• 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/disasm-aarch32.h"
41 #include "aarch32/instructions-aarch32.h"
42 #include "aarch32/operands-aarch32.h"
43 
44 namespace vixl {
45 namespace aarch32 {
46 
47 using internal::Int64;
48 using internal::Uint32;
49 
50 class T32CodeAddressIncrementer {
51   uint32_t* code_address_;
52   uint32_t increment_;
53 
54  public:
T32CodeAddressIncrementer(uint32_t instr,uint32_t * code_address)55   T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address)
56       : code_address_(code_address),
57         increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {}
~T32CodeAddressIncrementer()58   ~T32CodeAddressIncrementer() { *code_address_ += increment_; }
59 };
60 
61 class A32CodeAddressIncrementer {
62   uint32_t* code_address_;
63 
64  public:
A32CodeAddressIncrementer(uint32_t * code_address)65   explicit A32CodeAddressIncrementer(uint32_t* code_address)
66       : code_address_(code_address) {}
~A32CodeAddressIncrementer()67   ~A32CodeAddressIncrementer() { *code_address_ += 4; }
68 };
69 
70 class DecodeNeon {
71   int lane_;
72   SpacingType spacing_;
73   bool valid_;
74 
75  public:
DecodeNeon(int lane,SpacingType spacing)76   DecodeNeon(int lane, SpacingType spacing)
77       : lane_(lane), spacing_(spacing), valid_(true) {}
DecodeNeon()78   DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {}
GetLane() const79   int GetLane() const { return lane_; }
GetSpacing() const80   SpacingType GetSpacing() const { return spacing_; }
IsValid() const81   bool IsValid() const { return valid_; }
82 };
83 
84 class DecodeNeonAndAlign : public DecodeNeon {
85  public:
86   Alignment align_;
DecodeNeonAndAlign(int lanes,SpacingType spacing,Alignment align)87   DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align)
88       : DecodeNeon(lanes, spacing), align_(align) {}
DecodeNeonAndAlign()89   DecodeNeonAndAlign() : align_(kBadAlignment) {}
GetAlign() const90   Alignment GetAlign() const { return align_; }
91 };
92 
93 // Start of generated code.
Dt_L_imm6_1_Decode(uint32_t value,uint32_t type_value)94 DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) {
95   if ((value & 0xf) == 0x1) {
96     switch (type_value) {
97       case 0x0:
98         return S8;
99       case 0x1:
100         return U8;
101     }
102   } else if ((value & 0xe) == 0x2) {
103     switch (type_value) {
104       case 0x0:
105         return S16;
106       case 0x1:
107         return U16;
108     }
109   } else if ((value & 0xc) == 0x4) {
110     switch (type_value) {
111       case 0x0:
112         return S32;
113       case 0x1:
114         return U32;
115     }
116   } else if ((value & 0x8) == 0x8) {
117     switch (type_value) {
118       case 0x0:
119         return S64;
120       case 0x1:
121         return U64;
122     }
123   }
124   return kDataTypeValueInvalid;
125 }
126 
Dt_L_imm6_2_Decode(uint32_t value,uint32_t type_value)127 DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) {
128   if ((value & 0xf) == 0x1) {
129     if (type_value == 0x1) return S8;
130   } else if ((value & 0xe) == 0x2) {
131     if (type_value == 0x1) return S16;
132   } else if ((value & 0xc) == 0x4) {
133     if (type_value == 0x1) return S32;
134   } else if ((value & 0x8) == 0x8) {
135     if (type_value == 0x1) return S64;
136   }
137   return kDataTypeValueInvalid;
138 }
139 
Dt_L_imm6_3_Decode(uint32_t value)140 DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) {
141   if ((value & 0xf) == 0x1) {
142     return I8;
143   } else if ((value & 0xe) == 0x2) {
144     return I16;
145   } else if ((value & 0xc) == 0x4) {
146     return I32;
147   } else if ((value & 0x8) == 0x8) {
148     return I64;
149   }
150   return kDataTypeValueInvalid;
151 }
152 
Dt_L_imm6_4_Decode(uint32_t value)153 DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) {
154   if ((value & 0xf) == 0x1) {
155     return Untyped8;
156   } else if ((value & 0xe) == 0x2) {
157     return Untyped16;
158   } else if ((value & 0xc) == 0x4) {
159     return Untyped32;
160   } else if ((value & 0x8) == 0x8) {
161     return Untyped64;
162   }
163   return kDataTypeValueInvalid;
164 }
165 
Dt_imm6_1_Decode(uint32_t value,uint32_t type_value)166 DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) {
167   if ((value & 0x7) == 0x1) {
168     switch (type_value) {
169       case 0x0:
170         return S16;
171       case 0x1:
172         return U16;
173     }
174   } else if ((value & 0x6) == 0x2) {
175     switch (type_value) {
176       case 0x0:
177         return S32;
178       case 0x1:
179         return U32;
180     }
181   } else if ((value & 0x4) == 0x4) {
182     switch (type_value) {
183       case 0x0:
184         return S64;
185       case 0x1:
186         return U64;
187     }
188   }
189   return kDataTypeValueInvalid;
190 }
191 
Dt_imm6_2_Decode(uint32_t value,uint32_t type_value)192 DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) {
193   if ((value & 0x7) == 0x1) {
194     if (type_value == 0x1) return S16;
195   } else if ((value & 0x6) == 0x2) {
196     if (type_value == 0x1) return S32;
197   } else if ((value & 0x4) == 0x4) {
198     if (type_value == 0x1) return S64;
199   }
200   return kDataTypeValueInvalid;
201 }
202 
Dt_imm6_3_Decode(uint32_t value)203 DataTypeValue Dt_imm6_3_Decode(uint32_t value) {
204   if ((value & 0x7) == 0x1) {
205     return I16;
206   } else if ((value & 0x6) == 0x2) {
207     return I32;
208   } else if ((value & 0x4) == 0x4) {
209     return I64;
210   }
211   return kDataTypeValueInvalid;
212 }
213 
Dt_imm6_4_Decode(uint32_t value,uint32_t type_value)214 DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) {
215   if ((value & 0x7) == 0x1) {
216     switch (type_value) {
217       case 0x0:
218         return S8;
219       case 0x1:
220         return U8;
221     }
222   } else if ((value & 0x6) == 0x2) {
223     switch (type_value) {
224       case 0x0:
225         return S16;
226       case 0x1:
227         return U16;
228     }
229   } else if ((value & 0x4) == 0x4) {
230     switch (type_value) {
231       case 0x0:
232         return S32;
233       case 0x1:
234         return U32;
235     }
236   }
237   return kDataTypeValueInvalid;
238 }
239 
Dt_op_U_size_1_Decode(uint32_t value)240 DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) {
241   switch (value) {
242     case 0x0:
243       return S8;
244     case 0x1:
245       return S16;
246     case 0x2:
247       return S32;
248     case 0x4:
249       return U8;
250     case 0x5:
251       return U16;
252     case 0x6:
253       return U32;
254     case 0x8:
255       return P8;
256     case 0xa:
257       return P64;
258   }
259   return kDataTypeValueInvalid;
260 }
261 
Dt_op_size_1_Decode(uint32_t value)262 DataTypeValue Dt_op_size_1_Decode(uint32_t value) {
263   switch (value) {
264     case 0x0:
265       return I8;
266     case 0x1:
267       return I16;
268     case 0x2:
269       return I32;
270     case 0x4:
271       return P8;
272   }
273   return kDataTypeValueInvalid;
274 }
275 
Dt_op_size_2_Decode(uint32_t value)276 DataTypeValue Dt_op_size_2_Decode(uint32_t value) {
277   switch (value) {
278     case 0x0:
279       return S8;
280     case 0x1:
281       return S16;
282     case 0x2:
283       return S32;
284     case 0x4:
285       return U8;
286     case 0x5:
287       return U16;
288     case 0x6:
289       return U32;
290   }
291   return kDataTypeValueInvalid;
292 }
293 
Dt_op_size_3_Decode(uint32_t value)294 DataTypeValue Dt_op_size_3_Decode(uint32_t value) {
295   switch (value) {
296     case 0x0:
297       return S16;
298     case 0x1:
299       return S32;
300     case 0x2:
301       return S64;
302     case 0x4:
303       return U16;
304     case 0x5:
305       return U32;
306     case 0x6:
307       return U64;
308   }
309   return kDataTypeValueInvalid;
310 }
311 
Dt_U_imm3H_1_Decode(uint32_t value)312 DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) {
313   switch (value) {
314     case 0x1:
315       return S8;
316     case 0x2:
317       return S16;
318     case 0x4:
319       return S32;
320     case 0x9:
321       return U8;
322     case 0xa:
323       return U16;
324     case 0xc:
325       return U32;
326   }
327   return kDataTypeValueInvalid;
328 }
329 
Dt_U_opc1_opc2_1_Decode(uint32_t value,unsigned * lane)330 DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
331   if ((value & 0x18) == 0x8) {
332     *lane = value & 7;
333     return S8;
334   }
335   if ((value & 0x19) == 0x1) {
336     *lane = (value >> 1) & 3;
337     return S16;
338   }
339   if ((value & 0x18) == 0x18) {
340     *lane = value & 7;
341     return U8;
342   }
343   if ((value & 0x19) == 0x11) {
344     *lane = (value >> 1) & 3;
345     return U16;
346   }
347   if ((value & 0x1b) == 0x0) {
348     *lane = (value >> 2) & 1;
349     return Untyped32;
350   }
351   *lane = -1;
352   return kDataTypeValueInvalid;
353 }
354 
Dt_opc1_opc2_1_Decode(uint32_t value,unsigned * lane)355 DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
356   if ((value & 0x8) == 0x8) {
357     *lane = value & 7;
358     return Untyped8;
359   }
360   if ((value & 0x9) == 0x1) {
361     *lane = (value >> 1) & 3;
362     return Untyped16;
363   }
364   if ((value & 0xb) == 0x0) {
365     *lane = (value >> 2) & 1;
366     return Untyped32;
367   }
368   *lane = -1;
369   return kDataTypeValueInvalid;
370 }
371 
Dt_imm4_1_Decode(uint32_t value,unsigned * lane)372 DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) {
373   if ((value & 0x1) == 0x1) {
374     *lane = (value >> 1) & 7;
375     return Untyped8;
376   }
377   if ((value & 0x3) == 0x2) {
378     *lane = (value >> 2) & 3;
379     return Untyped16;
380   }
381   if ((value & 0x7) == 0x4) {
382     *lane = (value >> 3) & 1;
383     return Untyped32;
384   }
385   *lane = -1;
386   return kDataTypeValueInvalid;
387 }
388 
Dt_B_E_1_Decode(uint32_t value)389 DataTypeValue Dt_B_E_1_Decode(uint32_t value) {
390   switch (value) {
391     case 0x2:
392       return Untyped8;
393     case 0x1:
394       return Untyped16;
395     case 0x0:
396       return Untyped32;
397   }
398   return kDataTypeValueInvalid;
399 }
400 
Dt_op_1_Decode1(uint32_t value)401 DataTypeValue Dt_op_1_Decode1(uint32_t value) {
402   switch (value) {
403     case 0x0:
404       return F32;
405     case 0x1:
406       return F32;
407     case 0x2:
408       return S32;
409     case 0x3:
410       return U32;
411   }
412   return kDataTypeValueInvalid;
413 }
414 
Dt_op_1_Decode2(uint32_t value)415 DataTypeValue Dt_op_1_Decode2(uint32_t value) {
416   switch (value) {
417     case 0x0:
418       return S32;
419     case 0x1:
420       return U32;
421     case 0x2:
422       return F32;
423     case 0x3:
424       return F32;
425   }
426   return kDataTypeValueInvalid;
427 }
428 
Dt_op_2_Decode(uint32_t value)429 DataTypeValue Dt_op_2_Decode(uint32_t value) {
430   switch (value) {
431     case 0x0:
432       return U32;
433     case 0x1:
434       return S32;
435   }
436   return kDataTypeValueInvalid;
437 }
438 
Dt_op_3_Decode(uint32_t value)439 DataTypeValue Dt_op_3_Decode(uint32_t value) {
440   switch (value) {
441     case 0x0:
442       return S32;
443     case 0x1:
444       return U32;
445   }
446   return kDataTypeValueInvalid;
447 }
448 
Dt_U_sx_1_Decode(uint32_t value)449 DataTypeValue Dt_U_sx_1_Decode(uint32_t value) {
450   switch (value) {
451     case 0x0:
452       return S16;
453     case 0x1:
454       return S32;
455     case 0x2:
456       return U16;
457     case 0x3:
458       return U32;
459   }
460   return kDataTypeValueInvalid;
461 }
462 
Dt_op_U_1_Decode1(uint32_t value)463 DataTypeValue Dt_op_U_1_Decode1(uint32_t value) {
464   switch (value) {
465     case 0x0:
466       return F32;
467     case 0x1:
468       return F32;
469     case 0x2:
470       return S32;
471     case 0x3:
472       return U32;
473   }
474   return kDataTypeValueInvalid;
475 }
476 
Dt_op_U_1_Decode2(uint32_t value)477 DataTypeValue Dt_op_U_1_Decode2(uint32_t value) {
478   switch (value) {
479     case 0x0:
480       return S32;
481     case 0x1:
482       return U32;
483     case 0x2:
484       return F32;
485     case 0x3:
486       return F32;
487   }
488   return kDataTypeValueInvalid;
489 }
490 
Dt_sz_1_Decode(uint32_t value)491 DataTypeValue Dt_sz_1_Decode(uint32_t value) {
492   switch (value) {
493     case 0x0:
494       return F32;
495   }
496   return kDataTypeValueInvalid;
497 }
498 
Dt_F_size_1_Decode(uint32_t value)499 DataTypeValue Dt_F_size_1_Decode(uint32_t value) {
500   switch (value) {
501     case 0x0:
502       return S8;
503     case 0x1:
504       return S16;
505     case 0x2:
506       return S32;
507     case 0x6:
508       return F32;
509   }
510   return kDataTypeValueInvalid;
511 }
512 
Dt_F_size_2_Decode(uint32_t value)513 DataTypeValue Dt_F_size_2_Decode(uint32_t value) {
514   switch (value) {
515     case 0x0:
516       return I8;
517     case 0x1:
518       return I16;
519     case 0x2:
520       return I32;
521     case 0x6:
522       return F32;
523   }
524   return kDataTypeValueInvalid;
525 }
526 
Dt_F_size_3_Decode(uint32_t value)527 DataTypeValue Dt_F_size_3_Decode(uint32_t value) {
528   switch (value) {
529     case 0x1:
530       return I16;
531     case 0x2:
532       return I32;
533     case 0x6:
534       return F32;
535   }
536   return kDataTypeValueInvalid;
537 }
538 
Dt_F_size_4_Decode(uint32_t value)539 DataTypeValue Dt_F_size_4_Decode(uint32_t value) {
540   switch (value) {
541     case 0x2:
542       return U32;
543     case 0x6:
544       return F32;
545   }
546   return kDataTypeValueInvalid;
547 }
548 
Dt_U_size_1_Decode(uint32_t value)549 DataTypeValue Dt_U_size_1_Decode(uint32_t value) {
550   switch (value) {
551     case 0x0:
552       return S8;
553     case 0x1:
554       return S16;
555     case 0x2:
556       return S32;
557     case 0x4:
558       return U8;
559     case 0x5:
560       return U16;
561     case 0x6:
562       return U32;
563   }
564   return kDataTypeValueInvalid;
565 }
566 
Dt_U_size_2_Decode(uint32_t value)567 DataTypeValue Dt_U_size_2_Decode(uint32_t value) {
568   switch (value) {
569     case 0x1:
570       return S16;
571     case 0x2:
572       return S32;
573     case 0x5:
574       return U16;
575     case 0x6:
576       return U32;
577   }
578   return kDataTypeValueInvalid;
579 }
580 
Dt_U_size_3_Decode(uint32_t value)581 DataTypeValue Dt_U_size_3_Decode(uint32_t value) {
582   switch (value) {
583     case 0x0:
584       return S8;
585     case 0x1:
586       return S16;
587     case 0x2:
588       return S32;
589     case 0x3:
590       return S64;
591     case 0x4:
592       return U8;
593     case 0x5:
594       return U16;
595     case 0x6:
596       return U32;
597     case 0x7:
598       return U64;
599   }
600   return kDataTypeValueInvalid;
601 }
602 
Dt_size_1_Decode(uint32_t value)603 DataTypeValue Dt_size_1_Decode(uint32_t value) {
604   switch (value) {
605     case 0x0:
606       return Untyped8;
607   }
608   return kDataTypeValueInvalid;
609 }
610 
Dt_size_2_Decode(uint32_t value)611 DataTypeValue Dt_size_2_Decode(uint32_t value) {
612   switch (value) {
613     case 0x0:
614       return I8;
615     case 0x1:
616       return I16;
617     case 0x2:
618       return I32;
619     case 0x3:
620       return I64;
621   }
622   return kDataTypeValueInvalid;
623 }
624 
Dt_size_3_Decode(uint32_t value)625 DataTypeValue Dt_size_3_Decode(uint32_t value) {
626   switch (value) {
627     case 0x0:
628       return I16;
629     case 0x1:
630       return I32;
631     case 0x2:
632       return I64;
633   }
634   return kDataTypeValueInvalid;
635 }
636 
Dt_size_4_Decode(uint32_t value)637 DataTypeValue Dt_size_4_Decode(uint32_t value) {
638   switch (value) {
639     case 0x0:
640       return I8;
641     case 0x1:
642       return I16;
643     case 0x2:
644       return I32;
645   }
646   return kDataTypeValueInvalid;
647 }
648 
Dt_size_5_Decode(uint32_t value)649 DataTypeValue Dt_size_5_Decode(uint32_t value) {
650   switch (value) {
651     case 0x0:
652       return S8;
653     case 0x1:
654       return S16;
655     case 0x2:
656       return S32;
657   }
658   return kDataTypeValueInvalid;
659 }
660 
Dt_size_6_Decode(uint32_t value)661 DataTypeValue Dt_size_6_Decode(uint32_t value) {
662   switch (value) {
663     case 0x0:
664       return Untyped8;
665     case 0x1:
666       return Untyped16;
667     case 0x2:
668       return Untyped32;
669     case 0x3:
670       return Untyped64;
671   }
672   return kDataTypeValueInvalid;
673 }
674 
Dt_size_7_Decode(uint32_t value)675 DataTypeValue Dt_size_7_Decode(uint32_t value) {
676   switch (value) {
677     case 0x0:
678       return Untyped8;
679     case 0x1:
680       return Untyped16;
681     case 0x2:
682       return Untyped32;
683   }
684   return kDataTypeValueInvalid;
685 }
686 
Dt_size_8_Decode(uint32_t value)687 DataTypeValue Dt_size_8_Decode(uint32_t value) {
688   switch (value) {
689     case 0x0:
690       return Untyped8;
691     case 0x1:
692       return Untyped16;
693     case 0x2:
694       return Untyped32;
695     case 0x3:
696       return Untyped32;
697   }
698   return kDataTypeValueInvalid;
699 }
700 
Dt_size_9_Decode(uint32_t value,uint32_t type_value)701 DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) {
702   switch (value) {
703     case 0x1:
704       switch (type_value) {
705         case 0x0:
706           return I16;
707       }
708       break;
709     case 0x2:
710       switch (type_value) {
711         case 0x0:
712           return I32;
713         case 0x1:
714           return F32;
715       }
716       break;
717   }
718   return kDataTypeValueInvalid;
719 }
720 
Dt_size_10_Decode(uint32_t value)721 DataTypeValue Dt_size_10_Decode(uint32_t value) {
722   switch (value) {
723     case 0x0:
724       return I8;
725     case 0x1:
726       return I16;
727     case 0x2:
728       return I32;
729   }
730   return kDataTypeValueInvalid;
731 }
732 
Dt_size_11_Decode(uint32_t value,uint32_t type_value)733 DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) {
734   switch (value) {
735     case 0x1:
736       switch (type_value) {
737         case 0x0:
738           return S16;
739         case 0x1:
740           return U16;
741       }
742       break;
743     case 0x2:
744       switch (type_value) {
745         case 0x0:
746           return S32;
747         case 0x1:
748           return U32;
749       }
750       break;
751   }
752   return kDataTypeValueInvalid;
753 }
754 
Dt_size_12_Decode(uint32_t value,uint32_t type_value)755 DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) {
756   switch (value) {
757     case 0x0:
758       switch (type_value) {
759         case 0x0:
760           return S8;
761         case 0x1:
762           return U8;
763       }
764       break;
765     case 0x1:
766       switch (type_value) {
767         case 0x0:
768           return S16;
769         case 0x1:
770           return U16;
771       }
772       break;
773     case 0x2:
774       switch (type_value) {
775         case 0x0:
776           return S32;
777         case 0x1:
778           return U32;
779       }
780       break;
781   }
782   return kDataTypeValueInvalid;
783 }
784 
Dt_size_13_Decode(uint32_t value)785 DataTypeValue Dt_size_13_Decode(uint32_t value) {
786   switch (value) {
787     case 0x1:
788       return S16;
789     case 0x2:
790       return S32;
791   }
792   return kDataTypeValueInvalid;
793 }
794 
Dt_size_14_Decode(uint32_t value)795 DataTypeValue Dt_size_14_Decode(uint32_t value) {
796   switch (value) {
797     case 0x0:
798       return S16;
799     case 0x1:
800       return S32;
801     case 0x2:
802       return S64;
803   }
804   return kDataTypeValueInvalid;
805 }
806 
Dt_size_15_Decode(uint32_t value)807 DataTypeValue Dt_size_15_Decode(uint32_t value) {
808   switch (value) {
809     case 0x0:
810       return Untyped8;
811     case 0x1:
812       return Untyped16;
813   }
814   return kDataTypeValueInvalid;
815 }
816 
Dt_size_16_Decode(uint32_t value)817 DataTypeValue Dt_size_16_Decode(uint32_t value) {
818   switch (value) {
819     case 0x2:
820       return F32;
821   }
822   return kDataTypeValueInvalid;
823 }
824 
Dt_size_17_Decode(uint32_t value)825 DataTypeValue Dt_size_17_Decode(uint32_t value) {
826   switch (value) {
827     case 0x0:
828       return I8;
829     case 0x1:
830       return I16;
831     case 0x2:
832       return I32;
833   }
834   return kDataTypeValueInvalid;
835 }
836 
Index_1_Decode(uint32_t value,DataType dt)837 DecodeNeon Index_1_Decode(uint32_t value, DataType dt) {
838   switch (dt.GetValue()) {
839     case Untyped8: {
840       int lane = (value >> 1) & 0x7;
841       if ((value & 1) != 0) break;
842       SpacingType spacing = kSingle;
843       return DecodeNeon(lane, spacing);
844     }
845     case Untyped16: {
846       int lane = (value >> 2) & 0x3;
847       if ((value & 1) != 0) break;
848       SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle;
849       return DecodeNeon(lane, spacing);
850     }
851     case Untyped32: {
852       int lane = (value >> 3) & 0x1;
853       if ((value & 3) != 0) break;
854       SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle;
855       return DecodeNeon(lane, spacing);
856     }
857     default:
858       break;
859   }
860   return DecodeNeon();
861 }
862 
Align_index_align_1_Decode(uint32_t value,DataType dt)863 DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) {
864   switch (dt.GetValue()) {
865     case Untyped8: {
866       AlignmentType align;
867       if ((value & 1) == 0) {
868         align = kNoAlignment;
869       } else {
870         break;
871       }
872       int lane = (value >> 1) & 0x7;
873       SpacingType spacing = kSingle;
874       return DecodeNeonAndAlign(lane, spacing, align);
875     }
876     case Untyped16: {
877       AlignmentType align;
878       if ((value & 3) == 1) {
879         align = k16BitAlign;
880       } else if ((value & 3) == 0) {
881         align = kNoAlignment;
882       } else {
883         break;
884       }
885       int lane = (value >> 2) & 0x3;
886       SpacingType spacing = kSingle;
887       return DecodeNeonAndAlign(lane, spacing, align);
888     }
889     case Untyped32: {
890       AlignmentType align;
891       if ((value & 7) == 3) {
892         align = k32BitAlign;
893       } else if ((value & 7) == 0) {
894         align = kNoAlignment;
895       } else {
896         break;
897       }
898       int lane = (value >> 3) & 0x1;
899       SpacingType spacing = kSingle;
900       return DecodeNeonAndAlign(lane, spacing, align);
901     }
902     default:
903       break;
904   }
905   return DecodeNeonAndAlign();
906 }
907 
Align_index_align_2_Decode(uint32_t value,DataType dt)908 DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) {
909   switch (dt.GetValue()) {
910     case Untyped8: {
911       AlignmentType align;
912       if ((value & 1) == 1) {
913         align = k16BitAlign;
914       } else if ((value & 1) == 0) {
915         align = kNoAlignment;
916       } else {
917         break;
918       }
919       int lane = (value >> 1) & 0x7;
920       SpacingType spacing = kSingle;
921       return DecodeNeonAndAlign(lane, spacing, align);
922     }
923     case Untyped16: {
924       AlignmentType align;
925       if ((value & 1) == 1) {
926         align = k32BitAlign;
927       } else if ((value & 1) == 0) {
928         align = kNoAlignment;
929       } else {
930         break;
931       }
932       int lane = (value >> 2) & 0x3;
933       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
934       return DecodeNeonAndAlign(lane, spacing, align);
935     }
936     case Untyped32: {
937       AlignmentType align;
938       if ((value & 3) == 1) {
939         align = k64BitAlign;
940       } else if ((value & 3) == 0) {
941         align = kNoAlignment;
942       } else {
943         break;
944       }
945       int lane = (value >> 3) & 0x1;
946       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
947       return DecodeNeonAndAlign(lane, spacing, align);
948     }
949     default:
950       break;
951   }
952   return DecodeNeonAndAlign();
953 }
954 
Align_index_align_3_Decode(uint32_t value,DataType dt)955 DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) {
956   switch (dt.GetValue()) {
957     case Untyped8: {
958       AlignmentType align;
959       if ((value & 1) == 1) {
960         align = k32BitAlign;
961       } else if ((value & 1) == 0) {
962         align = kNoAlignment;
963       } else {
964         break;
965       }
966       int lane = (value >> 1) & 0x7;
967       SpacingType spacing = kSingle;
968       return DecodeNeonAndAlign(lane, spacing, align);
969     }
970     case Untyped16: {
971       AlignmentType align;
972       if ((value & 1) == 1) {
973         align = k64BitAlign;
974       } else if ((value & 1) == 0) {
975         align = kNoAlignment;
976       } else {
977         break;
978       }
979       int lane = (value >> 2) & 0x3;
980       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
981       return DecodeNeonAndAlign(lane, spacing, align);
982     }
983     case Untyped32: {
984       AlignmentType align;
985       if ((value & 3) == 1) {
986         align = k64BitAlign;
987       } else if ((value & 3) == 2) {
988         align = k128BitAlign;
989       } else if ((value & 3) == 0) {
990         align = kNoAlignment;
991       } else {
992         break;
993       }
994       int lane = (value >> 3) & 0x1;
995       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
996       return DecodeNeonAndAlign(lane, spacing, align);
997     }
998     default:
999       break;
1000   }
1001   return DecodeNeonAndAlign();
1002 }
1003 
Align_a_1_Decode(uint32_t value,DataType dt)1004 Alignment Align_a_1_Decode(uint32_t value, DataType dt) {
1005   switch (value) {
1006     case 0:
1007       return kNoAlignment;
1008     case 1:
1009       if (dt.Is(Untyped16)) return k16BitAlign;
1010       if (dt.Is(Untyped32)) return k32BitAlign;
1011       break;
1012     default:
1013       break;
1014   }
1015   return kBadAlignment;
1016 }
1017 
Align_a_2_Decode(uint32_t value,DataType dt)1018 Alignment Align_a_2_Decode(uint32_t value, DataType dt) {
1019   switch (value) {
1020     case 0:
1021       return kNoAlignment;
1022     case 1:
1023       if (dt.Is(Untyped8)) return k16BitAlign;
1024       if (dt.Is(Untyped16)) return k32BitAlign;
1025       if (dt.Is(Untyped32)) return k64BitAlign;
1026       break;
1027     default:
1028       break;
1029   }
1030   return kBadAlignment;
1031 }
1032 
Align_a_3_Decode(uint32_t value,DataType dt,uint32_t size)1033 Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) {
1034   switch (value) {
1035     case 0:
1036       if (size != 3) return kNoAlignment;
1037       break;
1038     case 1:
1039       if (dt.Is(Untyped8)) return k32BitAlign;
1040       if (dt.Is(Untyped16)) return k64BitAlign;
1041       if (size == 2) return k64BitAlign;
1042       if (size == 3) return k128BitAlign;
1043       break;
1044     default:
1045       break;
1046   }
1047   return kBadAlignment;
1048 }
1049 
Align_align_1_Decode(uint32_t value)1050 Alignment Align_align_1_Decode(uint32_t value) {
1051   switch (value) {
1052     case 0:
1053       return kNoAlignment;
1054     case 1:
1055       return k64BitAlign;
1056     case 2:
1057       return k128BitAlign;
1058     case 3:
1059       return k256BitAlign;
1060     default:
1061       break;
1062   }
1063   return kBadAlignment;
1064 }
1065 
Align_align_2_Decode(uint32_t value)1066 Alignment Align_align_2_Decode(uint32_t value) {
1067   switch (value) {
1068     case 0:
1069       return kNoAlignment;
1070     case 1:
1071       return k64BitAlign;
1072     case 2:
1073       return k128BitAlign;
1074     case 3:
1075       return k256BitAlign;
1076     default:
1077       break;
1078   }
1079   return kBadAlignment;
1080 }
1081 
Align_align_3_Decode(uint32_t value)1082 Alignment Align_align_3_Decode(uint32_t value) {
1083   switch (value) {
1084     case 0:
1085       return kNoAlignment;
1086     case 1:
1087       return k64BitAlign;
1088     default:
1089       break;
1090   }
1091   return kBadAlignment;
1092 }
1093 
Align_align_4_Decode(uint32_t value)1094 Alignment Align_align_4_Decode(uint32_t value) {
1095   switch (value) {
1096     case 0:
1097       return kNoAlignment;
1098     case 1:
1099       return k64BitAlign;
1100     case 2:
1101       return k128BitAlign;
1102     case 3:
1103       return k256BitAlign;
1104     default:
1105       break;
1106   }
1107   return kBadAlignment;
1108 }
1109 
Align_align_5_Decode(uint32_t value)1110 Alignment Align_align_5_Decode(uint32_t value) {
1111   switch (value) {
1112     case 0:
1113       return kNoAlignment;
1114     case 1:
1115       return k64BitAlign;
1116     case 2:
1117       return k128BitAlign;
1118     case 3:
1119       return k256BitAlign;
1120     default:
1121       break;
1122   }
1123   return kBadAlignment;
1124 }
1125 
1126 
adc(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1127 void Disassembler::adc(Condition cond,
1128                        EncodingSize size,
1129                        Register rd,
1130                        Register rn,
1131                        const Operand& operand) {
1132   os().SetCurrentInstruction(kAdc, kArithmetic);
1133   os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size;
1134   os() << " ";
1135   if (!rd.Is(rn) || !use_short_hand_form_) {
1136     os() << rd << ", ";
1137   }
1138   os() << rn << ", " << operand;
1139 }
1140 
adcs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1141 void Disassembler::adcs(Condition cond,
1142                         EncodingSize size,
1143                         Register rd,
1144                         Register rn,
1145                         const Operand& operand) {
1146   os().SetCurrentInstruction(kAdcs, kArithmetic);
1147   os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size;
1148   os() << " ";
1149   if (!rd.Is(rn) || !use_short_hand_form_) {
1150     os() << rd << ", ";
1151   }
1152   os() << rn << ", " << operand;
1153 }
1154 
add(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1155 void Disassembler::add(Condition cond,
1156                        EncodingSize size,
1157                        Register rd,
1158                        Register rn,
1159                        const Operand& operand) {
1160   os().SetCurrentInstruction(kAdd, kArithmetic);
1161   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size;
1162   os() << " ";
1163   if (!rd.Is(rn) || !use_short_hand_form_) {
1164     os() << rd << ", ";
1165   }
1166   os() << rn << ", " << operand;
1167 }
1168 
add(Condition cond,Register rd,const Operand & operand)1169 void Disassembler::add(Condition cond, Register rd, const Operand& operand) {
1170   os().SetCurrentInstruction(kAdd, kArithmetic);
1171   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd
1172        << ", " << operand;
1173 }
1174 
adds(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1175 void Disassembler::adds(Condition cond,
1176                         EncodingSize size,
1177                         Register rd,
1178                         Register rn,
1179                         const Operand& operand) {
1180   os().SetCurrentInstruction(kAdds, kArithmetic);
1181   os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size;
1182   os() << " ";
1183   if (!rd.Is(rn) || !use_short_hand_form_) {
1184     os() << rd << ", ";
1185   }
1186   os() << rn << ", " << operand;
1187 }
1188 
adds(Register rd,const Operand & operand)1189 void Disassembler::adds(Register rd, const Operand& operand) {
1190   os().SetCurrentInstruction(kAdds, kArithmetic);
1191   os() << ToCString(kAdds) << " " << rd << ", " << operand;
1192 }
1193 
addw(Condition cond,Register rd,Register rn,const Operand & operand)1194 void Disassembler::addw(Condition cond,
1195                         Register rd,
1196                         Register rn,
1197                         const Operand& operand) {
1198   os().SetCurrentInstruction(kAddw, kArithmetic);
1199   os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond);
1200   os() << " ";
1201   if (!rd.Is(rn) || !use_short_hand_form_) {
1202     os() << rd << ", ";
1203   }
1204   os() << rn << ", " << operand;
1205 }
1206 
adr(Condition cond,EncodingSize size,Register rd,Location * location)1207 void Disassembler::adr(Condition cond,
1208                        EncodingSize size,
1209                        Register rd,
1210                        Location* location) {
1211   os().SetCurrentInstruction(kAdr, kAddress);
1212   os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
1213        << rd << ", "
1214        << PrintLabel(kAnyLocation, location, GetCodeAddress() & ~3);
1215 }
1216 
and_(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1217 void Disassembler::and_(Condition cond,
1218                         EncodingSize size,
1219                         Register rd,
1220                         Register rn,
1221                         const Operand& operand) {
1222   os().SetCurrentInstruction(kAnd, kBitwise);
1223   os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
1224   os() << " ";
1225   if (!rd.Is(rn) || !use_short_hand_form_) {
1226     os() << rd << ", ";
1227   }
1228   os() << rn << ", " << operand;
1229 }
1230 
ands(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1231 void Disassembler::ands(Condition cond,
1232                         EncodingSize size,
1233                         Register rd,
1234                         Register rn,
1235                         const Operand& operand) {
1236   os().SetCurrentInstruction(kAnds, kBitwise);
1237   os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
1238   os() << " ";
1239   if (!rd.Is(rn) || !use_short_hand_form_) {
1240     os() << rd << ", ";
1241   }
1242   os() << rn << ", " << operand;
1243 }
1244 
asr(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1245 void Disassembler::asr(Condition cond,
1246                        EncodingSize size,
1247                        Register rd,
1248                        Register rm,
1249                        const Operand& operand) {
1250   os().SetCurrentInstruction(kAsr, kShift);
1251   os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
1252   os() << " ";
1253   if (!rd.Is(rm) || !use_short_hand_form_) {
1254     os() << rd << ", ";
1255   }
1256   os() << rm << ", " << operand;
1257 }
1258 
asrs(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1259 void Disassembler::asrs(Condition cond,
1260                         EncodingSize size,
1261                         Register rd,
1262                         Register rm,
1263                         const Operand& operand) {
1264   os().SetCurrentInstruction(kAsrs, kShift);
1265   os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
1266   os() << " ";
1267   if (!rd.Is(rm) || !use_short_hand_form_) {
1268     os() << rd << ", ";
1269   }
1270   os() << rm << ", " << operand;
1271 }
1272 
b(Condition cond,EncodingSize size,Location * location)1273 void Disassembler::b(Condition cond, EncodingSize size, Location* location) {
1274   os().SetCurrentInstruction(kB, kAddress | kBranch);
1275   os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
1276        << PrintLabel(kCodeLocation, location, GetCodeAddress());
1277 }
1278 
bfc(Condition cond,Register rd,uint32_t lsb,uint32_t width)1279 void Disassembler::bfc(Condition cond,
1280                        Register rd,
1281                        uint32_t lsb,
1282                        uint32_t width) {
1283   os().SetCurrentInstruction(kBfc, kShift);
1284   os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
1285        << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width);
1286 }
1287 
bfi(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)1288 void Disassembler::bfi(
1289     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
1290   os().SetCurrentInstruction(kBfi, kShift);
1291   os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
1292        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
1293        << ImmediatePrinter(width);
1294 }
1295 
bic(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1296 void Disassembler::bic(Condition cond,
1297                        EncodingSize size,
1298                        Register rd,
1299                        Register rn,
1300                        const Operand& operand) {
1301   os().SetCurrentInstruction(kBic, kBitwise);
1302   os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
1303   os() << " ";
1304   if (!rd.Is(rn) || !use_short_hand_form_) {
1305     os() << rd << ", ";
1306   }
1307   os() << rn << ", " << operand;
1308 }
1309 
bics(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1310 void Disassembler::bics(Condition cond,
1311                         EncodingSize size,
1312                         Register rd,
1313                         Register rn,
1314                         const Operand& operand) {
1315   os().SetCurrentInstruction(kBics, kBitwise);
1316   os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
1317   os() << " ";
1318   if (!rd.Is(rn) || !use_short_hand_form_) {
1319     os() << rd << ", ";
1320   }
1321   os() << rn << ", " << operand;
1322 }
1323 
bkpt(Condition cond,uint32_t imm)1324 void Disassembler::bkpt(Condition cond, uint32_t imm) {
1325   os().SetCurrentInstruction(kBkpt, kSystem);
1326   os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " "
1327        << RawImmediatePrinter(imm);
1328 }
1329 
bl(Condition cond,Location * location)1330 void Disassembler::bl(Condition cond, Location* location) {
1331   os().SetCurrentInstruction(kBl, kAddress | kBranch);
1332   os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
1333        << PrintLabel(kCodeLocation, location, GetCodeAddress());
1334 }
1335 
blx(Condition cond,Location * location)1336 void Disassembler::blx(Condition cond, Location* location) {
1337   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
1338   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
1339        << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
1340 }
1341 
blx(Condition cond,Register rm)1342 void Disassembler::blx(Condition cond, Register rm) {
1343   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
1344   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
1345 }
1346 
bx(Condition cond,Register rm)1347 void Disassembler::bx(Condition cond, Register rm) {
1348   os().SetCurrentInstruction(kBx, kAddress | kBranch);
1349   os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
1350 }
1351 
bxj(Condition cond,Register rm)1352 void Disassembler::bxj(Condition cond, Register rm) {
1353   os().SetCurrentInstruction(kBxj, kAddress | kBranch);
1354   os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
1355 }
1356 
cbnz(Register rn,Location * location)1357 void Disassembler::cbnz(Register rn, Location* location) {
1358   os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
1359   os() << ToCString(kCbnz) << " " << rn << ", "
1360        << PrintLabel(kCodeLocation, location, GetCodeAddress());
1361 }
1362 
cbz(Register rn,Location * location)1363 void Disassembler::cbz(Register rn, Location* location) {
1364   os().SetCurrentInstruction(kCbz, kAddress | kBranch);
1365   os() << ToCString(kCbz) << " " << rn << ", "
1366        << PrintLabel(kCodeLocation, location, GetCodeAddress());
1367 }
1368 
clrex(Condition cond)1369 void Disassembler::clrex(Condition cond) {
1370   os().SetCurrentInstruction(kClrex, kNoAttribute);
1371   os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
1372 }
1373 
clz(Condition cond,Register rd,Register rm)1374 void Disassembler::clz(Condition cond, Register rd, Register rm) {
1375   os().SetCurrentInstruction(kClz, kNoAttribute);
1376   os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
1377        << ", " << rm;
1378 }
1379 
cmn(Condition cond,EncodingSize size,Register rn,const Operand & operand)1380 void Disassembler::cmn(Condition cond,
1381                        EncodingSize size,
1382                        Register rn,
1383                        const Operand& operand) {
1384   os().SetCurrentInstruction(kCmn, kArithmetic);
1385   os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
1386        << rn << ", " << operand;
1387 }
1388 
cmp(Condition cond,EncodingSize size,Register rn,const Operand & operand)1389 void Disassembler::cmp(Condition cond,
1390                        EncodingSize size,
1391                        Register rn,
1392                        const Operand& operand) {
1393   os().SetCurrentInstruction(kCmp, kArithmetic);
1394   os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
1395        << rn << ", " << operand;
1396 }
1397 
crc32b(Condition cond,Register rd,Register rn,Register rm)1398 void Disassembler::crc32b(Condition cond,
1399                           Register rd,
1400                           Register rn,
1401                           Register rm) {
1402   os().SetCurrentInstruction(kCrc32b, kNoAttribute);
1403   os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
1404        << ", " << rn << ", " << rm;
1405 }
1406 
crc32cb(Condition cond,Register rd,Register rn,Register rm)1407 void Disassembler::crc32cb(Condition cond,
1408                            Register rd,
1409                            Register rn,
1410                            Register rm) {
1411   os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
1412   os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
1413        << ", " << rn << ", " << rm;
1414 }
1415 
crc32ch(Condition cond,Register rd,Register rn,Register rm)1416 void Disassembler::crc32ch(Condition cond,
1417                            Register rd,
1418                            Register rn,
1419                            Register rm) {
1420   os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
1421   os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
1422        << ", " << rn << ", " << rm;
1423 }
1424 
crc32cw(Condition cond,Register rd,Register rn,Register rm)1425 void Disassembler::crc32cw(Condition cond,
1426                            Register rd,
1427                            Register rn,
1428                            Register rm) {
1429   os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
1430   os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
1431        << ", " << rn << ", " << rm;
1432 }
1433 
crc32h(Condition cond,Register rd,Register rn,Register rm)1434 void Disassembler::crc32h(Condition cond,
1435                           Register rd,
1436                           Register rn,
1437                           Register rm) {
1438   os().SetCurrentInstruction(kCrc32h, kNoAttribute);
1439   os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
1440        << ", " << rn << ", " << rm;
1441 }
1442 
crc32w(Condition cond,Register rd,Register rn,Register rm)1443 void Disassembler::crc32w(Condition cond,
1444                           Register rd,
1445                           Register rn,
1446                           Register rm) {
1447   os().SetCurrentInstruction(kCrc32w, kNoAttribute);
1448   os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
1449        << ", " << rn << ", " << rm;
1450 }
1451 
dmb(Condition cond,MemoryBarrier option)1452 void Disassembler::dmb(Condition cond, MemoryBarrier option) {
1453   os().SetCurrentInstruction(kDmb, kNoAttribute);
1454   os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
1455 }
1456 
dsb(Condition cond,MemoryBarrier option)1457 void Disassembler::dsb(Condition cond, MemoryBarrier option) {
1458   os().SetCurrentInstruction(kDsb, kNoAttribute);
1459   os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
1460 }
1461 
eor(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1462 void Disassembler::eor(Condition cond,
1463                        EncodingSize size,
1464                        Register rd,
1465                        Register rn,
1466                        const Operand& operand) {
1467   os().SetCurrentInstruction(kEor, kBitwise);
1468   os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
1469   os() << " ";
1470   if (!rd.Is(rn) || !use_short_hand_form_) {
1471     os() << rd << ", ";
1472   }
1473   os() << rn << ", " << operand;
1474 }
1475 
eors(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1476 void Disassembler::eors(Condition cond,
1477                         EncodingSize size,
1478                         Register rd,
1479                         Register rn,
1480                         const Operand& operand) {
1481   os().SetCurrentInstruction(kEors, kBitwise);
1482   os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
1483   os() << " ";
1484   if (!rd.Is(rn) || !use_short_hand_form_) {
1485     os() << rd << ", ";
1486   }
1487   os() << rn << ", " << operand;
1488 }
1489 
fldmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1490 void Disassembler::fldmdbx(Condition cond,
1491                            Register rn,
1492                            WriteBack write_back,
1493                            DRegisterList dreglist) {
1494   os().SetCurrentInstruction(kFldmdbx,
1495                              kLoadStore | kLoadStoreMultiple | kFpNeon);
1496   os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
1497        << write_back << ", " << dreglist;
1498 }
1499 
fldmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1500 void Disassembler::fldmiax(Condition cond,
1501                            Register rn,
1502                            WriteBack write_back,
1503                            DRegisterList dreglist) {
1504   os().SetCurrentInstruction(kFldmiax,
1505                              kLoadStore | kLoadStoreMultiple | kFpNeon);
1506   os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
1507        << write_back << ", " << dreglist;
1508 }
1509 
fstmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1510 void Disassembler::fstmdbx(Condition cond,
1511                            Register rn,
1512                            WriteBack write_back,
1513                            DRegisterList dreglist) {
1514   os().SetCurrentInstruction(kFstmdbx,
1515                              kLoadStore | kLoadStoreMultiple | kFpNeon);
1516   os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
1517        << write_back << ", " << dreglist;
1518 }
1519 
fstmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1520 void Disassembler::fstmiax(Condition cond,
1521                            Register rn,
1522                            WriteBack write_back,
1523                            DRegisterList dreglist) {
1524   os().SetCurrentInstruction(kFstmiax,
1525                              kLoadStore | kLoadStoreMultiple | kFpNeon);
1526   os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
1527        << write_back << ", " << dreglist;
1528 }
1529 
hlt(Condition cond,uint32_t imm)1530 void Disassembler::hlt(Condition cond, uint32_t imm) {
1531   os().SetCurrentInstruction(kHlt, kSystem);
1532   os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " "
1533        << RawImmediatePrinter(imm);
1534 }
1535 
hvc(Condition cond,uint32_t imm)1536 void Disassembler::hvc(Condition cond, uint32_t imm) {
1537   os().SetCurrentInstruction(kHvc, kSystem);
1538   os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " "
1539        << RawImmediatePrinter(imm);
1540 }
1541 
isb(Condition cond,MemoryBarrier option)1542 void Disassembler::isb(Condition cond, MemoryBarrier option) {
1543   os().SetCurrentInstruction(kIsb, kNoAttribute);
1544   os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option;
1545 }
1546 
it(Condition cond,uint16_t mask)1547 void Disassembler::it(Condition cond, uint16_t mask) {
1548   os().SetCurrentInstruction(kIt, kNoAttribute);
1549   os() << ToCString(kIt);
1550   int count;
1551   if ((mask & 0x1) != 0) {
1552     count = 3;
1553   } else if ((mask & 0x2) != 0) {
1554     count = 2;
1555   } else if ((mask & 0x4) != 0) {
1556     count = 1;
1557   } else {
1558     count = 0;
1559   }
1560   uint16_t tmp = 0x8;
1561   uint16_t ref = (cond.GetCondition() & 0x1) << 3;
1562   while (count-- > 0) {
1563     os() << (((mask & tmp) == ref) ? "t" : "e");
1564     tmp >>= 1;
1565     ref >>= 1;
1566   }
1567   if (cond.Is(al)) {
1568     os() << " al";
1569   } else {
1570     os() << " " << cond;
1571   }
1572 }
1573 
lda(Condition cond,Register rt,const MemOperand & operand)1574 void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) {
1575   os().SetCurrentInstruction(kLda, kAddress | kLoadStore);
1576   os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt
1577        << ", " << PrintMemOperand(kLoadWordLocation, operand);
1578 }
1579 
ldab(Condition cond,Register rt,const MemOperand & operand)1580 void Disassembler::ldab(Condition cond,
1581                         Register rt,
1582                         const MemOperand& operand) {
1583   os().SetCurrentInstruction(kLdab, kAddress | kLoadStore);
1584   os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt
1585        << ", " << PrintMemOperand(kLoadByteLocation, operand);
1586 }
1587 
ldaex(Condition cond,Register rt,const MemOperand & operand)1588 void Disassembler::ldaex(Condition cond,
1589                          Register rt,
1590                          const MemOperand& operand) {
1591   os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore);
1592   os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt
1593        << ", " << PrintMemOperand(kLoadWordLocation, operand);
1594 }
1595 
ldaexb(Condition cond,Register rt,const MemOperand & operand)1596 void Disassembler::ldaexb(Condition cond,
1597                           Register rt,
1598                           const MemOperand& operand) {
1599   os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore);
1600   os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt
1601        << ", " << PrintMemOperand(kLoadByteLocation, operand);
1602 }
1603 
ldaexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1604 void Disassembler::ldaexd(Condition cond,
1605                           Register rt,
1606                           Register rt2,
1607                           const MemOperand& operand) {
1608   os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore);
1609   os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt
1610        << ", " << rt2 << ", "
1611        << PrintMemOperand(kLoadDoubleWordLocation, operand);
1612 }
1613 
ldaexh(Condition cond,Register rt,const MemOperand & operand)1614 void Disassembler::ldaexh(Condition cond,
1615                           Register rt,
1616                           const MemOperand& operand) {
1617   os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore);
1618   os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt
1619        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1620 }
1621 
ldah(Condition cond,Register rt,const MemOperand & operand)1622 void Disassembler::ldah(Condition cond,
1623                         Register rt,
1624                         const MemOperand& operand) {
1625   os().SetCurrentInstruction(kLdah, kAddress | kLoadStore);
1626   os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt
1627        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1628 }
1629 
ldm(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)1630 void Disassembler::ldm(Condition cond,
1631                        EncodingSize size,
1632                        Register rn,
1633                        WriteBack write_back,
1634                        RegisterList registers) {
1635   os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple);
1636   os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " "
1637        << rn << write_back << ", " << registers;
1638 }
1639 
ldmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1640 void Disassembler::ldmda(Condition cond,
1641                          Register rn,
1642                          WriteBack write_back,
1643                          RegisterList registers) {
1644   os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple);
1645   os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn
1646        << write_back << ", " << registers;
1647 }
1648 
ldmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1649 void Disassembler::ldmdb(Condition cond,
1650                          Register rn,
1651                          WriteBack write_back,
1652                          RegisterList registers) {
1653   os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple);
1654   os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn
1655        << write_back << ", " << registers;
1656 }
1657 
ldmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1658 void Disassembler::ldmea(Condition cond,
1659                          Register rn,
1660                          WriteBack write_back,
1661                          RegisterList registers) {
1662   os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple);
1663   os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn
1664        << write_back << ", " << registers;
1665 }
1666 
ldmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1667 void Disassembler::ldmed(Condition cond,
1668                          Register rn,
1669                          WriteBack write_back,
1670                          RegisterList registers) {
1671   os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple);
1672   os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn
1673        << write_back << ", " << registers;
1674 }
1675 
ldmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1676 void Disassembler::ldmfa(Condition cond,
1677                          Register rn,
1678                          WriteBack write_back,
1679                          RegisterList registers) {
1680   os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple);
1681   os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn
1682        << write_back << ", " << registers;
1683 }
1684 
ldmfd(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)1685 void Disassembler::ldmfd(Condition cond,
1686                          EncodingSize size,
1687                          Register rn,
1688                          WriteBack write_back,
1689                          RegisterList registers) {
1690   os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple);
1691   os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " "
1692        << rn << write_back << ", " << registers;
1693 }
1694 
ldmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1695 void Disassembler::ldmib(Condition cond,
1696                          Register rn,
1697                          WriteBack write_back,
1698                          RegisterList registers) {
1699   os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple);
1700   os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn
1701        << write_back << ", " << registers;
1702 }
1703 
ldr(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1704 void Disassembler::ldr(Condition cond,
1705                        EncodingSize size,
1706                        Register rt,
1707                        const MemOperand& operand) {
1708   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
1709   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
1710        << rt << ", " << PrintMemOperand(kLoadWordLocation, operand);
1711 }
1712 
ldr(Condition cond,EncodingSize size,Register rt,Location * location)1713 void Disassembler::ldr(Condition cond,
1714                        EncodingSize size,
1715                        Register rt,
1716                        Location* location) {
1717   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
1718   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
1719        << rt << ", "
1720        << PrintLabel(kLoadWordLocation, location, GetCodeAddress() & ~3);
1721 }
1722 
ldrb(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1723 void Disassembler::ldrb(Condition cond,
1724                         EncodingSize size,
1725                         Register rt,
1726                         const MemOperand& operand) {
1727   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
1728   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " "
1729        << rt << ", " << PrintMemOperand(kLoadByteLocation, operand);
1730 }
1731 
ldrb(Condition cond,Register rt,Location * location)1732 void Disassembler::ldrb(Condition cond, Register rt, Location* location) {
1733   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
1734   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
1735        << ", "
1736        << PrintLabel(kLoadByteLocation, location, GetCodeAddress() & ~3);
1737 }
1738 
ldrd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1739 void Disassembler::ldrd(Condition cond,
1740                         Register rt,
1741                         Register rt2,
1742                         const MemOperand& operand) {
1743   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
1744   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
1745        << ", " << rt2 << ", "
1746        << PrintMemOperand(kLoadDoubleWordLocation, operand);
1747 }
1748 
ldrd(Condition cond,Register rt,Register rt2,Location * location)1749 void Disassembler::ldrd(Condition cond,
1750                         Register rt,
1751                         Register rt2,
1752                         Location* location) {
1753   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
1754   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
1755        << ", " << rt2 << ", "
1756        << PrintLabel(kLoadDoubleWordLocation, location, GetCodeAddress() & ~3);
1757 }
1758 
ldrex(Condition cond,Register rt,const MemOperand & operand)1759 void Disassembler::ldrex(Condition cond,
1760                          Register rt,
1761                          const MemOperand& operand) {
1762   os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
1763   os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
1764        << ", " << PrintMemOperand(kLoadWordLocation, operand);
1765 }
1766 
ldrexb(Condition cond,Register rt,const MemOperand & operand)1767 void Disassembler::ldrexb(Condition cond,
1768                           Register rt,
1769                           const MemOperand& operand) {
1770   os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
1771   os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
1772        << ", " << PrintMemOperand(kLoadByteLocation, operand);
1773 }
1774 
ldrexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1775 void Disassembler::ldrexd(Condition cond,
1776                           Register rt,
1777                           Register rt2,
1778                           const MemOperand& operand) {
1779   os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
1780   os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
1781        << ", " << rt2 << ", "
1782        << PrintMemOperand(kLoadDoubleWordLocation, operand);
1783 }
1784 
ldrexh(Condition cond,Register rt,const MemOperand & operand)1785 void Disassembler::ldrexh(Condition cond,
1786                           Register rt,
1787                           const MemOperand& operand) {
1788   os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
1789   os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
1790        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1791 }
1792 
ldrh(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1793 void Disassembler::ldrh(Condition cond,
1794                         EncodingSize size,
1795                         Register rt,
1796                         const MemOperand& operand) {
1797   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
1798   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
1799        << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1800 }
1801 
ldrh(Condition cond,Register rt,Location * location)1802 void Disassembler::ldrh(Condition cond, Register rt, Location* location) {
1803   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
1804   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
1805        << ", "
1806        << PrintLabel(kLoadHalfWordLocation, location, GetCodeAddress() & ~3);
1807 }
1808 
ldrsb(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1809 void Disassembler::ldrsb(Condition cond,
1810                          EncodingSize size,
1811                          Register rt,
1812                          const MemOperand& operand) {
1813   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
1814   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
1815        << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
1816 }
1817 
ldrsb(Condition cond,Register rt,Location * location)1818 void Disassembler::ldrsb(Condition cond, Register rt, Location* location) {
1819   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
1820   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
1821        << ", "
1822        << PrintLabel(kLoadSignedByteLocation, location, GetCodeAddress() & ~3);
1823 }
1824 
ldrsh(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1825 void Disassembler::ldrsh(Condition cond,
1826                          EncodingSize size,
1827                          Register rt,
1828                          const MemOperand& operand) {
1829   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
1830   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
1831        << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
1832 }
1833 
ldrsh(Condition cond,Register rt,Location * location)1834 void Disassembler::ldrsh(Condition cond, Register rt, Location* location) {
1835   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
1836   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
1837        << ", " << PrintLabel(kLoadSignedHalfWordLocation,
1838                              location,
1839                              GetCodeAddress() & ~3);
1840 }
1841 
lsl(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1842 void Disassembler::lsl(Condition cond,
1843                        EncodingSize size,
1844                        Register rd,
1845                        Register rm,
1846                        const Operand& operand) {
1847   os().SetCurrentInstruction(kLsl, kShift);
1848   os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
1849   os() << " ";
1850   if (!rd.Is(rm) || !use_short_hand_form_) {
1851     os() << rd << ", ";
1852   }
1853   os() << rm << ", " << operand;
1854 }
1855 
lsls(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1856 void Disassembler::lsls(Condition cond,
1857                         EncodingSize size,
1858                         Register rd,
1859                         Register rm,
1860                         const Operand& operand) {
1861   os().SetCurrentInstruction(kLsls, kShift);
1862   os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
1863   os() << " ";
1864   if (!rd.Is(rm) || !use_short_hand_form_) {
1865     os() << rd << ", ";
1866   }
1867   os() << rm << ", " << operand;
1868 }
1869 
lsr(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1870 void Disassembler::lsr(Condition cond,
1871                        EncodingSize size,
1872                        Register rd,
1873                        Register rm,
1874                        const Operand& operand) {
1875   os().SetCurrentInstruction(kLsr, kShift);
1876   os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
1877   os() << " ";
1878   if (!rd.Is(rm) || !use_short_hand_form_) {
1879     os() << rd << ", ";
1880   }
1881   os() << rm << ", " << operand;
1882 }
1883 
lsrs(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1884 void Disassembler::lsrs(Condition cond,
1885                         EncodingSize size,
1886                         Register rd,
1887                         Register rm,
1888                         const Operand& operand) {
1889   os().SetCurrentInstruction(kLsrs, kShift);
1890   os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
1891   os() << " ";
1892   if (!rd.Is(rm) || !use_short_hand_form_) {
1893     os() << rd << ", ";
1894   }
1895   os() << rm << ", " << operand;
1896 }
1897 
mla(Condition cond,Register rd,Register rn,Register rm,Register ra)1898 void Disassembler::mla(
1899     Condition cond, Register rd, Register rn, Register rm, Register ra) {
1900   os().SetCurrentInstruction(kMla, kArithmetic);
1901   os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
1902        << ", " << rn << ", " << rm << ", " << ra;
1903 }
1904 
mlas(Condition cond,Register rd,Register rn,Register rm,Register ra)1905 void Disassembler::mlas(
1906     Condition cond, Register rd, Register rn, Register rm, Register ra) {
1907   os().SetCurrentInstruction(kMlas, kArithmetic);
1908   os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
1909        << ", " << rn << ", " << rm << ", " << ra;
1910 }
1911 
mls(Condition cond,Register rd,Register rn,Register rm,Register ra)1912 void Disassembler::mls(
1913     Condition cond, Register rd, Register rn, Register rm, Register ra) {
1914   os().SetCurrentInstruction(kMls, kArithmetic);
1915   os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
1916        << ", " << rn << ", " << rm << ", " << ra;
1917 }
1918 
mov(Condition cond,EncodingSize size,Register rd,const Operand & operand)1919 void Disassembler::mov(Condition cond,
1920                        EncodingSize size,
1921                        Register rd,
1922                        const Operand& operand) {
1923   os().SetCurrentInstruction(kMov, kNoAttribute);
1924   os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
1925        << rd << ", " << operand;
1926 }
1927 
movs(Condition cond,EncodingSize size,Register rd,const Operand & operand)1928 void Disassembler::movs(Condition cond,
1929                         EncodingSize size,
1930                         Register rd,
1931                         const Operand& operand) {
1932   os().SetCurrentInstruction(kMovs, kNoAttribute);
1933   os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
1934        << rd << ", " << operand;
1935 }
1936 
movt(Condition cond,Register rd,const Operand & operand)1937 void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
1938   os().SetCurrentInstruction(kMovt, kNoAttribute);
1939   os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
1940        << ", " << operand;
1941 }
1942 
movw(Condition cond,Register rd,const Operand & operand)1943 void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
1944   os().SetCurrentInstruction(kMovw, kNoAttribute);
1945   os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
1946        << ", " << operand;
1947 }
1948 
mrs(Condition cond,Register rd,SpecialRegister spec_reg)1949 void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
1950   os().SetCurrentInstruction(kMrs, kNoAttribute);
1951   os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
1952        << ", " << spec_reg;
1953 }
1954 
msr(Condition cond,MaskedSpecialRegister spec_reg,const Operand & operand)1955 void Disassembler::msr(Condition cond,
1956                        MaskedSpecialRegister spec_reg,
1957                        const Operand& operand) {
1958   os().SetCurrentInstruction(kMsr, kNoAttribute);
1959   os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
1960        << spec_reg << ", " << operand;
1961 }
1962 
mul(Condition cond,EncodingSize size,Register rd,Register rn,Register rm)1963 void Disassembler::mul(
1964     Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
1965   os().SetCurrentInstruction(kMul, kArithmetic);
1966   os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
1967        << rd << ", " << rn << ", " << rm;
1968 }
1969 
muls(Condition cond,Register rd,Register rn,Register rm)1970 void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
1971   os().SetCurrentInstruction(kMuls, kArithmetic);
1972   os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
1973        << ", " << rn << ", " << rm;
1974 }
1975 
mvn(Condition cond,EncodingSize size,Register rd,const Operand & operand)1976 void Disassembler::mvn(Condition cond,
1977                        EncodingSize size,
1978                        Register rd,
1979                        const Operand& operand) {
1980   os().SetCurrentInstruction(kMvn, kNoAttribute);
1981   os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
1982        << rd << ", " << operand;
1983 }
1984 
mvns(Condition cond,EncodingSize size,Register rd,const Operand & operand)1985 void Disassembler::mvns(Condition cond,
1986                         EncodingSize size,
1987                         Register rd,
1988                         const Operand& operand) {
1989   os().SetCurrentInstruction(kMvns, kNoAttribute);
1990   os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
1991        << rd << ", " << operand;
1992 }
1993 
nop(Condition cond,EncodingSize size)1994 void Disassembler::nop(Condition cond, EncodingSize size) {
1995   os().SetCurrentInstruction(kNop, kNoAttribute);
1996   os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
1997 }
1998 
orn(Condition cond,Register rd,Register rn,const Operand & operand)1999 void Disassembler::orn(Condition cond,
2000                        Register rd,
2001                        Register rn,
2002                        const Operand& operand) {
2003   os().SetCurrentInstruction(kOrn, kBitwise);
2004   os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
2005   os() << " ";
2006   if (!rd.Is(rn) || !use_short_hand_form_) {
2007     os() << rd << ", ";
2008   }
2009   os() << rn << ", " << operand;
2010 }
2011 
orns(Condition cond,Register rd,Register rn,const Operand & operand)2012 void Disassembler::orns(Condition cond,
2013                         Register rd,
2014                         Register rn,
2015                         const Operand& operand) {
2016   os().SetCurrentInstruction(kOrns, kBitwise);
2017   os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
2018   os() << " ";
2019   if (!rd.Is(rn) || !use_short_hand_form_) {
2020     os() << rd << ", ";
2021   }
2022   os() << rn << ", " << operand;
2023 }
2024 
orr(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2025 void Disassembler::orr(Condition cond,
2026                        EncodingSize size,
2027                        Register rd,
2028                        Register rn,
2029                        const Operand& operand) {
2030   os().SetCurrentInstruction(kOrr, kBitwise);
2031   os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
2032   os() << " ";
2033   if (!rd.Is(rn) || !use_short_hand_form_) {
2034     os() << rd << ", ";
2035   }
2036   os() << rn << ", " << operand;
2037 }
2038 
orrs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2039 void Disassembler::orrs(Condition cond,
2040                         EncodingSize size,
2041                         Register rd,
2042                         Register rn,
2043                         const Operand& operand) {
2044   os().SetCurrentInstruction(kOrrs, kBitwise);
2045   os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
2046   os() << " ";
2047   if (!rd.Is(rn) || !use_short_hand_form_) {
2048     os() << rd << ", ";
2049   }
2050   os() << rn << ", " << operand;
2051 }
2052 
pkhbt(Condition cond,Register rd,Register rn,const Operand & operand)2053 void Disassembler::pkhbt(Condition cond,
2054                          Register rd,
2055                          Register rn,
2056                          const Operand& operand) {
2057   os().SetCurrentInstruction(kPkhbt, kNoAttribute);
2058   os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
2059   os() << " ";
2060   if (!rd.Is(rn) || !use_short_hand_form_) {
2061     os() << rd << ", ";
2062   }
2063   os() << rn << ", " << operand;
2064 }
2065 
pkhtb(Condition cond,Register rd,Register rn,const Operand & operand)2066 void Disassembler::pkhtb(Condition cond,
2067                          Register rd,
2068                          Register rn,
2069                          const Operand& operand) {
2070   os().SetCurrentInstruction(kPkhtb, kNoAttribute);
2071   os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
2072   os() << " ";
2073   if (!rd.Is(rn) || !use_short_hand_form_) {
2074     os() << rd << ", ";
2075   }
2076   os() << rn << ", " << operand;
2077 }
2078 
pld(Condition cond,Location * location)2079 void Disassembler::pld(Condition cond, Location* location) {
2080   os().SetCurrentInstruction(kPld, kAddress);
2081   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
2082        << PrintLabel(kDataLocation, location, GetCodeAddress() & ~3);
2083 }
2084 
pld(Condition cond,const MemOperand & operand)2085 void Disassembler::pld(Condition cond, const MemOperand& operand) {
2086   os().SetCurrentInstruction(kPld, kAddress);
2087   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
2088        << PrintMemOperand(kDataLocation, operand);
2089 }
2090 
pldw(Condition cond,const MemOperand & operand)2091 void Disassembler::pldw(Condition cond, const MemOperand& operand) {
2092   os().SetCurrentInstruction(kPldw, kAddress);
2093   os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
2094        << PrintMemOperand(kDataLocation, operand);
2095 }
2096 
pli(Condition cond,const MemOperand & operand)2097 void Disassembler::pli(Condition cond, const MemOperand& operand) {
2098   os().SetCurrentInstruction(kPli, kAddress);
2099   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
2100        << PrintMemOperand(kCodeLocation, operand);
2101 }
2102 
pli(Condition cond,Location * location)2103 void Disassembler::pli(Condition cond, Location* location) {
2104   os().SetCurrentInstruction(kPli, kAddress);
2105   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
2106        << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
2107 }
2108 
pop(Condition cond,EncodingSize size,RegisterList registers)2109 void Disassembler::pop(Condition cond,
2110                        EncodingSize size,
2111                        RegisterList registers) {
2112   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
2113   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
2114        << registers;
2115 }
2116 
pop(Condition cond,EncodingSize size,Register rt)2117 void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
2118   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
2119   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
2120        << "{" << rt << "}";
2121 }
2122 
push(Condition cond,EncodingSize size,RegisterList registers)2123 void Disassembler::push(Condition cond,
2124                         EncodingSize size,
2125                         RegisterList registers) {
2126   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
2127   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
2128        << registers;
2129 }
2130 
push(Condition cond,EncodingSize size,Register rt)2131 void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
2132   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
2133   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
2134        << "{" << rt << "}";
2135 }
2136 
qadd(Condition cond,Register rd,Register rm,Register rn)2137 void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
2138   os().SetCurrentInstruction(kQadd, kArithmetic);
2139   os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
2140   os() << " ";
2141   if (!rd.Is(rm) || !use_short_hand_form_) {
2142     os() << rd << ", ";
2143   }
2144   os() << rm << ", " << rn;
2145 }
2146 
qadd16(Condition cond,Register rd,Register rn,Register rm)2147 void Disassembler::qadd16(Condition cond,
2148                           Register rd,
2149                           Register rn,
2150                           Register rm) {
2151   os().SetCurrentInstruction(kQadd16, kArithmetic);
2152   os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
2153   os() << " ";
2154   if (!rd.Is(rn) || !use_short_hand_form_) {
2155     os() << rd << ", ";
2156   }
2157   os() << rn << ", " << rm;
2158 }
2159 
qadd8(Condition cond,Register rd,Register rn,Register rm)2160 void Disassembler::qadd8(Condition cond,
2161                          Register rd,
2162                          Register rn,
2163                          Register rm) {
2164   os().SetCurrentInstruction(kQadd8, kArithmetic);
2165   os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
2166   os() << " ";
2167   if (!rd.Is(rn) || !use_short_hand_form_) {
2168     os() << rd << ", ";
2169   }
2170   os() << rn << ", " << rm;
2171 }
2172 
qasx(Condition cond,Register rd,Register rn,Register rm)2173 void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
2174   os().SetCurrentInstruction(kQasx, kArithmetic);
2175   os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
2176   os() << " ";
2177   if (!rd.Is(rn) || !use_short_hand_form_) {
2178     os() << rd << ", ";
2179   }
2180   os() << rn << ", " << rm;
2181 }
2182 
qdadd(Condition cond,Register rd,Register rm,Register rn)2183 void Disassembler::qdadd(Condition cond,
2184                          Register rd,
2185                          Register rm,
2186                          Register rn) {
2187   os().SetCurrentInstruction(kQdadd, kArithmetic);
2188   os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
2189   os() << " ";
2190   if (!rd.Is(rm) || !use_short_hand_form_) {
2191     os() << rd << ", ";
2192   }
2193   os() << rm << ", " << rn;
2194 }
2195 
qdsub(Condition cond,Register rd,Register rm,Register rn)2196 void Disassembler::qdsub(Condition cond,
2197                          Register rd,
2198                          Register rm,
2199                          Register rn) {
2200   os().SetCurrentInstruction(kQdsub, kArithmetic);
2201   os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
2202   os() << " ";
2203   if (!rd.Is(rm) || !use_short_hand_form_) {
2204     os() << rd << ", ";
2205   }
2206   os() << rm << ", " << rn;
2207 }
2208 
qsax(Condition cond,Register rd,Register rn,Register rm)2209 void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
2210   os().SetCurrentInstruction(kQsax, kArithmetic);
2211   os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
2212   os() << " ";
2213   if (!rd.Is(rn) || !use_short_hand_form_) {
2214     os() << rd << ", ";
2215   }
2216   os() << rn << ", " << rm;
2217 }
2218 
qsub(Condition cond,Register rd,Register rm,Register rn)2219 void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
2220   os().SetCurrentInstruction(kQsub, kArithmetic);
2221   os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
2222   os() << " ";
2223   if (!rd.Is(rm) || !use_short_hand_form_) {
2224     os() << rd << ", ";
2225   }
2226   os() << rm << ", " << rn;
2227 }
2228 
qsub16(Condition cond,Register rd,Register rn,Register rm)2229 void Disassembler::qsub16(Condition cond,
2230                           Register rd,
2231                           Register rn,
2232                           Register rm) {
2233   os().SetCurrentInstruction(kQsub16, kArithmetic);
2234   os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
2235   os() << " ";
2236   if (!rd.Is(rn) || !use_short_hand_form_) {
2237     os() << rd << ", ";
2238   }
2239   os() << rn << ", " << rm;
2240 }
2241 
qsub8(Condition cond,Register rd,Register rn,Register rm)2242 void Disassembler::qsub8(Condition cond,
2243                          Register rd,
2244                          Register rn,
2245                          Register rm) {
2246   os().SetCurrentInstruction(kQsub8, kArithmetic);
2247   os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
2248   os() << " ";
2249   if (!rd.Is(rn) || !use_short_hand_form_) {
2250     os() << rd << ", ";
2251   }
2252   os() << rn << ", " << rm;
2253 }
2254 
rbit(Condition cond,Register rd,Register rm)2255 void Disassembler::rbit(Condition cond, Register rd, Register rm) {
2256   os().SetCurrentInstruction(kRbit, kNoAttribute);
2257   os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
2258        << ", " << rm;
2259 }
2260 
rev(Condition cond,EncodingSize size,Register rd,Register rm)2261 void Disassembler::rev(Condition cond,
2262                        EncodingSize size,
2263                        Register rd,
2264                        Register rm) {
2265   os().SetCurrentInstruction(kRev, kNoAttribute);
2266   os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
2267        << rd << ", " << rm;
2268 }
2269 
rev16(Condition cond,EncodingSize size,Register rd,Register rm)2270 void Disassembler::rev16(Condition cond,
2271                          EncodingSize size,
2272                          Register rd,
2273                          Register rm) {
2274   os().SetCurrentInstruction(kRev16, kNoAttribute);
2275   os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
2276        << rd << ", " << rm;
2277 }
2278 
revsh(Condition cond,EncodingSize size,Register rd,Register rm)2279 void Disassembler::revsh(Condition cond,
2280                          EncodingSize size,
2281                          Register rd,
2282                          Register rm) {
2283   os().SetCurrentInstruction(kRevsh, kNoAttribute);
2284   os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
2285        << rd << ", " << rm;
2286 }
2287 
ror(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)2288 void Disassembler::ror(Condition cond,
2289                        EncodingSize size,
2290                        Register rd,
2291                        Register rm,
2292                        const Operand& operand) {
2293   os().SetCurrentInstruction(kRor, kShift);
2294   os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
2295   os() << " ";
2296   if (!rd.Is(rm) || !use_short_hand_form_) {
2297     os() << rd << ", ";
2298   }
2299   os() << rm << ", " << operand;
2300 }
2301 
rors(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)2302 void Disassembler::rors(Condition cond,
2303                         EncodingSize size,
2304                         Register rd,
2305                         Register rm,
2306                         const Operand& operand) {
2307   os().SetCurrentInstruction(kRors, kShift);
2308   os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
2309   os() << " ";
2310   if (!rd.Is(rm) || !use_short_hand_form_) {
2311     os() << rd << ", ";
2312   }
2313   os() << rm << ", " << operand;
2314 }
2315 
rrx(Condition cond,Register rd,Register rm)2316 void Disassembler::rrx(Condition cond, Register rd, Register rm) {
2317   os().SetCurrentInstruction(kRrx, kShift);
2318   os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
2319   os() << " ";
2320   if (!rd.Is(rm) || !use_short_hand_form_) {
2321     os() << rd << ", ";
2322   }
2323   os() << rm;
2324 }
2325 
rrxs(Condition cond,Register rd,Register rm)2326 void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
2327   os().SetCurrentInstruction(kRrxs, kShift);
2328   os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
2329   os() << " ";
2330   if (!rd.Is(rm) || !use_short_hand_form_) {
2331     os() << rd << ", ";
2332   }
2333   os() << rm;
2334 }
2335 
rsb(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2336 void Disassembler::rsb(Condition cond,
2337                        EncodingSize size,
2338                        Register rd,
2339                        Register rn,
2340                        const Operand& operand) {
2341   os().SetCurrentInstruction(kRsb, kArithmetic);
2342   os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
2343   os() << " ";
2344   if (!rd.Is(rn) || !use_short_hand_form_) {
2345     os() << rd << ", ";
2346   }
2347   os() << rn << ", " << operand;
2348 }
2349 
rsbs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2350 void Disassembler::rsbs(Condition cond,
2351                         EncodingSize size,
2352                         Register rd,
2353                         Register rn,
2354                         const Operand& operand) {
2355   os().SetCurrentInstruction(kRsbs, kArithmetic);
2356   os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
2357   os() << " ";
2358   if (!rd.Is(rn) || !use_short_hand_form_) {
2359     os() << rd << ", ";
2360   }
2361   os() << rn << ", " << operand;
2362 }
2363 
rsc(Condition cond,Register rd,Register rn,const Operand & operand)2364 void Disassembler::rsc(Condition cond,
2365                        Register rd,
2366                        Register rn,
2367                        const Operand& operand) {
2368   os().SetCurrentInstruction(kRsc, kArithmetic);
2369   os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
2370   os() << " ";
2371   if (!rd.Is(rn) || !use_short_hand_form_) {
2372     os() << rd << ", ";
2373   }
2374   os() << rn << ", " << operand;
2375 }
2376 
rscs(Condition cond,Register rd,Register rn,const Operand & operand)2377 void Disassembler::rscs(Condition cond,
2378                         Register rd,
2379                         Register rn,
2380                         const Operand& operand) {
2381   os().SetCurrentInstruction(kRscs, kArithmetic);
2382   os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
2383   os() << " ";
2384   if (!rd.Is(rn) || !use_short_hand_form_) {
2385     os() << rd << ", ";
2386   }
2387   os() << rn << ", " << operand;
2388 }
2389 
sadd16(Condition cond,Register rd,Register rn,Register rm)2390 void Disassembler::sadd16(Condition cond,
2391                           Register rd,
2392                           Register rn,
2393                           Register rm) {
2394   os().SetCurrentInstruction(kSadd16, kArithmetic);
2395   os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
2396   os() << " ";
2397   if (!rd.Is(rn) || !use_short_hand_form_) {
2398     os() << rd << ", ";
2399   }
2400   os() << rn << ", " << rm;
2401 }
2402 
sadd8(Condition cond,Register rd,Register rn,Register rm)2403 void Disassembler::sadd8(Condition cond,
2404                          Register rd,
2405                          Register rn,
2406                          Register rm) {
2407   os().SetCurrentInstruction(kSadd8, kArithmetic);
2408   os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
2409   os() << " ";
2410   if (!rd.Is(rn) || !use_short_hand_form_) {
2411     os() << rd << ", ";
2412   }
2413   os() << rn << ", " << rm;
2414 }
2415 
sasx(Condition cond,Register rd,Register rn,Register rm)2416 void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
2417   os().SetCurrentInstruction(kSasx, kArithmetic);
2418   os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
2419   os() << " ";
2420   if (!rd.Is(rn) || !use_short_hand_form_) {
2421     os() << rd << ", ";
2422   }
2423   os() << rn << ", " << rm;
2424 }
2425 
sbc(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2426 void Disassembler::sbc(Condition cond,
2427                        EncodingSize size,
2428                        Register rd,
2429                        Register rn,
2430                        const Operand& operand) {
2431   os().SetCurrentInstruction(kSbc, kArithmetic);
2432   os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
2433   os() << " ";
2434   if (!rd.Is(rn) || !use_short_hand_form_) {
2435     os() << rd << ", ";
2436   }
2437   os() << rn << ", " << operand;
2438 }
2439 
sbcs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2440 void Disassembler::sbcs(Condition cond,
2441                         EncodingSize size,
2442                         Register rd,
2443                         Register rn,
2444                         const Operand& operand) {
2445   os().SetCurrentInstruction(kSbcs, kArithmetic);
2446   os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
2447   os() << " ";
2448   if (!rd.Is(rn) || !use_short_hand_form_) {
2449     os() << rd << ", ";
2450   }
2451   os() << rn << ", " << operand;
2452 }
2453 
sbfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)2454 void Disassembler::sbfx(
2455     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
2456   os().SetCurrentInstruction(kSbfx, kShift);
2457   os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
2458        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
2459        << ImmediatePrinter(width);
2460 }
2461 
sdiv(Condition cond,Register rd,Register rn,Register rm)2462 void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
2463   os().SetCurrentInstruction(kSdiv, kArithmetic);
2464   os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
2465   os() << " ";
2466   if (!rd.Is(rn) || !use_short_hand_form_) {
2467     os() << rd << ", ";
2468   }
2469   os() << rn << ", " << rm;
2470 }
2471 
sel(Condition cond,Register rd,Register rn,Register rm)2472 void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
2473   os().SetCurrentInstruction(kSel, kNoAttribute);
2474   os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
2475   os() << " ";
2476   if (!rd.Is(rn) || !use_short_hand_form_) {
2477     os() << rd << ", ";
2478   }
2479   os() << rn << ", " << rm;
2480 }
2481 
shadd16(Condition cond,Register rd,Register rn,Register rm)2482 void Disassembler::shadd16(Condition cond,
2483                            Register rd,
2484                            Register rn,
2485                            Register rm) {
2486   os().SetCurrentInstruction(kShadd16, kArithmetic);
2487   os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
2488   os() << " ";
2489   if (!rd.Is(rn) || !use_short_hand_form_) {
2490     os() << rd << ", ";
2491   }
2492   os() << rn << ", " << rm;
2493 }
2494 
shadd8(Condition cond,Register rd,Register rn,Register rm)2495 void Disassembler::shadd8(Condition cond,
2496                           Register rd,
2497                           Register rn,
2498                           Register rm) {
2499   os().SetCurrentInstruction(kShadd8, kArithmetic);
2500   os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
2501   os() << " ";
2502   if (!rd.Is(rn) || !use_short_hand_form_) {
2503     os() << rd << ", ";
2504   }
2505   os() << rn << ", " << rm;
2506 }
2507 
shasx(Condition cond,Register rd,Register rn,Register rm)2508 void Disassembler::shasx(Condition cond,
2509                          Register rd,
2510                          Register rn,
2511                          Register rm) {
2512   os().SetCurrentInstruction(kShasx, kArithmetic);
2513   os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
2514   os() << " ";
2515   if (!rd.Is(rn) || !use_short_hand_form_) {
2516     os() << rd << ", ";
2517   }
2518   os() << rn << ", " << rm;
2519 }
2520 
shsax(Condition cond,Register rd,Register rn,Register rm)2521 void Disassembler::shsax(Condition cond,
2522                          Register rd,
2523                          Register rn,
2524                          Register rm) {
2525   os().SetCurrentInstruction(kShsax, kArithmetic);
2526   os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
2527   os() << " ";
2528   if (!rd.Is(rn) || !use_short_hand_form_) {
2529     os() << rd << ", ";
2530   }
2531   os() << rn << ", " << rm;
2532 }
2533 
shsub16(Condition cond,Register rd,Register rn,Register rm)2534 void Disassembler::shsub16(Condition cond,
2535                            Register rd,
2536                            Register rn,
2537                            Register rm) {
2538   os().SetCurrentInstruction(kShsub16, kArithmetic);
2539   os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
2540   os() << " ";
2541   if (!rd.Is(rn) || !use_short_hand_form_) {
2542     os() << rd << ", ";
2543   }
2544   os() << rn << ", " << rm;
2545 }
2546 
shsub8(Condition cond,Register rd,Register rn,Register rm)2547 void Disassembler::shsub8(Condition cond,
2548                           Register rd,
2549                           Register rn,
2550                           Register rm) {
2551   os().SetCurrentInstruction(kShsub8, kArithmetic);
2552   os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
2553   os() << " ";
2554   if (!rd.Is(rn) || !use_short_hand_form_) {
2555     os() << rd << ", ";
2556   }
2557   os() << rn << ", " << rm;
2558 }
2559 
smlabb(Condition cond,Register rd,Register rn,Register rm,Register ra)2560 void Disassembler::smlabb(
2561     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2562   os().SetCurrentInstruction(kSmlabb, kArithmetic);
2563   os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
2564        << ", " << rn << ", " << rm << ", " << ra;
2565 }
2566 
smlabt(Condition cond,Register rd,Register rn,Register rm,Register ra)2567 void Disassembler::smlabt(
2568     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2569   os().SetCurrentInstruction(kSmlabt, kArithmetic);
2570   os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
2571        << ", " << rn << ", " << rm << ", " << ra;
2572 }
2573 
smlad(Condition cond,Register rd,Register rn,Register rm,Register ra)2574 void Disassembler::smlad(
2575     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2576   os().SetCurrentInstruction(kSmlad, kArithmetic);
2577   os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
2578        << ", " << rn << ", " << rm << ", " << ra;
2579 }
2580 
smladx(Condition cond,Register rd,Register rn,Register rm,Register ra)2581 void Disassembler::smladx(
2582     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2583   os().SetCurrentInstruction(kSmladx, kArithmetic);
2584   os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
2585        << ", " << rn << ", " << rm << ", " << ra;
2586 }
2587 
smlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2588 void Disassembler::smlal(
2589     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2590   os().SetCurrentInstruction(kSmlal, kArithmetic);
2591   os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
2592        << ", " << rdhi << ", " << rn << ", " << rm;
2593 }
2594 
smlalbb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2595 void Disassembler::smlalbb(
2596     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2597   os().SetCurrentInstruction(kSmlalbb, kArithmetic);
2598   os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
2599        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2600 }
2601 
smlalbt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2602 void Disassembler::smlalbt(
2603     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2604   os().SetCurrentInstruction(kSmlalbt, kArithmetic);
2605   os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
2606        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2607 }
2608 
smlald(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2609 void Disassembler::smlald(
2610     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2611   os().SetCurrentInstruction(kSmlald, kArithmetic);
2612   os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
2613        << ", " << rdhi << ", " << rn << ", " << rm;
2614 }
2615 
smlaldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2616 void Disassembler::smlaldx(
2617     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2618   os().SetCurrentInstruction(kSmlaldx, kArithmetic);
2619   os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
2620        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2621 }
2622 
smlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2623 void Disassembler::smlals(
2624     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2625   os().SetCurrentInstruction(kSmlals, kArithmetic);
2626   os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
2627        << ", " << rdhi << ", " << rn << ", " << rm;
2628 }
2629 
smlaltb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2630 void Disassembler::smlaltb(
2631     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2632   os().SetCurrentInstruction(kSmlaltb, kArithmetic);
2633   os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
2634        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2635 }
2636 
smlaltt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2637 void Disassembler::smlaltt(
2638     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2639   os().SetCurrentInstruction(kSmlaltt, kArithmetic);
2640   os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
2641        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2642 }
2643 
smlatb(Condition cond,Register rd,Register rn,Register rm,Register ra)2644 void Disassembler::smlatb(
2645     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2646   os().SetCurrentInstruction(kSmlatb, kArithmetic);
2647   os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
2648        << ", " << rn << ", " << rm << ", " << ra;
2649 }
2650 
smlatt(Condition cond,Register rd,Register rn,Register rm,Register ra)2651 void Disassembler::smlatt(
2652     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2653   os().SetCurrentInstruction(kSmlatt, kArithmetic);
2654   os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
2655        << ", " << rn << ", " << rm << ", " << ra;
2656 }
2657 
smlawb(Condition cond,Register rd,Register rn,Register rm,Register ra)2658 void Disassembler::smlawb(
2659     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2660   os().SetCurrentInstruction(kSmlawb, kArithmetic);
2661   os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
2662        << ", " << rn << ", " << rm << ", " << ra;
2663 }
2664 
smlawt(Condition cond,Register rd,Register rn,Register rm,Register ra)2665 void Disassembler::smlawt(
2666     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2667   os().SetCurrentInstruction(kSmlawt, kArithmetic);
2668   os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
2669        << ", " << rn << ", " << rm << ", " << ra;
2670 }
2671 
smlsd(Condition cond,Register rd,Register rn,Register rm,Register ra)2672 void Disassembler::smlsd(
2673     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2674   os().SetCurrentInstruction(kSmlsd, kArithmetic);
2675   os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
2676        << ", " << rn << ", " << rm << ", " << ra;
2677 }
2678 
smlsdx(Condition cond,Register rd,Register rn,Register rm,Register ra)2679 void Disassembler::smlsdx(
2680     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2681   os().SetCurrentInstruction(kSmlsdx, kArithmetic);
2682   os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
2683        << ", " << rn << ", " << rm << ", " << ra;
2684 }
2685 
smlsld(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2686 void Disassembler::smlsld(
2687     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2688   os().SetCurrentInstruction(kSmlsld, kArithmetic);
2689   os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
2690        << ", " << rdhi << ", " << rn << ", " << rm;
2691 }
2692 
smlsldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2693 void Disassembler::smlsldx(
2694     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2695   os().SetCurrentInstruction(kSmlsldx, kArithmetic);
2696   os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
2697        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2698 }
2699 
smmla(Condition cond,Register rd,Register rn,Register rm,Register ra)2700 void Disassembler::smmla(
2701     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2702   os().SetCurrentInstruction(kSmmla, kArithmetic);
2703   os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
2704        << ", " << rn << ", " << rm << ", " << ra;
2705 }
2706 
smmlar(Condition cond,Register rd,Register rn,Register rm,Register ra)2707 void Disassembler::smmlar(
2708     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2709   os().SetCurrentInstruction(kSmmlar, kArithmetic);
2710   os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
2711        << ", " << rn << ", " << rm << ", " << ra;
2712 }
2713 
smmls(Condition cond,Register rd,Register rn,Register rm,Register ra)2714 void Disassembler::smmls(
2715     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2716   os().SetCurrentInstruction(kSmmls, kArithmetic);
2717   os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
2718        << ", " << rn << ", " << rm << ", " << ra;
2719 }
2720 
smmlsr(Condition cond,Register rd,Register rn,Register rm,Register ra)2721 void Disassembler::smmlsr(
2722     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2723   os().SetCurrentInstruction(kSmmlsr, kArithmetic);
2724   os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
2725        << ", " << rn << ", " << rm << ", " << ra;
2726 }
2727 
smmul(Condition cond,Register rd,Register rn,Register rm)2728 void Disassembler::smmul(Condition cond,
2729                          Register rd,
2730                          Register rn,
2731                          Register rm) {
2732   os().SetCurrentInstruction(kSmmul, kArithmetic);
2733   os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
2734   os() << " ";
2735   if (!rd.Is(rn) || !use_short_hand_form_) {
2736     os() << rd << ", ";
2737   }
2738   os() << rn << ", " << rm;
2739 }
2740 
smmulr(Condition cond,Register rd,Register rn,Register rm)2741 void Disassembler::smmulr(Condition cond,
2742                           Register rd,
2743                           Register rn,
2744                           Register rm) {
2745   os().SetCurrentInstruction(kSmmulr, kArithmetic);
2746   os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
2747   os() << " ";
2748   if (!rd.Is(rn) || !use_short_hand_form_) {
2749     os() << rd << ", ";
2750   }
2751   os() << rn << ", " << rm;
2752 }
2753 
smuad(Condition cond,Register rd,Register rn,Register rm)2754 void Disassembler::smuad(Condition cond,
2755                          Register rd,
2756                          Register rn,
2757                          Register rm) {
2758   os().SetCurrentInstruction(kSmuad, kArithmetic);
2759   os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
2760   os() << " ";
2761   if (!rd.Is(rn) || !use_short_hand_form_) {
2762     os() << rd << ", ";
2763   }
2764   os() << rn << ", " << rm;
2765 }
2766 
smuadx(Condition cond,Register rd,Register rn,Register rm)2767 void Disassembler::smuadx(Condition cond,
2768                           Register rd,
2769                           Register rn,
2770                           Register rm) {
2771   os().SetCurrentInstruction(kSmuadx, kArithmetic);
2772   os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
2773   os() << " ";
2774   if (!rd.Is(rn) || !use_short_hand_form_) {
2775     os() << rd << ", ";
2776   }
2777   os() << rn << ", " << rm;
2778 }
2779 
smulbb(Condition cond,Register rd,Register rn,Register rm)2780 void Disassembler::smulbb(Condition cond,
2781                           Register rd,
2782                           Register rn,
2783                           Register rm) {
2784   os().SetCurrentInstruction(kSmulbb, kArithmetic);
2785   os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
2786   os() << " ";
2787   if (!rd.Is(rn) || !use_short_hand_form_) {
2788     os() << rd << ", ";
2789   }
2790   os() << rn << ", " << rm;
2791 }
2792 
smulbt(Condition cond,Register rd,Register rn,Register rm)2793 void Disassembler::smulbt(Condition cond,
2794                           Register rd,
2795                           Register rn,
2796                           Register rm) {
2797   os().SetCurrentInstruction(kSmulbt, kArithmetic);
2798   os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
2799   os() << " ";
2800   if (!rd.Is(rn) || !use_short_hand_form_) {
2801     os() << rd << ", ";
2802   }
2803   os() << rn << ", " << rm;
2804 }
2805 
smull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2806 void Disassembler::smull(
2807     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2808   os().SetCurrentInstruction(kSmull, kArithmetic);
2809   os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
2810        << ", " << rdhi << ", " << rn << ", " << rm;
2811 }
2812 
smulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2813 void Disassembler::smulls(
2814     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2815   os().SetCurrentInstruction(kSmulls, kArithmetic);
2816   os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
2817        << ", " << rdhi << ", " << rn << ", " << rm;
2818 }
2819 
smultb(Condition cond,Register rd,Register rn,Register rm)2820 void Disassembler::smultb(Condition cond,
2821                           Register rd,
2822                           Register rn,
2823                           Register rm) {
2824   os().SetCurrentInstruction(kSmultb, kArithmetic);
2825   os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
2826   os() << " ";
2827   if (!rd.Is(rn) || !use_short_hand_form_) {
2828     os() << rd << ", ";
2829   }
2830   os() << rn << ", " << rm;
2831 }
2832 
smultt(Condition cond,Register rd,Register rn,Register rm)2833 void Disassembler::smultt(Condition cond,
2834                           Register rd,
2835                           Register rn,
2836                           Register rm) {
2837   os().SetCurrentInstruction(kSmultt, kArithmetic);
2838   os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
2839   os() << " ";
2840   if (!rd.Is(rn) || !use_short_hand_form_) {
2841     os() << rd << ", ";
2842   }
2843   os() << rn << ", " << rm;
2844 }
2845 
smulwb(Condition cond,Register rd,Register rn,Register rm)2846 void Disassembler::smulwb(Condition cond,
2847                           Register rd,
2848                           Register rn,
2849                           Register rm) {
2850   os().SetCurrentInstruction(kSmulwb, kArithmetic);
2851   os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
2852   os() << " ";
2853   if (!rd.Is(rn) || !use_short_hand_form_) {
2854     os() << rd << ", ";
2855   }
2856   os() << rn << ", " << rm;
2857 }
2858 
smulwt(Condition cond,Register rd,Register rn,Register rm)2859 void Disassembler::smulwt(Condition cond,
2860                           Register rd,
2861                           Register rn,
2862                           Register rm) {
2863   os().SetCurrentInstruction(kSmulwt, kArithmetic);
2864   os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
2865   os() << " ";
2866   if (!rd.Is(rn) || !use_short_hand_form_) {
2867     os() << rd << ", ";
2868   }
2869   os() << rn << ", " << rm;
2870 }
2871 
smusd(Condition cond,Register rd,Register rn,Register rm)2872 void Disassembler::smusd(Condition cond,
2873                          Register rd,
2874                          Register rn,
2875                          Register rm) {
2876   os().SetCurrentInstruction(kSmusd, kArithmetic);
2877   os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
2878   os() << " ";
2879   if (!rd.Is(rn) || !use_short_hand_form_) {
2880     os() << rd << ", ";
2881   }
2882   os() << rn << ", " << rm;
2883 }
2884 
smusdx(Condition cond,Register rd,Register rn,Register rm)2885 void Disassembler::smusdx(Condition cond,
2886                           Register rd,
2887                           Register rn,
2888                           Register rm) {
2889   os().SetCurrentInstruction(kSmusdx, kArithmetic);
2890   os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
2891   os() << " ";
2892   if (!rd.Is(rn) || !use_short_hand_form_) {
2893     os() << rd << ", ";
2894   }
2895   os() << rn << ", " << rm;
2896 }
2897 
ssat(Condition cond,Register rd,uint32_t imm,const Operand & operand)2898 void Disassembler::ssat(Condition cond,
2899                         Register rd,
2900                         uint32_t imm,
2901                         const Operand& operand) {
2902   os().SetCurrentInstruction(kSsat, kArithmetic);
2903   os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
2904        << ", " << ImmediatePrinter(imm) << ", " << operand;
2905 }
2906 
ssat16(Condition cond,Register rd,uint32_t imm,Register rn)2907 void Disassembler::ssat16(Condition cond,
2908                           Register rd,
2909                           uint32_t imm,
2910                           Register rn) {
2911   os().SetCurrentInstruction(kSsat16, kArithmetic);
2912   os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
2913        << ", " << ImmediatePrinter(imm) << ", " << rn;
2914 }
2915 
ssax(Condition cond,Register rd,Register rn,Register rm)2916 void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
2917   os().SetCurrentInstruction(kSsax, kArithmetic);
2918   os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
2919   os() << " ";
2920   if (!rd.Is(rn) || !use_short_hand_form_) {
2921     os() << rd << ", ";
2922   }
2923   os() << rn << ", " << rm;
2924 }
2925 
ssub16(Condition cond,Register rd,Register rn,Register rm)2926 void Disassembler::ssub16(Condition cond,
2927                           Register rd,
2928                           Register rn,
2929                           Register rm) {
2930   os().SetCurrentInstruction(kSsub16, kArithmetic);
2931   os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
2932   os() << " ";
2933   if (!rd.Is(rn) || !use_short_hand_form_) {
2934     os() << rd << ", ";
2935   }
2936   os() << rn << ", " << rm;
2937 }
2938 
ssub8(Condition cond,Register rd,Register rn,Register rm)2939 void Disassembler::ssub8(Condition cond,
2940                          Register rd,
2941                          Register rn,
2942                          Register rm) {
2943   os().SetCurrentInstruction(kSsub8, kArithmetic);
2944   os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
2945   os() << " ";
2946   if (!rd.Is(rn) || !use_short_hand_form_) {
2947     os() << rd << ", ";
2948   }
2949   os() << rn << ", " << rm;
2950 }
2951 
stl(Condition cond,Register rt,const MemOperand & operand)2952 void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
2953   os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
2954   os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
2955        << ", " << PrintMemOperand(kStoreWordLocation, operand);
2956 }
2957 
stlb(Condition cond,Register rt,const MemOperand & operand)2958 void Disassembler::stlb(Condition cond,
2959                         Register rt,
2960                         const MemOperand& operand) {
2961   os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
2962   os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
2963        << ", " << PrintMemOperand(kStoreByteLocation, operand);
2964 }
2965 
stlex(Condition cond,Register rd,Register rt,const MemOperand & operand)2966 void Disassembler::stlex(Condition cond,
2967                          Register rd,
2968                          Register rt,
2969                          const MemOperand& operand) {
2970   os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
2971   os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
2972        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
2973 }
2974 
stlexb(Condition cond,Register rd,Register rt,const MemOperand & operand)2975 void Disassembler::stlexb(Condition cond,
2976                           Register rd,
2977                           Register rt,
2978                           const MemOperand& operand) {
2979   os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
2980   os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
2981        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
2982 }
2983 
stlexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)2984 void Disassembler::stlexd(Condition cond,
2985                           Register rd,
2986                           Register rt,
2987                           Register rt2,
2988                           const MemOperand& operand) {
2989   os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
2990   os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
2991        << ", " << rt << ", " << rt2 << ", "
2992        << PrintMemOperand(kStoreDoubleWordLocation, operand);
2993 }
2994 
stlexh(Condition cond,Register rd,Register rt,const MemOperand & operand)2995 void Disassembler::stlexh(Condition cond,
2996                           Register rd,
2997                           Register rt,
2998                           const MemOperand& operand) {
2999   os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
3000   os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
3001        << ", " << rt << ", "
3002        << PrintMemOperand(kStoreHalfWordLocation, operand);
3003 }
3004 
stlh(Condition cond,Register rt,const MemOperand & operand)3005 void Disassembler::stlh(Condition cond,
3006                         Register rt,
3007                         const MemOperand& operand) {
3008   os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
3009   os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
3010        << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
3011 }
3012 
stm(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)3013 void Disassembler::stm(Condition cond,
3014                        EncodingSize size,
3015                        Register rn,
3016                        WriteBack write_back,
3017                        RegisterList registers) {
3018   os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
3019   os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
3020        << rn << write_back << ", " << registers;
3021 }
3022 
stmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3023 void Disassembler::stmda(Condition cond,
3024                          Register rn,
3025                          WriteBack write_back,
3026                          RegisterList registers) {
3027   os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
3028   os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
3029        << write_back << ", " << registers;
3030 }
3031 
stmdb(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)3032 void Disassembler::stmdb(Condition cond,
3033                          EncodingSize size,
3034                          Register rn,
3035                          WriteBack write_back,
3036                          RegisterList registers) {
3037   os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
3038   os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
3039        << rn << write_back << ", " << registers;
3040 }
3041 
stmea(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)3042 void Disassembler::stmea(Condition cond,
3043                          EncodingSize size,
3044                          Register rn,
3045                          WriteBack write_back,
3046                          RegisterList registers) {
3047   os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
3048   os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
3049        << rn << write_back << ", " << registers;
3050 }
3051 
stmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3052 void Disassembler::stmed(Condition cond,
3053                          Register rn,
3054                          WriteBack write_back,
3055                          RegisterList registers) {
3056   os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
3057   os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
3058        << write_back << ", " << registers;
3059 }
3060 
stmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3061 void Disassembler::stmfa(Condition cond,
3062                          Register rn,
3063                          WriteBack write_back,
3064                          RegisterList registers) {
3065   os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
3066   os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
3067        << write_back << ", " << registers;
3068 }
3069 
stmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3070 void Disassembler::stmfd(Condition cond,
3071                          Register rn,
3072                          WriteBack write_back,
3073                          RegisterList registers) {
3074   os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
3075   os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
3076        << write_back << ", " << registers;
3077 }
3078 
stmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3079 void Disassembler::stmib(Condition cond,
3080                          Register rn,
3081                          WriteBack write_back,
3082                          RegisterList registers) {
3083   os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
3084   os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
3085        << write_back << ", " << registers;
3086 }
3087 
str(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)3088 void Disassembler::str(Condition cond,
3089                        EncodingSize size,
3090                        Register rt,
3091                        const MemOperand& operand) {
3092   os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
3093   os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
3094        << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
3095 }
3096 
strb(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)3097 void Disassembler::strb(Condition cond,
3098                         EncodingSize size,
3099                         Register rt,
3100                         const MemOperand& operand) {
3101   os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
3102   os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
3103        << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
3104 }
3105 
strd(Condition cond,Register rt,Register rt2,const MemOperand & operand)3106 void Disassembler::strd(Condition cond,
3107                         Register rt,
3108                         Register rt2,
3109                         const MemOperand& operand) {
3110   os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
3111   os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
3112        << ", " << rt2 << ", "
3113        << PrintMemOperand(kStoreDoubleWordLocation, operand);
3114 }
3115 
strex(Condition cond,Register rd,Register rt,const MemOperand & operand)3116 void Disassembler::strex(Condition cond,
3117                          Register rd,
3118                          Register rt,
3119                          const MemOperand& operand) {
3120   os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
3121   os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
3122        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
3123 }
3124 
strexb(Condition cond,Register rd,Register rt,const MemOperand & operand)3125 void Disassembler::strexb(Condition cond,
3126                           Register rd,
3127                           Register rt,
3128                           const MemOperand& operand) {
3129   os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
3130   os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
3131        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
3132 }
3133 
strexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)3134 void Disassembler::strexd(Condition cond,
3135                           Register rd,
3136                           Register rt,
3137                           Register rt2,
3138                           const MemOperand& operand) {
3139   os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
3140   os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
3141        << ", " << rt << ", " << rt2 << ", "
3142        << PrintMemOperand(kStoreDoubleWordLocation, operand);
3143 }
3144 
strexh(Condition cond,Register rd,Register rt,const MemOperand & operand)3145 void Disassembler::strexh(Condition cond,
3146                           Register rd,
3147                           Register rt,
3148                           const MemOperand& operand) {
3149   os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
3150   os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
3151        << ", " << rt << ", "
3152        << PrintMemOperand(kStoreHalfWordLocation, operand);
3153 }
3154 
strh(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)3155 void Disassembler::strh(Condition cond,
3156                         EncodingSize size,
3157                         Register rt,
3158                         const MemOperand& operand) {
3159   os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
3160   os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
3161        << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
3162 }
3163 
sub(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)3164 void Disassembler::sub(Condition cond,
3165                        EncodingSize size,
3166                        Register rd,
3167                        Register rn,
3168                        const Operand& operand) {
3169   os().SetCurrentInstruction(kSub, kArithmetic);
3170   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
3171   os() << " ";
3172   if (!rd.Is(rn) || !use_short_hand_form_) {
3173     os() << rd << ", ";
3174   }
3175   os() << rn << ", " << operand;
3176 }
3177 
sub(Condition cond,Register rd,const Operand & operand)3178 void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
3179   os().SetCurrentInstruction(kSub, kArithmetic);
3180   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
3181        << ", " << operand;
3182 }
3183 
subs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)3184 void Disassembler::subs(Condition cond,
3185                         EncodingSize size,
3186                         Register rd,
3187                         Register rn,
3188                         const Operand& operand) {
3189   os().SetCurrentInstruction(kSubs, kArithmetic);
3190   os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
3191   os() << " ";
3192   if (!rd.Is(rn) || !use_short_hand_form_) {
3193     os() << rd << ", ";
3194   }
3195   os() << rn << ", " << operand;
3196 }
3197 
subs(Register rd,const Operand & operand)3198 void Disassembler::subs(Register rd, const Operand& operand) {
3199   os().SetCurrentInstruction(kSubs, kArithmetic);
3200   os() << ToCString(kSubs) << " " << rd << ", " << operand;
3201 }
3202 
subw(Condition cond,Register rd,Register rn,const Operand & operand)3203 void Disassembler::subw(Condition cond,
3204                         Register rd,
3205                         Register rn,
3206                         const Operand& operand) {
3207   os().SetCurrentInstruction(kSubw, kArithmetic);
3208   os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
3209   os() << " ";
3210   if (!rd.Is(rn) || !use_short_hand_form_) {
3211     os() << rd << ", ";
3212   }
3213   os() << rn << ", " << operand;
3214 }
3215 
svc(Condition cond,uint32_t imm)3216 void Disassembler::svc(Condition cond, uint32_t imm) {
3217   os().SetCurrentInstruction(kSvc, kSystem);
3218   os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " "
3219        << RawImmediatePrinter(imm);
3220 }
3221 
sxtab(Condition cond,Register rd,Register rn,const Operand & operand)3222 void Disassembler::sxtab(Condition cond,
3223                          Register rd,
3224                          Register rn,
3225                          const Operand& operand) {
3226   os().SetCurrentInstruction(kSxtab, kArithmetic);
3227   os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
3228   os() << " ";
3229   if (!rd.Is(rn) || !use_short_hand_form_) {
3230     os() << rd << ", ";
3231   }
3232   os() << rn << ", " << operand;
3233 }
3234 
sxtab16(Condition cond,Register rd,Register rn,const Operand & operand)3235 void Disassembler::sxtab16(Condition cond,
3236                            Register rd,
3237                            Register rn,
3238                            const Operand& operand) {
3239   os().SetCurrentInstruction(kSxtab16, kArithmetic);
3240   os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
3241   os() << " ";
3242   if (!rd.Is(rn) || !use_short_hand_form_) {
3243     os() << rd << ", ";
3244   }
3245   os() << rn << ", " << operand;
3246 }
3247 
sxtah(Condition cond,Register rd,Register rn,const Operand & operand)3248 void Disassembler::sxtah(Condition cond,
3249                          Register rd,
3250                          Register rn,
3251                          const Operand& operand) {
3252   os().SetCurrentInstruction(kSxtah, kArithmetic);
3253   os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
3254   os() << " ";
3255   if (!rd.Is(rn) || !use_short_hand_form_) {
3256     os() << rd << ", ";
3257   }
3258   os() << rn << ", " << operand;
3259 }
3260 
sxtb(Condition cond,EncodingSize size,Register rd,const Operand & operand)3261 void Disassembler::sxtb(Condition cond,
3262                         EncodingSize size,
3263                         Register rd,
3264                         const Operand& operand) {
3265   os().SetCurrentInstruction(kSxtb, kArithmetic);
3266   os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
3267   os() << " ";
3268   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3269     os() << rd << ", ";
3270   }
3271   os() << operand;
3272 }
3273 
sxtb16(Condition cond,Register rd,const Operand & operand)3274 void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
3275   os().SetCurrentInstruction(kSxtb16, kArithmetic);
3276   os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
3277   os() << " ";
3278   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3279     os() << rd << ", ";
3280   }
3281   os() << operand;
3282 }
3283 
sxth(Condition cond,EncodingSize size,Register rd,const Operand & operand)3284 void Disassembler::sxth(Condition cond,
3285                         EncodingSize size,
3286                         Register rd,
3287                         const Operand& operand) {
3288   os().SetCurrentInstruction(kSxth, kArithmetic);
3289   os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
3290   os() << " ";
3291   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3292     os() << rd << ", ";
3293   }
3294   os() << operand;
3295 }
3296 
tbb(Condition cond,Register rn,Register rm)3297 void Disassembler::tbb(Condition cond, Register rn, Register rm) {
3298   os().SetCurrentInstruction(kTbb, kBranch);
3299   os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
3300        << MemOperand(rn, rm);
3301 }
3302 
tbh(Condition cond,Register rn,Register rm)3303 void Disassembler::tbh(Condition cond, Register rn, Register rm) {
3304   os().SetCurrentInstruction(kTbh, kBranch);
3305   os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
3306        << MemOperand(rn, plus, rm, LSL, 1);
3307 }
3308 
teq(Condition cond,Register rn,const Operand & operand)3309 void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
3310   os().SetCurrentInstruction(kTeq, kBitwise);
3311   os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
3312        << ", " << operand;
3313 }
3314 
tst(Condition cond,EncodingSize size,Register rn,const Operand & operand)3315 void Disassembler::tst(Condition cond,
3316                        EncodingSize size,
3317                        Register rn,
3318                        const Operand& operand) {
3319   os().SetCurrentInstruction(kTst, kBitwise);
3320   os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
3321        << rn << ", " << operand;
3322 }
3323 
uadd16(Condition cond,Register rd,Register rn,Register rm)3324 void Disassembler::uadd16(Condition cond,
3325                           Register rd,
3326                           Register rn,
3327                           Register rm) {
3328   os().SetCurrentInstruction(kUadd16, kArithmetic);
3329   os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
3330   os() << " ";
3331   if (!rd.Is(rn) || !use_short_hand_form_) {
3332     os() << rd << ", ";
3333   }
3334   os() << rn << ", " << rm;
3335 }
3336 
uadd8(Condition cond,Register rd,Register rn,Register rm)3337 void Disassembler::uadd8(Condition cond,
3338                          Register rd,
3339                          Register rn,
3340                          Register rm) {
3341   os().SetCurrentInstruction(kUadd8, kArithmetic);
3342   os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
3343   os() << " ";
3344   if (!rd.Is(rn) || !use_short_hand_form_) {
3345     os() << rd << ", ";
3346   }
3347   os() << rn << ", " << rm;
3348 }
3349 
uasx(Condition cond,Register rd,Register rn,Register rm)3350 void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
3351   os().SetCurrentInstruction(kUasx, kArithmetic);
3352   os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
3353   os() << " ";
3354   if (!rd.Is(rn) || !use_short_hand_form_) {
3355     os() << rd << ", ";
3356   }
3357   os() << rn << ", " << rm;
3358 }
3359 
ubfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)3360 void Disassembler::ubfx(
3361     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
3362   os().SetCurrentInstruction(kUbfx, kShift);
3363   os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
3364        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
3365        << ImmediatePrinter(width);
3366 }
3367 
udf(Condition cond,EncodingSize size,uint32_t imm)3368 void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
3369   os().SetCurrentInstruction(kUdf, kNoAttribute);
3370   os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
3371        << RawImmediatePrinter(imm);
3372 }
3373 
udiv(Condition cond,Register rd,Register rn,Register rm)3374 void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
3375   os().SetCurrentInstruction(kUdiv, kArithmetic);
3376   os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
3377   os() << " ";
3378   if (!rd.Is(rn) || !use_short_hand_form_) {
3379     os() << rd << ", ";
3380   }
3381   os() << rn << ", " << rm;
3382 }
3383 
uhadd16(Condition cond,Register rd,Register rn,Register rm)3384 void Disassembler::uhadd16(Condition cond,
3385                            Register rd,
3386                            Register rn,
3387                            Register rm) {
3388   os().SetCurrentInstruction(kUhadd16, kArithmetic);
3389   os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
3390   os() << " ";
3391   if (!rd.Is(rn) || !use_short_hand_form_) {
3392     os() << rd << ", ";
3393   }
3394   os() << rn << ", " << rm;
3395 }
3396 
uhadd8(Condition cond,Register rd,Register rn,Register rm)3397 void Disassembler::uhadd8(Condition cond,
3398                           Register rd,
3399                           Register rn,
3400                           Register rm) {
3401   os().SetCurrentInstruction(kUhadd8, kArithmetic);
3402   os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
3403   os() << " ";
3404   if (!rd.Is(rn) || !use_short_hand_form_) {
3405     os() << rd << ", ";
3406   }
3407   os() << rn << ", " << rm;
3408 }
3409 
uhasx(Condition cond,Register rd,Register rn,Register rm)3410 void Disassembler::uhasx(Condition cond,
3411                          Register rd,
3412                          Register rn,
3413                          Register rm) {
3414   os().SetCurrentInstruction(kUhasx, kArithmetic);
3415   os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
3416   os() << " ";
3417   if (!rd.Is(rn) || !use_short_hand_form_) {
3418     os() << rd << ", ";
3419   }
3420   os() << rn << ", " << rm;
3421 }
3422 
uhsax(Condition cond,Register rd,Register rn,Register rm)3423 void Disassembler::uhsax(Condition cond,
3424                          Register rd,
3425                          Register rn,
3426                          Register rm) {
3427   os().SetCurrentInstruction(kUhsax, kArithmetic);
3428   os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
3429   os() << " ";
3430   if (!rd.Is(rn) || !use_short_hand_form_) {
3431     os() << rd << ", ";
3432   }
3433   os() << rn << ", " << rm;
3434 }
3435 
uhsub16(Condition cond,Register rd,Register rn,Register rm)3436 void Disassembler::uhsub16(Condition cond,
3437                            Register rd,
3438                            Register rn,
3439                            Register rm) {
3440   os().SetCurrentInstruction(kUhsub16, kArithmetic);
3441   os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
3442   os() << " ";
3443   if (!rd.Is(rn) || !use_short_hand_form_) {
3444     os() << rd << ", ";
3445   }
3446   os() << rn << ", " << rm;
3447 }
3448 
uhsub8(Condition cond,Register rd,Register rn,Register rm)3449 void Disassembler::uhsub8(Condition cond,
3450                           Register rd,
3451                           Register rn,
3452                           Register rm) {
3453   os().SetCurrentInstruction(kUhsub8, kArithmetic);
3454   os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
3455   os() << " ";
3456   if (!rd.Is(rn) || !use_short_hand_form_) {
3457     os() << rd << ", ";
3458   }
3459   os() << rn << ", " << rm;
3460 }
3461 
umaal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3462 void Disassembler::umaal(
3463     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3464   os().SetCurrentInstruction(kUmaal, kArithmetic);
3465   os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
3466        << ", " << rdhi << ", " << rn << ", " << rm;
3467 }
3468 
umlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3469 void Disassembler::umlal(
3470     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3471   os().SetCurrentInstruction(kUmlal, kArithmetic);
3472   os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
3473        << ", " << rdhi << ", " << rn << ", " << rm;
3474 }
3475 
umlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3476 void Disassembler::umlals(
3477     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3478   os().SetCurrentInstruction(kUmlals, kArithmetic);
3479   os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
3480        << ", " << rdhi << ", " << rn << ", " << rm;
3481 }
3482 
umull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3483 void Disassembler::umull(
3484     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3485   os().SetCurrentInstruction(kUmull, kArithmetic);
3486   os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
3487        << ", " << rdhi << ", " << rn << ", " << rm;
3488 }
3489 
umulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3490 void Disassembler::umulls(
3491     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3492   os().SetCurrentInstruction(kUmulls, kArithmetic);
3493   os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
3494        << ", " << rdhi << ", " << rn << ", " << rm;
3495 }
3496 
uqadd16(Condition cond,Register rd,Register rn,Register rm)3497 void Disassembler::uqadd16(Condition cond,
3498                            Register rd,
3499                            Register rn,
3500                            Register rm) {
3501   os().SetCurrentInstruction(kUqadd16, kArithmetic);
3502   os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
3503   os() << " ";
3504   if (!rd.Is(rn) || !use_short_hand_form_) {
3505     os() << rd << ", ";
3506   }
3507   os() << rn << ", " << rm;
3508 }
3509 
uqadd8(Condition cond,Register rd,Register rn,Register rm)3510 void Disassembler::uqadd8(Condition cond,
3511                           Register rd,
3512                           Register rn,
3513                           Register rm) {
3514   os().SetCurrentInstruction(kUqadd8, kArithmetic);
3515   os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
3516   os() << " ";
3517   if (!rd.Is(rn) || !use_short_hand_form_) {
3518     os() << rd << ", ";
3519   }
3520   os() << rn << ", " << rm;
3521 }
3522 
uqasx(Condition cond,Register rd,Register rn,Register rm)3523 void Disassembler::uqasx(Condition cond,
3524                          Register rd,
3525                          Register rn,
3526                          Register rm) {
3527   os().SetCurrentInstruction(kUqasx, kArithmetic);
3528   os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
3529   os() << " ";
3530   if (!rd.Is(rn) || !use_short_hand_form_) {
3531     os() << rd << ", ";
3532   }
3533   os() << rn << ", " << rm;
3534 }
3535 
uqsax(Condition cond,Register rd,Register rn,Register rm)3536 void Disassembler::uqsax(Condition cond,
3537                          Register rd,
3538                          Register rn,
3539                          Register rm) {
3540   os().SetCurrentInstruction(kUqsax, kArithmetic);
3541   os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
3542   os() << " ";
3543   if (!rd.Is(rn) || !use_short_hand_form_) {
3544     os() << rd << ", ";
3545   }
3546   os() << rn << ", " << rm;
3547 }
3548 
uqsub16(Condition cond,Register rd,Register rn,Register rm)3549 void Disassembler::uqsub16(Condition cond,
3550                            Register rd,
3551                            Register rn,
3552                            Register rm) {
3553   os().SetCurrentInstruction(kUqsub16, kArithmetic);
3554   os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
3555   os() << " ";
3556   if (!rd.Is(rn) || !use_short_hand_form_) {
3557     os() << rd << ", ";
3558   }
3559   os() << rn << ", " << rm;
3560 }
3561 
uqsub8(Condition cond,Register rd,Register rn,Register rm)3562 void Disassembler::uqsub8(Condition cond,
3563                           Register rd,
3564                           Register rn,
3565                           Register rm) {
3566   os().SetCurrentInstruction(kUqsub8, kArithmetic);
3567   os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
3568   os() << " ";
3569   if (!rd.Is(rn) || !use_short_hand_form_) {
3570     os() << rd << ", ";
3571   }
3572   os() << rn << ", " << rm;
3573 }
3574 
usad8(Condition cond,Register rd,Register rn,Register rm)3575 void Disassembler::usad8(Condition cond,
3576                          Register rd,
3577                          Register rn,
3578                          Register rm) {
3579   os().SetCurrentInstruction(kUsad8, kArithmetic);
3580   os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
3581   os() << " ";
3582   if (!rd.Is(rn) || !use_short_hand_form_) {
3583     os() << rd << ", ";
3584   }
3585   os() << rn << ", " << rm;
3586 }
3587 
usada8(Condition cond,Register rd,Register rn,Register rm,Register ra)3588 void Disassembler::usada8(
3589     Condition cond, Register rd, Register rn, Register rm, Register ra) {
3590   os().SetCurrentInstruction(kUsada8, kArithmetic);
3591   os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
3592        << ", " << rn << ", " << rm << ", " << ra;
3593 }
3594 
usat(Condition cond,Register rd,uint32_t imm,const Operand & operand)3595 void Disassembler::usat(Condition cond,
3596                         Register rd,
3597                         uint32_t imm,
3598                         const Operand& operand) {
3599   os().SetCurrentInstruction(kUsat, kArithmetic);
3600   os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
3601        << ", " << ImmediatePrinter(imm) << ", " << operand;
3602 }
3603 
usat16(Condition cond,Register rd,uint32_t imm,Register rn)3604 void Disassembler::usat16(Condition cond,
3605                           Register rd,
3606                           uint32_t imm,
3607                           Register rn) {
3608   os().SetCurrentInstruction(kUsat16, kArithmetic);
3609   os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
3610        << ", " << ImmediatePrinter(imm) << ", " << rn;
3611 }
3612 
usax(Condition cond,Register rd,Register rn,Register rm)3613 void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
3614   os().SetCurrentInstruction(kUsax, kArithmetic);
3615   os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
3616   os() << " ";
3617   if (!rd.Is(rn) || !use_short_hand_form_) {
3618     os() << rd << ", ";
3619   }
3620   os() << rn << ", " << rm;
3621 }
3622 
usub16(Condition cond,Register rd,Register rn,Register rm)3623 void Disassembler::usub16(Condition cond,
3624                           Register rd,
3625                           Register rn,
3626                           Register rm) {
3627   os().SetCurrentInstruction(kUsub16, kArithmetic);
3628   os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
3629   os() << " ";
3630   if (!rd.Is(rn) || !use_short_hand_form_) {
3631     os() << rd << ", ";
3632   }
3633   os() << rn << ", " << rm;
3634 }
3635 
usub8(Condition cond,Register rd,Register rn,Register rm)3636 void Disassembler::usub8(Condition cond,
3637                          Register rd,
3638                          Register rn,
3639                          Register rm) {
3640   os().SetCurrentInstruction(kUsub8, kArithmetic);
3641   os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
3642   os() << " ";
3643   if (!rd.Is(rn) || !use_short_hand_form_) {
3644     os() << rd << ", ";
3645   }
3646   os() << rn << ", " << rm;
3647 }
3648 
uxtab(Condition cond,Register rd,Register rn,const Operand & operand)3649 void Disassembler::uxtab(Condition cond,
3650                          Register rd,
3651                          Register rn,
3652                          const Operand& operand) {
3653   os().SetCurrentInstruction(kUxtab, kArithmetic);
3654   os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
3655   os() << " ";
3656   if (!rd.Is(rn) || !use_short_hand_form_) {
3657     os() << rd << ", ";
3658   }
3659   os() << rn << ", " << operand;
3660 }
3661 
uxtab16(Condition cond,Register rd,Register rn,const Operand & operand)3662 void Disassembler::uxtab16(Condition cond,
3663                            Register rd,
3664                            Register rn,
3665                            const Operand& operand) {
3666   os().SetCurrentInstruction(kUxtab16, kArithmetic);
3667   os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
3668   os() << " ";
3669   if (!rd.Is(rn) || !use_short_hand_form_) {
3670     os() << rd << ", ";
3671   }
3672   os() << rn << ", " << operand;
3673 }
3674 
uxtah(Condition cond,Register rd,Register rn,const Operand & operand)3675 void Disassembler::uxtah(Condition cond,
3676                          Register rd,
3677                          Register rn,
3678                          const Operand& operand) {
3679   os().SetCurrentInstruction(kUxtah, kArithmetic);
3680   os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
3681   os() << " ";
3682   if (!rd.Is(rn) || !use_short_hand_form_) {
3683     os() << rd << ", ";
3684   }
3685   os() << rn << ", " << operand;
3686 }
3687 
uxtb(Condition cond,EncodingSize size,Register rd,const Operand & operand)3688 void Disassembler::uxtb(Condition cond,
3689                         EncodingSize size,
3690                         Register rd,
3691                         const Operand& operand) {
3692   os().SetCurrentInstruction(kUxtb, kArithmetic);
3693   os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
3694   os() << " ";
3695   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3696     os() << rd << ", ";
3697   }
3698   os() << operand;
3699 }
3700 
uxtb16(Condition cond,Register rd,const Operand & operand)3701 void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
3702   os().SetCurrentInstruction(kUxtb16, kArithmetic);
3703   os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
3704   os() << " ";
3705   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3706     os() << rd << ", ";
3707   }
3708   os() << operand;
3709 }
3710 
uxth(Condition cond,EncodingSize size,Register rd,const Operand & operand)3711 void Disassembler::uxth(Condition cond,
3712                         EncodingSize size,
3713                         Register rd,
3714                         const Operand& operand) {
3715   os().SetCurrentInstruction(kUxth, kArithmetic);
3716   os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
3717   os() << " ";
3718   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3719     os() << rd << ", ";
3720   }
3721   os() << operand;
3722 }
3723 
vaba(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3724 void Disassembler::vaba(
3725     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3726   os().SetCurrentInstruction(kVaba, kFpNeon);
3727   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
3728        << rd << ", " << rn << ", " << rm;
3729 }
3730 
vaba(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3731 void Disassembler::vaba(
3732     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3733   os().SetCurrentInstruction(kVaba, kFpNeon);
3734   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
3735        << rd << ", " << rn << ", " << rm;
3736 }
3737 
vabal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)3738 void Disassembler::vabal(
3739     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3740   os().SetCurrentInstruction(kVabal, kFpNeon);
3741   os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
3742        << rd << ", " << rn << ", " << rm;
3743 }
3744 
vabd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3745 void Disassembler::vabd(
3746     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3747   os().SetCurrentInstruction(kVabd, kFpNeon);
3748   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
3749   os() << " ";
3750   if (!rd.Is(rn) || !use_short_hand_form_) {
3751     os() << rd << ", ";
3752   }
3753   os() << rn << ", " << rm;
3754 }
3755 
vabd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3756 void Disassembler::vabd(
3757     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3758   os().SetCurrentInstruction(kVabd, kFpNeon);
3759   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
3760   os() << " ";
3761   if (!rd.Is(rn) || !use_short_hand_form_) {
3762     os() << rd << ", ";
3763   }
3764   os() << rn << ", " << rm;
3765 }
3766 
vabdl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)3767 void Disassembler::vabdl(
3768     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3769   os().SetCurrentInstruction(kVabdl, kFpNeon);
3770   os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
3771        << rd << ", " << rn << ", " << rm;
3772 }
3773 
vabs(Condition cond,DataType dt,DRegister rd,DRegister rm)3774 void Disassembler::vabs(Condition cond,
3775                         DataType dt,
3776                         DRegister rd,
3777                         DRegister rm) {
3778   os().SetCurrentInstruction(kVabs, kFpNeon);
3779   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3780        << rd << ", " << rm;
3781 }
3782 
vabs(Condition cond,DataType dt,QRegister rd,QRegister rm)3783 void Disassembler::vabs(Condition cond,
3784                         DataType dt,
3785                         QRegister rd,
3786                         QRegister rm) {
3787   os().SetCurrentInstruction(kVabs, kFpNeon);
3788   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3789        << rd << ", " << rm;
3790 }
3791 
vabs(Condition cond,DataType dt,SRegister rd,SRegister rm)3792 void Disassembler::vabs(Condition cond,
3793                         DataType dt,
3794                         SRegister rd,
3795                         SRegister rm) {
3796   os().SetCurrentInstruction(kVabs, kFpNeon);
3797   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3798        << rd << ", " << rm;
3799 }
3800 
vacge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3801 void Disassembler::vacge(
3802     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3803   os().SetCurrentInstruction(kVacge, kFpNeon);
3804   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
3805   os() << " ";
3806   if (!rd.Is(rn) || !use_short_hand_form_) {
3807     os() << rd << ", ";
3808   }
3809   os() << rn << ", " << rm;
3810 }
3811 
vacge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3812 void Disassembler::vacge(
3813     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3814   os().SetCurrentInstruction(kVacge, kFpNeon);
3815   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
3816   os() << " ";
3817   if (!rd.Is(rn) || !use_short_hand_form_) {
3818     os() << rd << ", ";
3819   }
3820   os() << rn << ", " << rm;
3821 }
3822 
vacgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3823 void Disassembler::vacgt(
3824     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3825   os().SetCurrentInstruction(kVacgt, kFpNeon);
3826   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
3827   os() << " ";
3828   if (!rd.Is(rn) || !use_short_hand_form_) {
3829     os() << rd << ", ";
3830   }
3831   os() << rn << ", " << rm;
3832 }
3833 
vacgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3834 void Disassembler::vacgt(
3835     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3836   os().SetCurrentInstruction(kVacgt, kFpNeon);
3837   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
3838   os() << " ";
3839   if (!rd.Is(rn) || !use_short_hand_form_) {
3840     os() << rd << ", ";
3841   }
3842   os() << rn << ", " << rm;
3843 }
3844 
vacle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3845 void Disassembler::vacle(
3846     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3847   os().SetCurrentInstruction(kVacle, kFpNeon);
3848   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
3849   os() << " ";
3850   if (!rd.Is(rn) || !use_short_hand_form_) {
3851     os() << rd << ", ";
3852   }
3853   os() << rn << ", " << rm;
3854 }
3855 
vacle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3856 void Disassembler::vacle(
3857     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3858   os().SetCurrentInstruction(kVacle, kFpNeon);
3859   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
3860   os() << " ";
3861   if (!rd.Is(rn) || !use_short_hand_form_) {
3862     os() << rd << ", ";
3863   }
3864   os() << rn << ", " << rm;
3865 }
3866 
vaclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3867 void Disassembler::vaclt(
3868     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3869   os().SetCurrentInstruction(kVaclt, kFpNeon);
3870   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
3871   os() << " ";
3872   if (!rd.Is(rn) || !use_short_hand_form_) {
3873     os() << rd << ", ";
3874   }
3875   os() << rn << ", " << rm;
3876 }
3877 
vaclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3878 void Disassembler::vaclt(
3879     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3880   os().SetCurrentInstruction(kVaclt, kFpNeon);
3881   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
3882   os() << " ";
3883   if (!rd.Is(rn) || !use_short_hand_form_) {
3884     os() << rd << ", ";
3885   }
3886   os() << rn << ", " << rm;
3887 }
3888 
vadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3889 void Disassembler::vadd(
3890     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3891   os().SetCurrentInstruction(kVadd, kFpNeon);
3892   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3893   os() << " ";
3894   if (!rd.Is(rn) || !use_short_hand_form_) {
3895     os() << rd << ", ";
3896   }
3897   os() << rn << ", " << rm;
3898 }
3899 
vadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3900 void Disassembler::vadd(
3901     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3902   os().SetCurrentInstruction(kVadd, kFpNeon);
3903   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3904   os() << " ";
3905   if (!rd.Is(rn) || !use_short_hand_form_) {
3906     os() << rd << ", ";
3907   }
3908   os() << rn << ", " << rm;
3909 }
3910 
vadd(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)3911 void Disassembler::vadd(
3912     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
3913   os().SetCurrentInstruction(kVadd, kFpNeon);
3914   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3915   os() << " ";
3916   if (!rd.Is(rn) || !use_short_hand_form_) {
3917     os() << rd << ", ";
3918   }
3919   os() << rn << ", " << rm;
3920 }
3921 
vaddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)3922 void Disassembler::vaddhn(
3923     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
3924   os().SetCurrentInstruction(kVaddhn, kFpNeon);
3925   os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
3926        << rd << ", " << rn << ", " << rm;
3927 }
3928 
vaddl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)3929 void Disassembler::vaddl(
3930     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3931   os().SetCurrentInstruction(kVaddl, kFpNeon);
3932   os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
3933        << rd << ", " << rn << ", " << rm;
3934 }
3935 
vaddw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)3936 void Disassembler::vaddw(
3937     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
3938   os().SetCurrentInstruction(kVaddw, kFpNeon);
3939   os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
3940   os() << " ";
3941   if (!rd.Is(rn) || !use_short_hand_form_) {
3942     os() << rd << ", ";
3943   }
3944   os() << rn << ", " << rm;
3945 }
3946 
vand(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)3947 void Disassembler::vand(Condition cond,
3948                         DataType dt,
3949                         DRegister rd,
3950                         DRegister rn,
3951                         const DOperand& operand) {
3952   os().SetCurrentInstruction(kVand, kFpNeon);
3953   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
3954   os() << " ";
3955   if (!rd.Is(rn) || !use_short_hand_form_) {
3956     os() << rd << ", ";
3957   }
3958   os() << rn << ", " << operand;
3959 }
3960 
vand(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)3961 void Disassembler::vand(Condition cond,
3962                         DataType dt,
3963                         QRegister rd,
3964                         QRegister rn,
3965                         const QOperand& operand) {
3966   os().SetCurrentInstruction(kVand, kFpNeon);
3967   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
3968   os() << " ";
3969   if (!rd.Is(rn) || !use_short_hand_form_) {
3970     os() << rd << ", ";
3971   }
3972   os() << rn << ", " << operand;
3973 }
3974 
vbic(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)3975 void Disassembler::vbic(Condition cond,
3976                         DataType dt,
3977                         DRegister rd,
3978                         DRegister rn,
3979                         const DOperand& operand) {
3980   os().SetCurrentInstruction(kVbic, kFpNeon);
3981   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
3982   os() << " ";
3983   if (!rd.Is(rn) || !use_short_hand_form_) {
3984     os() << rd << ", ";
3985   }
3986   os() << rn << ", " << operand;
3987 }
3988 
vbic(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)3989 void Disassembler::vbic(Condition cond,
3990                         DataType dt,
3991                         QRegister rd,
3992                         QRegister rn,
3993                         const QOperand& operand) {
3994   os().SetCurrentInstruction(kVbic, kFpNeon);
3995   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
3996   os() << " ";
3997   if (!rd.Is(rn) || !use_short_hand_form_) {
3998     os() << rd << ", ";
3999   }
4000   os() << rn << ", " << operand;
4001 }
4002 
vbif(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4003 void Disassembler::vbif(
4004     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4005   os().SetCurrentInstruction(kVbif, kFpNeon);
4006   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
4007   os() << " ";
4008   if (!rd.Is(rn) || !use_short_hand_form_) {
4009     os() << rd << ", ";
4010   }
4011   os() << rn << ", " << rm;
4012 }
4013 
vbif(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4014 void Disassembler::vbif(
4015     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4016   os().SetCurrentInstruction(kVbif, kFpNeon);
4017   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
4018   os() << " ";
4019   if (!rd.Is(rn) || !use_short_hand_form_) {
4020     os() << rd << ", ";
4021   }
4022   os() << rn << ", " << rm;
4023 }
4024 
vbit(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4025 void Disassembler::vbit(
4026     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4027   os().SetCurrentInstruction(kVbit, kFpNeon);
4028   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
4029   os() << " ";
4030   if (!rd.Is(rn) || !use_short_hand_form_) {
4031     os() << rd << ", ";
4032   }
4033   os() << rn << ", " << rm;
4034 }
4035 
vbit(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4036 void Disassembler::vbit(
4037     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4038   os().SetCurrentInstruction(kVbit, kFpNeon);
4039   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
4040   os() << " ";
4041   if (!rd.Is(rn) || !use_short_hand_form_) {
4042     os() << rd << ", ";
4043   }
4044   os() << rn << ", " << rm;
4045 }
4046 
vbsl(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4047 void Disassembler::vbsl(
4048     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4049   os().SetCurrentInstruction(kVbsl, kFpNeon);
4050   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
4051   os() << " ";
4052   if (!rd.Is(rn) || !use_short_hand_form_) {
4053     os() << rd << ", ";
4054   }
4055   os() << rn << ", " << rm;
4056 }
4057 
vbsl(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4058 void Disassembler::vbsl(
4059     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4060   os().SetCurrentInstruction(kVbsl, kFpNeon);
4061   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
4062   os() << " ";
4063   if (!rd.Is(rn) || !use_short_hand_form_) {
4064     os() << rd << ", ";
4065   }
4066   os() << rn << ", " << rm;
4067 }
4068 
vceq(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4069 void Disassembler::vceq(Condition cond,
4070                         DataType dt,
4071                         DRegister rd,
4072                         DRegister rm,
4073                         const DOperand& operand) {
4074   os().SetCurrentInstruction(kVceq, kFpNeon);
4075   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4076   os() << " ";
4077   if (!rd.Is(rm) || !use_short_hand_form_) {
4078     os() << rd << ", ";
4079   }
4080   os() << rm << ", " << operand;
4081 }
4082 
vceq(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4083 void Disassembler::vceq(Condition cond,
4084                         DataType dt,
4085                         QRegister rd,
4086                         QRegister rm,
4087                         const QOperand& operand) {
4088   os().SetCurrentInstruction(kVceq, kFpNeon);
4089   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4090   os() << " ";
4091   if (!rd.Is(rm) || !use_short_hand_form_) {
4092     os() << rd << ", ";
4093   }
4094   os() << rm << ", " << operand;
4095 }
4096 
vceq(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4097 void Disassembler::vceq(
4098     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4099   os().SetCurrentInstruction(kVceq, kFpNeon);
4100   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4101   os() << " ";
4102   if (!rd.Is(rn) || !use_short_hand_form_) {
4103     os() << rd << ", ";
4104   }
4105   os() << rn << ", " << rm;
4106 }
4107 
vceq(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4108 void Disassembler::vceq(
4109     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4110   os().SetCurrentInstruction(kVceq, kFpNeon);
4111   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4112   os() << " ";
4113   if (!rd.Is(rn) || !use_short_hand_form_) {
4114     os() << rd << ", ";
4115   }
4116   os() << rn << ", " << rm;
4117 }
4118 
vcge(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4119 void Disassembler::vcge(Condition cond,
4120                         DataType dt,
4121                         DRegister rd,
4122                         DRegister rm,
4123                         const DOperand& operand) {
4124   os().SetCurrentInstruction(kVcge, kFpNeon);
4125   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4126   os() << " ";
4127   if (!rd.Is(rm) || !use_short_hand_form_) {
4128     os() << rd << ", ";
4129   }
4130   os() << rm << ", " << operand;
4131 }
4132 
vcge(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4133 void Disassembler::vcge(Condition cond,
4134                         DataType dt,
4135                         QRegister rd,
4136                         QRegister rm,
4137                         const QOperand& operand) {
4138   os().SetCurrentInstruction(kVcge, kFpNeon);
4139   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4140   os() << " ";
4141   if (!rd.Is(rm) || !use_short_hand_form_) {
4142     os() << rd << ", ";
4143   }
4144   os() << rm << ", " << operand;
4145 }
4146 
vcge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4147 void Disassembler::vcge(
4148     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4149   os().SetCurrentInstruction(kVcge, kFpNeon);
4150   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4151   os() << " ";
4152   if (!rd.Is(rn) || !use_short_hand_form_) {
4153     os() << rd << ", ";
4154   }
4155   os() << rn << ", " << rm;
4156 }
4157 
vcge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4158 void Disassembler::vcge(
4159     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4160   os().SetCurrentInstruction(kVcge, kFpNeon);
4161   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4162   os() << " ";
4163   if (!rd.Is(rn) || !use_short_hand_form_) {
4164     os() << rd << ", ";
4165   }
4166   os() << rn << ", " << rm;
4167 }
4168 
vcgt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4169 void Disassembler::vcgt(Condition cond,
4170                         DataType dt,
4171                         DRegister rd,
4172                         DRegister rm,
4173                         const DOperand& operand) {
4174   os().SetCurrentInstruction(kVcgt, kFpNeon);
4175   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4176   os() << " ";
4177   if (!rd.Is(rm) || !use_short_hand_form_) {
4178     os() << rd << ", ";
4179   }
4180   os() << rm << ", " << operand;
4181 }
4182 
vcgt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4183 void Disassembler::vcgt(Condition cond,
4184                         DataType dt,
4185                         QRegister rd,
4186                         QRegister rm,
4187                         const QOperand& operand) {
4188   os().SetCurrentInstruction(kVcgt, kFpNeon);
4189   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4190   os() << " ";
4191   if (!rd.Is(rm) || !use_short_hand_form_) {
4192     os() << rd << ", ";
4193   }
4194   os() << rm << ", " << operand;
4195 }
4196 
vcgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4197 void Disassembler::vcgt(
4198     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4199   os().SetCurrentInstruction(kVcgt, kFpNeon);
4200   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4201   os() << " ";
4202   if (!rd.Is(rn) || !use_short_hand_form_) {
4203     os() << rd << ", ";
4204   }
4205   os() << rn << ", " << rm;
4206 }
4207 
vcgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4208 void Disassembler::vcgt(
4209     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4210   os().SetCurrentInstruction(kVcgt, kFpNeon);
4211   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4212   os() << " ";
4213   if (!rd.Is(rn) || !use_short_hand_form_) {
4214     os() << rd << ", ";
4215   }
4216   os() << rn << ", " << rm;
4217 }
4218 
vcle(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4219 void Disassembler::vcle(Condition cond,
4220                         DataType dt,
4221                         DRegister rd,
4222                         DRegister rm,
4223                         const DOperand& operand) {
4224   os().SetCurrentInstruction(kVcle, kFpNeon);
4225   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4226   os() << " ";
4227   if (!rd.Is(rm) || !use_short_hand_form_) {
4228     os() << rd << ", ";
4229   }
4230   os() << rm << ", " << operand;
4231 }
4232 
vcle(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4233 void Disassembler::vcle(Condition cond,
4234                         DataType dt,
4235                         QRegister rd,
4236                         QRegister rm,
4237                         const QOperand& operand) {
4238   os().SetCurrentInstruction(kVcle, kFpNeon);
4239   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4240   os() << " ";
4241   if (!rd.Is(rm) || !use_short_hand_form_) {
4242     os() << rd << ", ";
4243   }
4244   os() << rm << ", " << operand;
4245 }
4246 
vcle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4247 void Disassembler::vcle(
4248     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4249   os().SetCurrentInstruction(kVcle, kFpNeon);
4250   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4251   os() << " ";
4252   if (!rd.Is(rn) || !use_short_hand_form_) {
4253     os() << rd << ", ";
4254   }
4255   os() << rn << ", " << rm;
4256 }
4257 
vcle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4258 void Disassembler::vcle(
4259     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4260   os().SetCurrentInstruction(kVcle, kFpNeon);
4261   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4262   os() << " ";
4263   if (!rd.Is(rn) || !use_short_hand_form_) {
4264     os() << rd << ", ";
4265   }
4266   os() << rn << ", " << rm;
4267 }
4268 
vcls(Condition cond,DataType dt,DRegister rd,DRegister rm)4269 void Disassembler::vcls(Condition cond,
4270                         DataType dt,
4271                         DRegister rd,
4272                         DRegister rm) {
4273   os().SetCurrentInstruction(kVcls, kFpNeon);
4274   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
4275        << rd << ", " << rm;
4276 }
4277 
vcls(Condition cond,DataType dt,QRegister rd,QRegister rm)4278 void Disassembler::vcls(Condition cond,
4279                         DataType dt,
4280                         QRegister rd,
4281                         QRegister rm) {
4282   os().SetCurrentInstruction(kVcls, kFpNeon);
4283   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
4284        << rd << ", " << rm;
4285 }
4286 
vclt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4287 void Disassembler::vclt(Condition cond,
4288                         DataType dt,
4289                         DRegister rd,
4290                         DRegister rm,
4291                         const DOperand& operand) {
4292   os().SetCurrentInstruction(kVclt, kFpNeon);
4293   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4294   os() << " ";
4295   if (!rd.Is(rm) || !use_short_hand_form_) {
4296     os() << rd << ", ";
4297   }
4298   os() << rm << ", " << operand;
4299 }
4300 
vclt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4301 void Disassembler::vclt(Condition cond,
4302                         DataType dt,
4303                         QRegister rd,
4304                         QRegister rm,
4305                         const QOperand& operand) {
4306   os().SetCurrentInstruction(kVclt, kFpNeon);
4307   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4308   os() << " ";
4309   if (!rd.Is(rm) || !use_short_hand_form_) {
4310     os() << rd << ", ";
4311   }
4312   os() << rm << ", " << operand;
4313 }
4314 
vclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4315 void Disassembler::vclt(
4316     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4317   os().SetCurrentInstruction(kVclt, kFpNeon);
4318   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4319   os() << " ";
4320   if (!rd.Is(rn) || !use_short_hand_form_) {
4321     os() << rd << ", ";
4322   }
4323   os() << rn << ", " << rm;
4324 }
4325 
vclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4326 void Disassembler::vclt(
4327     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4328   os().SetCurrentInstruction(kVclt, kFpNeon);
4329   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4330   os() << " ";
4331   if (!rd.Is(rn) || !use_short_hand_form_) {
4332     os() << rd << ", ";
4333   }
4334   os() << rn << ", " << rm;
4335 }
4336 
vclz(Condition cond,DataType dt,DRegister rd,DRegister rm)4337 void Disassembler::vclz(Condition cond,
4338                         DataType dt,
4339                         DRegister rd,
4340                         DRegister rm) {
4341   os().SetCurrentInstruction(kVclz, kFpNeon);
4342   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
4343        << rd << ", " << rm;
4344 }
4345 
vclz(Condition cond,DataType dt,QRegister rd,QRegister rm)4346 void Disassembler::vclz(Condition cond,
4347                         DataType dt,
4348                         QRegister rd,
4349                         QRegister rm) {
4350   os().SetCurrentInstruction(kVclz, kFpNeon);
4351   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
4352        << rd << ", " << rm;
4353 }
4354 
vcmp(Condition cond,DataType dt,SRegister rd,const SOperand & operand)4355 void Disassembler::vcmp(Condition cond,
4356                         DataType dt,
4357                         SRegister rd,
4358                         const SOperand& operand) {
4359   os().SetCurrentInstruction(kVcmp, kFpNeon);
4360   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4361        << rd << ", " << operand;
4362 }
4363 
vcmp(Condition cond,DataType dt,DRegister rd,const DOperand & operand)4364 void Disassembler::vcmp(Condition cond,
4365                         DataType dt,
4366                         DRegister rd,
4367                         const DOperand& operand) {
4368   os().SetCurrentInstruction(kVcmp, kFpNeon);
4369   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4370        << rd << ", " << operand;
4371 }
4372 
vcmpe(Condition cond,DataType dt,SRegister rd,const SOperand & operand)4373 void Disassembler::vcmpe(Condition cond,
4374                          DataType dt,
4375                          SRegister rd,
4376                          const SOperand& operand) {
4377   os().SetCurrentInstruction(kVcmpe, kFpNeon);
4378   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4379        << rd << ", " << operand;
4380 }
4381 
vcmpe(Condition cond,DataType dt,DRegister rd,const DOperand & operand)4382 void Disassembler::vcmpe(Condition cond,
4383                          DataType dt,
4384                          DRegister rd,
4385                          const DOperand& operand) {
4386   os().SetCurrentInstruction(kVcmpe, kFpNeon);
4387   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4388        << rd << ", " << operand;
4389 }
4390 
vcnt(Condition cond,DataType dt,DRegister rd,DRegister rm)4391 void Disassembler::vcnt(Condition cond,
4392                         DataType dt,
4393                         DRegister rd,
4394                         DRegister rm) {
4395   os().SetCurrentInstruction(kVcnt, kFpNeon);
4396   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
4397        << rd << ", " << rm;
4398 }
4399 
vcnt(Condition cond,DataType dt,QRegister rd,QRegister rm)4400 void Disassembler::vcnt(Condition cond,
4401                         DataType dt,
4402                         QRegister rd,
4403                         QRegister rm) {
4404   os().SetCurrentInstruction(kVcnt, kFpNeon);
4405   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
4406        << rd << ", " << rm;
4407 }
4408 
vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)4409 void Disassembler::vcvt(
4410     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4411   os().SetCurrentInstruction(kVcvt, kFpNeon);
4412   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4413        << " " << rd << ", " << rm;
4414 }
4415 
vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)4416 void Disassembler::vcvt(
4417     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4418   os().SetCurrentInstruction(kVcvt, kFpNeon);
4419   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4420        << " " << rd << ", " << rm;
4421 }
4422 
vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)4423 void Disassembler::vcvt(Condition cond,
4424                         DataType dt1,
4425                         DataType dt2,
4426                         DRegister rd,
4427                         DRegister rm,
4428                         int32_t fbits) {
4429   os().SetCurrentInstruction(kVcvt, kFpNeon);
4430   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4431        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
4432 }
4433 
vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)4434 void Disassembler::vcvt(Condition cond,
4435                         DataType dt1,
4436                         DataType dt2,
4437                         QRegister rd,
4438                         QRegister rm,
4439                         int32_t fbits) {
4440   os().SetCurrentInstruction(kVcvt, kFpNeon);
4441   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4442        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
4443 }
4444 
vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)4445 void Disassembler::vcvt(Condition cond,
4446                         DataType dt1,
4447                         DataType dt2,
4448                         SRegister rd,
4449                         SRegister rm,
4450                         int32_t fbits) {
4451   os().SetCurrentInstruction(kVcvt, kFpNeon);
4452   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4453        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
4454 }
4455 
vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)4456 void Disassembler::vcvt(
4457     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
4458   os().SetCurrentInstruction(kVcvt, kFpNeon);
4459   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4460        << " " << rd << ", " << rm;
4461 }
4462 
vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm)4463 void Disassembler::vcvt(
4464     Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
4465   os().SetCurrentInstruction(kVcvt, kFpNeon);
4466   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4467        << " " << rd << ", " << rm;
4468 }
4469 
vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,QRegister rm)4470 void Disassembler::vcvt(
4471     Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
4472   os().SetCurrentInstruction(kVcvt, kFpNeon);
4473   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4474        << " " << rd << ", " << rm;
4475 }
4476 
vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,DRegister rm)4477 void Disassembler::vcvt(
4478     Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
4479   os().SetCurrentInstruction(kVcvt, kFpNeon);
4480   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4481        << " " << rd << ", " << rm;
4482 }
4483 
vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)4484 void Disassembler::vcvt(
4485     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4486   os().SetCurrentInstruction(kVcvt, kFpNeon);
4487   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4488        << " " << rd << ", " << rm;
4489 }
4490 
vcvta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)4491 void Disassembler::vcvta(DataType dt1,
4492                          DataType dt2,
4493                          DRegister rd,
4494                          DRegister rm) {
4495   os().SetCurrentInstruction(kVcvta, kFpNeon);
4496   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4497 }
4498 
vcvta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)4499 void Disassembler::vcvta(DataType dt1,
4500                          DataType dt2,
4501                          QRegister rd,
4502                          QRegister rm) {
4503   os().SetCurrentInstruction(kVcvta, kFpNeon);
4504   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4505 }
4506 
vcvta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)4507 void Disassembler::vcvta(DataType dt1,
4508                          DataType dt2,
4509                          SRegister rd,
4510                          SRegister rm) {
4511   os().SetCurrentInstruction(kVcvta, kFpNeon);
4512   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4513 }
4514 
vcvta(DataType dt1,DataType dt2,SRegister rd,DRegister rm)4515 void Disassembler::vcvta(DataType dt1,
4516                          DataType dt2,
4517                          SRegister rd,
4518                          DRegister rm) {
4519   os().SetCurrentInstruction(kVcvta, kFpNeon);
4520   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4521 }
4522 
vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)4523 void Disassembler::vcvtb(
4524     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4525   os().SetCurrentInstruction(kVcvtb, kFpNeon);
4526   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4527        << " " << rd << ", " << rm;
4528 }
4529 
vcvtb(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)4530 void Disassembler::vcvtb(
4531     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4532   os().SetCurrentInstruction(kVcvtb, kFpNeon);
4533   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4534        << " " << rd << ", " << rm;
4535 }
4536 
vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)4537 void Disassembler::vcvtb(
4538     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4539   os().SetCurrentInstruction(kVcvtb, kFpNeon);
4540   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4541        << " " << rd << ", " << rm;
4542 }
4543 
vcvtm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)4544 void Disassembler::vcvtm(DataType dt1,
4545                          DataType dt2,
4546                          DRegister rd,
4547                          DRegister rm) {
4548   os().SetCurrentInstruction(kVcvtm, kFpNeon);
4549   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4550 }
4551 
vcvtm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)4552 void Disassembler::vcvtm(DataType dt1,
4553                          DataType dt2,
4554                          QRegister rd,
4555                          QRegister rm) {
4556   os().SetCurrentInstruction(kVcvtm, kFpNeon);
4557   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4558 }
4559 
vcvtm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)4560 void Disassembler::vcvtm(DataType dt1,
4561                          DataType dt2,
4562                          SRegister rd,
4563                          SRegister rm) {
4564   os().SetCurrentInstruction(kVcvtm, kFpNeon);
4565   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4566 }
4567 
vcvtm(DataType dt1,DataType dt2,SRegister rd,DRegister rm)4568 void Disassembler::vcvtm(DataType dt1,
4569                          DataType dt2,
4570                          SRegister rd,
4571                          DRegister rm) {
4572   os().SetCurrentInstruction(kVcvtm, kFpNeon);
4573   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4574 }
4575 
vcvtn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)4576 void Disassembler::vcvtn(DataType dt1,
4577                          DataType dt2,
4578                          DRegister rd,
4579                          DRegister rm) {
4580   os().SetCurrentInstruction(kVcvtn, kFpNeon);
4581   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4582 }
4583 
vcvtn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)4584 void Disassembler::vcvtn(DataType dt1,
4585                          DataType dt2,
4586                          QRegister rd,
4587                          QRegister rm) {
4588   os().SetCurrentInstruction(kVcvtn, kFpNeon);
4589   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4590 }
4591 
vcvtn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)4592 void Disassembler::vcvtn(DataType dt1,
4593                          DataType dt2,
4594                          SRegister rd,
4595                          SRegister rm) {
4596   os().SetCurrentInstruction(kVcvtn, kFpNeon);
4597   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4598 }
4599 
vcvtn(DataType dt1,DataType dt2,SRegister rd,DRegister rm)4600 void Disassembler::vcvtn(DataType dt1,
4601                          DataType dt2,
4602                          SRegister rd,
4603                          DRegister rm) {
4604   os().SetCurrentInstruction(kVcvtn, kFpNeon);
4605   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4606 }
4607 
vcvtp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)4608 void Disassembler::vcvtp(DataType dt1,
4609                          DataType dt2,
4610                          DRegister rd,
4611                          DRegister rm) {
4612   os().SetCurrentInstruction(kVcvtp, kFpNeon);
4613   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4614 }
4615 
vcvtp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)4616 void Disassembler::vcvtp(DataType dt1,
4617                          DataType dt2,
4618                          QRegister rd,
4619                          QRegister rm) {
4620   os().SetCurrentInstruction(kVcvtp, kFpNeon);
4621   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4622 }
4623 
vcvtp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)4624 void Disassembler::vcvtp(DataType dt1,
4625                          DataType dt2,
4626                          SRegister rd,
4627                          SRegister rm) {
4628   os().SetCurrentInstruction(kVcvtp, kFpNeon);
4629   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4630 }
4631 
vcvtp(DataType dt1,DataType dt2,SRegister rd,DRegister rm)4632 void Disassembler::vcvtp(DataType dt1,
4633                          DataType dt2,
4634                          SRegister rd,
4635                          DRegister rm) {
4636   os().SetCurrentInstruction(kVcvtp, kFpNeon);
4637   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4638 }
4639 
vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)4640 void Disassembler::vcvtr(
4641     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4642   os().SetCurrentInstruction(kVcvtr, kFpNeon);
4643   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4644        << " " << rd << ", " << rm;
4645 }
4646 
vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)4647 void Disassembler::vcvtr(
4648     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4649   os().SetCurrentInstruction(kVcvtr, kFpNeon);
4650   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4651        << " " << rd << ", " << rm;
4652 }
4653 
vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)4654 void Disassembler::vcvtt(
4655     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4656   os().SetCurrentInstruction(kVcvtt, kFpNeon);
4657   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4658        << " " << rd << ", " << rm;
4659 }
4660 
vcvtt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)4661 void Disassembler::vcvtt(
4662     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4663   os().SetCurrentInstruction(kVcvtt, kFpNeon);
4664   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4665        << " " << rd << ", " << rm;
4666 }
4667 
vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)4668 void Disassembler::vcvtt(
4669     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4670   os().SetCurrentInstruction(kVcvtt, kFpNeon);
4671   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4672        << " " << rd << ", " << rm;
4673 }
4674 
vdiv(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4675 void Disassembler::vdiv(
4676     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4677   os().SetCurrentInstruction(kVdiv, kFpNeon);
4678   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
4679   os() << " ";
4680   if (!rd.Is(rn) || !use_short_hand_form_) {
4681     os() << rd << ", ";
4682   }
4683   os() << rn << ", " << rm;
4684 }
4685 
vdiv(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4686 void Disassembler::vdiv(
4687     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4688   os().SetCurrentInstruction(kVdiv, kFpNeon);
4689   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
4690   os() << " ";
4691   if (!rd.Is(rn) || !use_short_hand_form_) {
4692     os() << rd << ", ";
4693   }
4694   os() << rn << ", " << rm;
4695 }
4696 
vdup(Condition cond,DataType dt,QRegister rd,Register rt)4697 void Disassembler::vdup(Condition cond,
4698                         DataType dt,
4699                         QRegister rd,
4700                         Register rt) {
4701   os().SetCurrentInstruction(kVdup, kFpNeon);
4702   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4703        << rd << ", " << rt;
4704 }
4705 
vdup(Condition cond,DataType dt,DRegister rd,Register rt)4706 void Disassembler::vdup(Condition cond,
4707                         DataType dt,
4708                         DRegister rd,
4709                         Register rt) {
4710   os().SetCurrentInstruction(kVdup, kFpNeon);
4711   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4712        << rd << ", " << rt;
4713 }
4714 
vdup(Condition cond,DataType dt,DRegister rd,DRegisterLane rm)4715 void Disassembler::vdup(Condition cond,
4716                         DataType dt,
4717                         DRegister rd,
4718                         DRegisterLane rm) {
4719   os().SetCurrentInstruction(kVdup, kFpNeon);
4720   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4721        << rd << ", " << rm;
4722 }
4723 
vdup(Condition cond,DataType dt,QRegister rd,DRegisterLane rm)4724 void Disassembler::vdup(Condition cond,
4725                         DataType dt,
4726                         QRegister rd,
4727                         DRegisterLane rm) {
4728   os().SetCurrentInstruction(kVdup, kFpNeon);
4729   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4730        << rd << ", " << rm;
4731 }
4732 
veor(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4733 void Disassembler::veor(
4734     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4735   os().SetCurrentInstruction(kVeor, kFpNeon);
4736   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
4737   os() << " ";
4738   if (!rd.Is(rn) || !use_short_hand_form_) {
4739     os() << rd << ", ";
4740   }
4741   os() << rn << ", " << rm;
4742 }
4743 
veor(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4744 void Disassembler::veor(
4745     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4746   os().SetCurrentInstruction(kVeor, kFpNeon);
4747   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
4748   os() << " ";
4749   if (!rd.Is(rn) || !use_short_hand_form_) {
4750     os() << rd << ", ";
4751   }
4752   os() << rn << ", " << rm;
4753 }
4754 
vext(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)4755 void Disassembler::vext(Condition cond,
4756                         DataType dt,
4757                         DRegister rd,
4758                         DRegister rn,
4759                         DRegister rm,
4760                         const DOperand& operand) {
4761   os().SetCurrentInstruction(kVext, kFpNeon);
4762   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
4763   os() << " ";
4764   if (!rd.Is(rn) || !use_short_hand_form_) {
4765     os() << rd << ", ";
4766   }
4767   os() << rn << ", " << rm << ", " << operand;
4768 }
4769 
vext(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)4770 void Disassembler::vext(Condition cond,
4771                         DataType dt,
4772                         QRegister rd,
4773                         QRegister rn,
4774                         QRegister rm,
4775                         const QOperand& operand) {
4776   os().SetCurrentInstruction(kVext, kFpNeon);
4777   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
4778   os() << " ";
4779   if (!rd.Is(rn) || !use_short_hand_form_) {
4780     os() << rd << ", ";
4781   }
4782   os() << rn << ", " << rm << ", " << operand;
4783 }
4784 
vfma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4785 void Disassembler::vfma(
4786     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4787   os().SetCurrentInstruction(kVfma, kFpNeon);
4788   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4789        << rd << ", " << rn << ", " << rm;
4790 }
4791 
vfma(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4792 void Disassembler::vfma(
4793     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4794   os().SetCurrentInstruction(kVfma, kFpNeon);
4795   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4796        << rd << ", " << rn << ", " << rm;
4797 }
4798 
vfma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4799 void Disassembler::vfma(
4800     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4801   os().SetCurrentInstruction(kVfma, kFpNeon);
4802   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4803        << rd << ", " << rn << ", " << rm;
4804 }
4805 
vfms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4806 void Disassembler::vfms(
4807     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4808   os().SetCurrentInstruction(kVfms, kFpNeon);
4809   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4810        << rd << ", " << rn << ", " << rm;
4811 }
4812 
vfms(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4813 void Disassembler::vfms(
4814     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4815   os().SetCurrentInstruction(kVfms, kFpNeon);
4816   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4817        << rd << ", " << rn << ", " << rm;
4818 }
4819 
vfms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4820 void Disassembler::vfms(
4821     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4822   os().SetCurrentInstruction(kVfms, kFpNeon);
4823   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4824        << rd << ", " << rn << ", " << rm;
4825 }
4826 
vfnma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4827 void Disassembler::vfnma(
4828     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4829   os().SetCurrentInstruction(kVfnma, kFpNeon);
4830   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
4831        << rd << ", " << rn << ", " << rm;
4832 }
4833 
vfnma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4834 void Disassembler::vfnma(
4835     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4836   os().SetCurrentInstruction(kVfnma, kFpNeon);
4837   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
4838        << rd << ", " << rn << ", " << rm;
4839 }
4840 
vfnms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4841 void Disassembler::vfnms(
4842     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4843   os().SetCurrentInstruction(kVfnms, kFpNeon);
4844   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
4845        << rd << ", " << rn << ", " << rm;
4846 }
4847 
vfnms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4848 void Disassembler::vfnms(
4849     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4850   os().SetCurrentInstruction(kVfnms, kFpNeon);
4851   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
4852        << rd << ", " << rn << ", " << rm;
4853 }
4854 
vhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4855 void Disassembler::vhadd(
4856     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4857   os().SetCurrentInstruction(kVhadd, kFpNeon);
4858   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
4859   os() << " ";
4860   if (!rd.Is(rn) || !use_short_hand_form_) {
4861     os() << rd << ", ";
4862   }
4863   os() << rn << ", " << rm;
4864 }
4865 
vhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4866 void Disassembler::vhadd(
4867     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4868   os().SetCurrentInstruction(kVhadd, kFpNeon);
4869   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
4870   os() << " ";
4871   if (!rd.Is(rn) || !use_short_hand_form_) {
4872     os() << rd << ", ";
4873   }
4874   os() << rn << ", " << rm;
4875 }
4876 
vhsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4877 void Disassembler::vhsub(
4878     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4879   os().SetCurrentInstruction(kVhsub, kFpNeon);
4880   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
4881   os() << " ";
4882   if (!rd.Is(rn) || !use_short_hand_form_) {
4883     os() << rd << ", ";
4884   }
4885   os() << rn << ", " << rm;
4886 }
4887 
vhsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4888 void Disassembler::vhsub(
4889     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4890   os().SetCurrentInstruction(kVhsub, kFpNeon);
4891   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
4892   os() << " ";
4893   if (!rd.Is(rn) || !use_short_hand_form_) {
4894     os() << rd << ", ";
4895   }
4896   os() << rn << ", " << rm;
4897 }
4898 
vld1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)4899 void Disassembler::vld1(Condition cond,
4900                         DataType dt,
4901                         const NeonRegisterList& nreglist,
4902                         const AlignedMemOperand& operand) {
4903   os().SetCurrentInstruction(kVld1, kFpNeon);
4904   os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
4905        << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
4906 }
4907 
vld2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)4908 void Disassembler::vld2(Condition cond,
4909                         DataType dt,
4910                         const NeonRegisterList& nreglist,
4911                         const AlignedMemOperand& operand) {
4912   os().SetCurrentInstruction(kVld2, kFpNeon);
4913   os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
4914        << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
4915 }
4916 
vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)4917 void Disassembler::vld3(Condition cond,
4918                         DataType dt,
4919                         const NeonRegisterList& nreglist,
4920                         const AlignedMemOperand& operand) {
4921   os().SetCurrentInstruction(kVld3, kFpNeon);
4922   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
4923        << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
4924 }
4925 
vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)4926 void Disassembler::vld3(Condition cond,
4927                         DataType dt,
4928                         const NeonRegisterList& nreglist,
4929                         const MemOperand& operand) {
4930   os().SetCurrentInstruction(kVld3, kFpNeon);
4931   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
4932        << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
4933 }
4934 
vld4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)4935 void Disassembler::vld4(Condition cond,
4936                         DataType dt,
4937                         const NeonRegisterList& nreglist,
4938                         const AlignedMemOperand& operand) {
4939   os().SetCurrentInstruction(kVld4, kFpNeon);
4940   os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
4941        << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
4942 }
4943 
vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)4944 void Disassembler::vldm(Condition cond,
4945                         DataType dt,
4946                         Register rn,
4947                         WriteBack write_back,
4948                         DRegisterList dreglist) {
4949   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
4950   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
4951        << rn << write_back << ", " << dreglist;
4952 }
4953 
vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)4954 void Disassembler::vldm(Condition cond,
4955                         DataType dt,
4956                         Register rn,
4957                         WriteBack write_back,
4958                         SRegisterList sreglist) {
4959   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
4960   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
4961        << rn << write_back << ", " << sreglist;
4962 }
4963 
vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)4964 void Disassembler::vldmdb(Condition cond,
4965                           DataType dt,
4966                           Register rn,
4967                           WriteBack write_back,
4968                           DRegisterList dreglist) {
4969   os().SetCurrentInstruction(kVldmdb,
4970                              kLoadStore | kLoadStoreMultiple | kFpNeon);
4971   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
4972        << rn << write_back << ", " << dreglist;
4973 }
4974 
vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)4975 void Disassembler::vldmdb(Condition cond,
4976                           DataType dt,
4977                           Register rn,
4978                           WriteBack write_back,
4979                           SRegisterList sreglist) {
4980   os().SetCurrentInstruction(kVldmdb,
4981                              kLoadStore | kLoadStoreMultiple | kFpNeon);
4982   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
4983        << rn << write_back << ", " << sreglist;
4984 }
4985 
vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)4986 void Disassembler::vldmia(Condition cond,
4987                           DataType dt,
4988                           Register rn,
4989                           WriteBack write_back,
4990                           DRegisterList dreglist) {
4991   os().SetCurrentInstruction(kVldmia,
4992                              kLoadStore | kLoadStoreMultiple | kFpNeon);
4993   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
4994        << rn << write_back << ", " << dreglist;
4995 }
4996 
vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)4997 void Disassembler::vldmia(Condition cond,
4998                           DataType dt,
4999                           Register rn,
5000                           WriteBack write_back,
5001                           SRegisterList sreglist) {
5002   os().SetCurrentInstruction(kVldmia,
5003                              kLoadStore | kLoadStoreMultiple | kFpNeon);
5004   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
5005        << rn << write_back << ", " << sreglist;
5006 }
5007 
vldr(Condition cond,DataType dt,DRegister rd,Location * location)5008 void Disassembler::vldr(Condition cond,
5009                         DataType dt,
5010                         DRegister rd,
5011                         Location* location) {
5012   os().SetCurrentInstruction(kVldr, kFpNeon);
5013   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5014        << DtPrinter(dt, Untyped64) << " " << rd << ", "
5015        << PrintLabel(kLoadDoublePrecisionLocation,
5016                      location,
5017                      GetCodeAddress() & ~3);
5018 }
5019 
vldr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)5020 void Disassembler::vldr(Condition cond,
5021                         DataType dt,
5022                         DRegister rd,
5023                         const MemOperand& operand) {
5024   os().SetCurrentInstruction(kVldr, kFpNeon);
5025   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5026        << DtPrinter(dt, Untyped64) << " " << rd << ", "
5027        << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
5028 }
5029 
vldr(Condition cond,DataType dt,SRegister rd,Location * location)5030 void Disassembler::vldr(Condition cond,
5031                         DataType dt,
5032                         SRegister rd,
5033                         Location* location) {
5034   os().SetCurrentInstruction(kVldr, kFpNeon);
5035   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5036        << DtPrinter(dt, Untyped32) << " " << rd << ", "
5037        << PrintLabel(kLoadSinglePrecisionLocation,
5038                      location,
5039                      GetCodeAddress() & ~3);
5040 }
5041 
vldr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)5042 void Disassembler::vldr(Condition cond,
5043                         DataType dt,
5044                         SRegister rd,
5045                         const MemOperand& operand) {
5046   os().SetCurrentInstruction(kVldr, kFpNeon);
5047   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5048        << DtPrinter(dt, Untyped32) << " " << rd << ", "
5049        << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
5050 }
5051 
vmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5052 void Disassembler::vmax(
5053     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5054   os().SetCurrentInstruction(kVmax, kFpNeon);
5055   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
5056   os() << " ";
5057   if (!rd.Is(rn) || !use_short_hand_form_) {
5058     os() << rd << ", ";
5059   }
5060   os() << rn << ", " << rm;
5061 }
5062 
vmax(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5063 void Disassembler::vmax(
5064     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5065   os().SetCurrentInstruction(kVmax, kFpNeon);
5066   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
5067   os() << " ";
5068   if (!rd.Is(rn) || !use_short_hand_form_) {
5069     os() << rd << ", ";
5070   }
5071   os() << rn << ", " << rm;
5072 }
5073 
vmaxnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)5074 void Disassembler::vmaxnm(DataType dt,
5075                           DRegister rd,
5076                           DRegister rn,
5077                           DRegister rm) {
5078   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5079   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5080 }
5081 
vmaxnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)5082 void Disassembler::vmaxnm(DataType dt,
5083                           QRegister rd,
5084                           QRegister rn,
5085                           QRegister rm) {
5086   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5087   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5088 }
5089 
vmaxnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)5090 void Disassembler::vmaxnm(DataType dt,
5091                           SRegister rd,
5092                           SRegister rn,
5093                           SRegister rm) {
5094   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5095   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5096 }
5097 
vmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5098 void Disassembler::vmin(
5099     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5100   os().SetCurrentInstruction(kVmin, kFpNeon);
5101   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
5102   os() << " ";
5103   if (!rd.Is(rn) || !use_short_hand_form_) {
5104     os() << rd << ", ";
5105   }
5106   os() << rn << ", " << rm;
5107 }
5108 
vmin(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5109 void Disassembler::vmin(
5110     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5111   os().SetCurrentInstruction(kVmin, kFpNeon);
5112   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
5113   os() << " ";
5114   if (!rd.Is(rn) || !use_short_hand_form_) {
5115     os() << rd << ", ";
5116   }
5117   os() << rn << ", " << rm;
5118 }
5119 
vminnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)5120 void Disassembler::vminnm(DataType dt,
5121                           DRegister rd,
5122                           DRegister rn,
5123                           DRegister rm) {
5124   os().SetCurrentInstruction(kVminnm, kFpNeon);
5125   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5126 }
5127 
vminnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)5128 void Disassembler::vminnm(DataType dt,
5129                           QRegister rd,
5130                           QRegister rn,
5131                           QRegister rm) {
5132   os().SetCurrentInstruction(kVminnm, kFpNeon);
5133   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5134 }
5135 
vminnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)5136 void Disassembler::vminnm(DataType dt,
5137                           SRegister rd,
5138                           SRegister rn,
5139                           SRegister rm) {
5140   os().SetCurrentInstruction(kVminnm, kFpNeon);
5141   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5142 }
5143 
vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)5144 void Disassembler::vmla(
5145     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5146   os().SetCurrentInstruction(kVmla, kFpNeon);
5147   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5148        << rd << ", " << rn << ", " << rm;
5149 }
5150 
vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)5151 void Disassembler::vmla(
5152     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5153   os().SetCurrentInstruction(kVmla, kFpNeon);
5154   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5155        << rd << ", " << rn << ", " << rm;
5156 }
5157 
vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5158 void Disassembler::vmla(
5159     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5160   os().SetCurrentInstruction(kVmla, kFpNeon);
5161   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5162        << rd << ", " << rn << ", " << rm;
5163 }
5164 
vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5165 void Disassembler::vmla(
5166     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5167   os().SetCurrentInstruction(kVmla, kFpNeon);
5168   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5169        << rd << ", " << rn << ", " << rm;
5170 }
5171 
vmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5172 void Disassembler::vmla(
5173     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5174   os().SetCurrentInstruction(kVmla, kFpNeon);
5175   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5176        << rd << ", " << rn << ", " << rm;
5177 }
5178 
vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)5179 void Disassembler::vmlal(
5180     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5181   os().SetCurrentInstruction(kVmlal, kFpNeon);
5182   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5183        << rd << ", " << rn << ", " << rm;
5184 }
5185 
vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5186 void Disassembler::vmlal(
5187     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5188   os().SetCurrentInstruction(kVmlal, kFpNeon);
5189   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5190        << rd << ", " << rn << ", " << rm;
5191 }
5192 
vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)5193 void Disassembler::vmls(
5194     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5195   os().SetCurrentInstruction(kVmls, kFpNeon);
5196   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5197        << rd << ", " << rn << ", " << rm;
5198 }
5199 
vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)5200 void Disassembler::vmls(
5201     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5202   os().SetCurrentInstruction(kVmls, kFpNeon);
5203   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5204        << rd << ", " << rn << ", " << rm;
5205 }
5206 
vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5207 void Disassembler::vmls(
5208     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5209   os().SetCurrentInstruction(kVmls, kFpNeon);
5210   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5211        << rd << ", " << rn << ", " << rm;
5212 }
5213 
vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5214 void Disassembler::vmls(
5215     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5216   os().SetCurrentInstruction(kVmls, kFpNeon);
5217   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5218        << rd << ", " << rn << ", " << rm;
5219 }
5220 
vmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5221 void Disassembler::vmls(
5222     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5223   os().SetCurrentInstruction(kVmls, kFpNeon);
5224   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5225        << rd << ", " << rn << ", " << rm;
5226 }
5227 
vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)5228 void Disassembler::vmlsl(
5229     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5230   os().SetCurrentInstruction(kVmlsl, kFpNeon);
5231   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5232        << rd << ", " << rn << ", " << rm;
5233 }
5234 
vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5235 void Disassembler::vmlsl(
5236     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5237   os().SetCurrentInstruction(kVmlsl, kFpNeon);
5238   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5239        << rd << ", " << rn << ", " << rm;
5240 }
5241 
vmov(Condition cond,Register rt,SRegister rn)5242 void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
5243   os().SetCurrentInstruction(kVmov, kFpNeon);
5244   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5245        << ", " << rn;
5246 }
5247 
vmov(Condition cond,SRegister rn,Register rt)5248 void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
5249   os().SetCurrentInstruction(kVmov, kFpNeon);
5250   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
5251        << ", " << rt;
5252 }
5253 
vmov(Condition cond,Register rt,Register rt2,DRegister rm)5254 void Disassembler::vmov(Condition cond,
5255                         Register rt,
5256                         Register rt2,
5257                         DRegister rm) {
5258   os().SetCurrentInstruction(kVmov, kFpNeon);
5259   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5260        << ", " << rt2 << ", " << rm;
5261 }
5262 
vmov(Condition cond,DRegister rm,Register rt,Register rt2)5263 void Disassembler::vmov(Condition cond,
5264                         DRegister rm,
5265                         Register rt,
5266                         Register rt2) {
5267   os().SetCurrentInstruction(kVmov, kFpNeon);
5268   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
5269        << ", " << rt << ", " << rt2;
5270 }
5271 
vmov(Condition cond,Register rt,Register rt2,SRegister rm,SRegister rm1)5272 void Disassembler::vmov(
5273     Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
5274   os().SetCurrentInstruction(kVmov, kFpNeon);
5275   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5276        << ", " << rt2 << ", " << rm << ", " << rm1;
5277 }
5278 
vmov(Condition cond,SRegister rm,SRegister rm1,Register rt,Register rt2)5279 void Disassembler::vmov(
5280     Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
5281   os().SetCurrentInstruction(kVmov, kFpNeon);
5282   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
5283        << ", " << rm1 << ", " << rt << ", " << rt2;
5284 }
5285 
vmov(Condition cond,DataType dt,DRegisterLane rd,Register rt)5286 void Disassembler::vmov(Condition cond,
5287                         DataType dt,
5288                         DRegisterLane rd,
5289                         Register rt) {
5290   os().SetCurrentInstruction(kVmov, kFpNeon);
5291   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5292        << rd << ", " << rt;
5293 }
5294 
vmov(Condition cond,DataType dt,DRegister rd,const DOperand & operand)5295 void Disassembler::vmov(Condition cond,
5296                         DataType dt,
5297                         DRegister rd,
5298                         const DOperand& operand) {
5299   os().SetCurrentInstruction(kVmov, kFpNeon);
5300   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5301        << rd << ", " << operand;
5302 }
5303 
vmov(Condition cond,DataType dt,QRegister rd,const QOperand & operand)5304 void Disassembler::vmov(Condition cond,
5305                         DataType dt,
5306                         QRegister rd,
5307                         const QOperand& operand) {
5308   os().SetCurrentInstruction(kVmov, kFpNeon);
5309   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5310        << rd << ", " << operand;
5311 }
5312 
vmov(Condition cond,DataType dt,SRegister rd,const SOperand & operand)5313 void Disassembler::vmov(Condition cond,
5314                         DataType dt,
5315                         SRegister rd,
5316                         const SOperand& operand) {
5317   os().SetCurrentInstruction(kVmov, kFpNeon);
5318   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5319        << rd << ", " << operand;
5320 }
5321 
vmov(Condition cond,DataType dt,Register rt,DRegisterLane rn)5322 void Disassembler::vmov(Condition cond,
5323                         DataType dt,
5324                         Register rt,
5325                         DRegisterLane rn) {
5326   os().SetCurrentInstruction(kVmov, kFpNeon);
5327   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5328        << rt << ", " << rn;
5329 }
5330 
vmovl(Condition cond,DataType dt,QRegister rd,DRegister rm)5331 void Disassembler::vmovl(Condition cond,
5332                          DataType dt,
5333                          QRegister rd,
5334                          DRegister rm) {
5335   os().SetCurrentInstruction(kVmovl, kFpNeon);
5336   os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
5337        << rd << ", " << rm;
5338 }
5339 
vmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)5340 void Disassembler::vmovn(Condition cond,
5341                          DataType dt,
5342                          DRegister rd,
5343                          QRegister rm) {
5344   os().SetCurrentInstruction(kVmovn, kFpNeon);
5345   os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
5346        << rd << ", " << rm;
5347 }
5348 
vmrs(Condition cond,RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)5349 void Disassembler::vmrs(Condition cond,
5350                         RegisterOrAPSR_nzcv rt,
5351                         SpecialFPRegister spec_reg) {
5352   os().SetCurrentInstruction(kVmrs, kFpNeon);
5353   os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
5354        << ", " << spec_reg;
5355 }
5356 
vmsr(Condition cond,SpecialFPRegister spec_reg,Register rt)5357 void Disassembler::vmsr(Condition cond,
5358                         SpecialFPRegister spec_reg,
5359                         Register rt) {
5360   os().SetCurrentInstruction(kVmsr, kFpNeon);
5361   os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
5362        << spec_reg << ", " << rt;
5363 }
5364 
vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)5365 void Disassembler::vmul(Condition cond,
5366                         DataType dt,
5367                         DRegister rd,
5368                         DRegister rn,
5369                         DRegister dm,
5370                         unsigned index) {
5371   os().SetCurrentInstruction(kVmul, kFpNeon);
5372   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5373   os() << " ";
5374   if (!rd.Is(rn) || !use_short_hand_form_) {
5375     os() << rd << ", ";
5376   }
5377   os() << rn << ", " << IndexedRegisterPrinter(dm, index);
5378 }
5379 
vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)5380 void Disassembler::vmul(Condition cond,
5381                         DataType dt,
5382                         QRegister rd,
5383                         QRegister rn,
5384                         DRegister dm,
5385                         unsigned index) {
5386   os().SetCurrentInstruction(kVmul, kFpNeon);
5387   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5388   os() << " ";
5389   if (!rd.Is(rn) || !use_short_hand_form_) {
5390     os() << rd << ", ";
5391   }
5392   os() << rn << ", " << IndexedRegisterPrinter(dm, index);
5393 }
5394 
vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5395 void Disassembler::vmul(
5396     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5397   os().SetCurrentInstruction(kVmul, kFpNeon);
5398   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5399   os() << " ";
5400   if (!rd.Is(rn) || !use_short_hand_form_) {
5401     os() << rd << ", ";
5402   }
5403   os() << rn << ", " << rm;
5404 }
5405 
vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5406 void Disassembler::vmul(
5407     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5408   os().SetCurrentInstruction(kVmul, kFpNeon);
5409   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5410   os() << " ";
5411   if (!rd.Is(rn) || !use_short_hand_form_) {
5412     os() << rd << ", ";
5413   }
5414   os() << rn << ", " << rm;
5415 }
5416 
vmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5417 void Disassembler::vmul(
5418     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5419   os().SetCurrentInstruction(kVmul, kFpNeon);
5420   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5421   os() << " ";
5422   if (!rd.Is(rn) || !use_short_hand_form_) {
5423     os() << rd << ", ";
5424   }
5425   os() << rn << ", " << rm;
5426 }
5427 
vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)5428 void Disassembler::vmull(Condition cond,
5429                          DataType dt,
5430                          QRegister rd,
5431                          DRegister rn,
5432                          DRegister dm,
5433                          unsigned index) {
5434   os().SetCurrentInstruction(kVmull, kFpNeon);
5435   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
5436        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5437 }
5438 
vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5439 void Disassembler::vmull(
5440     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5441   os().SetCurrentInstruction(kVmull, kFpNeon);
5442   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
5443        << rd << ", " << rn << ", " << rm;
5444 }
5445 
vmvn(Condition cond,DataType dt,DRegister rd,const DOperand & operand)5446 void Disassembler::vmvn(Condition cond,
5447                         DataType dt,
5448                         DRegister rd,
5449                         const DOperand& operand) {
5450   os().SetCurrentInstruction(kVmvn, kFpNeon);
5451   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
5452        << rd << ", " << operand;
5453 }
5454 
vmvn(Condition cond,DataType dt,QRegister rd,const QOperand & operand)5455 void Disassembler::vmvn(Condition cond,
5456                         DataType dt,
5457                         QRegister rd,
5458                         const QOperand& operand) {
5459   os().SetCurrentInstruction(kVmvn, kFpNeon);
5460   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
5461        << rd << ", " << operand;
5462 }
5463 
vneg(Condition cond,DataType dt,DRegister rd,DRegister rm)5464 void Disassembler::vneg(Condition cond,
5465                         DataType dt,
5466                         DRegister rd,
5467                         DRegister rm) {
5468   os().SetCurrentInstruction(kVneg, kFpNeon);
5469   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5470        << rd << ", " << rm;
5471 }
5472 
vneg(Condition cond,DataType dt,QRegister rd,QRegister rm)5473 void Disassembler::vneg(Condition cond,
5474                         DataType dt,
5475                         QRegister rd,
5476                         QRegister rm) {
5477   os().SetCurrentInstruction(kVneg, kFpNeon);
5478   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5479        << rd << ", " << rm;
5480 }
5481 
vneg(Condition cond,DataType dt,SRegister rd,SRegister rm)5482 void Disassembler::vneg(Condition cond,
5483                         DataType dt,
5484                         SRegister rd,
5485                         SRegister rm) {
5486   os().SetCurrentInstruction(kVneg, kFpNeon);
5487   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5488        << rd << ", " << rm;
5489 }
5490 
vnmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5491 void Disassembler::vnmla(
5492     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5493   os().SetCurrentInstruction(kVnmla, kFpNeon);
5494   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
5495        << rd << ", " << rn << ", " << rm;
5496 }
5497 
vnmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5498 void Disassembler::vnmla(
5499     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5500   os().SetCurrentInstruction(kVnmla, kFpNeon);
5501   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
5502        << rd << ", " << rn << ", " << rm;
5503 }
5504 
vnmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5505 void Disassembler::vnmls(
5506     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5507   os().SetCurrentInstruction(kVnmls, kFpNeon);
5508   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
5509        << rd << ", " << rn << ", " << rm;
5510 }
5511 
vnmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5512 void Disassembler::vnmls(
5513     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5514   os().SetCurrentInstruction(kVnmls, kFpNeon);
5515   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
5516        << rd << ", " << rn << ", " << rm;
5517 }
5518 
vnmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5519 void Disassembler::vnmul(
5520     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5521   os().SetCurrentInstruction(kVnmul, kFpNeon);
5522   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
5523   os() << " ";
5524   if (!rd.Is(rn) || !use_short_hand_form_) {
5525     os() << rd << ", ";
5526   }
5527   os() << rn << ", " << rm;
5528 }
5529 
vnmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5530 void Disassembler::vnmul(
5531     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5532   os().SetCurrentInstruction(kVnmul, kFpNeon);
5533   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
5534   os() << " ";
5535   if (!rd.Is(rn) || !use_short_hand_form_) {
5536     os() << rd << ", ";
5537   }
5538   os() << rn << ", " << rm;
5539 }
5540 
vorn(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5541 void Disassembler::vorn(Condition cond,
5542                         DataType dt,
5543                         DRegister rd,
5544                         DRegister rn,
5545                         const DOperand& operand) {
5546   os().SetCurrentInstruction(kVorn, kFpNeon);
5547   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
5548   os() << " ";
5549   if (!rd.Is(rn) || !use_short_hand_form_) {
5550     os() << rd << ", ";
5551   }
5552   os() << rn << ", " << operand;
5553 }
5554 
vorn(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5555 void Disassembler::vorn(Condition cond,
5556                         DataType dt,
5557                         QRegister rd,
5558                         QRegister rn,
5559                         const QOperand& operand) {
5560   os().SetCurrentInstruction(kVorn, kFpNeon);
5561   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
5562   os() << " ";
5563   if (!rd.Is(rn) || !use_short_hand_form_) {
5564     os() << rd << ", ";
5565   }
5566   os() << rn << ", " << operand;
5567 }
5568 
vorr(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5569 void Disassembler::vorr(Condition cond,
5570                         DataType dt,
5571                         DRegister rd,
5572                         DRegister rn,
5573                         const DOperand& operand) {
5574   os().SetCurrentInstruction(kVorr, kFpNeon);
5575   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
5576   os() << " ";
5577   if (!rd.Is(rn) || !use_short_hand_form_) {
5578     os() << rd << ", ";
5579   }
5580   os() << rn << ", " << operand;
5581 }
5582 
vorr(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5583 void Disassembler::vorr(Condition cond,
5584                         DataType dt,
5585                         QRegister rd,
5586                         QRegister rn,
5587                         const QOperand& operand) {
5588   os().SetCurrentInstruction(kVorr, kFpNeon);
5589   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
5590   os() << " ";
5591   if (!rd.Is(rn) || !use_short_hand_form_) {
5592     os() << rd << ", ";
5593   }
5594   os() << rn << ", " << operand;
5595 }
5596 
vpadal(Condition cond,DataType dt,DRegister rd,DRegister rm)5597 void Disassembler::vpadal(Condition cond,
5598                           DataType dt,
5599                           DRegister rd,
5600                           DRegister rm) {
5601   os().SetCurrentInstruction(kVpadal, kFpNeon);
5602   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
5603        << rd << ", " << rm;
5604 }
5605 
vpadal(Condition cond,DataType dt,QRegister rd,QRegister rm)5606 void Disassembler::vpadal(Condition cond,
5607                           DataType dt,
5608                           QRegister rd,
5609                           QRegister rm) {
5610   os().SetCurrentInstruction(kVpadal, kFpNeon);
5611   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
5612        << rd << ", " << rm;
5613 }
5614 
vpadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5615 void Disassembler::vpadd(
5616     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5617   os().SetCurrentInstruction(kVpadd, kFpNeon);
5618   os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
5619   os() << " ";
5620   if (!rd.Is(rn) || !use_short_hand_form_) {
5621     os() << rd << ", ";
5622   }
5623   os() << rn << ", " << rm;
5624 }
5625 
vpaddl(Condition cond,DataType dt,DRegister rd,DRegister rm)5626 void Disassembler::vpaddl(Condition cond,
5627                           DataType dt,
5628                           DRegister rd,
5629                           DRegister rm) {
5630   os().SetCurrentInstruction(kVpaddl, kFpNeon);
5631   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
5632        << rd << ", " << rm;
5633 }
5634 
vpaddl(Condition cond,DataType dt,QRegister rd,QRegister rm)5635 void Disassembler::vpaddl(Condition cond,
5636                           DataType dt,
5637                           QRegister rd,
5638                           QRegister rm) {
5639   os().SetCurrentInstruction(kVpaddl, kFpNeon);
5640   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
5641        << rd << ", " << rm;
5642 }
5643 
vpmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5644 void Disassembler::vpmax(
5645     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5646   os().SetCurrentInstruction(kVpmax, kFpNeon);
5647   os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
5648   os() << " ";
5649   if (!rd.Is(rn) || !use_short_hand_form_) {
5650     os() << rd << ", ";
5651   }
5652   os() << rn << ", " << rm;
5653 }
5654 
vpmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5655 void Disassembler::vpmin(
5656     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5657   os().SetCurrentInstruction(kVpmin, kFpNeon);
5658   os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt;
5659   os() << " ";
5660   if (!rd.Is(rn) || !use_short_hand_form_) {
5661     os() << rd << ", ";
5662   }
5663   os() << rn << ", " << rm;
5664 }
5665 
vpop(Condition cond,DataType dt,DRegisterList dreglist)5666 void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
5667   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
5668   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
5669        << dreglist;
5670 }
5671 
vpop(Condition cond,DataType dt,SRegisterList sreglist)5672 void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
5673   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
5674   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
5675        << sreglist;
5676 }
5677 
vpush(Condition cond,DataType dt,DRegisterList dreglist)5678 void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
5679   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
5680   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
5681        << dreglist;
5682 }
5683 
vpush(Condition cond,DataType dt,SRegisterList sreglist)5684 void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
5685   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
5686   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
5687        << sreglist;
5688 }
5689 
vqabs(Condition cond,DataType dt,DRegister rd,DRegister rm)5690 void Disassembler::vqabs(Condition cond,
5691                          DataType dt,
5692                          DRegister rd,
5693                          DRegister rm) {
5694   os().SetCurrentInstruction(kVqabs, kFpNeon);
5695   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
5696        << rd << ", " << rm;
5697 }
5698 
vqabs(Condition cond,DataType dt,QRegister rd,QRegister rm)5699 void Disassembler::vqabs(Condition cond,
5700                          DataType dt,
5701                          QRegister rd,
5702                          QRegister rm) {
5703   os().SetCurrentInstruction(kVqabs, kFpNeon);
5704   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
5705        << rd << ", " << rm;
5706 }
5707 
vqadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5708 void Disassembler::vqadd(
5709     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5710   os().SetCurrentInstruction(kVqadd, kFpNeon);
5711   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
5712   os() << " ";
5713   if (!rd.Is(rn) || !use_short_hand_form_) {
5714     os() << rd << ", ";
5715   }
5716   os() << rn << ", " << rm;
5717 }
5718 
vqadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5719 void Disassembler::vqadd(
5720     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5721   os().SetCurrentInstruction(kVqadd, kFpNeon);
5722   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
5723   os() << " ";
5724   if (!rd.Is(rn) || !use_short_hand_form_) {
5725     os() << rd << ", ";
5726   }
5727   os() << rn << ", " << rm;
5728 }
5729 
vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5730 void Disassembler::vqdmlal(
5731     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5732   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
5733   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5734        << rd << ", " << rn << ", " << rm;
5735 }
5736 
vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)5737 void Disassembler::vqdmlal(Condition cond,
5738                            DataType dt,
5739                            QRegister rd,
5740                            DRegister rn,
5741                            DRegister dm,
5742                            unsigned index) {
5743   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
5744   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5745        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5746 }
5747 
vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5748 void Disassembler::vqdmlsl(
5749     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5750   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
5751   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5752        << rd << ", " << rn << ", " << rm;
5753 }
5754 
vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)5755 void Disassembler::vqdmlsl(Condition cond,
5756                            DataType dt,
5757                            QRegister rd,
5758                            DRegister rn,
5759                            DRegister dm,
5760                            unsigned index) {
5761   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
5762   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5763        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5764 }
5765 
vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5766 void Disassembler::vqdmulh(
5767     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5768   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5769   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5770   os() << " ";
5771   if (!rd.Is(rn) || !use_short_hand_form_) {
5772     os() << rd << ", ";
5773   }
5774   os() << rn << ", " << rm;
5775 }
5776 
vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5777 void Disassembler::vqdmulh(
5778     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5779   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5780   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5781   os() << " ";
5782   if (!rd.Is(rn) || !use_short_hand_form_) {
5783     os() << rd << ", ";
5784   }
5785   os() << rn << ", " << rm;
5786 }
5787 
vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)5788 void Disassembler::vqdmulh(
5789     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5790   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5791   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5792   os() << " ";
5793   if (!rd.Is(rn) || !use_short_hand_form_) {
5794     os() << rd << ", ";
5795   }
5796   os() << rn << ", " << rm;
5797 }
5798 
vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)5799 void Disassembler::vqdmulh(
5800     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5801   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5802   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5803   os() << " ";
5804   if (!rd.Is(rn) || !use_short_hand_form_) {
5805     os() << rd << ", ";
5806   }
5807   os() << rn << ", " << rm;
5808 }
5809 
vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5810 void Disassembler::vqdmull(
5811     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5812   os().SetCurrentInstruction(kVqdmull, kFpNeon);
5813   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
5814        << rd << ", " << rn << ", " << rm;
5815 }
5816 
vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)5817 void Disassembler::vqdmull(
5818     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5819   os().SetCurrentInstruction(kVqdmull, kFpNeon);
5820   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
5821        << rd << ", " << rn << ", " << rm;
5822 }
5823 
vqmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)5824 void Disassembler::vqmovn(Condition cond,
5825                           DataType dt,
5826                           DRegister rd,
5827                           QRegister rm) {
5828   os().SetCurrentInstruction(kVqmovn, kFpNeon);
5829   os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
5830        << rd << ", " << rm;
5831 }
5832 
vqmovun(Condition cond,DataType dt,DRegister rd,QRegister rm)5833 void Disassembler::vqmovun(Condition cond,
5834                            DataType dt,
5835                            DRegister rd,
5836                            QRegister rm) {
5837   os().SetCurrentInstruction(kVqmovun, kFpNeon);
5838   os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
5839        << rd << ", " << rm;
5840 }
5841 
vqneg(Condition cond,DataType dt,DRegister rd,DRegister rm)5842 void Disassembler::vqneg(Condition cond,
5843                          DataType dt,
5844                          DRegister rd,
5845                          DRegister rm) {
5846   os().SetCurrentInstruction(kVqneg, kFpNeon);
5847   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
5848        << rd << ", " << rm;
5849 }
5850 
vqneg(Condition cond,DataType dt,QRegister rd,QRegister rm)5851 void Disassembler::vqneg(Condition cond,
5852                          DataType dt,
5853                          QRegister rd,
5854                          QRegister rm) {
5855   os().SetCurrentInstruction(kVqneg, kFpNeon);
5856   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
5857        << rd << ", " << rm;
5858 }
5859 
vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5860 void Disassembler::vqrdmulh(
5861     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5862   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5863   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5864   os() << " ";
5865   if (!rd.Is(rn) || !use_short_hand_form_) {
5866     os() << rd << ", ";
5867   }
5868   os() << rn << ", " << rm;
5869 }
5870 
vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5871 void Disassembler::vqrdmulh(
5872     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5873   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5874   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5875   os() << " ";
5876   if (!rd.Is(rn) || !use_short_hand_form_) {
5877     os() << rd << ", ";
5878   }
5879   os() << rn << ", " << rm;
5880 }
5881 
vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)5882 void Disassembler::vqrdmulh(
5883     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5884   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5885   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5886   os() << " ";
5887   if (!rd.Is(rn) || !use_short_hand_form_) {
5888     os() << rd << ", ";
5889   }
5890   os() << rn << ", " << rm;
5891 }
5892 
vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)5893 void Disassembler::vqrdmulh(
5894     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5895   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5896   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5897   os() << " ";
5898   if (!rd.Is(rn) || !use_short_hand_form_) {
5899     os() << rd << ", ";
5900   }
5901   os() << rn << ", " << rm;
5902 }
5903 
vqrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)5904 void Disassembler::vqrshl(
5905     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
5906   os().SetCurrentInstruction(kVqrshl, kFpNeon);
5907   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
5908   os() << " ";
5909   if (!rd.Is(rm) || !use_short_hand_form_) {
5910     os() << rd << ", ";
5911   }
5912   os() << rm << ", " << rn;
5913 }
5914 
vqrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)5915 void Disassembler::vqrshl(
5916     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
5917   os().SetCurrentInstruction(kVqrshl, kFpNeon);
5918   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
5919   os() << " ";
5920   if (!rd.Is(rm) || !use_short_hand_form_) {
5921     os() << rd << ", ";
5922   }
5923   os() << rm << ", " << rn;
5924 }
5925 
vqrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)5926 void Disassembler::vqrshrn(Condition cond,
5927                            DataType dt,
5928                            DRegister rd,
5929                            QRegister rm,
5930                            const QOperand& operand) {
5931   os().SetCurrentInstruction(kVqrshrn, kFpNeon);
5932   os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
5933        << rd << ", " << rm << ", " << operand;
5934 }
5935 
vqrshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)5936 void Disassembler::vqrshrun(Condition cond,
5937                             DataType dt,
5938                             DRegister rd,
5939                             QRegister rm,
5940                             const QOperand& operand) {
5941   os().SetCurrentInstruction(kVqrshrun, kFpNeon);
5942   os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
5943        << rd << ", " << rm << ", " << operand;
5944 }
5945 
vqshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5946 void Disassembler::vqshl(Condition cond,
5947                          DataType dt,
5948                          DRegister rd,
5949                          DRegister rm,
5950                          const DOperand& operand) {
5951   os().SetCurrentInstruction(kVqshl, kFpNeon);
5952   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
5953   os() << " ";
5954   if (!rd.Is(rm) || !use_short_hand_form_) {
5955     os() << rd << ", ";
5956   }
5957   os() << rm << ", " << operand;
5958 }
5959 
vqshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5960 void Disassembler::vqshl(Condition cond,
5961                          DataType dt,
5962                          QRegister rd,
5963                          QRegister rm,
5964                          const QOperand& operand) {
5965   os().SetCurrentInstruction(kVqshl, kFpNeon);
5966   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
5967   os() << " ";
5968   if (!rd.Is(rm) || !use_short_hand_form_) {
5969     os() << rd << ", ";
5970   }
5971   os() << rm << ", " << operand;
5972 }
5973 
vqshlu(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5974 void Disassembler::vqshlu(Condition cond,
5975                           DataType dt,
5976                           DRegister rd,
5977                           DRegister rm,
5978                           const DOperand& operand) {
5979   os().SetCurrentInstruction(kVqshlu, kFpNeon);
5980   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
5981   os() << " ";
5982   if (!rd.Is(rm) || !use_short_hand_form_) {
5983     os() << rd << ", ";
5984   }
5985   os() << rm << ", " << operand;
5986 }
5987 
vqshlu(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5988 void Disassembler::vqshlu(Condition cond,
5989                           DataType dt,
5990                           QRegister rd,
5991                           QRegister rm,
5992                           const QOperand& operand) {
5993   os().SetCurrentInstruction(kVqshlu, kFpNeon);
5994   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
5995   os() << " ";
5996   if (!rd.Is(rm) || !use_short_hand_form_) {
5997     os() << rd << ", ";
5998   }
5999   os() << rm << ", " << operand;
6000 }
6001 
vqshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)6002 void Disassembler::vqshrn(Condition cond,
6003                           DataType dt,
6004                           DRegister rd,
6005                           QRegister rm,
6006                           const QOperand& operand) {
6007   os().SetCurrentInstruction(kVqshrn, kFpNeon);
6008   os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6009        << rd << ", " << rm << ", " << operand;
6010 }
6011 
vqshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)6012 void Disassembler::vqshrun(Condition cond,
6013                            DataType dt,
6014                            DRegister rd,
6015                            QRegister rm,
6016                            const QOperand& operand) {
6017   os().SetCurrentInstruction(kVqshrun, kFpNeon);
6018   os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
6019        << rd << ", " << rm << ", " << operand;
6020 }
6021 
vqsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6022 void Disassembler::vqsub(
6023     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6024   os().SetCurrentInstruction(kVqsub, kFpNeon);
6025   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
6026   os() << " ";
6027   if (!rd.Is(rn) || !use_short_hand_form_) {
6028     os() << rd << ", ";
6029   }
6030   os() << rn << ", " << rm;
6031 }
6032 
vqsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6033 void Disassembler::vqsub(
6034     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6035   os().SetCurrentInstruction(kVqsub, kFpNeon);
6036   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
6037   os() << " ";
6038   if (!rd.Is(rn) || !use_short_hand_form_) {
6039     os() << rd << ", ";
6040   }
6041   os() << rn << ", " << rm;
6042 }
6043 
vraddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)6044 void Disassembler::vraddhn(
6045     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6046   os().SetCurrentInstruction(kVraddhn, kFpNeon);
6047   os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
6048        << rd << ", " << rn << ", " << rm;
6049 }
6050 
vrecpe(Condition cond,DataType dt,DRegister rd,DRegister rm)6051 void Disassembler::vrecpe(Condition cond,
6052                           DataType dt,
6053                           DRegister rd,
6054                           DRegister rm) {
6055   os().SetCurrentInstruction(kVrecpe, kFpNeon);
6056   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
6057        << rd << ", " << rm;
6058 }
6059 
vrecpe(Condition cond,DataType dt,QRegister rd,QRegister rm)6060 void Disassembler::vrecpe(Condition cond,
6061                           DataType dt,
6062                           QRegister rd,
6063                           QRegister rm) {
6064   os().SetCurrentInstruction(kVrecpe, kFpNeon);
6065   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
6066        << rd << ", " << rm;
6067 }
6068 
vrecps(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6069 void Disassembler::vrecps(
6070     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6071   os().SetCurrentInstruction(kVrecps, kFpNeon);
6072   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
6073   os() << " ";
6074   if (!rd.Is(rn) || !use_short_hand_form_) {
6075     os() << rd << ", ";
6076   }
6077   os() << rn << ", " << rm;
6078 }
6079 
vrecps(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6080 void Disassembler::vrecps(
6081     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6082   os().SetCurrentInstruction(kVrecps, kFpNeon);
6083   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
6084   os() << " ";
6085   if (!rd.Is(rn) || !use_short_hand_form_) {
6086     os() << rd << ", ";
6087   }
6088   os() << rn << ", " << rm;
6089 }
6090 
vrev16(Condition cond,DataType dt,DRegister rd,DRegister rm)6091 void Disassembler::vrev16(Condition cond,
6092                           DataType dt,
6093                           DRegister rd,
6094                           DRegister rm) {
6095   os().SetCurrentInstruction(kVrev16, kFpNeon);
6096   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
6097        << rd << ", " << rm;
6098 }
6099 
vrev16(Condition cond,DataType dt,QRegister rd,QRegister rm)6100 void Disassembler::vrev16(Condition cond,
6101                           DataType dt,
6102                           QRegister rd,
6103                           QRegister rm) {
6104   os().SetCurrentInstruction(kVrev16, kFpNeon);
6105   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
6106        << rd << ", " << rm;
6107 }
6108 
vrev32(Condition cond,DataType dt,DRegister rd,DRegister rm)6109 void Disassembler::vrev32(Condition cond,
6110                           DataType dt,
6111                           DRegister rd,
6112                           DRegister rm) {
6113   os().SetCurrentInstruction(kVrev32, kFpNeon);
6114   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
6115        << rd << ", " << rm;
6116 }
6117 
vrev32(Condition cond,DataType dt,QRegister rd,QRegister rm)6118 void Disassembler::vrev32(Condition cond,
6119                           DataType dt,
6120                           QRegister rd,
6121                           QRegister rm) {
6122   os().SetCurrentInstruction(kVrev32, kFpNeon);
6123   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
6124        << rd << ", " << rm;
6125 }
6126 
vrev64(Condition cond,DataType dt,DRegister rd,DRegister rm)6127 void Disassembler::vrev64(Condition cond,
6128                           DataType dt,
6129                           DRegister rd,
6130                           DRegister rm) {
6131   os().SetCurrentInstruction(kVrev64, kFpNeon);
6132   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
6133        << rd << ", " << rm;
6134 }
6135 
vrev64(Condition cond,DataType dt,QRegister rd,QRegister rm)6136 void Disassembler::vrev64(Condition cond,
6137                           DataType dt,
6138                           QRegister rd,
6139                           QRegister rm) {
6140   os().SetCurrentInstruction(kVrev64, kFpNeon);
6141   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
6142        << rd << ", " << rm;
6143 }
6144 
vrhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6145 void Disassembler::vrhadd(
6146     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6147   os().SetCurrentInstruction(kVrhadd, kFpNeon);
6148   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
6149   os() << " ";
6150   if (!rd.Is(rn) || !use_short_hand_form_) {
6151     os() << rd << ", ";
6152   }
6153   os() << rn << ", " << rm;
6154 }
6155 
vrhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6156 void Disassembler::vrhadd(
6157     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6158   os().SetCurrentInstruction(kVrhadd, kFpNeon);
6159   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
6160   os() << " ";
6161   if (!rd.Is(rn) || !use_short_hand_form_) {
6162     os() << rd << ", ";
6163   }
6164   os() << rn << ", " << rm;
6165 }
6166 
vrinta(DataType dt,DRegister rd,DRegister rm)6167 void Disassembler::vrinta(DataType dt, DRegister rd, DRegister rm) {
6168   os().SetCurrentInstruction(kVrinta, kFpNeon);
6169   os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
6170 }
6171 
vrinta(DataType dt,QRegister rd,QRegister rm)6172 void Disassembler::vrinta(DataType dt, QRegister rd, QRegister rm) {
6173   os().SetCurrentInstruction(kVrinta, kFpNeon);
6174   os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
6175 }
6176 
vrinta(DataType dt,SRegister rd,SRegister rm)6177 void Disassembler::vrinta(DataType dt, SRegister rd, SRegister rm) {
6178   os().SetCurrentInstruction(kVrinta, kFpNeon);
6179   os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
6180 }
6181 
vrintm(DataType dt,DRegister rd,DRegister rm)6182 void Disassembler::vrintm(DataType dt, DRegister rd, DRegister rm) {
6183   os().SetCurrentInstruction(kVrintm, kFpNeon);
6184   os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
6185 }
6186 
vrintm(DataType dt,QRegister rd,QRegister rm)6187 void Disassembler::vrintm(DataType dt, QRegister rd, QRegister rm) {
6188   os().SetCurrentInstruction(kVrintm, kFpNeon);
6189   os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
6190 }
6191 
vrintm(DataType dt,SRegister rd,SRegister rm)6192 void Disassembler::vrintm(DataType dt, SRegister rd, SRegister rm) {
6193   os().SetCurrentInstruction(kVrintm, kFpNeon);
6194   os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
6195 }
6196 
vrintn(DataType dt,DRegister rd,DRegister rm)6197 void Disassembler::vrintn(DataType dt, DRegister rd, DRegister rm) {
6198   os().SetCurrentInstruction(kVrintn, kFpNeon);
6199   os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
6200 }
6201 
vrintn(DataType dt,QRegister rd,QRegister rm)6202 void Disassembler::vrintn(DataType dt, QRegister rd, QRegister rm) {
6203   os().SetCurrentInstruction(kVrintn, kFpNeon);
6204   os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
6205 }
6206 
vrintn(DataType dt,SRegister rd,SRegister rm)6207 void Disassembler::vrintn(DataType dt, SRegister rd, SRegister rm) {
6208   os().SetCurrentInstruction(kVrintn, kFpNeon);
6209   os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
6210 }
6211 
vrintp(DataType dt,DRegister rd,DRegister rm)6212 void Disassembler::vrintp(DataType dt, DRegister rd, DRegister rm) {
6213   os().SetCurrentInstruction(kVrintp, kFpNeon);
6214   os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
6215 }
6216 
vrintp(DataType dt,QRegister rd,QRegister rm)6217 void Disassembler::vrintp(DataType dt, QRegister rd, QRegister rm) {
6218   os().SetCurrentInstruction(kVrintp, kFpNeon);
6219   os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
6220 }
6221 
vrintp(DataType dt,SRegister rd,SRegister rm)6222 void Disassembler::vrintp(DataType dt, SRegister rd, SRegister rm) {
6223   os().SetCurrentInstruction(kVrintp, kFpNeon);
6224   os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
6225 }
6226 
vrintr(Condition cond,DataType dt,SRegister rd,SRegister rm)6227 void Disassembler::vrintr(Condition cond,
6228                           DataType dt,
6229                           SRegister rd,
6230                           SRegister rm) {
6231   os().SetCurrentInstruction(kVrintr, kFpNeon);
6232   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " "
6233        << rd << ", " << rm;
6234 }
6235 
vrintr(Condition cond,DataType dt,DRegister rd,DRegister rm)6236 void Disassembler::vrintr(Condition cond,
6237                           DataType dt,
6238                           DRegister rd,
6239                           DRegister rm) {
6240   os().SetCurrentInstruction(kVrintr, kFpNeon);
6241   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " "
6242        << rd << ", " << rm;
6243 }
6244 
vrintx(Condition cond,DataType dt,DRegister rd,DRegister rm)6245 void Disassembler::vrintx(Condition cond,
6246                           DataType dt,
6247                           DRegister rd,
6248                           DRegister rm) {
6249   os().SetCurrentInstruction(kVrintx, kFpNeon);
6250   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " "
6251        << rd << ", " << rm;
6252 }
6253 
vrintx(DataType dt,QRegister rd,QRegister rm)6254 void Disassembler::vrintx(DataType dt, QRegister rd, QRegister rm) {
6255   os().SetCurrentInstruction(kVrintx, kFpNeon);
6256   os() << ToCString(kVrintx) << dt << " " << rd << ", " << rm;
6257 }
6258 
vrintx(Condition cond,DataType dt,SRegister rd,SRegister rm)6259 void Disassembler::vrintx(Condition cond,
6260                           DataType dt,
6261                           SRegister rd,
6262                           SRegister rm) {
6263   os().SetCurrentInstruction(kVrintx, kFpNeon);
6264   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " "
6265        << rd << ", " << rm;
6266 }
6267 
vrintz(Condition cond,DataType dt,DRegister rd,DRegister rm)6268 void Disassembler::vrintz(Condition cond,
6269                           DataType dt,
6270                           DRegister rd,
6271                           DRegister rm) {
6272   os().SetCurrentInstruction(kVrintz, kFpNeon);
6273   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " "
6274        << rd << ", " << rm;
6275 }
6276 
vrintz(DataType dt,QRegister rd,QRegister rm)6277 void Disassembler::vrintz(DataType dt, QRegister rd, QRegister rm) {
6278   os().SetCurrentInstruction(kVrintz, kFpNeon);
6279   os() << ToCString(kVrintz) << dt << " " << rd << ", " << rm;
6280 }
6281 
vrintz(Condition cond,DataType dt,SRegister rd,SRegister rm)6282 void Disassembler::vrintz(Condition cond,
6283                           DataType dt,
6284                           SRegister rd,
6285                           SRegister rm) {
6286   os().SetCurrentInstruction(kVrintz, kFpNeon);
6287   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " "
6288        << rd << ", " << rm;
6289 }
6290 
vrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)6291 void Disassembler::vrshl(
6292     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
6293   os().SetCurrentInstruction(kVrshl, kFpNeon);
6294   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
6295   os() << " ";
6296   if (!rd.Is(rm) || !use_short_hand_form_) {
6297     os() << rd << ", ";
6298   }
6299   os() << rm << ", " << rn;
6300 }
6301 
vrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)6302 void Disassembler::vrshl(
6303     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
6304   os().SetCurrentInstruction(kVrshl, kFpNeon);
6305   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
6306   os() << " ";
6307   if (!rd.Is(rm) || !use_short_hand_form_) {
6308     os() << rd << ", ";
6309   }
6310   os() << rm << ", " << rn;
6311 }
6312 
vrshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6313 void Disassembler::vrshr(Condition cond,
6314                          DataType dt,
6315                          DRegister rd,
6316                          DRegister rm,
6317                          const DOperand& operand) {
6318   os().SetCurrentInstruction(kVrshr, kFpNeon);
6319   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
6320   os() << " ";
6321   if (!rd.Is(rm) || !use_short_hand_form_) {
6322     os() << rd << ", ";
6323   }
6324   os() << rm << ", " << operand;
6325 }
6326 
vrshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6327 void Disassembler::vrshr(Condition cond,
6328                          DataType dt,
6329                          QRegister rd,
6330                          QRegister rm,
6331                          const QOperand& operand) {
6332   os().SetCurrentInstruction(kVrshr, kFpNeon);
6333   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
6334   os() << " ";
6335   if (!rd.Is(rm) || !use_short_hand_form_) {
6336     os() << rd << ", ";
6337   }
6338   os() << rm << ", " << operand;
6339 }
6340 
vrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)6341 void Disassembler::vrshrn(Condition cond,
6342                           DataType dt,
6343                           DRegister rd,
6344                           QRegister rm,
6345                           const QOperand& operand) {
6346   os().SetCurrentInstruction(kVrshrn, kFpNeon);
6347   os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6348        << rd << ", " << rm << ", " << operand;
6349 }
6350 
vrsqrte(Condition cond,DataType dt,DRegister rd,DRegister rm)6351 void Disassembler::vrsqrte(Condition cond,
6352                            DataType dt,
6353                            DRegister rd,
6354                            DRegister rm) {
6355   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
6356   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
6357        << rd << ", " << rm;
6358 }
6359 
vrsqrte(Condition cond,DataType dt,QRegister rd,QRegister rm)6360 void Disassembler::vrsqrte(Condition cond,
6361                            DataType dt,
6362                            QRegister rd,
6363                            QRegister rm) {
6364   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
6365   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
6366        << rd << ", " << rm;
6367 }
6368 
vrsqrts(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6369 void Disassembler::vrsqrts(
6370     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6371   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
6372   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
6373   os() << " ";
6374   if (!rd.Is(rn) || !use_short_hand_form_) {
6375     os() << rd << ", ";
6376   }
6377   os() << rn << ", " << rm;
6378 }
6379 
vrsqrts(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6380 void Disassembler::vrsqrts(
6381     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6382   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
6383   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
6384   os() << " ";
6385   if (!rd.Is(rn) || !use_short_hand_form_) {
6386     os() << rd << ", ";
6387   }
6388   os() << rn << ", " << rm;
6389 }
6390 
vrsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6391 void Disassembler::vrsra(Condition cond,
6392                          DataType dt,
6393                          DRegister rd,
6394                          DRegister rm,
6395                          const DOperand& operand) {
6396   os().SetCurrentInstruction(kVrsra, kFpNeon);
6397   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
6398   os() << " ";
6399   if (!rd.Is(rm) || !use_short_hand_form_) {
6400     os() << rd << ", ";
6401   }
6402   os() << rm << ", " << operand;
6403 }
6404 
vrsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6405 void Disassembler::vrsra(Condition cond,
6406                          DataType dt,
6407                          QRegister rd,
6408                          QRegister rm,
6409                          const QOperand& operand) {
6410   os().SetCurrentInstruction(kVrsra, kFpNeon);
6411   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
6412   os() << " ";
6413   if (!rd.Is(rm) || !use_short_hand_form_) {
6414     os() << rd << ", ";
6415   }
6416   os() << rm << ", " << operand;
6417 }
6418 
vrsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)6419 void Disassembler::vrsubhn(
6420     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6421   os().SetCurrentInstruction(kVrsubhn, kFpNeon);
6422   os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
6423        << rd << ", " << rn << ", " << rm;
6424 }
6425 
vseleq(DataType dt,DRegister rd,DRegister rn,DRegister rm)6426 void Disassembler::vseleq(DataType dt,
6427                           DRegister rd,
6428                           DRegister rn,
6429                           DRegister rm) {
6430   os().SetCurrentInstruction(kVseleq, kFpNeon);
6431   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
6432 }
6433 
vseleq(DataType dt,SRegister rd,SRegister rn,SRegister rm)6434 void Disassembler::vseleq(DataType dt,
6435                           SRegister rd,
6436                           SRegister rn,
6437                           SRegister rm) {
6438   os().SetCurrentInstruction(kVseleq, kFpNeon);
6439   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
6440 }
6441 
vselge(DataType dt,DRegister rd,DRegister rn,DRegister rm)6442 void Disassembler::vselge(DataType dt,
6443                           DRegister rd,
6444                           DRegister rn,
6445                           DRegister rm) {
6446   os().SetCurrentInstruction(kVselge, kFpNeon);
6447   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
6448 }
6449 
vselge(DataType dt,SRegister rd,SRegister rn,SRegister rm)6450 void Disassembler::vselge(DataType dt,
6451                           SRegister rd,
6452                           SRegister rn,
6453                           SRegister rm) {
6454   os().SetCurrentInstruction(kVselge, kFpNeon);
6455   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
6456 }
6457 
vselgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)6458 void Disassembler::vselgt(DataType dt,
6459                           DRegister rd,
6460                           DRegister rn,
6461                           DRegister rm) {
6462   os().SetCurrentInstruction(kVselgt, kFpNeon);
6463   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
6464 }
6465 
vselgt(DataType dt,SRegister rd,SRegister rn,SRegister rm)6466 void Disassembler::vselgt(DataType dt,
6467                           SRegister rd,
6468                           SRegister rn,
6469                           SRegister rm) {
6470   os().SetCurrentInstruction(kVselgt, kFpNeon);
6471   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
6472 }
6473 
vselvs(DataType dt,DRegister rd,DRegister rn,DRegister rm)6474 void Disassembler::vselvs(DataType dt,
6475                           DRegister rd,
6476                           DRegister rn,
6477                           DRegister rm) {
6478   os().SetCurrentInstruction(kVselvs, kFpNeon);
6479   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
6480 }
6481 
vselvs(DataType dt,SRegister rd,SRegister rn,SRegister rm)6482 void Disassembler::vselvs(DataType dt,
6483                           SRegister rd,
6484                           SRegister rn,
6485                           SRegister rm) {
6486   os().SetCurrentInstruction(kVselvs, kFpNeon);
6487   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
6488 }
6489 
vshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6490 void Disassembler::vshl(Condition cond,
6491                         DataType dt,
6492                         DRegister rd,
6493                         DRegister rm,
6494                         const DOperand& operand) {
6495   os().SetCurrentInstruction(kVshl, kFpNeon);
6496   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
6497   os() << " ";
6498   if (!rd.Is(rm) || !use_short_hand_form_) {
6499     os() << rd << ", ";
6500   }
6501   os() << rm << ", " << operand;
6502 }
6503 
vshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6504 void Disassembler::vshl(Condition cond,
6505                         DataType dt,
6506                         QRegister rd,
6507                         QRegister rm,
6508                         const QOperand& operand) {
6509   os().SetCurrentInstruction(kVshl, kFpNeon);
6510   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
6511   os() << " ";
6512   if (!rd.Is(rm) || !use_short_hand_form_) {
6513     os() << rd << ", ";
6514   }
6515   os() << rm << ", " << operand;
6516 }
6517 
vshll(Condition cond,DataType dt,QRegister rd,DRegister rm,const DOperand & operand)6518 void Disassembler::vshll(Condition cond,
6519                          DataType dt,
6520                          QRegister rd,
6521                          DRegister rm,
6522                          const DOperand& operand) {
6523   os().SetCurrentInstruction(kVshll, kFpNeon);
6524   os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
6525        << rd << ", " << rm << ", " << operand;
6526 }
6527 
vshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6528 void Disassembler::vshr(Condition cond,
6529                         DataType dt,
6530                         DRegister rd,
6531                         DRegister rm,
6532                         const DOperand& operand) {
6533   os().SetCurrentInstruction(kVshr, kFpNeon);
6534   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
6535   os() << " ";
6536   if (!rd.Is(rm) || !use_short_hand_form_) {
6537     os() << rd << ", ";
6538   }
6539   os() << rm << ", " << operand;
6540 }
6541 
vshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6542 void Disassembler::vshr(Condition cond,
6543                         DataType dt,
6544                         QRegister rd,
6545                         QRegister rm,
6546                         const QOperand& operand) {
6547   os().SetCurrentInstruction(kVshr, kFpNeon);
6548   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
6549   os() << " ";
6550   if (!rd.Is(rm) || !use_short_hand_form_) {
6551     os() << rd << ", ";
6552   }
6553   os() << rm << ", " << operand;
6554 }
6555 
vshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)6556 void Disassembler::vshrn(Condition cond,
6557                          DataType dt,
6558                          DRegister rd,
6559                          QRegister rm,
6560                          const QOperand& operand) {
6561   os().SetCurrentInstruction(kVshrn, kFpNeon);
6562   os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6563        << rd << ", " << rm << ", " << operand;
6564 }
6565 
vsli(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6566 void Disassembler::vsli(Condition cond,
6567                         DataType dt,
6568                         DRegister rd,
6569                         DRegister rm,
6570                         const DOperand& operand) {
6571   os().SetCurrentInstruction(kVsli, kFpNeon);
6572   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
6573   os() << " ";
6574   if (!rd.Is(rm) || !use_short_hand_form_) {
6575     os() << rd << ", ";
6576   }
6577   os() << rm << ", " << operand;
6578 }
6579 
vsli(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6580 void Disassembler::vsli(Condition cond,
6581                         DataType dt,
6582                         QRegister rd,
6583                         QRegister rm,
6584                         const QOperand& operand) {
6585   os().SetCurrentInstruction(kVsli, kFpNeon);
6586   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
6587   os() << " ";
6588   if (!rd.Is(rm) || !use_short_hand_form_) {
6589     os() << rd << ", ";
6590   }
6591   os() << rm << ", " << operand;
6592 }
6593 
vsqrt(Condition cond,DataType dt,SRegister rd,SRegister rm)6594 void Disassembler::vsqrt(Condition cond,
6595                          DataType dt,
6596                          SRegister rd,
6597                          SRegister rm) {
6598   os().SetCurrentInstruction(kVsqrt, kFpNeon);
6599   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
6600        << rd << ", " << rm;
6601 }
6602 
vsqrt(Condition cond,DataType dt,DRegister rd,DRegister rm)6603 void Disassembler::vsqrt(Condition cond,
6604                          DataType dt,
6605                          DRegister rd,
6606                          DRegister rm) {
6607   os().SetCurrentInstruction(kVsqrt, kFpNeon);
6608   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
6609        << rd << ", " << rm;
6610 }
6611 
vsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6612 void Disassembler::vsra(Condition cond,
6613                         DataType dt,
6614                         DRegister rd,
6615                         DRegister rm,
6616                         const DOperand& operand) {
6617   os().SetCurrentInstruction(kVsra, kFpNeon);
6618   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
6619   os() << " ";
6620   if (!rd.Is(rm) || !use_short_hand_form_) {
6621     os() << rd << ", ";
6622   }
6623   os() << rm << ", " << operand;
6624 }
6625 
vsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6626 void Disassembler::vsra(Condition cond,
6627                         DataType dt,
6628                         QRegister rd,
6629                         QRegister rm,
6630                         const QOperand& operand) {
6631   os().SetCurrentInstruction(kVsra, kFpNeon);
6632   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
6633   os() << " ";
6634   if (!rd.Is(rm) || !use_short_hand_form_) {
6635     os() << rd << ", ";
6636   }
6637   os() << rm << ", " << operand;
6638 }
6639 
vsri(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6640 void Disassembler::vsri(Condition cond,
6641                         DataType dt,
6642                         DRegister rd,
6643                         DRegister rm,
6644                         const DOperand& operand) {
6645   os().SetCurrentInstruction(kVsri, kFpNeon);
6646   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
6647   os() << " ";
6648   if (!rd.Is(rm) || !use_short_hand_form_) {
6649     os() << rd << ", ";
6650   }
6651   os() << rm << ", " << operand;
6652 }
6653 
vsri(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6654 void Disassembler::vsri(Condition cond,
6655                         DataType dt,
6656                         QRegister rd,
6657                         QRegister rm,
6658                         const QOperand& operand) {
6659   os().SetCurrentInstruction(kVsri, kFpNeon);
6660   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
6661   os() << " ";
6662   if (!rd.Is(rm) || !use_short_hand_form_) {
6663     os() << rd << ", ";
6664   }
6665   os() << rm << ", " << operand;
6666 }
6667 
vst1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)6668 void Disassembler::vst1(Condition cond,
6669                         DataType dt,
6670                         const NeonRegisterList& nreglist,
6671                         const AlignedMemOperand& operand) {
6672   os().SetCurrentInstruction(kVst1, kFpNeon);
6673   os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
6674        << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
6675 }
6676 
vst2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)6677 void Disassembler::vst2(Condition cond,
6678                         DataType dt,
6679                         const NeonRegisterList& nreglist,
6680                         const AlignedMemOperand& operand) {
6681   os().SetCurrentInstruction(kVst2, kFpNeon);
6682   os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
6683        << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
6684 }
6685 
vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)6686 void Disassembler::vst3(Condition cond,
6687                         DataType dt,
6688                         const NeonRegisterList& nreglist,
6689                         const AlignedMemOperand& operand) {
6690   os().SetCurrentInstruction(kVst3, kFpNeon);
6691   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
6692        << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
6693 }
6694 
vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)6695 void Disassembler::vst3(Condition cond,
6696                         DataType dt,
6697                         const NeonRegisterList& nreglist,
6698                         const MemOperand& operand) {
6699   os().SetCurrentInstruction(kVst3, kFpNeon);
6700   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
6701        << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
6702 }
6703 
vst4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)6704 void Disassembler::vst4(Condition cond,
6705                         DataType dt,
6706                         const NeonRegisterList& nreglist,
6707                         const AlignedMemOperand& operand) {
6708   os().SetCurrentInstruction(kVst4, kFpNeon);
6709   os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
6710        << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
6711 }
6712 
vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)6713 void Disassembler::vstm(Condition cond,
6714                         DataType dt,
6715                         Register rn,
6716                         WriteBack write_back,
6717                         DRegisterList dreglist) {
6718   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
6719   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
6720        << rn << write_back << ", " << dreglist;
6721 }
6722 
vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)6723 void Disassembler::vstm(Condition cond,
6724                         DataType dt,
6725                         Register rn,
6726                         WriteBack write_back,
6727                         SRegisterList sreglist) {
6728   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
6729   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
6730        << rn << write_back << ", " << sreglist;
6731 }
6732 
vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)6733 void Disassembler::vstmdb(Condition cond,
6734                           DataType dt,
6735                           Register rn,
6736                           WriteBack write_back,
6737                           DRegisterList dreglist) {
6738   os().SetCurrentInstruction(kVstmdb,
6739                              kLoadStore | kLoadStoreMultiple | kFpNeon);
6740   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
6741        << rn << write_back << ", " << dreglist;
6742 }
6743 
vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)6744 void Disassembler::vstmdb(Condition cond,
6745                           DataType dt,
6746                           Register rn,
6747                           WriteBack write_back,
6748                           SRegisterList sreglist) {
6749   os().SetCurrentInstruction(kVstmdb,
6750                              kLoadStore | kLoadStoreMultiple | kFpNeon);
6751   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
6752        << rn << write_back << ", " << sreglist;
6753 }
6754 
vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)6755 void Disassembler::vstmia(Condition cond,
6756                           DataType dt,
6757                           Register rn,
6758                           WriteBack write_back,
6759                           DRegisterList dreglist) {
6760   os().SetCurrentInstruction(kVstmia,
6761                              kLoadStore | kLoadStoreMultiple | kFpNeon);
6762   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
6763        << rn << write_back << ", " << dreglist;
6764 }
6765 
vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)6766 void Disassembler::vstmia(Condition cond,
6767                           DataType dt,
6768                           Register rn,
6769                           WriteBack write_back,
6770                           SRegisterList sreglist) {
6771   os().SetCurrentInstruction(kVstmia,
6772                              kLoadStore | kLoadStoreMultiple | kFpNeon);
6773   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
6774        << rn << write_back << ", " << sreglist;
6775 }
6776 
vstr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)6777 void Disassembler::vstr(Condition cond,
6778                         DataType dt,
6779                         DRegister rd,
6780                         const MemOperand& operand) {
6781   os().SetCurrentInstruction(kVstr, kFpNeon);
6782   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
6783        << DtPrinter(dt, Untyped64) << " " << rd << ", "
6784        << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
6785 }
6786 
vstr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)6787 void Disassembler::vstr(Condition cond,
6788                         DataType dt,
6789                         SRegister rd,
6790                         const MemOperand& operand) {
6791   os().SetCurrentInstruction(kVstr, kFpNeon);
6792   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
6793        << DtPrinter(dt, Untyped32) << " " << rd << ", "
6794        << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
6795 }
6796 
vsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6797 void Disassembler::vsub(
6798     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6799   os().SetCurrentInstruction(kVsub, kFpNeon);
6800   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6801   os() << " ";
6802   if (!rd.Is(rn) || !use_short_hand_form_) {
6803     os() << rd << ", ";
6804   }
6805   os() << rn << ", " << rm;
6806 }
6807 
vsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6808 void Disassembler::vsub(
6809     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6810   os().SetCurrentInstruction(kVsub, kFpNeon);
6811   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6812   os() << " ";
6813   if (!rd.Is(rn) || !use_short_hand_form_) {
6814     os() << rd << ", ";
6815   }
6816   os() << rn << ", " << rm;
6817 }
6818 
vsub(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6819 void Disassembler::vsub(
6820     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6821   os().SetCurrentInstruction(kVsub, kFpNeon);
6822   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6823   os() << " ";
6824   if (!rd.Is(rn) || !use_short_hand_form_) {
6825     os() << rd << ", ";
6826   }
6827   os() << rn << ", " << rm;
6828 }
6829 
vsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)6830 void Disassembler::vsubhn(
6831     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6832   os().SetCurrentInstruction(kVsubhn, kFpNeon);
6833   os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
6834        << rd << ", " << rn << ", " << rm;
6835 }
6836 
vsubl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)6837 void Disassembler::vsubl(
6838     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6839   os().SetCurrentInstruction(kVsubl, kFpNeon);
6840   os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
6841        << rd << ", " << rn << ", " << rm;
6842 }
6843 
vsubw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)6844 void Disassembler::vsubw(
6845     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
6846   os().SetCurrentInstruction(kVsubw, kFpNeon);
6847   os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
6848   os() << " ";
6849   if (!rd.Is(rn) || !use_short_hand_form_) {
6850     os() << rd << ", ";
6851   }
6852   os() << rn << ", " << rm;
6853 }
6854 
vswp(Condition cond,DataType dt,DRegister rd,DRegister rm)6855 void Disassembler::vswp(Condition cond,
6856                         DataType dt,
6857                         DRegister rd,
6858                         DRegister rm) {
6859   os().SetCurrentInstruction(kVswp, kFpNeon);
6860   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
6861        << rd << ", " << rm;
6862 }
6863 
vswp(Condition cond,DataType dt,QRegister rd,QRegister rm)6864 void Disassembler::vswp(Condition cond,
6865                         DataType dt,
6866                         QRegister rd,
6867                         QRegister rm) {
6868   os().SetCurrentInstruction(kVswp, kFpNeon);
6869   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
6870        << rd << ", " << rm;
6871 }
6872 
vtbl(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)6873 void Disassembler::vtbl(Condition cond,
6874                         DataType dt,
6875                         DRegister rd,
6876                         const NeonRegisterList& nreglist,
6877                         DRegister rm) {
6878   os().SetCurrentInstruction(kVtbl, kFpNeon);
6879   os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
6880        << rd << ", " << nreglist << ", " << rm;
6881 }
6882 
vtbx(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)6883 void Disassembler::vtbx(Condition cond,
6884                         DataType dt,
6885                         DRegister rd,
6886                         const NeonRegisterList& nreglist,
6887                         DRegister rm) {
6888   os().SetCurrentInstruction(kVtbx, kFpNeon);
6889   os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
6890        << rd << ", " << nreglist << ", " << rm;
6891 }
6892 
vtrn(Condition cond,DataType dt,DRegister rd,DRegister rm)6893 void Disassembler::vtrn(Condition cond,
6894                         DataType dt,
6895                         DRegister rd,
6896                         DRegister rm) {
6897   os().SetCurrentInstruction(kVtrn, kFpNeon);
6898   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
6899        << rd << ", " << rm;
6900 }
6901 
vtrn(Condition cond,DataType dt,QRegister rd,QRegister rm)6902 void Disassembler::vtrn(Condition cond,
6903                         DataType dt,
6904                         QRegister rd,
6905                         QRegister rm) {
6906   os().SetCurrentInstruction(kVtrn, kFpNeon);
6907   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
6908        << rd << ", " << rm;
6909 }
6910 
vtst(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6911 void Disassembler::vtst(
6912     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6913   os().SetCurrentInstruction(kVtst, kFpNeon);
6914   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
6915   os() << " ";
6916   if (!rd.Is(rn) || !use_short_hand_form_) {
6917     os() << rd << ", ";
6918   }
6919   os() << rn << ", " << rm;
6920 }
6921 
vtst(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6922 void Disassembler::vtst(
6923     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6924   os().SetCurrentInstruction(kVtst, kFpNeon);
6925   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
6926   os() << " ";
6927   if (!rd.Is(rn) || !use_short_hand_form_) {
6928     os() << rd << ", ";
6929   }
6930   os() << rn << ", " << rm;
6931 }
6932 
vuzp(Condition cond,DataType dt,DRegister rd,DRegister rm)6933 void Disassembler::vuzp(Condition cond,
6934                         DataType dt,
6935                         DRegister rd,
6936                         DRegister rm) {
6937   os().SetCurrentInstruction(kVuzp, kFpNeon);
6938   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
6939        << rd << ", " << rm;
6940 }
6941 
vuzp(Condition cond,DataType dt,QRegister rd,QRegister rm)6942 void Disassembler::vuzp(Condition cond,
6943                         DataType dt,
6944                         QRegister rd,
6945                         QRegister rm) {
6946   os().SetCurrentInstruction(kVuzp, kFpNeon);
6947   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
6948        << rd << ", " << rm;
6949 }
6950 
vzip(Condition cond,DataType dt,DRegister rd,DRegister rm)6951 void Disassembler::vzip(Condition cond,
6952                         DataType dt,
6953                         DRegister rd,
6954                         DRegister rm) {
6955   os().SetCurrentInstruction(kVzip, kFpNeon);
6956   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
6957        << rd << ", " << rm;
6958 }
6959 
vzip(Condition cond,DataType dt,QRegister rd,QRegister rm)6960 void Disassembler::vzip(Condition cond,
6961                         DataType dt,
6962                         QRegister rd,
6963                         QRegister rm) {
6964   os().SetCurrentInstruction(kVzip, kFpNeon);
6965   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
6966        << rd << ", " << rm;
6967 }
6968 
yield(Condition cond,EncodingSize size)6969 void Disassembler::yield(Condition cond, EncodingSize size) {
6970   os().SetCurrentInstruction(kYield, kNoAttribute);
6971   os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
6972 }
6973 
T32Size(uint32_t instr)6974 int Disassembler::T32Size(uint32_t instr) {
6975   if ((instr & 0xe0000000) == 0xe0000000) {
6976     switch (instr & 0x08000000) {
6977       case 0x00000000:
6978         if ((instr & 0x10000000) == 0x10000000) return 4;
6979         return 2;
6980       case 0x08000000:
6981         return 4;
6982       default:
6983         return 2;
6984     }
6985   }
6986   return 2;
6987 }
6988 
DecodeT32(uint32_t instr)6989 void Disassembler::DecodeT32(uint32_t instr) {
6990   T32CodeAddressIncrementer incrementer(instr, &code_address_);
6991   ITBlockScope it_scope(&it_block_);
6992 
6993   switch (instr & 0xe0000000) {
6994     case 0x00000000: {
6995       // 0x00000000
6996       switch (instr & 0x18000000) {
6997         case 0x18000000: {
6998           // 0x18000000
6999           switch (instr & 0x06000000) {
7000             case 0x00000000: {
7001               // 0x18000000
7002               unsigned rd = (instr >> 16) & 0x7;
7003               unsigned rn = (instr >> 19) & 0x7;
7004               unsigned rm = (instr >> 22) & 0x7;
7005               if (InITBlock()) {
7006                 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
7007                 add(CurrentCond(),
7008                     Narrow,
7009                     Register(rd),
7010                     Register(rn),
7011                     Register(rm));
7012               } else {
7013                 VIXL_ASSERT(OutsideITBlock());
7014                 // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
7015                 adds(Condition::None(),
7016                      Narrow,
7017                      Register(rd),
7018                      Register(rn),
7019                      Register(rm));
7020               }
7021               break;
7022             }
7023             case 0x02000000: {
7024               // 0x1a000000
7025               unsigned rd = (instr >> 16) & 0x7;
7026               unsigned rn = (instr >> 19) & 0x7;
7027               unsigned rm = (instr >> 22) & 0x7;
7028               if (InITBlock()) {
7029                 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
7030                 sub(CurrentCond(),
7031                     Narrow,
7032                     Register(rd),
7033                     Register(rn),
7034                     Register(rm));
7035               } else {
7036                 VIXL_ASSERT(OutsideITBlock());
7037                 // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
7038                 subs(Condition::None(),
7039                      Narrow,
7040                      Register(rd),
7041                      Register(rn),
7042                      Register(rm));
7043               }
7044               break;
7045             }
7046             case 0x04000000: {
7047               // 0x1c000000
7048               unsigned rd = (instr >> 16) & 0x7;
7049               unsigned rn = (instr >> 19) & 0x7;
7050               uint32_t imm = (instr >> 22) & 0x7;
7051               if (InITBlock()) {
7052                 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
7053                 add(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
7054               } else {
7055                 VIXL_ASSERT(OutsideITBlock());
7056                 // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
7057                 adds(Condition::None(),
7058                      Narrow,
7059                      Register(rd),
7060                      Register(rn),
7061                      imm);
7062               }
7063               break;
7064             }
7065             case 0x06000000: {
7066               // 0x1e000000
7067               unsigned rd = (instr >> 16) & 0x7;
7068               unsigned rn = (instr >> 19) & 0x7;
7069               uint32_t imm = (instr >> 22) & 0x7;
7070               if (InITBlock()) {
7071                 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
7072                 sub(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
7073               } else {
7074                 VIXL_ASSERT(OutsideITBlock());
7075                 // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
7076                 subs(Condition::None(),
7077                      Narrow,
7078                      Register(rd),
7079                      Register(rn),
7080                      imm);
7081               }
7082               break;
7083             }
7084           }
7085           break;
7086         }
7087         default: {
7088           if (((instr & 0x18000000) == 0x18000000)) {
7089             UnallocatedT32(instr);
7090             return;
7091           }
7092           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
7093               InITBlock()) {
7094             unsigned rd = (instr >> 16) & 0x7;
7095             unsigned rm = (instr >> 19) & 0x7;
7096             uint32_t amount = (instr >> 22) & 0x1f;
7097             if (amount == 0) amount = 32;
7098             // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7099             asr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7100             return;
7101           }
7102           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
7103               !InITBlock()) {
7104             unsigned rd = (instr >> 16) & 0x7;
7105             unsigned rm = (instr >> 19) & 0x7;
7106             uint32_t amount = (instr >> 22) & 0x1f;
7107             if (amount == 0) amount = 32;
7108             // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7109             asrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7110             return;
7111           }
7112           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
7113               ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
7114             unsigned rd = (instr >> 16) & 0x7;
7115             unsigned rm = (instr >> 19) & 0x7;
7116             uint32_t amount = (instr >> 22) & 0x1f;
7117             // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7118             lsl(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7119             return;
7120           }
7121           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
7122               ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
7123             unsigned rd = (instr >> 16) & 0x7;
7124             unsigned rm = (instr >> 19) & 0x7;
7125             uint32_t amount = (instr >> 22) & 0x1f;
7126             // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7127             lsls(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7128             return;
7129           }
7130           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
7131               InITBlock()) {
7132             unsigned rd = (instr >> 16) & 0x7;
7133             unsigned rm = (instr >> 19) & 0x7;
7134             uint32_t amount = (instr >> 22) & 0x1f;
7135             if (amount == 0) amount = 32;
7136             // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7137             lsr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7138             return;
7139           }
7140           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
7141               !InITBlock()) {
7142             unsigned rd = (instr >> 16) & 0x7;
7143             unsigned rm = (instr >> 19) & 0x7;
7144             uint32_t amount = (instr >> 22) & 0x1f;
7145             if (amount == 0) amount = 32;
7146             // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7147             lsrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7148             return;
7149           }
7150           unsigned rd = (instr >> 16) & 0x7;
7151           unsigned rm = (instr >> 19) & 0x7;
7152           ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
7153                                               (instr >> 22) & 0x1f);
7154           if (InITBlock()) {
7155             // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
7156             mov(CurrentCond(),
7157                 Narrow,
7158                 Register(rd),
7159                 Operand(Register(rm),
7160                         shift_operand.GetType(),
7161                         shift_operand.GetAmount()));
7162           } else {
7163             VIXL_ASSERT(OutsideITBlock());
7164             // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
7165             movs(Condition::None(),
7166                  Narrow,
7167                  Register(rd),
7168                  Operand(Register(rm),
7169                          shift_operand.GetType(),
7170                          shift_operand.GetAmount()));
7171           }
7172           break;
7173         }
7174       }
7175       break;
7176     }
7177     case 0x20000000: {
7178       // 0x20000000
7179       switch (instr & 0x18000000) {
7180         case 0x00000000: {
7181           // 0x20000000
7182           unsigned rd = (instr >> 24) & 0x7;
7183           uint32_t imm = (instr >> 16) & 0xff;
7184           if (InITBlock()) {
7185             // MOV<c>{<q>} <Rd>, #<imm8> ; T1
7186             mov(CurrentCond(), Narrow, Register(rd), imm);
7187           } else {
7188             VIXL_ASSERT(OutsideITBlock());
7189             // MOVS{<q>} <Rd>, #<imm8> ; T1
7190             movs(Condition::None(), Narrow, Register(rd), imm);
7191           }
7192           break;
7193         }
7194         case 0x08000000: {
7195           // 0x28000000
7196           unsigned rn = (instr >> 24) & 0x7;
7197           uint32_t imm = (instr >> 16) & 0xff;
7198           // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
7199           cmp(CurrentCond(), Narrow, Register(rn), imm);
7200           break;
7201         }
7202         case 0x10000000: {
7203           // 0x30000000
7204           unsigned rd = (instr >> 24) & 0x7;
7205           uint32_t imm = (instr >> 16) & 0xff;
7206           if (InITBlock() && ((imm <= 7))) {
7207             // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
7208             add(CurrentCond(), Register(rd), imm);
7209           } else if (InITBlock() && ((imm > 7))) {
7210             // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7211             add(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
7212           } else if (OutsideITBlock() && ((imm <= 7))) {
7213             // ADDS{<q>} <Rdn>, #<imm8> ; T2
7214             adds(Register(rd), imm);
7215           } else if (OutsideITBlock() && ((imm > 7))) {
7216             // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7217             adds(Condition::None(), Narrow, Register(rd), Register(rd), imm);
7218           } else {
7219             UnallocatedT32(instr);
7220           }
7221           break;
7222         }
7223         case 0x18000000: {
7224           // 0x38000000
7225           unsigned rd = (instr >> 24) & 0x7;
7226           uint32_t imm = (instr >> 16) & 0xff;
7227           if (InITBlock() && ((imm <= 7))) {
7228             // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
7229             sub(CurrentCond(), Register(rd), imm);
7230           } else if (InITBlock() && ((imm > 7))) {
7231             // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7232             sub(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
7233           } else if (OutsideITBlock() && ((imm <= 7))) {
7234             // SUBS{<q>} <Rdn>, #<imm8> ; T2
7235             subs(Register(rd), imm);
7236           } else if (OutsideITBlock() && ((imm > 7))) {
7237             // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7238             subs(Condition::None(), Narrow, Register(rd), Register(rd), imm);
7239           } else {
7240             UnallocatedT32(instr);
7241           }
7242           break;
7243         }
7244       }
7245       break;
7246     }
7247     case 0x40000000: {
7248       // 0x40000000
7249       switch (instr & 0x18000000) {
7250         case 0x00000000: {
7251           // 0x40000000
7252           switch (instr & 0x07000000) {
7253             case 0x00000000: {
7254               // 0x40000000
7255               switch (instr & 0x00c00000) {
7256                 case 0x00000000: {
7257                   // 0x40000000
7258                   unsigned rd = (instr >> 16) & 0x7;
7259                   unsigned rm = (instr >> 19) & 0x7;
7260                   if (InITBlock()) {
7261                     // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7262                     and_(CurrentCond(),
7263                          Narrow,
7264                          Register(rd),
7265                          Register(rd),
7266                          Register(rm));
7267                   } else {
7268                     VIXL_ASSERT(OutsideITBlock());
7269                     // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7270                     ands(Condition::None(),
7271                          Narrow,
7272                          Register(rd),
7273                          Register(rd),
7274                          Register(rm));
7275                   }
7276                   break;
7277                 }
7278                 case 0x00400000: {
7279                   // 0x40400000
7280                   unsigned rd = (instr >> 16) & 0x7;
7281                   unsigned rm = (instr >> 19) & 0x7;
7282                   if (InITBlock()) {
7283                     // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7284                     eor(CurrentCond(),
7285                         Narrow,
7286                         Register(rd),
7287                         Register(rd),
7288                         Register(rm));
7289                   } else {
7290                     VIXL_ASSERT(OutsideITBlock());
7291                     // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7292                     eors(Condition::None(),
7293                          Narrow,
7294                          Register(rd),
7295                          Register(rd),
7296                          Register(rm));
7297                   }
7298                   break;
7299                 }
7300                 case 0x00800000: {
7301                   // 0x40800000
7302                   if (InITBlock()) {
7303                     unsigned rd = (instr >> 16) & 0x7;
7304                     unsigned rs = (instr >> 19) & 0x7;
7305                     // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7306                     lsl(CurrentCond(),
7307                         Narrow,
7308                         Register(rd),
7309                         Register(rd),
7310                         Register(rs));
7311                     return;
7312                   }
7313                   if (!InITBlock()) {
7314                     unsigned rd = (instr >> 16) & 0x7;
7315                     unsigned rs = (instr >> 19) & 0x7;
7316                     // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7317                     lsls(Condition::None(),
7318                          Narrow,
7319                          Register(rd),
7320                          Register(rd),
7321                          Register(rs));
7322                     return;
7323                   }
7324                   unsigned rd = (instr >> 16) & 0x7;
7325                   unsigned rm = (instr >> 16) & 0x7;
7326                   unsigned rs = (instr >> 19) & 0x7;
7327                   if (InITBlock()) {
7328                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
7329                     mov(CurrentCond(),
7330                         Narrow,
7331                         Register(rd),
7332                         Operand(Register(rm), LSL, Register(rs)));
7333                   } else {
7334                     VIXL_ASSERT(OutsideITBlock());
7335                     // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
7336                     movs(Condition::None(),
7337                          Narrow,
7338                          Register(rd),
7339                          Operand(Register(rm), LSL, Register(rs)));
7340                   }
7341                   break;
7342                 }
7343                 case 0x00c00000: {
7344                   // 0x40c00000
7345                   if (InITBlock()) {
7346                     unsigned rd = (instr >> 16) & 0x7;
7347                     unsigned rs = (instr >> 19) & 0x7;
7348                     // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7349                     lsr(CurrentCond(),
7350                         Narrow,
7351                         Register(rd),
7352                         Register(rd),
7353                         Register(rs));
7354                     return;
7355                   }
7356                   if (!InITBlock()) {
7357                     unsigned rd = (instr >> 16) & 0x7;
7358                     unsigned rs = (instr >> 19) & 0x7;
7359                     // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7360                     lsrs(Condition::None(),
7361                          Narrow,
7362                          Register(rd),
7363                          Register(rd),
7364                          Register(rs));
7365                     return;
7366                   }
7367                   unsigned rd = (instr >> 16) & 0x7;
7368                   unsigned rm = (instr >> 16) & 0x7;
7369                   unsigned rs = (instr >> 19) & 0x7;
7370                   if (InITBlock()) {
7371                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
7372                     mov(CurrentCond(),
7373                         Narrow,
7374                         Register(rd),
7375                         Operand(Register(rm), LSR, Register(rs)));
7376                   } else {
7377                     VIXL_ASSERT(OutsideITBlock());
7378                     // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
7379                     movs(Condition::None(),
7380                          Narrow,
7381                          Register(rd),
7382                          Operand(Register(rm), LSR, Register(rs)));
7383                   }
7384                   break;
7385                 }
7386               }
7387               break;
7388             }
7389             case 0x01000000: {
7390               // 0x41000000
7391               switch (instr & 0x00c00000) {
7392                 case 0x00000000: {
7393                   // 0x41000000
7394                   if (InITBlock()) {
7395                     unsigned rd = (instr >> 16) & 0x7;
7396                     unsigned rs = (instr >> 19) & 0x7;
7397                     // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7398                     asr(CurrentCond(),
7399                         Narrow,
7400                         Register(rd),
7401                         Register(rd),
7402                         Register(rs));
7403                     return;
7404                   }
7405                   if (!InITBlock()) {
7406                     unsigned rd = (instr >> 16) & 0x7;
7407                     unsigned rs = (instr >> 19) & 0x7;
7408                     // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7409                     asrs(Condition::None(),
7410                          Narrow,
7411                          Register(rd),
7412                          Register(rd),
7413                          Register(rs));
7414                     return;
7415                   }
7416                   unsigned rd = (instr >> 16) & 0x7;
7417                   unsigned rm = (instr >> 16) & 0x7;
7418                   unsigned rs = (instr >> 19) & 0x7;
7419                   if (InITBlock()) {
7420                     // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
7421                     mov(CurrentCond(),
7422                         Narrow,
7423                         Register(rd),
7424                         Operand(Register(rm), ASR, Register(rs)));
7425                   } else {
7426                     VIXL_ASSERT(OutsideITBlock());
7427                     // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
7428                     movs(Condition::None(),
7429                          Narrow,
7430                          Register(rd),
7431                          Operand(Register(rm), ASR, Register(rs)));
7432                   }
7433                   break;
7434                 }
7435                 case 0x00400000: {
7436                   // 0x41400000
7437                   unsigned rd = (instr >> 16) & 0x7;
7438                   unsigned rm = (instr >> 19) & 0x7;
7439                   if (InITBlock()) {
7440                     // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7441                     adc(CurrentCond(),
7442                         Narrow,
7443                         Register(rd),
7444                         Register(rd),
7445                         Register(rm));
7446                   } else {
7447                     VIXL_ASSERT(OutsideITBlock());
7448                     // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7449                     adcs(Condition::None(),
7450                          Narrow,
7451                          Register(rd),
7452                          Register(rd),
7453                          Register(rm));
7454                   }
7455                   break;
7456                 }
7457                 case 0x00800000: {
7458                   // 0x41800000
7459                   unsigned rd = (instr >> 16) & 0x7;
7460                   unsigned rm = (instr >> 19) & 0x7;
7461                   if (InITBlock()) {
7462                     // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7463                     sbc(CurrentCond(),
7464                         Narrow,
7465                         Register(rd),
7466                         Register(rd),
7467                         Register(rm));
7468                   } else {
7469                     VIXL_ASSERT(OutsideITBlock());
7470                     // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7471                     sbcs(Condition::None(),
7472                          Narrow,
7473                          Register(rd),
7474                          Register(rd),
7475                          Register(rm));
7476                   }
7477                   break;
7478                 }
7479                 case 0x00c00000: {
7480                   // 0x41c00000
7481                   if (InITBlock()) {
7482                     unsigned rd = (instr >> 16) & 0x7;
7483                     unsigned rs = (instr >> 19) & 0x7;
7484                     // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7485                     ror(CurrentCond(),
7486                         Narrow,
7487                         Register(rd),
7488                         Register(rd),
7489                         Register(rs));
7490                     return;
7491                   }
7492                   if (!InITBlock()) {
7493                     unsigned rd = (instr >> 16) & 0x7;
7494                     unsigned rs = (instr >> 19) & 0x7;
7495                     // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7496                     rors(Condition::None(),
7497                          Narrow,
7498                          Register(rd),
7499                          Register(rd),
7500                          Register(rs));
7501                     return;
7502                   }
7503                   unsigned rd = (instr >> 16) & 0x7;
7504                   unsigned rm = (instr >> 16) & 0x7;
7505                   unsigned rs = (instr >> 19) & 0x7;
7506                   if (InITBlock()) {
7507                     // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
7508                     mov(CurrentCond(),
7509                         Narrow,
7510                         Register(rd),
7511                         Operand(Register(rm), ROR, Register(rs)));
7512                   } else {
7513                     VIXL_ASSERT(OutsideITBlock());
7514                     // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
7515                     movs(Condition::None(),
7516                          Narrow,
7517                          Register(rd),
7518                          Operand(Register(rm), ROR, Register(rs)));
7519                   }
7520                   break;
7521                 }
7522               }
7523               break;
7524             }
7525             case 0x02000000: {
7526               // 0x42000000
7527               switch (instr & 0x00c00000) {
7528                 case 0x00000000: {
7529                   // 0x42000000
7530                   unsigned rn = (instr >> 16) & 0x7;
7531                   unsigned rm = (instr >> 19) & 0x7;
7532                   // TST{<c>}{<q>} <Rn>, <Rm> ; T1
7533                   tst(CurrentCond(), Narrow, Register(rn), Register(rm));
7534                   break;
7535                 }
7536                 case 0x00400000: {
7537                   // 0x42400000
7538                   unsigned rd = (instr >> 16) & 0x7;
7539                   unsigned rn = (instr >> 19) & 0x7;
7540                   if (InITBlock()) {
7541                     // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
7542                     rsb(CurrentCond(),
7543                         Narrow,
7544                         Register(rd),
7545                         Register(rn),
7546                         UINT32_C(0));
7547                   } else {
7548                     VIXL_ASSERT(OutsideITBlock());
7549                     // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
7550                     rsbs(Condition::None(),
7551                          Narrow,
7552                          Register(rd),
7553                          Register(rn),
7554                          UINT32_C(0));
7555                   }
7556                   break;
7557                 }
7558                 case 0x00800000: {
7559                   // 0x42800000
7560                   unsigned rn = (instr >> 16) & 0x7;
7561                   unsigned rm = (instr >> 19) & 0x7;
7562                   // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
7563                   cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
7564                   break;
7565                 }
7566                 case 0x00c00000: {
7567                   // 0x42c00000
7568                   unsigned rn = (instr >> 16) & 0x7;
7569                   unsigned rm = (instr >> 19) & 0x7;
7570                   // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
7571                   cmn(CurrentCond(), Narrow, Register(rn), Register(rm));
7572                   break;
7573                 }
7574               }
7575               break;
7576             }
7577             case 0x03000000: {
7578               // 0x43000000
7579               switch (instr & 0x00c00000) {
7580                 case 0x00000000: {
7581                   // 0x43000000
7582                   unsigned rd = (instr >> 16) & 0x7;
7583                   unsigned rm = (instr >> 19) & 0x7;
7584                   if (InITBlock()) {
7585                     // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7586                     orr(CurrentCond(),
7587                         Narrow,
7588                         Register(rd),
7589                         Register(rd),
7590                         Register(rm));
7591                   } else {
7592                     VIXL_ASSERT(OutsideITBlock());
7593                     // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7594                     orrs(Condition::None(),
7595                          Narrow,
7596                          Register(rd),
7597                          Register(rd),
7598                          Register(rm));
7599                   }
7600                   break;
7601                 }
7602                 case 0x00400000: {
7603                   // 0x43400000
7604                   unsigned rd = (instr >> 16) & 0x7;
7605                   unsigned rn = (instr >> 19) & 0x7;
7606                   if (InITBlock()) {
7607                     // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
7608                     mul(CurrentCond(),
7609                         Narrow,
7610                         Register(rd),
7611                         Register(rn),
7612                         Register(rd));
7613                   } else {
7614                     VIXL_ASSERT(OutsideITBlock());
7615                     // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
7616                     muls(Condition::None(),
7617                          Register(rd),
7618                          Register(rn),
7619                          Register(rd));
7620                   }
7621                   break;
7622                 }
7623                 case 0x00800000: {
7624                   // 0x43800000
7625                   unsigned rd = (instr >> 16) & 0x7;
7626                   unsigned rm = (instr >> 19) & 0x7;
7627                   if (InITBlock()) {
7628                     // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7629                     bic(CurrentCond(),
7630                         Narrow,
7631                         Register(rd),
7632                         Register(rd),
7633                         Register(rm));
7634                   } else {
7635                     VIXL_ASSERT(OutsideITBlock());
7636                     // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7637                     bics(Condition::None(),
7638                          Narrow,
7639                          Register(rd),
7640                          Register(rd),
7641                          Register(rm));
7642                   }
7643                   break;
7644                 }
7645                 case 0x00c00000: {
7646                   // 0x43c00000
7647                   unsigned rd = (instr >> 16) & 0x7;
7648                   unsigned rm = (instr >> 19) & 0x7;
7649                   if (InITBlock()) {
7650                     // MVN<c>{<q>} <Rd>, <Rm> ; T1
7651                     mvn(CurrentCond(), Narrow, Register(rd), Register(rm));
7652                   } else {
7653                     VIXL_ASSERT(OutsideITBlock());
7654                     // MVNS{<q>} <Rd>, <Rm> ; T1
7655                     mvns(Condition::None(), Narrow, Register(rd), Register(rm));
7656                   }
7657                   break;
7658                 }
7659               }
7660               break;
7661             }
7662             case 0x04000000: {
7663               // 0x44000000
7664               switch (instr & 0x00780000) {
7665                 case 0x00680000: {
7666                   // 0x44680000
7667                   unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7668                   // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
7669                   add(CurrentCond(), Narrow, Register(rd), sp, Register(rd));
7670                   break;
7671                 }
7672                 default: {
7673                   switch (instr & 0x00870000) {
7674                     case 0x00850000: {
7675                       // 0x44850000
7676                       if (((instr & 0x780000) == 0x680000)) {
7677                         UnallocatedT32(instr);
7678                         return;
7679                       }
7680                       unsigned rm = (instr >> 19) & 0xf;
7681                       // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
7682                       add(CurrentCond(), Narrow, sp, sp, Register(rm));
7683                       break;
7684                     }
7685                     default: {
7686                       if (((instr & 0x780000) == 0x680000) ||
7687                           ((instr & 0x870000) == 0x850000)) {
7688                         UnallocatedT32(instr);
7689                         return;
7690                       }
7691                       unsigned rd =
7692                           ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7693                       unsigned rm = (instr >> 19) & 0xf;
7694                       if (InITBlock()) {
7695                         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
7696                         add(CurrentCond(), Register(rd), Register(rm));
7697                       } else {
7698                         // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
7699                         add(CurrentCond(),
7700                             Narrow,
7701                             Register(rd),
7702                             Register(rd),
7703                             Register(rm));
7704                       }
7705                       break;
7706                     }
7707                   }
7708                   break;
7709                 }
7710               }
7711               break;
7712             }
7713             case 0x05000000: {
7714               // 0x45000000
7715               unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7716               unsigned rm = (instr >> 19) & 0xf;
7717               // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
7718               cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
7719               break;
7720             }
7721             case 0x06000000: {
7722               // 0x46000000
7723               unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7724               unsigned rm = (instr >> 19) & 0xf;
7725               // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
7726               mov(CurrentCond(), Narrow, Register(rd), Register(rm));
7727               break;
7728             }
7729             case 0x07000000: {
7730               // 0x47000000
7731               switch (instr & 0x00800000) {
7732                 case 0x00000000: {
7733                   // 0x47000000
7734                   unsigned rm = (instr >> 19) & 0xf;
7735                   // BX{<c>}{<q>} <Rm> ; T1
7736                   bx(CurrentCond(), Register(rm));
7737                   if (((instr & 0xff870000) != 0x47000000)) {
7738                     UnpredictableT32(instr);
7739                   }
7740                   break;
7741                 }
7742                 case 0x00800000: {
7743                   // 0x47800000
7744                   unsigned rm = (instr >> 19) & 0xf;
7745                   // BLX{<c>}{<q>} <Rm> ; T1
7746                   blx(CurrentCond(), Register(rm));
7747                   if (((instr & 0xff870000) != 0x47800000)) {
7748                     UnpredictableT32(instr);
7749                   }
7750                   break;
7751                 }
7752               }
7753               break;
7754             }
7755           }
7756           break;
7757         }
7758         case 0x08000000: {
7759           // 0x48000000
7760           unsigned rt = (instr >> 24) & 0x7;
7761           int32_t imm = ((instr >> 16) & 0xff) << 2;
7762           Location location(imm, kT32PcDelta);
7763           // LDR{<c>}{<q>} <Rt>, <label> ; T1
7764           ldr(CurrentCond(), Narrow, Register(rt), &location);
7765           break;
7766         }
7767         case 0x10000000: {
7768           // 0x50000000
7769           switch (instr & 0x06000000) {
7770             case 0x00000000: {
7771               // 0x50000000
7772               unsigned rt = (instr >> 16) & 0x7;
7773               unsigned rn = (instr >> 19) & 0x7;
7774               Sign sign(plus);
7775               unsigned rm = (instr >> 22) & 0x7;
7776               AddrMode addrmode = Offset;
7777               // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7778               str(CurrentCond(),
7779                   Narrow,
7780                   Register(rt),
7781                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7782               break;
7783             }
7784             case 0x02000000: {
7785               // 0x52000000
7786               unsigned rt = (instr >> 16) & 0x7;
7787               unsigned rn = (instr >> 19) & 0x7;
7788               Sign sign(plus);
7789               unsigned rm = (instr >> 22) & 0x7;
7790               AddrMode addrmode = Offset;
7791               // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7792               strh(CurrentCond(),
7793                    Narrow,
7794                    Register(rt),
7795                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7796               break;
7797             }
7798             case 0x04000000: {
7799               // 0x54000000
7800               unsigned rt = (instr >> 16) & 0x7;
7801               unsigned rn = (instr >> 19) & 0x7;
7802               Sign sign(plus);
7803               unsigned rm = (instr >> 22) & 0x7;
7804               AddrMode addrmode = Offset;
7805               // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7806               strb(CurrentCond(),
7807                    Narrow,
7808                    Register(rt),
7809                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7810               break;
7811             }
7812             case 0x06000000: {
7813               // 0x56000000
7814               unsigned rt = (instr >> 16) & 0x7;
7815               unsigned rn = (instr >> 19) & 0x7;
7816               Sign sign(plus);
7817               unsigned rm = (instr >> 22) & 0x7;
7818               AddrMode addrmode = Offset;
7819               // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7820               ldrsb(CurrentCond(),
7821                     Narrow,
7822                     Register(rt),
7823                     MemOperand(Register(rn), sign, Register(rm), addrmode));
7824               break;
7825             }
7826           }
7827           break;
7828         }
7829         case 0x18000000: {
7830           // 0x58000000
7831           switch (instr & 0x06000000) {
7832             case 0x00000000: {
7833               // 0x58000000
7834               unsigned rt = (instr >> 16) & 0x7;
7835               unsigned rn = (instr >> 19) & 0x7;
7836               Sign sign(plus);
7837               unsigned rm = (instr >> 22) & 0x7;
7838               AddrMode addrmode = Offset;
7839               // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7840               ldr(CurrentCond(),
7841                   Narrow,
7842                   Register(rt),
7843                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7844               break;
7845             }
7846             case 0x02000000: {
7847               // 0x5a000000
7848               unsigned rt = (instr >> 16) & 0x7;
7849               unsigned rn = (instr >> 19) & 0x7;
7850               Sign sign(plus);
7851               unsigned rm = (instr >> 22) & 0x7;
7852               AddrMode addrmode = Offset;
7853               // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7854               ldrh(CurrentCond(),
7855                    Narrow,
7856                    Register(rt),
7857                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7858               break;
7859             }
7860             case 0x04000000: {
7861               // 0x5c000000
7862               unsigned rt = (instr >> 16) & 0x7;
7863               unsigned rn = (instr >> 19) & 0x7;
7864               Sign sign(plus);
7865               unsigned rm = (instr >> 22) & 0x7;
7866               AddrMode addrmode = Offset;
7867               // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7868               ldrb(CurrentCond(),
7869                    Narrow,
7870                    Register(rt),
7871                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7872               break;
7873             }
7874             case 0x06000000: {
7875               // 0x5e000000
7876               unsigned rt = (instr >> 16) & 0x7;
7877               unsigned rn = (instr >> 19) & 0x7;
7878               Sign sign(plus);
7879               unsigned rm = (instr >> 22) & 0x7;
7880               AddrMode addrmode = Offset;
7881               // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7882               ldrsh(CurrentCond(),
7883                     Narrow,
7884                     Register(rt),
7885                     MemOperand(Register(rn), sign, Register(rm), addrmode));
7886               break;
7887             }
7888           }
7889           break;
7890         }
7891       }
7892       break;
7893     }
7894     case 0x60000000: {
7895       // 0x60000000
7896       switch (instr & 0x18000000) {
7897         case 0x00000000: {
7898           // 0x60000000
7899           unsigned rt = (instr >> 16) & 0x7;
7900           unsigned rn = (instr >> 19) & 0x7;
7901           int32_t offset = ((instr >> 22) & 0x1f) << 2;
7902           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7903           str(CurrentCond(),
7904               Narrow,
7905               Register(rt),
7906               MemOperand(Register(rn), plus, offset, Offset));
7907           break;
7908         }
7909         case 0x08000000: {
7910           // 0x68000000
7911           unsigned rt = (instr >> 16) & 0x7;
7912           unsigned rn = (instr >> 19) & 0x7;
7913           int32_t offset = ((instr >> 22) & 0x1f) << 2;
7914           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7915           ldr(CurrentCond(),
7916               Narrow,
7917               Register(rt),
7918               MemOperand(Register(rn), plus, offset, Offset));
7919           break;
7920         }
7921         case 0x10000000: {
7922           // 0x70000000
7923           unsigned rt = (instr >> 16) & 0x7;
7924           unsigned rn = (instr >> 19) & 0x7;
7925           int32_t offset = (instr >> 22) & 0x1f;
7926           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7927           strb(CurrentCond(),
7928                Narrow,
7929                Register(rt),
7930                MemOperand(Register(rn), plus, offset, Offset));
7931           break;
7932         }
7933         case 0x18000000: {
7934           // 0x78000000
7935           unsigned rt = (instr >> 16) & 0x7;
7936           unsigned rn = (instr >> 19) & 0x7;
7937           int32_t offset = (instr >> 22) & 0x1f;
7938           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7939           ldrb(CurrentCond(),
7940                Narrow,
7941                Register(rt),
7942                MemOperand(Register(rn), plus, offset, Offset));
7943           break;
7944         }
7945       }
7946       break;
7947     }
7948     case 0x80000000: {
7949       // 0x80000000
7950       switch (instr & 0x18000000) {
7951         case 0x00000000: {
7952           // 0x80000000
7953           unsigned rt = (instr >> 16) & 0x7;
7954           unsigned rn = (instr >> 19) & 0x7;
7955           int32_t offset = ((instr >> 22) & 0x1f) << 1;
7956           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7957           strh(CurrentCond(),
7958                Narrow,
7959                Register(rt),
7960                MemOperand(Register(rn), plus, offset, Offset));
7961           break;
7962         }
7963         case 0x08000000: {
7964           // 0x88000000
7965           unsigned rt = (instr >> 16) & 0x7;
7966           unsigned rn = (instr >> 19) & 0x7;
7967           int32_t offset = ((instr >> 22) & 0x1f) << 1;
7968           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7969           ldrh(CurrentCond(),
7970                Narrow,
7971                Register(rt),
7972                MemOperand(Register(rn), plus, offset, Offset));
7973           break;
7974         }
7975         case 0x10000000: {
7976           // 0x90000000
7977           unsigned rt = (instr >> 24) & 0x7;
7978           int32_t offset = ((instr >> 16) & 0xff) << 2;
7979           // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
7980           str(CurrentCond(),
7981               Narrow,
7982               Register(rt),
7983               MemOperand(sp, plus, offset, Offset));
7984           break;
7985         }
7986         case 0x18000000: {
7987           // 0x98000000
7988           unsigned rt = (instr >> 24) & 0x7;
7989           int32_t offset = ((instr >> 16) & 0xff) << 2;
7990           // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
7991           ldr(CurrentCond(),
7992               Narrow,
7993               Register(rt),
7994               MemOperand(sp, plus, offset, Offset));
7995           break;
7996         }
7997       }
7998       break;
7999     }
8000     case 0xa0000000: {
8001       // 0xa0000000
8002       switch (instr & 0x18000000) {
8003         case 0x00000000: {
8004           // 0xa0000000
8005           unsigned rd = (instr >> 24) & 0x7;
8006           int32_t imm = ((instr >> 16) & 0xff) << 2;
8007           Location location(imm, kT32PcDelta);
8008           // ADR{<c>}{<q>} <Rd>, <label> ; T1
8009           adr(CurrentCond(), Narrow, Register(rd), &location);
8010           break;
8011         }
8012         case 0x08000000: {
8013           // 0xa8000000
8014           unsigned rd = (instr >> 24) & 0x7;
8015           uint32_t imm = ((instr >> 16) & 0xff) << 2;
8016           // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
8017           add(CurrentCond(), Narrow, Register(rd), sp, imm);
8018           break;
8019         }
8020         case 0x10000000: {
8021           // 0xb0000000
8022           switch (instr & 0x04000000) {
8023             case 0x00000000: {
8024               // 0xb0000000
8025               switch (instr & 0x01000000) {
8026                 case 0x00000000: {
8027                   // 0xb0000000
8028                   switch (instr & 0x02800000) {
8029                     case 0x00000000: {
8030                       // 0xb0000000
8031                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
8032                       // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
8033                       add(CurrentCond(), Narrow, sp, sp, imm);
8034                       break;
8035                     }
8036                     case 0x00800000: {
8037                       // 0xb0800000
8038                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
8039                       // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
8040                       sub(CurrentCond(), Narrow, sp, sp, imm);
8041                       break;
8042                     }
8043                     case 0x02000000: {
8044                       // 0xb2000000
8045                       switch (instr & 0x00400000) {
8046                         case 0x00000000: {
8047                           // 0xb2000000
8048                           unsigned rd = (instr >> 16) & 0x7;
8049                           unsigned rm = (instr >> 19) & 0x7;
8050                           // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
8051                           sxth(CurrentCond(),
8052                                Narrow,
8053                                Register(rd),
8054                                Register(rm));
8055                           break;
8056                         }
8057                         case 0x00400000: {
8058                           // 0xb2400000
8059                           unsigned rd = (instr >> 16) & 0x7;
8060                           unsigned rm = (instr >> 19) & 0x7;
8061                           // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
8062                           sxtb(CurrentCond(),
8063                                Narrow,
8064                                Register(rd),
8065                                Register(rm));
8066                           break;
8067                         }
8068                       }
8069                       break;
8070                     }
8071                     case 0x02800000: {
8072                       // 0xb2800000
8073                       switch (instr & 0x00400000) {
8074                         case 0x00000000: {
8075                           // 0xb2800000
8076                           unsigned rd = (instr >> 16) & 0x7;
8077                           unsigned rm = (instr >> 19) & 0x7;
8078                           // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
8079                           uxth(CurrentCond(),
8080                                Narrow,
8081                                Register(rd),
8082                                Register(rm));
8083                           break;
8084                         }
8085                         case 0x00400000: {
8086                           // 0xb2c00000
8087                           unsigned rd = (instr >> 16) & 0x7;
8088                           unsigned rm = (instr >> 19) & 0x7;
8089                           // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
8090                           uxtb(CurrentCond(),
8091                                Narrow,
8092                                Register(rd),
8093                                Register(rm));
8094                           break;
8095                         }
8096                       }
8097                       break;
8098                     }
8099                   }
8100                   break;
8101                 }
8102                 case 0x01000000: {
8103                   // 0xb1000000
8104                   unsigned rn = (instr >> 16) & 0x7;
8105                   int32_t imm =
8106                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
8107                   Location location(imm, kT32PcDelta);
8108                   // CBZ{<q>} <Rn>, <label> ; T1
8109                   cbz(Register(rn), &location);
8110                   break;
8111                 }
8112               }
8113               break;
8114             }
8115             case 0x04000000: {
8116               // 0xb4000000
8117               switch (instr & 0x02000000) {
8118                 case 0x00000000: {
8119                   // 0xb4000000
8120                   RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
8121                                          ((instr >> 16) & 0xff));
8122                   // PUSH{<c>}{<q>} <registers> ; T1
8123                   push(CurrentCond(), Narrow, registers);
8124                   break;
8125                 }
8126                 case 0x02000000: {
8127                   // 0xb6000000
8128                   switch (instr & 0x01e00000) {
8129                     case 0x00400000: {
8130                       // 0xb6400000
8131                       UnimplementedT32_16("SETEND", instr);
8132                       break;
8133                     }
8134                     case 0x00600000: {
8135                       // 0xb6600000
8136                       switch (instr & 0x00100000) {
8137                         case 0x00000000: {
8138                           // 0xb6600000
8139                           UnimplementedT32_16("CPSIE", instr);
8140                           break;
8141                         }
8142                         case 0x00100000: {
8143                           // 0xb6700000
8144                           UnimplementedT32_16("CPSID", instr);
8145                           break;
8146                         }
8147                       }
8148                       break;
8149                     }
8150                     default:
8151                       UnallocatedT32(instr);
8152                       break;
8153                   }
8154                   break;
8155                 }
8156               }
8157               break;
8158             }
8159           }
8160           break;
8161         }
8162         case 0x18000000: {
8163           // 0xb8000000
8164           switch (instr & 0x04000000) {
8165             case 0x00000000: {
8166               // 0xb8000000
8167               switch (instr & 0x01000000) {
8168                 case 0x00000000: {
8169                   // 0xb8000000
8170                   switch (instr & 0x02c00000) {
8171                     case 0x02000000: {
8172                       // 0xba000000
8173                       unsigned rd = (instr >> 16) & 0x7;
8174                       unsigned rm = (instr >> 19) & 0x7;
8175                       // REV{<c>}{<q>} <Rd>, <Rm> ; T1
8176                       rev(CurrentCond(), Narrow, Register(rd), Register(rm));
8177                       break;
8178                     }
8179                     case 0x02400000: {
8180                       // 0xba400000
8181                       unsigned rd = (instr >> 16) & 0x7;
8182                       unsigned rm = (instr >> 19) & 0x7;
8183                       // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
8184                       rev16(CurrentCond(), Narrow, Register(rd), Register(rm));
8185                       break;
8186                     }
8187                     case 0x02800000: {
8188                       // 0xba800000
8189                       uint32_t imm = (instr >> 16) & 0x3f;
8190                       // HLT{<q>} {#}<imm> ; T1
8191                       hlt(Condition::None(), imm);
8192                       break;
8193                     }
8194                     case 0x02c00000: {
8195                       // 0xbac00000
8196                       unsigned rd = (instr >> 16) & 0x7;
8197                       unsigned rm = (instr >> 19) & 0x7;
8198                       // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
8199                       revsh(CurrentCond(), Narrow, Register(rd), Register(rm));
8200                       break;
8201                     }
8202                     default:
8203                       UnallocatedT32(instr);
8204                       break;
8205                   }
8206                   break;
8207                 }
8208                 case 0x01000000: {
8209                   // 0xb9000000
8210                   unsigned rn = (instr >> 16) & 0x7;
8211                   int32_t imm =
8212                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
8213                   Location location(imm, kT32PcDelta);
8214                   // CBNZ{<q>} <Rn>, <label> ; T1
8215                   cbnz(Register(rn), &location);
8216                   break;
8217                 }
8218               }
8219               break;
8220             }
8221             case 0x04000000: {
8222               // 0xbc000000
8223               switch (instr & 0x02000000) {
8224                 case 0x00000000: {
8225                   // 0xbc000000
8226                   RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
8227                                          ((instr >> 16) & 0xff));
8228                   // POP{<c>}{<q>} <registers> ; T1
8229                   pop(CurrentCond(), Narrow, registers);
8230                   break;
8231                 }
8232                 case 0x02000000: {
8233                   // 0xbe000000
8234                   switch (instr & 0x01000000) {
8235                     case 0x00000000: {
8236                       // 0xbe000000
8237                       uint32_t imm = (instr >> 16) & 0xff;
8238                       // BKPT{<q>} {#}<imm> ; T1
8239                       bkpt(Condition::None(), imm);
8240                       break;
8241                     }
8242                     case 0x01000000: {
8243                       // 0xbf000000
8244                       switch (instr & 0x000f0000) {
8245                         case 0x00000000: {
8246                           // 0xbf000000
8247                           switch (instr & 0x00f00000) {
8248                             case 0x00000000: {
8249                               // 0xbf000000
8250                               // NOP{<c>}{<q>} ; T1
8251                               nop(CurrentCond(), Narrow);
8252                               break;
8253                             }
8254                             case 0x00100000: {
8255                               // 0xbf100000
8256                               // YIELD{<c>}{<q>} ; T1
8257                               yield(CurrentCond(), Narrow);
8258                               break;
8259                             }
8260                             case 0x00200000: {
8261                               // 0xbf200000
8262                               UnimplementedT32_16("WFE", instr);
8263                               break;
8264                             }
8265                             case 0x00300000: {
8266                               // 0xbf300000
8267                               UnimplementedT32_16("WFI", instr);
8268                               break;
8269                             }
8270                             case 0x00400000: {
8271                               // 0xbf400000
8272                               UnimplementedT32_16("SEV", instr);
8273                               break;
8274                             }
8275                             case 0x00500000: {
8276                               // 0xbf500000
8277                               UnimplementedT32_16("SEVL", instr);
8278                               break;
8279                             }
8280                             default:
8281                               UnallocatedT32(instr);
8282                               break;
8283                           }
8284                           break;
8285                         }
8286                         default: {
8287                           if (((instr & 0xf0000) == 0x0)) {
8288                             UnallocatedT32(instr);
8289                             return;
8290                           }
8291                           unsigned firstcond = (instr >> 20) & 0xf;
8292                           unsigned mask = (instr >> 16) & 0xf;
8293                           bool wasInITBlock = InITBlock();
8294                           SetIT(Condition(firstcond), mask);
8295                           it(Condition(firstcond), mask);
8296                           if (wasInITBlock || (firstcond == 15) ||
8297                               ((firstcond == al) &&
8298                                (BitCount(Uint32(mask)) != 1))) {
8299                             UnpredictableT32(instr);
8300                           }
8301                           break;
8302                         }
8303                       }
8304                       break;
8305                     }
8306                   }
8307                   break;
8308                 }
8309               }
8310               break;
8311             }
8312           }
8313           break;
8314         }
8315       }
8316       break;
8317     }
8318     case 0xc0000000: {
8319       // 0xc0000000
8320       switch (instr & 0x10000000) {
8321         case 0x00000000: {
8322           // 0xc0000000
8323           switch (instr & 0x08000000) {
8324             case 0x00000000: {
8325               // 0xc0000000
8326               unsigned rn = (instr >> 24) & 0x7;
8327               RegisterList registers(((instr >> 16) & 0xff));
8328               // STM{<c>}{<q>} <Rn>!, <registers> ; T1
8329               stm(CurrentCond(),
8330                   Narrow,
8331                   Register(rn),
8332                   WriteBack(WRITE_BACK),
8333                   registers);
8334               break;
8335             }
8336             case 0x08000000: {
8337               // 0xc8000000
8338               unsigned rn = (instr >> 24) & 0x7;
8339               RegisterList registers(((instr >> 16) & 0xff));
8340               // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
8341               ldm(CurrentCond(),
8342                   Narrow,
8343                   Register(rn),
8344                   WriteBack(!registers.Includes(Register(rn))),
8345                   registers);
8346               break;
8347             }
8348           }
8349           break;
8350         }
8351         case 0x10000000: {
8352           // 0xd0000000
8353           switch (instr & 0x0e000000) {
8354             case 0x0e000000: {
8355               // 0xde000000
8356               switch (instr & 0x01000000) {
8357                 case 0x00000000: {
8358                   // 0xde000000
8359                   uint32_t imm = (instr >> 16) & 0xff;
8360                   // UDF{<c>}{<q>} {#}<imm> ; T1
8361                   udf(CurrentCond(), Narrow, imm);
8362                   break;
8363                 }
8364                 case 0x01000000: {
8365                   // 0xdf000000
8366                   uint32_t imm = (instr >> 16) & 0xff;
8367                   // SVC{<c>}{<q>} {#}<imm> ; T1
8368                   svc(CurrentCond(), imm);
8369                   break;
8370                 }
8371               }
8372               break;
8373             }
8374             default: {
8375               if (((instr & 0xe000000) == 0xe000000)) {
8376                 UnallocatedT32(instr);
8377                 return;
8378               }
8379               Condition condition((instr >> 24) & 0xf);
8380               int32_t imm = SignExtend<int32_t>(((instr >> 16) & 0xff) << 1, 9);
8381               Location location(imm, kT32PcDelta);
8382               // B<c>{<q>} <label> ; T1
8383               b(condition, Narrow, &location);
8384               if (InITBlock()) {
8385                 UnpredictableT32(instr);
8386               }
8387               break;
8388             }
8389           }
8390           break;
8391         }
8392       }
8393       break;
8394     }
8395     case 0xe0000000: {
8396       // 0xe0000000
8397       switch (instr & 0x08000000) {
8398         case 0x00000000: {
8399           // 0xe0000000
8400           switch (instr & 0x10000000) {
8401             case 0x00000000: {
8402               // 0xe0000000
8403               int32_t imm =
8404                   SignExtend<int32_t>(((instr >> 16) & 0x7ff) << 1, 12);
8405               Location location(imm, kT32PcDelta);
8406               // B{<c>}{<q>} <label> ; T2
8407               b(CurrentCond(), Narrow, &location);
8408               if (!OutsideITBlockOrLast()) {
8409                 UnpredictableT32(instr);
8410               }
8411               break;
8412             }
8413             case 0x10000000: {
8414               // 0xf0000000
8415               switch (instr & 0x00008000) {
8416                 case 0x00000000: {
8417                   // 0xf0000000
8418                   switch (instr & 0x03f00000) {
8419                     case 0x00000000: {
8420                       // 0xf0000000
8421                       unsigned rd = (instr >> 8) & 0xf;
8422                       unsigned rn = (instr >> 16) & 0xf;
8423                       uint32_t imm = ImmediateT32::Decode(
8424                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8425                           ((instr >> 15) & 0x800));
8426                       // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8427                       and_(CurrentCond(),
8428                            Best,
8429                            Register(rd),
8430                            Register(rn),
8431                            imm);
8432                       break;
8433                     }
8434                     case 0x00100000: {
8435                       // 0xf0100000
8436                       switch (instr & 0x00000f00) {
8437                         case 0x00000f00: {
8438                           // 0xf0100f00
8439                           unsigned rn = (instr >> 16) & 0xf;
8440                           uint32_t imm = ImmediateT32::Decode(
8441                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8442                               ((instr >> 15) & 0x800));
8443                           // TST{<c>}{<q>} <Rn>, #<const> ; T1
8444                           tst(CurrentCond(), Best, Register(rn), imm);
8445                           break;
8446                         }
8447                         default: {
8448                           if (((instr & 0xf00) == 0xf00)) {
8449                             UnallocatedT32(instr);
8450                             return;
8451                           }
8452                           unsigned rd = (instr >> 8) & 0xf;
8453                           unsigned rn = (instr >> 16) & 0xf;
8454                           uint32_t imm = ImmediateT32::Decode(
8455                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8456                               ((instr >> 15) & 0x800));
8457                           // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8458                           ands(CurrentCond(),
8459                                Best,
8460                                Register(rd),
8461                                Register(rn),
8462                                imm);
8463                           break;
8464                         }
8465                       }
8466                       break;
8467                     }
8468                     case 0x00200000: {
8469                       // 0xf0200000
8470                       unsigned rd = (instr >> 8) & 0xf;
8471                       unsigned rn = (instr >> 16) & 0xf;
8472                       uint32_t imm = ImmediateT32::Decode(
8473                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8474                           ((instr >> 15) & 0x800));
8475                       // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8476                       bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
8477                       break;
8478                     }
8479                     case 0x00300000: {
8480                       // 0xf0300000
8481                       unsigned rd = (instr >> 8) & 0xf;
8482                       unsigned rn = (instr >> 16) & 0xf;
8483                       uint32_t imm = ImmediateT32::Decode(
8484                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8485                           ((instr >> 15) & 0x800));
8486                       // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8487                       bics(CurrentCond(),
8488                            Best,
8489                            Register(rd),
8490                            Register(rn),
8491                            imm);
8492                       break;
8493                     }
8494                     case 0x00400000: {
8495                       // 0xf0400000
8496                       switch (instr & 0x000f0000) {
8497                         case 0x000f0000: {
8498                           // 0xf04f0000
8499                           unsigned rd = (instr >> 8) & 0xf;
8500                           uint32_t imm = ImmediateT32::Decode(
8501                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8502                               ((instr >> 15) & 0x800));
8503                           if (InITBlock() &&
8504                               (instr & 0x00100000) == 0x00000000 &&
8505                               ((rd < kNumberOfT32LowRegisters) &&
8506                                (imm <= 255))) {
8507                             // MOV<c>.W <Rd>, #<const> ; T2
8508                             mov(CurrentCond(), Wide, Register(rd), imm);
8509                           } else if ((instr & 0x00100000) == 0x00000000) {
8510                             // MOV{<c>}{<q>} <Rd>, #<const> ; T2
8511                             mov(CurrentCond(), Best, Register(rd), imm);
8512                           } else {
8513                             UnallocatedT32(instr);
8514                           }
8515                           break;
8516                         }
8517                         default: {
8518                           if (((instr & 0xf0000) == 0xf0000)) {
8519                             UnallocatedT32(instr);
8520                             return;
8521                           }
8522                           unsigned rd = (instr >> 8) & 0xf;
8523                           unsigned rn = (instr >> 16) & 0xf;
8524                           uint32_t imm = ImmediateT32::Decode(
8525                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8526                               ((instr >> 15) & 0x800));
8527                           // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8528                           orr(CurrentCond(),
8529                               Best,
8530                               Register(rd),
8531                               Register(rn),
8532                               imm);
8533                           break;
8534                         }
8535                       }
8536                       break;
8537                     }
8538                     case 0x00500000: {
8539                       // 0xf0500000
8540                       switch (instr & 0x000f0000) {
8541                         case 0x000f0000: {
8542                           // 0xf05f0000
8543                           unsigned rd = (instr >> 8) & 0xf;
8544                           uint32_t imm = ImmediateT32::Decode(
8545                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8546                               ((instr >> 15) & 0x800));
8547                           if (OutsideITBlock() &&
8548                               (instr & 0x00100000) == 0x00100000 &&
8549                               ((rd < kNumberOfT32LowRegisters) &&
8550                                (imm <= 255))) {
8551                             // MOVS.W <Rd>, #<const> ; T2
8552                             movs(Condition::None(), Wide, Register(rd), imm);
8553                           } else if ((instr & 0x00100000) == 0x00100000) {
8554                             // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
8555                             movs(CurrentCond(), Best, Register(rd), imm);
8556                           } else {
8557                             UnallocatedT32(instr);
8558                           }
8559                           break;
8560                         }
8561                         default: {
8562                           if (((instr & 0xf0000) == 0xf0000)) {
8563                             UnallocatedT32(instr);
8564                             return;
8565                           }
8566                           unsigned rd = (instr >> 8) & 0xf;
8567                           unsigned rn = (instr >> 16) & 0xf;
8568                           uint32_t imm = ImmediateT32::Decode(
8569                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8570                               ((instr >> 15) & 0x800));
8571                           // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8572                           orrs(CurrentCond(),
8573                                Best,
8574                                Register(rd),
8575                                Register(rn),
8576                                imm);
8577                           break;
8578                         }
8579                       }
8580                       break;
8581                     }
8582                     case 0x00600000: {
8583                       // 0xf0600000
8584                       switch (instr & 0x000f0000) {
8585                         case 0x000f0000: {
8586                           // 0xf06f0000
8587                           unsigned rd = (instr >> 8) & 0xf;
8588                           uint32_t imm = ImmediateT32::Decode(
8589                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8590                               ((instr >> 15) & 0x800));
8591                           // MVN{<c>}{<q>} <Rd>, #<const> ; T1
8592                           mvn(CurrentCond(), Best, Register(rd), imm);
8593                           break;
8594                         }
8595                         default: {
8596                           if (((instr & 0xf0000) == 0xf0000)) {
8597                             UnallocatedT32(instr);
8598                             return;
8599                           }
8600                           unsigned rd = (instr >> 8) & 0xf;
8601                           unsigned rn = (instr >> 16) & 0xf;
8602                           uint32_t imm = ImmediateT32::Decode(
8603                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8604                               ((instr >> 15) & 0x800));
8605                           // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8606                           orn(CurrentCond(), Register(rd), Register(rn), imm);
8607                           break;
8608                         }
8609                       }
8610                       break;
8611                     }
8612                     case 0x00700000: {
8613                       // 0xf0700000
8614                       switch (instr & 0x000f0000) {
8615                         case 0x000f0000: {
8616                           // 0xf07f0000
8617                           unsigned rd = (instr >> 8) & 0xf;
8618                           uint32_t imm = ImmediateT32::Decode(
8619                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8620                               ((instr >> 15) & 0x800));
8621                           // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
8622                           mvns(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                           // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8636                           orns(CurrentCond(), Register(rd), Register(rn), imm);
8637                           break;
8638                         }
8639                       }
8640                       break;
8641                     }
8642                     case 0x00800000: {
8643                       // 0xf0800000
8644                       unsigned rd = (instr >> 8) & 0xf;
8645                       unsigned rn = (instr >> 16) & 0xf;
8646                       uint32_t imm = ImmediateT32::Decode(
8647                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8648                           ((instr >> 15) & 0x800));
8649                       // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8650                       eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
8651                       break;
8652                     }
8653                     case 0x00900000: {
8654                       // 0xf0900000
8655                       switch (instr & 0x00000f00) {
8656                         case 0x00000f00: {
8657                           // 0xf0900f00
8658                           unsigned rn = (instr >> 16) & 0xf;
8659                           uint32_t imm = ImmediateT32::Decode(
8660                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8661                               ((instr >> 15) & 0x800));
8662                           // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
8663                           teq(CurrentCond(), Register(rn), imm);
8664                           break;
8665                         }
8666                         default: {
8667                           if (((instr & 0xf00) == 0xf00)) {
8668                             UnallocatedT32(instr);
8669                             return;
8670                           }
8671                           unsigned rd = (instr >> 8) & 0xf;
8672                           unsigned rn = (instr >> 16) & 0xf;
8673                           uint32_t imm = ImmediateT32::Decode(
8674                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8675                               ((instr >> 15) & 0x800));
8676                           // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8677                           eors(CurrentCond(),
8678                                Best,
8679                                Register(rd),
8680                                Register(rn),
8681                                imm);
8682                           break;
8683                         }
8684                       }
8685                       break;
8686                     }
8687                     case 0x01000000: {
8688                       // 0xf1000000
8689                       switch (instr & 0x000f0000) {
8690                         case 0x000d0000: {
8691                           // 0xf10d0000
8692                           unsigned rd = (instr >> 8) & 0xf;
8693                           uint32_t imm = ImmediateT32::Decode(
8694                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8695                               ((instr >> 15) & 0x800));
8696                           if ((instr & 0x00100000) == 0x00000000 &&
8697                               (((rd < kNumberOfT32LowRegisters) &&
8698                                 ((imm <= 1020) && ((imm & 3) == 0))) ||
8699                                ((rd == sp.GetCode()) &&
8700                                 ((imm <= 508) && ((imm & 3) == 0))))) {
8701                             // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
8702                             add(CurrentCond(), Wide, Register(rd), sp, imm);
8703                           } else if ((instr & 0x00100000) == 0x00000000) {
8704                             // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
8705                             add(CurrentCond(), Best, Register(rd), sp, imm);
8706                           } else {
8707                             UnallocatedT32(instr);
8708                           }
8709                           break;
8710                         }
8711                         default: {
8712                           if (((instr & 0xf0000) == 0xd0000)) {
8713                             UnallocatedT32(instr);
8714                             return;
8715                           }
8716                           unsigned rd = (instr >> 8) & 0xf;
8717                           unsigned rn = (instr >> 16) & 0xf;
8718                           uint32_t imm = ImmediateT32::Decode(
8719                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8720                               ((instr >> 15) & 0x800));
8721                           if (InITBlock() &&
8722                               (instr & 0x00100000) == 0x00000000 &&
8723                               (((rd < kNumberOfT32LowRegisters) &&
8724                                 (rn < kNumberOfT32LowRegisters) &&
8725                                 (imm <= 7)) ||
8726                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
8727                                 (imm <= 255)))) {
8728                             // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
8729                             add(CurrentCond(),
8730                                 Wide,
8731                                 Register(rd),
8732                                 Register(rn),
8733                                 imm);
8734                           } else if ((instr & 0x00100000) == 0x00000000) {
8735                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8736                             add(CurrentCond(),
8737                                 Best,
8738                                 Register(rd),
8739                                 Register(rn),
8740                                 imm);
8741                           } else {
8742                             UnallocatedT32(instr);
8743                           }
8744                           break;
8745                         }
8746                       }
8747                       break;
8748                     }
8749                     case 0x01100000: {
8750                       // 0xf1100000
8751                       switch (instr & 0x00000f00) {
8752                         case 0x00000f00: {
8753                           // 0xf1100f00
8754                           unsigned rn = (instr >> 16) & 0xf;
8755                           uint32_t imm = ImmediateT32::Decode(
8756                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8757                               ((instr >> 15) & 0x800));
8758                           // CMN{<c>}{<q>} <Rn>, #<const> ; T1
8759                           cmn(CurrentCond(), Best, Register(rn), imm);
8760                           break;
8761                         }
8762                         default: {
8763                           switch (instr & 0x000f0000) {
8764                             case 0x000d0000: {
8765                               // 0xf11d0000
8766                               if (((instr & 0xf00) == 0xf00)) {
8767                                 UnallocatedT32(instr);
8768                                 return;
8769                               }
8770                               unsigned rd = (instr >> 8) & 0xf;
8771                               uint32_t imm = ImmediateT32::Decode(
8772                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
8773                                   ((instr >> 15) & 0x800));
8774                               // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
8775                               adds(CurrentCond(), Best, Register(rd), sp, imm);
8776                               break;
8777                             }
8778                             default: {
8779                               if (((instr & 0xf0000) == 0xd0000) ||
8780                                   ((instr & 0xf00) == 0xf00)) {
8781                                 UnallocatedT32(instr);
8782                                 return;
8783                               }
8784                               unsigned rd = (instr >> 8) & 0xf;
8785                               unsigned rn = (instr >> 16) & 0xf;
8786                               uint32_t imm = ImmediateT32::Decode(
8787                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
8788                                   ((instr >> 15) & 0x800));
8789                               if (OutsideITBlock() &&
8790                                   (instr & 0x00100000) == 0x00100000 &&
8791                                   (((rd < kNumberOfT32LowRegisters) &&
8792                                     (rn < kNumberOfT32LowRegisters) &&
8793                                     (imm <= 7)) ||
8794                                    ((rd == rn) &&
8795                                     (rd < kNumberOfT32LowRegisters) &&
8796                                     (imm <= 255)))) {
8797                                 // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
8798                                 adds(Condition::None(),
8799                                      Wide,
8800                                      Register(rd),
8801                                      Register(rn),
8802                                      imm);
8803                               } else if ((instr & 0x00100000) == 0x00100000) {
8804                                 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8805                                 adds(CurrentCond(),
8806                                      Best,
8807                                      Register(rd),
8808                                      Register(rn),
8809                                      imm);
8810                               } else {
8811                                 UnallocatedT32(instr);
8812                               }
8813                               break;
8814                             }
8815                           }
8816                           break;
8817                         }
8818                       }
8819                       break;
8820                     }
8821                     case 0x01400000: {
8822                       // 0xf1400000
8823                       unsigned rd = (instr >> 8) & 0xf;
8824                       unsigned rn = (instr >> 16) & 0xf;
8825                       uint32_t imm = ImmediateT32::Decode(
8826                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8827                           ((instr >> 15) & 0x800));
8828                       // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8829                       adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
8830                       break;
8831                     }
8832                     case 0x01500000: {
8833                       // 0xf1500000
8834                       unsigned rd = (instr >> 8) & 0xf;
8835                       unsigned rn = (instr >> 16) & 0xf;
8836                       uint32_t imm = ImmediateT32::Decode(
8837                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8838                           ((instr >> 15) & 0x800));
8839                       // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8840                       adcs(CurrentCond(),
8841                            Best,
8842                            Register(rd),
8843                            Register(rn),
8844                            imm);
8845                       break;
8846                     }
8847                     case 0x01600000: {
8848                       // 0xf1600000
8849                       unsigned rd = (instr >> 8) & 0xf;
8850                       unsigned rn = (instr >> 16) & 0xf;
8851                       uint32_t imm = ImmediateT32::Decode(
8852                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8853                           ((instr >> 15) & 0x800));
8854                       // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8855                       sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
8856                       break;
8857                     }
8858                     case 0x01700000: {
8859                       // 0xf1700000
8860                       unsigned rd = (instr >> 8) & 0xf;
8861                       unsigned rn = (instr >> 16) & 0xf;
8862                       uint32_t imm = ImmediateT32::Decode(
8863                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8864                           ((instr >> 15) & 0x800));
8865                       // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8866                       sbcs(CurrentCond(),
8867                            Best,
8868                            Register(rd),
8869                            Register(rn),
8870                            imm);
8871                       break;
8872                     }
8873                     case 0x01a00000: {
8874                       // 0xf1a00000
8875                       switch (instr & 0x000f0000) {
8876                         case 0x000d0000: {
8877                           // 0xf1ad0000
8878                           unsigned rd = (instr >> 8) & 0xf;
8879                           uint32_t imm = ImmediateT32::Decode(
8880                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8881                               ((instr >> 15) & 0x800));
8882                           if ((instr & 0x00100000) == 0x00000000 &&
8883                               ((rd == sp.GetCode()) &&
8884                                ((imm <= 508) && ((imm & 3) == 0)))) {
8885                             // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
8886                             sub(CurrentCond(), Wide, Register(rd), sp, imm);
8887                           } else if ((instr & 0x00100000) == 0x00000000) {
8888                             // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
8889                             sub(CurrentCond(), Best, Register(rd), sp, imm);
8890                           } else {
8891                             UnallocatedT32(instr);
8892                           }
8893                           break;
8894                         }
8895                         default: {
8896                           if (((instr & 0xf0000) == 0xd0000)) {
8897                             UnallocatedT32(instr);
8898                             return;
8899                           }
8900                           unsigned rd = (instr >> 8) & 0xf;
8901                           unsigned rn = (instr >> 16) & 0xf;
8902                           uint32_t imm = ImmediateT32::Decode(
8903                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8904                               ((instr >> 15) & 0x800));
8905                           if (InITBlock() &&
8906                               (instr & 0x00100000) == 0x00000000 &&
8907                               (((rd < kNumberOfT32LowRegisters) &&
8908                                 (rn < kNumberOfT32LowRegisters) &&
8909                                 (imm <= 7)) ||
8910                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
8911                                 (imm <= 255)))) {
8912                             // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
8913                             sub(CurrentCond(),
8914                                 Wide,
8915                                 Register(rd),
8916                                 Register(rn),
8917                                 imm);
8918                           } else if ((instr & 0x00100000) == 0x00000000) {
8919                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8920                             sub(CurrentCond(),
8921                                 Best,
8922                                 Register(rd),
8923                                 Register(rn),
8924                                 imm);
8925                           } else {
8926                             UnallocatedT32(instr);
8927                           }
8928                           break;
8929                         }
8930                       }
8931                       break;
8932                     }
8933                     case 0x01b00000: {
8934                       // 0xf1b00000
8935                       switch (instr & 0x00000f00) {
8936                         case 0x00000f00: {
8937                           // 0xf1b00f00
8938                           unsigned rn = (instr >> 16) & 0xf;
8939                           uint32_t imm = ImmediateT32::Decode(
8940                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8941                               ((instr >> 15) & 0x800));
8942                           if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
8943                             // CMP{<c>}.W <Rn>, #<const> ; T2
8944                             cmp(CurrentCond(), Wide, Register(rn), imm);
8945                           } else {
8946                             // CMP{<c>}{<q>} <Rn>, #<const> ; T2
8947                             cmp(CurrentCond(), Best, Register(rn), imm);
8948                           }
8949                           break;
8950                         }
8951                         default: {
8952                           switch (instr & 0x000f0000) {
8953                             case 0x000d0000: {
8954                               // 0xf1bd0000
8955                               if (((instr & 0xf00) == 0xf00)) {
8956                                 UnallocatedT32(instr);
8957                                 return;
8958                               }
8959                               unsigned rd = (instr >> 8) & 0xf;
8960                               uint32_t imm = ImmediateT32::Decode(
8961                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
8962                                   ((instr >> 15) & 0x800));
8963                               // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
8964                               subs(CurrentCond(), Best, Register(rd), sp, imm);
8965                               break;
8966                             }
8967                             default: {
8968                               if (((instr & 0xf0000) == 0xd0000) ||
8969                                   ((instr & 0xf00) == 0xf00)) {
8970                                 UnallocatedT32(instr);
8971                                 return;
8972                               }
8973                               unsigned rd = (instr >> 8) & 0xf;
8974                               unsigned rn = (instr >> 16) & 0xf;
8975                               uint32_t imm = ImmediateT32::Decode(
8976                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
8977                                   ((instr >> 15) & 0x800));
8978                               if (OutsideITBlock() &&
8979                                   (instr & 0x00100000) == 0x00100000 &&
8980                                   (((rd < kNumberOfT32LowRegisters) &&
8981                                     (rn < kNumberOfT32LowRegisters) &&
8982                                     (imm <= 7)) ||
8983                                    ((rd == rn) &&
8984                                     (rd < kNumberOfT32LowRegisters) &&
8985                                     (imm <= 255)))) {
8986                                 // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
8987                                 subs(Condition::None(),
8988                                      Wide,
8989                                      Register(rd),
8990                                      Register(rn),
8991                                      imm);
8992                               } else if ((instr & 0x00100000) == 0x00100000) {
8993                                 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8994                                 subs(CurrentCond(),
8995                                      Best,
8996                                      Register(rd),
8997                                      Register(rn),
8998                                      imm);
8999                               } else {
9000                                 UnallocatedT32(instr);
9001                               }
9002                               break;
9003                             }
9004                           }
9005                           break;
9006                         }
9007                       }
9008                       break;
9009                     }
9010                     case 0x01c00000: {
9011                       // 0xf1c00000
9012                       unsigned rd = (instr >> 8) & 0xf;
9013                       unsigned rn = (instr >> 16) & 0xf;
9014                       uint32_t imm = ImmediateT32::Decode(
9015                           (instr & 0xff) | ((instr >> 4) & 0x700) |
9016                           ((instr >> 15) & 0x800));
9017                       if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
9018                           (imm == 0) &&
9019                           ((rd < kNumberOfT32LowRegisters) &&
9020                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
9021                         // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
9022                         rsb(CurrentCond(),
9023                             Wide,
9024                             Register(rd),
9025                             Register(rn),
9026                             UINT32_C(0));
9027                       } else if ((instr & 0x00100000) == 0x00000000) {
9028                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
9029                         rsb(CurrentCond(),
9030                             Best,
9031                             Register(rd),
9032                             Register(rn),
9033                             imm);
9034                       } else {
9035                         UnallocatedT32(instr);
9036                       }
9037                       break;
9038                     }
9039                     case 0x01d00000: {
9040                       // 0xf1d00000
9041                       unsigned rd = (instr >> 8) & 0xf;
9042                       unsigned rn = (instr >> 16) & 0xf;
9043                       uint32_t imm = ImmediateT32::Decode(
9044                           (instr & 0xff) | ((instr >> 4) & 0x700) |
9045                           ((instr >> 15) & 0x800));
9046                       if (OutsideITBlock() &&
9047                           (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
9048                           ((rd < kNumberOfT32LowRegisters) &&
9049                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
9050                         // RSBS.W {<Rd>}, <Rn>, #0 ; T2
9051                         rsbs(Condition::None(),
9052                              Wide,
9053                              Register(rd),
9054                              Register(rn),
9055                              UINT32_C(0));
9056                       } else if ((instr & 0x00100000) == 0x00100000) {
9057                         // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
9058                         rsbs(CurrentCond(),
9059                              Best,
9060                              Register(rd),
9061                              Register(rn),
9062                              imm);
9063                       } else {
9064                         UnallocatedT32(instr);
9065                       }
9066                       break;
9067                     }
9068                     case 0x02000000: {
9069                       // 0xf2000000
9070                       switch (instr & 0x000d0000) {
9071                         case 0x000d0000: {
9072                           // 0xf20d0000
9073                           switch (instr & 0x00020000) {
9074                             case 0x00000000: {
9075                               // 0xf20d0000
9076                               unsigned rd = (instr >> 8) & 0xf;
9077                               uint32_t imm = (instr & 0xff) |
9078                                              ((instr >> 4) & 0x700) |
9079                                              ((instr >> 15) & 0x800);
9080                               if (((rd >= kNumberOfT32LowRegisters) ||
9081                                    ((imm > 1020) || ((imm & 3) != 0))) &&
9082                                   ((rd != sp.GetCode()) ||
9083                                    ((imm > 508) || ((imm & 3) != 0))) &&
9084                                   (!ImmediateT32::IsImmediateT32(imm))) {
9085                                 // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
9086                                 add(CurrentCond(), Best, Register(rd), sp, imm);
9087                               } else {
9088                                 // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
9089                                 addw(CurrentCond(), Register(rd), sp, imm);
9090                               }
9091                               break;
9092                             }
9093                             case 0x00020000: {
9094                               // 0xf20f0000
9095                               unsigned rd = (instr >> 8) & 0xf;
9096                               int32_t imm = (instr & 0xff) |
9097                                             ((instr >> 4) & 0x700) |
9098                                             ((instr >> 15) & 0x800);
9099                               Location location(imm, kT32PcDelta);
9100                               if ((imm >= 0) && (imm <= 4095) &&
9101                                   ((rd < kNumberOfT32LowRegisters) &&
9102                                    (imm >= 0) && (imm <= 1020) &&
9103                                    ((imm & 3) == 0))) {
9104                                 // ADR{<c>}.W <Rd>, <label> ; T3
9105                                 adr(CurrentCond(),
9106                                     Wide,
9107                                     Register(rd),
9108                                     &location);
9109                               } else if ((imm >= 0) && (imm <= 4095)) {
9110                                 // ADR{<c>}{<q>} <Rd>, <label> ; T3
9111                                 adr(CurrentCond(),
9112                                     Best,
9113                                     Register(rd),
9114                                     &location);
9115                               } else {
9116                                 UnallocatedT32(instr);
9117                               }
9118                               break;
9119                             }
9120                           }
9121                           break;
9122                         }
9123                         default: {
9124                           if (((instr & 0xd0000) == 0xd0000)) {
9125                             UnallocatedT32(instr);
9126                             return;
9127                           }
9128                           unsigned rd = (instr >> 8) & 0xf;
9129                           unsigned rn = (instr >> 16) & 0xf;
9130                           uint32_t imm = (instr & 0xff) |
9131                                          ((instr >> 4) & 0x700) |
9132                                          ((instr >> 15) & 0x800);
9133                           if ((InITBlock() ||
9134                                (rd >= kNumberOfT32LowRegisters) ||
9135                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
9136                               (InITBlock() || (rd != rn) ||
9137                                (rd >= kNumberOfT32LowRegisters) ||
9138                                (imm > 255)) &&
9139                               (!ImmediateT32::IsImmediateT32(imm))) {
9140                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9141                             add(CurrentCond(),
9142                                 Best,
9143                                 Register(rd),
9144                                 Register(rn),
9145                                 imm);
9146                           } else {
9147                             // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9148                             addw(CurrentCond(),
9149                                  Register(rd),
9150                                  Register(rn),
9151                                  imm);
9152                           }
9153                           break;
9154                         }
9155                       }
9156                       break;
9157                     }
9158                     case 0x02400000: {
9159                       // 0xf2400000
9160                       unsigned rd = (instr >> 8) & 0xf;
9161                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
9162                                      ((instr >> 15) & 0x800) |
9163                                      ((instr >> 4) & 0xf000);
9164                       if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
9165                            (imm > 255)) &&
9166                           (!ImmediateT32::IsImmediateT32(imm))) {
9167                         // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
9168                         mov(CurrentCond(), Best, Register(rd), imm);
9169                       } else {
9170                         // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
9171                         movw(CurrentCond(), Register(rd), imm);
9172                       }
9173                       break;
9174                     }
9175                     case 0x02a00000: {
9176                       // 0xf2a00000
9177                       switch (instr & 0x000d0000) {
9178                         case 0x000d0000: {
9179                           // 0xf2ad0000
9180                           switch (instr & 0x00020000) {
9181                             case 0x00000000: {
9182                               // 0xf2ad0000
9183                               unsigned rd = (instr >> 8) & 0xf;
9184                               uint32_t imm = (instr & 0xff) |
9185                                              ((instr >> 4) & 0x700) |
9186                                              ((instr >> 15) & 0x800);
9187                               if (((rd != sp.GetCode()) ||
9188                                    ((imm > 508) || ((imm & 3) != 0))) &&
9189                                   (!ImmediateT32::IsImmediateT32(imm))) {
9190                                 // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
9191                                 sub(CurrentCond(), Best, Register(rd), sp, imm);
9192                               } else {
9193                                 // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
9194                                 subw(CurrentCond(), Register(rd), sp, imm);
9195                               }
9196                               break;
9197                             }
9198                             case 0x00020000: {
9199                               // 0xf2af0000
9200                               if (((((Uint32((instr >> 26)) & Uint32(0x1))
9201                                      << 11) |
9202                                     ((Uint32((instr >> 12)) & Uint32(0x7))
9203                                      << 8) |
9204                                     (Uint32(instr) & Uint32(0xff))) ==
9205                                    Uint32(0x0))) {
9206                                 unsigned rd = (instr >> 8) & 0xf;
9207                                 uint32_t imm = (instr & 0xff) |
9208                                                ((instr >> 4) & 0x700) |
9209                                                ((instr >> 15) & 0x800);
9210                                 // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
9211                                 sub(CurrentCond(), Best, Register(rd), pc, imm);
9212                                 return;
9213                               }
9214                               unsigned rd = (instr >> 8) & 0xf;
9215                               int32_t imm = (instr & 0xff) |
9216                                             ((instr >> 4) & 0x700) |
9217                                             ((instr >> 15) & 0x800);
9218                               Location location(-imm, kT32PcDelta);
9219                               // ADR{<c>}{<q>} <Rd>, <label> ; T2
9220                               adr(CurrentCond(), Best, Register(rd), &location);
9221                               break;
9222                             }
9223                           }
9224                           break;
9225                         }
9226                         default: {
9227                           if (((instr & 0xd0000) == 0xd0000)) {
9228                             UnallocatedT32(instr);
9229                             return;
9230                           }
9231                           unsigned rd = (instr >> 8) & 0xf;
9232                           unsigned rn = (instr >> 16) & 0xf;
9233                           uint32_t imm = (instr & 0xff) |
9234                                          ((instr >> 4) & 0x700) |
9235                                          ((instr >> 15) & 0x800);
9236                           if ((InITBlock() ||
9237                                (rd >= kNumberOfT32LowRegisters) ||
9238                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
9239                               (InITBlock() || (rd != rn) ||
9240                                (rd >= kNumberOfT32LowRegisters) ||
9241                                (imm > 255)) &&
9242                               (!ImmediateT32::IsImmediateT32(imm))) {
9243                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9244                             sub(CurrentCond(),
9245                                 Best,
9246                                 Register(rd),
9247                                 Register(rn),
9248                                 imm);
9249                           } else {
9250                             // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9251                             subw(CurrentCond(),
9252                                  Register(rd),
9253                                  Register(rn),
9254                                  imm);
9255                           }
9256                           break;
9257                         }
9258                       }
9259                       break;
9260                     }
9261                     case 0x02c00000: {
9262                       // 0xf2c00000
9263                       unsigned rd = (instr >> 8) & 0xf;
9264                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
9265                                      ((instr >> 15) & 0x800) |
9266                                      ((instr >> 4) & 0xf000);
9267                       // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
9268                       movt(CurrentCond(), Register(rd), imm);
9269                       break;
9270                     }
9271                     case 0x03000000: {
9272                       // 0xf3000000
9273                       unsigned rd = (instr >> 8) & 0xf;
9274                       uint32_t imm = (instr & 0x1f) + 1;
9275                       unsigned rn = (instr >> 16) & 0xf;
9276                       uint32_t amount =
9277                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9278                       // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
9279                       ssat(CurrentCond(),
9280                            Register(rd),
9281                            imm,
9282                            Operand(Register(rn), LSL, amount));
9283                       if (((instr & 0xfff08020) != 0xf3000000)) {
9284                         UnpredictableT32(instr);
9285                       }
9286                       break;
9287                     }
9288                     case 0x03200000: {
9289                       // 0xf3200000
9290                       switch (instr & 0x000070c0) {
9291                         case 0x00000000: {
9292                           // 0xf3200000
9293                           unsigned rd = (instr >> 8) & 0xf;
9294                           uint32_t imm = (instr & 0xf) + 1;
9295                           unsigned rn = (instr >> 16) & 0xf;
9296                           // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
9297                           ssat16(CurrentCond(),
9298                                  Register(rd),
9299                                  imm,
9300                                  Register(rn));
9301                           if (((instr & 0xfff0f0f0) != 0xf3200000)) {
9302                             UnpredictableT32(instr);
9303                           }
9304                           break;
9305                         }
9306                         default: {
9307                           if (((instr & 0x70c0) == 0x0)) {
9308                             UnallocatedT32(instr);
9309                             return;
9310                           }
9311                           unsigned rd = (instr >> 8) & 0xf;
9312                           uint32_t imm = (instr & 0x1f) + 1;
9313                           unsigned rn = (instr >> 16) & 0xf;
9314                           uint32_t amount =
9315                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9316                           // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
9317                           ssat(CurrentCond(),
9318                                Register(rd),
9319                                imm,
9320                                Operand(Register(rn), ASR, amount));
9321                           if (((instr & 0xfff08020) != 0xf3200000)) {
9322                             UnpredictableT32(instr);
9323                           }
9324                           break;
9325                         }
9326                       }
9327                       break;
9328                     }
9329                     case 0x03400000: {
9330                       // 0xf3400000
9331                       unsigned rd = (instr >> 8) & 0xf;
9332                       unsigned rn = (instr >> 16) & 0xf;
9333                       uint32_t lsb =
9334                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9335                       uint32_t widthm1 = instr & 0x1f;
9336                       uint32_t width = widthm1 + 1;
9337                       // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9338                       sbfx(CurrentCond(),
9339                            Register(rd),
9340                            Register(rn),
9341                            lsb,
9342                            width);
9343                       if (((instr & 0xfff08020) != 0xf3400000)) {
9344                         UnpredictableT32(instr);
9345                       }
9346                       break;
9347                     }
9348                     case 0x03600000: {
9349                       // 0xf3600000
9350                       switch (instr & 0x000f0000) {
9351                         case 0x000f0000: {
9352                           // 0xf36f0000
9353                           unsigned rd = (instr >> 8) & 0xf;
9354                           uint32_t lsb =
9355                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9356                           uint32_t msb = instr & 0x1f;
9357                           uint32_t width = msb - lsb + 1;
9358                           // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
9359                           bfc(CurrentCond(), Register(rd), lsb, width);
9360                           if (((instr & 0xffff8020) != 0xf36f0000)) {
9361                             UnpredictableT32(instr);
9362                           }
9363                           break;
9364                         }
9365                         default: {
9366                           if (((instr & 0xf0000) == 0xf0000)) {
9367                             UnallocatedT32(instr);
9368                             return;
9369                           }
9370                           unsigned rd = (instr >> 8) & 0xf;
9371                           unsigned rn = (instr >> 16) & 0xf;
9372                           uint32_t lsb =
9373                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9374                           uint32_t msb = instr & 0x1f;
9375                           uint32_t width = msb - lsb + 1;
9376                           // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9377                           bfi(CurrentCond(),
9378                               Register(rd),
9379                               Register(rn),
9380                               lsb,
9381                               width);
9382                           if (((instr & 0xfff08020) != 0xf3600000)) {
9383                             UnpredictableT32(instr);
9384                           }
9385                           break;
9386                         }
9387                       }
9388                       break;
9389                     }
9390                     case 0x03800000: {
9391                       // 0xf3800000
9392                       unsigned rd = (instr >> 8) & 0xf;
9393                       uint32_t imm = instr & 0x1f;
9394                       unsigned rn = (instr >> 16) & 0xf;
9395                       uint32_t amount =
9396                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9397                       // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
9398                       usat(CurrentCond(),
9399                            Register(rd),
9400                            imm,
9401                            Operand(Register(rn), LSL, amount));
9402                       if (((instr & 0xfff08020) != 0xf3800000)) {
9403                         UnpredictableT32(instr);
9404                       }
9405                       break;
9406                     }
9407                     case 0x03a00000: {
9408                       // 0xf3a00000
9409                       switch (instr & 0x000070c0) {
9410                         case 0x00000000: {
9411                           // 0xf3a00000
9412                           unsigned rd = (instr >> 8) & 0xf;
9413                           uint32_t imm = instr & 0xf;
9414                           unsigned rn = (instr >> 16) & 0xf;
9415                           // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
9416                           usat16(CurrentCond(),
9417                                  Register(rd),
9418                                  imm,
9419                                  Register(rn));
9420                           if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
9421                             UnpredictableT32(instr);
9422                           }
9423                           break;
9424                         }
9425                         default: {
9426                           if (((instr & 0x70c0) == 0x0)) {
9427                             UnallocatedT32(instr);
9428                             return;
9429                           }
9430                           unsigned rd = (instr >> 8) & 0xf;
9431                           uint32_t imm = instr & 0x1f;
9432                           unsigned rn = (instr >> 16) & 0xf;
9433                           uint32_t amount =
9434                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9435                           // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
9436                           usat(CurrentCond(),
9437                                Register(rd),
9438                                imm,
9439                                Operand(Register(rn), ASR, amount));
9440                           if (((instr & 0xfff08020) != 0xf3a00000)) {
9441                             UnpredictableT32(instr);
9442                           }
9443                           break;
9444                         }
9445                       }
9446                       break;
9447                     }
9448                     case 0x03c00000: {
9449                       // 0xf3c00000
9450                       unsigned rd = (instr >> 8) & 0xf;
9451                       unsigned rn = (instr >> 16) & 0xf;
9452                       uint32_t lsb =
9453                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9454                       uint32_t widthm1 = instr & 0x1f;
9455                       uint32_t width = widthm1 + 1;
9456                       // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9457                       ubfx(CurrentCond(),
9458                            Register(rd),
9459                            Register(rn),
9460                            lsb,
9461                            width);
9462                       if (((instr & 0xfff08020) != 0xf3c00000)) {
9463                         UnpredictableT32(instr);
9464                       }
9465                       break;
9466                     }
9467                     default:
9468                       UnallocatedT32(instr);
9469                       break;
9470                   }
9471                   break;
9472                 }
9473                 case 0x00008000: {
9474                   // 0xf0008000
9475                   switch (instr & 0x00005000) {
9476                     case 0x00000000: {
9477                       // 0xf0008000
9478                       switch (instr & 0x03800000) {
9479                         case 0x03800000: {
9480                           // 0xf3808000
9481                           switch (instr & 0x04600000) {
9482                             case 0x00000000: {
9483                               // 0xf3808000
9484                               switch (instr & 0x00000020) {
9485                                 case 0x00000000: {
9486                                   // 0xf3808000
9487                                   unsigned spec_reg = ((instr >> 8) & 0xf) |
9488                                                       ((instr >> 16) & 0x10);
9489                                   unsigned rn = (instr >> 16) & 0xf;
9490                                   // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
9491                                   msr(CurrentCond(),
9492                                       MaskedSpecialRegister(spec_reg),
9493                                       Register(rn));
9494                                   if (((instr & 0xffe0f0ff) != 0xf3808000)) {
9495                                     UnpredictableT32(instr);
9496                                   }
9497                                   break;
9498                                 }
9499                                 case 0x00000020: {
9500                                   // 0xf3808020
9501                                   UnimplementedT32_32("MSR", instr);
9502                                   break;
9503                                 }
9504                               }
9505                               break;
9506                             }
9507                             case 0x00200000: {
9508                               // 0xf3a08000
9509                               switch (instr & 0x00100000) {
9510                                 case 0x00000000: {
9511                                   // 0xf3a08000
9512                                   switch (instr & 0x00000700) {
9513                                     case 0x00000000: {
9514                                       // 0xf3a08000
9515                                       switch (instr & 0x000000f0) {
9516                                         case 0x00000000: {
9517                                           // 0xf3a08000
9518                                           switch (instr & 0x0000000f) {
9519                                             case 0x00000000: {
9520                                               // 0xf3a08000
9521                                               // NOP{<c>}.W ; T2
9522                                               nop(CurrentCond(), Wide);
9523                                               if (((instr & 0xffffffff) !=
9524                                                    0xf3af8000)) {
9525                                                 UnpredictableT32(instr);
9526                                               }
9527                                               break;
9528                                             }
9529                                             case 0x00000001: {
9530                                               // 0xf3a08001
9531                                               // YIELD{<c>}.W ; T2
9532                                               yield(CurrentCond(), Wide);
9533                                               if (((instr & 0xffffffff) !=
9534                                                    0xf3af8001)) {
9535                                                 UnpredictableT32(instr);
9536                                               }
9537                                               break;
9538                                             }
9539                                             case 0x00000002: {
9540                                               // 0xf3a08002
9541                                               UnimplementedT32_32("WFE", instr);
9542                                               break;
9543                                             }
9544                                             case 0x00000003: {
9545                                               // 0xf3a08003
9546                                               UnimplementedT32_32("WFI", instr);
9547                                               break;
9548                                             }
9549                                             case 0x00000004: {
9550                                               // 0xf3a08004
9551                                               UnimplementedT32_32("SEV", instr);
9552                                               break;
9553                                             }
9554                                             case 0x00000005: {
9555                                               // 0xf3a08005
9556                                               UnimplementedT32_32("SEVL",
9557                                                                   instr);
9558                                               break;
9559                                             }
9560                                             default:
9561                                               UnallocatedT32(instr);
9562                                               break;
9563                                           }
9564                                           break;
9565                                         }
9566                                         case 0x000000f0: {
9567                                           // 0xf3a080f0
9568                                           UnimplementedT32_32("DBG", instr);
9569                                           break;
9570                                         }
9571                                         default:
9572                                           UnallocatedT32(instr);
9573                                           break;
9574                                       }
9575                                       break;
9576                                     }
9577                                     case 0x00000100: {
9578                                       // 0xf3a08100
9579                                       if ((instr & 0x000000e0) == 0x00000000) {
9580                                         UnimplementedT32_32("CPS", instr);
9581                                       } else {
9582                                         UnallocatedT32(instr);
9583                                       }
9584                                       break;
9585                                     }
9586                                     case 0x00000400: {
9587                                       // 0xf3a08400
9588                                       if ((instr & 0x0000001f) == 0x00000000) {
9589                                         UnimplementedT32_32("CPSIE", instr);
9590                                       } else {
9591                                         UnallocatedT32(instr);
9592                                       }
9593                                       break;
9594                                     }
9595                                     case 0x00000500: {
9596                                       // 0xf3a08500
9597                                       UnimplementedT32_32("CPSIE", instr);
9598                                       break;
9599                                     }
9600                                     case 0x00000600: {
9601                                       // 0xf3a08600
9602                                       if ((instr & 0x0000001f) == 0x00000000) {
9603                                         UnimplementedT32_32("CPSID", instr);
9604                                       } else {
9605                                         UnallocatedT32(instr);
9606                                       }
9607                                       break;
9608                                     }
9609                                     case 0x00000700: {
9610                                       // 0xf3a08700
9611                                       UnimplementedT32_32("CPSID", instr);
9612                                       break;
9613                                     }
9614                                     default:
9615                                       UnallocatedT32(instr);
9616                                       break;
9617                                   }
9618                                   break;
9619                                 }
9620                                 case 0x00100000: {
9621                                   // 0xf3b08000
9622                                   switch (instr & 0x000000f0) {
9623                                     case 0x00000020: {
9624                                       // 0xf3b08020
9625                                       // CLREX{<c>}{<q>} ; T1
9626                                       clrex(CurrentCond());
9627                                       if (((instr & 0xffffffff) !=
9628                                            0xf3bf8f2f)) {
9629                                         UnpredictableT32(instr);
9630                                       }
9631                                       break;
9632                                     }
9633                                     case 0x00000040: {
9634                                       // 0xf3b08040
9635                                       MemoryBarrier option(instr & 0xf);
9636                                       // DSB{<c>}{<q>} {<option>} ; T1
9637                                       dsb(CurrentCond(), option);
9638                                       if (((instr & 0xfffffff0) !=
9639                                            0xf3bf8f40)) {
9640                                         UnpredictableT32(instr);
9641                                       }
9642                                       break;
9643                                     }
9644                                     case 0x00000050: {
9645                                       // 0xf3b08050
9646                                       MemoryBarrier option(instr & 0xf);
9647                                       // DMB{<c>}{<q>} {<option>} ; T1
9648                                       dmb(CurrentCond(), option);
9649                                       if (((instr & 0xfffffff0) !=
9650                                            0xf3bf8f50)) {
9651                                         UnpredictableT32(instr);
9652                                       }
9653                                       break;
9654                                     }
9655                                     case 0x00000060: {
9656                                       // 0xf3b08060
9657                                       MemoryBarrier option(instr & 0xf);
9658                                       // ISB{<c>}{<q>} {<option>} ; T1
9659                                       isb(CurrentCond(), option);
9660                                       if (((instr & 0xfffffff0) !=
9661                                            0xf3bf8f60)) {
9662                                         UnpredictableT32(instr);
9663                                       }
9664                                       break;
9665                                     }
9666                                     default:
9667                                       UnallocatedT32(instr);
9668                                       break;
9669                                   }
9670                                   break;
9671                                 }
9672                               }
9673                               break;
9674                             }
9675                             case 0x00400000: {
9676                               // 0xf3c08000
9677                               switch (instr & 0x00100000) {
9678                                 case 0x00000000: {
9679                                   // 0xf3c08000
9680                                   unsigned rm = (instr >> 16) & 0xf;
9681                                   // BXJ{<c>}{<q>} <Rm> ; T1
9682                                   bxj(CurrentCond(), Register(rm));
9683                                   if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
9684                                     UnpredictableT32(instr);
9685                                   }
9686                                   break;
9687                                 }
9688                                 case 0x00100000: {
9689                                   // 0xf3d08000
9690                                   switch (instr & 0x000000ff) {
9691                                     case 0x00000000: {
9692                                       // 0xf3d08000
9693                                       if ((instr & 0x000f0000) == 0x000e0000) {
9694                                         UnimplementedT32_32("ERET", instr);
9695                                       } else {
9696                                         UnallocatedT32(instr);
9697                                       }
9698                                       break;
9699                                     }
9700                                     default: {
9701                                       if (((instr & 0xff) == 0x0)) {
9702                                         UnallocatedT32(instr);
9703                                         return;
9704                                       }
9705                                       uint32_t imm = instr & 0xff;
9706                                       // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
9707                                       subs(CurrentCond(), Best, pc, lr, imm);
9708                                       if (((instr & 0xffffff00) !=
9709                                            0xf3de8f00)) {
9710                                         UnpredictableT32(instr);
9711                                       }
9712                                       break;
9713                                     }
9714                                   }
9715                                   break;
9716                                 }
9717                               }
9718                               break;
9719                             }
9720                             case 0x00600000: {
9721                               // 0xf3e08000
9722                               switch (instr & 0x00000020) {
9723                                 case 0x00000000: {
9724                                   // 0xf3e08000
9725                                   unsigned rd = (instr >> 8) & 0xf;
9726                                   unsigned spec_reg = (instr >> 20) & 0x1;
9727                                   // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
9728                                   mrs(CurrentCond(),
9729                                       Register(rd),
9730                                       SpecialRegister(spec_reg));
9731                                   if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
9732                                     UnpredictableT32(instr);
9733                                   }
9734                                   break;
9735                                 }
9736                                 case 0x00000020: {
9737                                   // 0xf3e08020
9738                                   UnimplementedT32_32("MRS", instr);
9739                                   break;
9740                                 }
9741                               }
9742                               break;
9743                             }
9744                             case 0x04000000: {
9745                               // 0xf7808000
9746                               switch (instr & 0x001f2fff) {
9747                                 case 0x000f0001: {
9748                                   // 0xf78f8001
9749                                   UnimplementedT32_32("DCPS1", instr);
9750                                   break;
9751                                 }
9752                                 case 0x000f0002: {
9753                                   // 0xf78f8002
9754                                   UnimplementedT32_32("DCPS2", instr);
9755                                   break;
9756                                 }
9757                                 case 0x000f0003: {
9758                                   // 0xf78f8003
9759                                   UnimplementedT32_32("DCPS3", instr);
9760                                   break;
9761                                 }
9762                                 default:
9763                                   UnallocatedT32(instr);
9764                                   break;
9765                               }
9766                               break;
9767                             }
9768                             case 0x04600000: {
9769                               // 0xf7e08000
9770                               switch (instr & 0x00102000) {
9771                                 case 0x00000000: {
9772                                   // 0xf7e08000
9773                                   uint32_t imm =
9774                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
9775                                   // HVC{<q>} {#}<imm16> ; T1
9776                                   hvc(Condition::None(), imm);
9777                                   break;
9778                                 }
9779                                 case 0x00100000: {
9780                                   // 0xf7f08000
9781                                   UnimplementedT32_32("SMC", instr);
9782                                   break;
9783                                 }
9784                                 case 0x00102000: {
9785                                   // 0xf7f0a000
9786                                   uint32_t imm =
9787                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
9788                                   if ((imm <= 255)) {
9789                                     // UDF{<c>}.W {#}<imm> ; T2
9790                                     udf(CurrentCond(), Wide, imm);
9791                                   } else {
9792                                     // UDF{<c>}{<q>} {#}<imm> ; T2
9793                                     udf(CurrentCond(), Best, imm);
9794                                   }
9795                                   break;
9796                                 }
9797                                 default:
9798                                   UnallocatedT32(instr);
9799                                   break;
9800                               }
9801                               break;
9802                             }
9803                             default:
9804                               UnallocatedT32(instr);
9805                               break;
9806                           }
9807                           break;
9808                         }
9809                         default: {
9810                           if (((instr & 0x3800000) == 0x3800000)) {
9811                             UnallocatedT32(instr);
9812                             return;
9813                           }
9814                           Condition condition((instr >> 22) & 0xf);
9815                           int32_t imm =
9816                               SignExtend<int32_t>(((instr & 0x7ff) |
9817                                                    ((instr >> 5) & 0x1f800) |
9818                                                    ((instr << 4) & 0x20000) |
9819                                                    ((instr << 7) & 0x40000) |
9820                                                    ((instr >> 7) & 0x80000))
9821                                                       << 1,
9822                                                   21);
9823                           Location location(imm, kT32PcDelta);
9824                           if ((imm >= -1048576) && (imm <= 1048574) &&
9825                               ((imm & 1) == 0) &&
9826                               ((imm >= -256) && (imm <= 254) &&
9827                                ((imm & 1) == 0))) {
9828                             // B<c>.W <label> ; T3
9829                             b(condition, Wide, &location);
9830                             if (InITBlock()) {
9831                               UnpredictableT32(instr);
9832                             }
9833                           } else if ((imm >= -1048576) && (imm <= 1048574) &&
9834                                      ((imm & 1) == 0)) {
9835                             // B<c>{<q>} <label> ; T3
9836                             b(condition, Best, &location);
9837                             if (InITBlock()) {
9838                               UnpredictableT32(instr);
9839                             }
9840                           } else {
9841                             UnallocatedT32(instr);
9842                           }
9843                           break;
9844                         }
9845                       }
9846                       break;
9847                     }
9848                     case 0x00001000: {
9849                       // 0xf0009000
9850                       uint32_t encoded_imm =
9851                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
9852                           ((instr << 10) & 0x200000) |
9853                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
9854                       uint32_t S = encoded_imm & (1 << 23);
9855                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
9856                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
9857                       Location location(imm, kT32PcDelta);
9858                       if ((imm >= -16777216) && (imm <= 16777214) &&
9859                           ((imm & 1) == 0) &&
9860                           ((imm >= -2048) && (imm <= 2046) &&
9861                            ((imm & 1) == 0))) {
9862                         // B{<c>}.W <label> ; T4
9863                         b(CurrentCond(), Wide, &location);
9864                       } else if ((imm >= -16777216) && (imm <= 16777214) &&
9865                                  ((imm & 1) == 0)) {
9866                         // B{<c>}{<q>} <label> ; T4
9867                         b(CurrentCond(), Best, &location);
9868                         if (!OutsideITBlockOrLast()) {
9869                           UnpredictableT32(instr);
9870                         }
9871                       } else {
9872                         UnallocatedT32(instr);
9873                       }
9874                       break;
9875                     }
9876                     case 0x00004000: {
9877                       // 0xf000c000
9878                       if ((instr & 0x00000001) == 0x00000000) {
9879                         uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
9880                                                ((instr >> 6) & 0xffc00) |
9881                                                ((instr << 9) & 0x100000) |
9882                                                ((instr << 8) & 0x200000) |
9883                                                ((instr >> 4) & 0x400000);
9884                         uint32_t S = encoded_imm & (1 << 22);
9885                         encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
9886                         int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
9887                         Location location(imm, kT32PcDelta);
9888                         // BLX{<c>}{<q>} <label> ; T2
9889                         blx(CurrentCond(), &location);
9890                       } else {
9891                         UnallocatedT32(instr);
9892                       }
9893                       break;
9894                     }
9895                     case 0x00005000: {
9896                       // 0xf000d000
9897                       uint32_t encoded_imm =
9898                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
9899                           ((instr << 10) & 0x200000) |
9900                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
9901                       uint32_t S = encoded_imm & (1 << 23);
9902                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
9903                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
9904                       Location location(imm, kT32PcDelta);
9905                       // BL{<c>}{<q>} <label> ; T1
9906                       bl(CurrentCond(), &location);
9907                       break;
9908                     }
9909                   }
9910                   break;
9911                 }
9912               }
9913               break;
9914             }
9915           }
9916           break;
9917         }
9918         case 0x08000000: {
9919           // 0xe8000000
9920           switch (instr & 0x06000000) {
9921             case 0x00000000: {
9922               // 0xe8000000
9923               switch (instr & 0x10100000) {
9924                 case 0x00000000: {
9925                   // 0xe8000000
9926                   switch (instr & 0x01400000) {
9927                     case 0x00000000: {
9928                       // 0xe8000000
9929                       switch (instr & 0x00800000) {
9930                         case 0x00000000: {
9931                           // 0xe8000000
9932                           UnimplementedT32_32("SRSDB", instr);
9933                           break;
9934                         }
9935                         case 0x00800000: {
9936                           // 0xe8800000
9937                           unsigned rn = (instr >> 16) & 0xf;
9938                           WriteBack write_back((instr >> 21) & 0x1);
9939                           RegisterList registers(
9940                               (((instr >> 14) & 0x1) << kLRRegNum) |
9941                               (instr & 0x1fff));
9942                           if ((rn < kNumberOfT32LowRegisters) &&
9943                               write_back.DoesWriteBack() &&
9944                               ((registers.GetList() & ~0xff) == 0)) {
9945                             // STM{<c>}.W <Rn>{!}, <registers> ; T2
9946                             stm(CurrentCond(),
9947                                 Wide,
9948                                 Register(rn),
9949                                 write_back,
9950                                 registers);
9951                             if (((instr & 0xffd0a000) != 0xe8800000)) {
9952                               UnpredictableT32(instr);
9953                             }
9954                           } else {
9955                             // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
9956                             stm(CurrentCond(),
9957                                 Best,
9958                                 Register(rn),
9959                                 write_back,
9960                                 registers);
9961                             if (((instr & 0xffd0a000) != 0xe8800000)) {
9962                               UnpredictableT32(instr);
9963                             }
9964                           }
9965                           break;
9966                         }
9967                       }
9968                       break;
9969                     }
9970                     case 0x00400000: {
9971                       // 0xe8400000
9972                       switch (instr & 0x00200000) {
9973                         case 0x00000000: {
9974                           // 0xe8400000
9975                           switch (instr & 0x00800000) {
9976                             case 0x00000000: {
9977                               // 0xe8400000
9978                               unsigned rd = (instr >> 8) & 0xf;
9979                               unsigned rt = (instr >> 12) & 0xf;
9980                               unsigned rn = (instr >> 16) & 0xf;
9981                               int32_t offset = (instr & 0xff) << 2;
9982                               // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
9983                               strex(CurrentCond(),
9984                                     Register(rd),
9985                                     Register(rt),
9986                                     MemOperand(Register(rn),
9987                                                plus,
9988                                                offset,
9989                                                Offset));
9990                               break;
9991                             }
9992                             case 0x00800000: {
9993                               // 0xe8c00000
9994                               switch (instr & 0x000000f0) {
9995                                 case 0x00000040: {
9996                                   // 0xe8c00040
9997                                   unsigned rd = instr & 0xf;
9998                                   unsigned rt = (instr >> 12) & 0xf;
9999                                   unsigned rn = (instr >> 16) & 0xf;
10000                                   // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10001                                   strexb(CurrentCond(),
10002                                          Register(rd),
10003                                          Register(rt),
10004                                          MemOperand(Register(rn), Offset));
10005                                   if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
10006                                     UnpredictableT32(instr);
10007                                   }
10008                                   break;
10009                                 }
10010                                 case 0x00000050: {
10011                                   // 0xe8c00050
10012                                   unsigned rd = instr & 0xf;
10013                                   unsigned rt = (instr >> 12) & 0xf;
10014                                   unsigned rn = (instr >> 16) & 0xf;
10015                                   // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10016                                   strexh(CurrentCond(),
10017                                          Register(rd),
10018                                          Register(rt),
10019                                          MemOperand(Register(rn), Offset));
10020                                   if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
10021                                     UnpredictableT32(instr);
10022                                   }
10023                                   break;
10024                                 }
10025                                 case 0x00000070: {
10026                                   // 0xe8c00070
10027                                   unsigned rd = instr & 0xf;
10028                                   unsigned rt = (instr >> 12) & 0xf;
10029                                   unsigned rt2 = (instr >> 8) & 0xf;
10030                                   unsigned rn = (instr >> 16) & 0xf;
10031                                   // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
10032                                   strexd(CurrentCond(),
10033                                          Register(rd),
10034                                          Register(rt),
10035                                          Register(rt2),
10036                                          MemOperand(Register(rn), Offset));
10037                                   break;
10038                                 }
10039                                 case 0x00000080: {
10040                                   // 0xe8c00080
10041                                   unsigned rt = (instr >> 12) & 0xf;
10042                                   unsigned rn = (instr >> 16) & 0xf;
10043                                   // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10044                                   stlb(CurrentCond(),
10045                                        Register(rt),
10046                                        MemOperand(Register(rn), Offset));
10047                                   if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
10048                                     UnpredictableT32(instr);
10049                                   }
10050                                   break;
10051                                 }
10052                                 case 0x00000090: {
10053                                   // 0xe8c00090
10054                                   unsigned rt = (instr >> 12) & 0xf;
10055                                   unsigned rn = (instr >> 16) & 0xf;
10056                                   // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10057                                   stlh(CurrentCond(),
10058                                        Register(rt),
10059                                        MemOperand(Register(rn), Offset));
10060                                   if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
10061                                     UnpredictableT32(instr);
10062                                   }
10063                                   break;
10064                                 }
10065                                 case 0x000000a0: {
10066                                   // 0xe8c000a0
10067                                   unsigned rt = (instr >> 12) & 0xf;
10068                                   unsigned rn = (instr >> 16) & 0xf;
10069                                   // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
10070                                   stl(CurrentCond(),
10071                                       Register(rt),
10072                                       MemOperand(Register(rn), Offset));
10073                                   if (((instr & 0xfff00fff) != 0xe8c00faf)) {
10074                                     UnpredictableT32(instr);
10075                                   }
10076                                   break;
10077                                 }
10078                                 case 0x000000c0: {
10079                                   // 0xe8c000c0
10080                                   unsigned rd = instr & 0xf;
10081                                   unsigned rt = (instr >> 12) & 0xf;
10082                                   unsigned rn = (instr >> 16) & 0xf;
10083                                   // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10084                                   stlexb(CurrentCond(),
10085                                          Register(rd),
10086                                          Register(rt),
10087                                          MemOperand(Register(rn), Offset));
10088                                   if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
10089                                     UnpredictableT32(instr);
10090                                   }
10091                                   break;
10092                                 }
10093                                 case 0x000000d0: {
10094                                   // 0xe8c000d0
10095                                   unsigned rd = instr & 0xf;
10096                                   unsigned rt = (instr >> 12) & 0xf;
10097                                   unsigned rn = (instr >> 16) & 0xf;
10098                                   // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10099                                   stlexh(CurrentCond(),
10100                                          Register(rd),
10101                                          Register(rt),
10102                                          MemOperand(Register(rn), Offset));
10103                                   if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
10104                                     UnpredictableT32(instr);
10105                                   }
10106                                   break;
10107                                 }
10108                                 case 0x000000e0: {
10109                                   // 0xe8c000e0
10110                                   unsigned rd = instr & 0xf;
10111                                   unsigned rt = (instr >> 12) & 0xf;
10112                                   unsigned rn = (instr >> 16) & 0xf;
10113                                   // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10114                                   stlex(CurrentCond(),
10115                                         Register(rd),
10116                                         Register(rt),
10117                                         MemOperand(Register(rn), Offset));
10118                                   if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
10119                                     UnpredictableT32(instr);
10120                                   }
10121                                   break;
10122                                 }
10123                                 case 0x000000f0: {
10124                                   // 0xe8c000f0
10125                                   unsigned rd = instr & 0xf;
10126                                   unsigned rt = (instr >> 12) & 0xf;
10127                                   unsigned rt2 = (instr >> 8) & 0xf;
10128                                   unsigned rn = (instr >> 16) & 0xf;
10129                                   // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
10130                                   stlexd(CurrentCond(),
10131                                          Register(rd),
10132                                          Register(rt),
10133                                          Register(rt2),
10134                                          MemOperand(Register(rn), Offset));
10135                                   break;
10136                                 }
10137                                 default:
10138                                   UnallocatedT32(instr);
10139                                   break;
10140                               }
10141                               break;
10142                             }
10143                           }
10144                           break;
10145                         }
10146                         case 0x00200000: {
10147                           // 0xe8600000
10148                           if (((instr & 0xf0000) == 0xf0000)) {
10149                             UnallocatedT32(instr);
10150                             return;
10151                           }
10152                           unsigned rt = (instr >> 12) & 0xf;
10153                           unsigned rt2 = (instr >> 8) & 0xf;
10154                           unsigned rn = (instr >> 16) & 0xf;
10155                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10156                                                                  : plus);
10157                           int32_t offset = (instr & 0xff) << 2;
10158                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
10159                           strd(CurrentCond(),
10160                                Register(rt),
10161                                Register(rt2),
10162                                MemOperand(Register(rn),
10163                                           sign,
10164                                           offset,
10165                                           PostIndex));
10166                           break;
10167                         }
10168                       }
10169                       break;
10170                     }
10171                     case 0x01000000: {
10172                       // 0xe9000000
10173                       switch (instr & 0x00800000) {
10174                         case 0x00000000: {
10175                           // 0xe9000000
10176                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
10177                                Uint32(0x1)) &&
10178                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
10179                                Uint32(0xd)) &&
10180                               (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
10181                                          << 13) |
10182                                         (Uint32(instr) & Uint32(0x1fff))) >
10183                                Int64(1))) {
10184                             RegisterList registers(
10185                                 (((instr >> 14) & 0x1) << kLRRegNum) |
10186                                 (instr & 0x1fff));
10187                             if (registers.IsR0toR7orLR()) {
10188                               // PUSH{<c>}.W <registers> ; T1
10189                               push(CurrentCond(), Wide, registers);
10190                               if (((instr & 0xffffa000) != 0xe92d0000)) {
10191                                 UnpredictableT32(instr);
10192                               }
10193                             } else {
10194                               // PUSH{<c>}{<q>} <registers> ; T1
10195                               push(CurrentCond(), Best, registers);
10196                               if (((instr & 0xffffa000) != 0xe92d0000)) {
10197                                 UnpredictableT32(instr);
10198                               }
10199                             }
10200                             return;
10201                           }
10202                           unsigned rn = (instr >> 16) & 0xf;
10203                           WriteBack write_back((instr >> 21) & 0x1);
10204                           RegisterList registers(
10205                               (((instr >> 14) & 0x1) << kLRRegNum) |
10206                               (instr & 0x1fff));
10207                           // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
10208                           stmdb(CurrentCond(),
10209                                 Best,
10210                                 Register(rn),
10211                                 write_back,
10212                                 registers);
10213                           if (((instr & 0xffd0a000) != 0xe9000000)) {
10214                             UnpredictableT32(instr);
10215                           }
10216                           break;
10217                         }
10218                         case 0x00800000: {
10219                           // 0xe9800000
10220                           UnimplementedT32_32("SRS{IA}", instr);
10221                           break;
10222                         }
10223                       }
10224                       break;
10225                     }
10226                     case 0x01400000: {
10227                       // 0xe9400000
10228                       switch (instr & 0x00200000) {
10229                         case 0x00000000: {
10230                           // 0xe9400000
10231                           if (((instr & 0xf0000) == 0xf0000)) {
10232                             UnallocatedT32(instr);
10233                             return;
10234                           }
10235                           unsigned rt = (instr >> 12) & 0xf;
10236                           unsigned rt2 = (instr >> 8) & 0xf;
10237                           unsigned rn = (instr >> 16) & 0xf;
10238                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10239                                                                  : plus);
10240                           int32_t offset = (instr & 0xff) << 2;
10241                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
10242                           strd(CurrentCond(),
10243                                Register(rt),
10244                                Register(rt2),
10245                                MemOperand(Register(rn), sign, offset, Offset));
10246                           break;
10247                         }
10248                         case 0x00200000: {
10249                           // 0xe9600000
10250                           if (((instr & 0xf0000) == 0xf0000)) {
10251                             UnallocatedT32(instr);
10252                             return;
10253                           }
10254                           unsigned rt = (instr >> 12) & 0xf;
10255                           unsigned rt2 = (instr >> 8) & 0xf;
10256                           unsigned rn = (instr >> 16) & 0xf;
10257                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10258                                                                  : plus);
10259                           int32_t offset = (instr & 0xff) << 2;
10260                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
10261                           strd(CurrentCond(),
10262                                Register(rt),
10263                                Register(rt2),
10264                                MemOperand(Register(rn),
10265                                           sign,
10266                                           offset,
10267                                           PreIndex));
10268                           break;
10269                         }
10270                       }
10271                       break;
10272                     }
10273                   }
10274                   break;
10275                 }
10276                 case 0x00100000: {
10277                   // 0xe8100000
10278                   switch (instr & 0x00400000) {
10279                     case 0x00000000: {
10280                       // 0xe8100000
10281                       switch (instr & 0x01800000) {
10282                         case 0x00000000: {
10283                           // 0xe8100000
10284                           UnimplementedT32_32("RFEDB", instr);
10285                           break;
10286                         }
10287                         case 0x00800000: {
10288                           // 0xe8900000
10289                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
10290                                Uint32(0x1)) &&
10291                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
10292                                Uint32(0xd)) &&
10293                               (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
10294                                          << 14) |
10295                                         ((Uint32((instr >> 14)) & Uint32(0x1))
10296                                          << 13) |
10297                                         (Uint32(instr) & Uint32(0x1fff))) >
10298                                Int64(1))) {
10299                             RegisterList registers(
10300                                 (((instr >> 15) & 0x1) << kPCRegNum) |
10301                                 (((instr >> 14) & 0x1) << kLRRegNum) |
10302                                 (instr & 0x1fff));
10303                             if (registers.IsR0toR7orPC()) {
10304                               // POP{<c>}.W <registers> ; T2
10305                               pop(CurrentCond(), Wide, registers);
10306                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
10307                                 UnpredictableT32(instr);
10308                               }
10309                             } else {
10310                               // POP{<c>}{<q>} <registers> ; T2
10311                               pop(CurrentCond(), Best, registers);
10312                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
10313                                 UnpredictableT32(instr);
10314                               }
10315                             }
10316                             return;
10317                           }
10318                           unsigned rn = (instr >> 16) & 0xf;
10319                           WriteBack write_back((instr >> 21) & 0x1);
10320                           RegisterList registers(
10321                               (((instr >> 15) & 0x1) << kPCRegNum) |
10322                               (((instr >> 14) & 0x1) << kLRRegNum) |
10323                               (instr & 0x1fff));
10324                           if ((rn < kNumberOfT32LowRegisters) &&
10325                               (((registers.GetList() & (1 << rn)) == 0) ==
10326                                write_back.DoesWriteBack()) &&
10327                               ((registers.GetList() & ~0xff) == 0)) {
10328                             // LDM{<c>}.W <Rn>{!}, <registers> ; T2
10329                             ldm(CurrentCond(),
10330                                 Wide,
10331                                 Register(rn),
10332                                 write_back,
10333                                 registers);
10334                             if (((instr & 0xffd02000) != 0xe8900000)) {
10335                               UnpredictableT32(instr);
10336                             }
10337                           } else {
10338                             // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
10339                             ldm(CurrentCond(),
10340                                 Best,
10341                                 Register(rn),
10342                                 write_back,
10343                                 registers);
10344                             if (((instr & 0xffd02000) != 0xe8900000)) {
10345                               UnpredictableT32(instr);
10346                             }
10347                           }
10348                           break;
10349                         }
10350                         case 0x01000000: {
10351                           // 0xe9100000
10352                           unsigned rn = (instr >> 16) & 0xf;
10353                           WriteBack write_back((instr >> 21) & 0x1);
10354                           RegisterList registers(
10355                               (((instr >> 15) & 0x1) << kPCRegNum) |
10356                               (((instr >> 14) & 0x1) << kLRRegNum) |
10357                               (instr & 0x1fff));
10358                           // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
10359                           ldmdb(CurrentCond(),
10360                                 Register(rn),
10361                                 write_back,
10362                                 registers);
10363                           if (((instr & 0xffd02000) != 0xe9100000)) {
10364                             UnpredictableT32(instr);
10365                           }
10366                           break;
10367                         }
10368                         case 0x01800000: {
10369                           // 0xe9900000
10370                           UnimplementedT32_32("RFE{IA}", instr);
10371                           break;
10372                         }
10373                       }
10374                       break;
10375                     }
10376                     case 0x00400000: {
10377                       // 0xe8500000
10378                       switch (instr & 0x01200000) {
10379                         case 0x00000000: {
10380                           // 0xe8500000
10381                           switch (instr & 0x00800000) {
10382                             case 0x00000000: {
10383                               // 0xe8500000
10384                               unsigned rt = (instr >> 12) & 0xf;
10385                               unsigned rn = (instr >> 16) & 0xf;
10386                               int32_t offset = (instr & 0xff) << 2;
10387                               // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
10388                               ldrex(CurrentCond(),
10389                                     Register(rt),
10390                                     MemOperand(Register(rn),
10391                                                plus,
10392                                                offset,
10393                                                Offset));
10394                               if (((instr & 0xfff00f00) != 0xe8500f00)) {
10395                                 UnpredictableT32(instr);
10396                               }
10397                               break;
10398                             }
10399                             case 0x00800000: {
10400                               // 0xe8d00000
10401                               switch (instr & 0x000000f0) {
10402                                 case 0x00000000: {
10403                                   // 0xe8d00000
10404                                   unsigned rn = (instr >> 16) & 0xf;
10405                                   unsigned rm = instr & 0xf;
10406                                   // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
10407                                   tbb(CurrentCond(),
10408                                       Register(rn),
10409                                       Register(rm));
10410                                   if (((instr & 0xfff0fff0) != 0xe8d0f000) ||
10411                                       !OutsideITBlockOrLast()) {
10412                                     UnpredictableT32(instr);
10413                                   }
10414                                   break;
10415                                 }
10416                                 case 0x00000010: {
10417                                   // 0xe8d00010
10418                                   unsigned rn = (instr >> 16) & 0xf;
10419                                   unsigned rm = instr & 0xf;
10420                                   // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
10421                                   tbh(CurrentCond(),
10422                                       Register(rn),
10423                                       Register(rm));
10424                                   if (((instr & 0xfff0fff0) != 0xe8d0f010) ||
10425                                       !OutsideITBlockOrLast()) {
10426                                     UnpredictableT32(instr);
10427                                   }
10428                                   break;
10429                                 }
10430                                 case 0x00000040: {
10431                                   // 0xe8d00040
10432                                   unsigned rt = (instr >> 12) & 0xf;
10433                                   unsigned rn = (instr >> 16) & 0xf;
10434                                   // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10435                                   ldrexb(CurrentCond(),
10436                                          Register(rt),
10437                                          MemOperand(Register(rn), Offset));
10438                                   if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
10439                                     UnpredictableT32(instr);
10440                                   }
10441                                   break;
10442                                 }
10443                                 case 0x00000050: {
10444                                   // 0xe8d00050
10445                                   unsigned rt = (instr >> 12) & 0xf;
10446                                   unsigned rn = (instr >> 16) & 0xf;
10447                                   // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10448                                   ldrexh(CurrentCond(),
10449                                          Register(rt),
10450                                          MemOperand(Register(rn), Offset));
10451                                   if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
10452                                     UnpredictableT32(instr);
10453                                   }
10454                                   break;
10455                                 }
10456                                 case 0x00000070: {
10457                                   // 0xe8d00070
10458                                   unsigned rt = (instr >> 12) & 0xf;
10459                                   unsigned rt2 = (instr >> 8) & 0xf;
10460                                   unsigned rn = (instr >> 16) & 0xf;
10461                                   // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
10462                                   ldrexd(CurrentCond(),
10463                                          Register(rt),
10464                                          Register(rt2),
10465                                          MemOperand(Register(rn), Offset));
10466                                   if (((instr & 0xfff000ff) != 0xe8d0007f)) {
10467                                     UnpredictableT32(instr);
10468                                   }
10469                                   break;
10470                                 }
10471                                 case 0x00000080: {
10472                                   // 0xe8d00080
10473                                   unsigned rt = (instr >> 12) & 0xf;
10474                                   unsigned rn = (instr >> 16) & 0xf;
10475                                   // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10476                                   ldab(CurrentCond(),
10477                                        Register(rt),
10478                                        MemOperand(Register(rn), Offset));
10479                                   if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
10480                                     UnpredictableT32(instr);
10481                                   }
10482                                   break;
10483                                 }
10484                                 case 0x00000090: {
10485                                   // 0xe8d00090
10486                                   unsigned rt = (instr >> 12) & 0xf;
10487                                   unsigned rn = (instr >> 16) & 0xf;
10488                                   // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10489                                   ldah(CurrentCond(),
10490                                        Register(rt),
10491                                        MemOperand(Register(rn), Offset));
10492                                   if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
10493                                     UnpredictableT32(instr);
10494                                   }
10495                                   break;
10496                                 }
10497                                 case 0x000000a0: {
10498                                   // 0xe8d000a0
10499                                   unsigned rt = (instr >> 12) & 0xf;
10500                                   unsigned rn = (instr >> 16) & 0xf;
10501                                   // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
10502                                   lda(CurrentCond(),
10503                                       Register(rt),
10504                                       MemOperand(Register(rn), Offset));
10505                                   if (((instr & 0xfff00fff) != 0xe8d00faf)) {
10506                                     UnpredictableT32(instr);
10507                                   }
10508                                   break;
10509                                 }
10510                                 case 0x000000c0: {
10511                                   // 0xe8d000c0
10512                                   unsigned rt = (instr >> 12) & 0xf;
10513                                   unsigned rn = (instr >> 16) & 0xf;
10514                                   // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10515                                   ldaexb(CurrentCond(),
10516                                          Register(rt),
10517                                          MemOperand(Register(rn), Offset));
10518                                   if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
10519                                     UnpredictableT32(instr);
10520                                   }
10521                                   break;
10522                                 }
10523                                 case 0x000000d0: {
10524                                   // 0xe8d000d0
10525                                   unsigned rt = (instr >> 12) & 0xf;
10526                                   unsigned rn = (instr >> 16) & 0xf;
10527                                   // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10528                                   ldaexh(CurrentCond(),
10529                                          Register(rt),
10530                                          MemOperand(Register(rn), Offset));
10531                                   if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
10532                                     UnpredictableT32(instr);
10533                                   }
10534                                   break;
10535                                 }
10536                                 case 0x000000e0: {
10537                                   // 0xe8d000e0
10538                                   unsigned rt = (instr >> 12) & 0xf;
10539                                   unsigned rn = (instr >> 16) & 0xf;
10540                                   // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
10541                                   ldaex(CurrentCond(),
10542                                         Register(rt),
10543                                         MemOperand(Register(rn), Offset));
10544                                   if (((instr & 0xfff00fff) != 0xe8d00fef)) {
10545                                     UnpredictableT32(instr);
10546                                   }
10547                                   break;
10548                                 }
10549                                 case 0x000000f0: {
10550                                   // 0xe8d000f0
10551                                   unsigned rt = (instr >> 12) & 0xf;
10552                                   unsigned rt2 = (instr >> 8) & 0xf;
10553                                   unsigned rn = (instr >> 16) & 0xf;
10554                                   // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
10555                                   ldaexd(CurrentCond(),
10556                                          Register(rt),
10557                                          Register(rt2),
10558                                          MemOperand(Register(rn), Offset));
10559                                   if (((instr & 0xfff000ff) != 0xe8d000ff)) {
10560                                     UnpredictableT32(instr);
10561                                   }
10562                                   break;
10563                                 }
10564                                 default:
10565                                   UnallocatedT32(instr);
10566                                   break;
10567                               }
10568                               break;
10569                             }
10570                           }
10571                           break;
10572                         }
10573                         case 0x00200000: {
10574                           // 0xe8700000
10575                           switch (instr & 0x000f0000) {
10576                             case 0x000f0000: {
10577                               // 0xe87f0000
10578                               if (((instr & 0x1200000) == 0x0)) {
10579                                 UnallocatedT32(instr);
10580                                 return;
10581                               }
10582                               unsigned rt = (instr >> 12) & 0xf;
10583                               unsigned rt2 = (instr >> 8) & 0xf;
10584                               uint32_t U = (instr >> 23) & 0x1;
10585                               int32_t imm = instr & 0xff;
10586                               imm <<= 2;
10587                               if (U == 0) imm = -imm;
10588                               bool minus_zero = (imm == 0) && (U == 0);
10589                               Location location(imm, kT32PcDelta);
10590                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10591                               if (minus_zero) {
10592                                 ldrd(CurrentCond(),
10593                                      Register(rt),
10594                                      Register(rt2),
10595                                      MemOperand(pc, minus, 0));
10596                               } else {
10597                                 ldrd(CurrentCond(),
10598                                      Register(rt),
10599                                      Register(rt2),
10600                                      &location);
10601                               }
10602                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
10603                                 UnpredictableT32(instr);
10604                               }
10605                               break;
10606                             }
10607                             default: {
10608                               if (((instr & 0xf0000) == 0xf0000)) {
10609                                 UnallocatedT32(instr);
10610                                 return;
10611                               }
10612                               unsigned rt = (instr >> 12) & 0xf;
10613                               unsigned rt2 = (instr >> 8) & 0xf;
10614                               unsigned rn = (instr >> 16) & 0xf;
10615                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10616                                                                      : plus);
10617                               int32_t offset = (instr & 0xff) << 2;
10618                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
10619                               ldrd(CurrentCond(),
10620                                    Register(rt),
10621                                    Register(rt2),
10622                                    MemOperand(Register(rn),
10623                                               sign,
10624                                               offset,
10625                                               PostIndex));
10626                               break;
10627                             }
10628                           }
10629                           break;
10630                         }
10631                         case 0x01000000: {
10632                           // 0xe9500000
10633                           switch (instr & 0x000f0000) {
10634                             case 0x000f0000: {
10635                               // 0xe95f0000
10636                               if (((instr & 0x1200000) == 0x0)) {
10637                                 UnallocatedT32(instr);
10638                                 return;
10639                               }
10640                               unsigned rt = (instr >> 12) & 0xf;
10641                               unsigned rt2 = (instr >> 8) & 0xf;
10642                               uint32_t U = (instr >> 23) & 0x1;
10643                               int32_t imm = instr & 0xff;
10644                               imm <<= 2;
10645                               if (U == 0) imm = -imm;
10646                               bool minus_zero = (imm == 0) && (U == 0);
10647                               Location location(imm, kT32PcDelta);
10648                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10649                               if (minus_zero) {
10650                                 ldrd(CurrentCond(),
10651                                      Register(rt),
10652                                      Register(rt2),
10653                                      MemOperand(pc, minus, 0));
10654                               } else {
10655                                 ldrd(CurrentCond(),
10656                                      Register(rt),
10657                                      Register(rt2),
10658                                      &location);
10659                               }
10660                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
10661                                 UnpredictableT32(instr);
10662                               }
10663                               break;
10664                             }
10665                             default: {
10666                               if (((instr & 0xf0000) == 0xf0000)) {
10667                                 UnallocatedT32(instr);
10668                                 return;
10669                               }
10670                               unsigned rt = (instr >> 12) & 0xf;
10671                               unsigned rt2 = (instr >> 8) & 0xf;
10672                               unsigned rn = (instr >> 16) & 0xf;
10673                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10674                                                                      : plus);
10675                               int32_t offset = (instr & 0xff) << 2;
10676                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
10677                               ldrd(CurrentCond(),
10678                                    Register(rt),
10679                                    Register(rt2),
10680                                    MemOperand(Register(rn),
10681                                               sign,
10682                                               offset,
10683                                               Offset));
10684                               break;
10685                             }
10686                           }
10687                           break;
10688                         }
10689                         case 0x01200000: {
10690                           // 0xe9700000
10691                           switch (instr & 0x000f0000) {
10692                             case 0x000f0000: {
10693                               // 0xe97f0000
10694                               if (((instr & 0x1200000) == 0x0)) {
10695                                 UnallocatedT32(instr);
10696                                 return;
10697                               }
10698                               unsigned rt = (instr >> 12) & 0xf;
10699                               unsigned rt2 = (instr >> 8) & 0xf;
10700                               uint32_t U = (instr >> 23) & 0x1;
10701                               int32_t imm = instr & 0xff;
10702                               imm <<= 2;
10703                               if (U == 0) imm = -imm;
10704                               bool minus_zero = (imm == 0) && (U == 0);
10705                               Location location(imm, kT32PcDelta);
10706                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10707                               if (minus_zero) {
10708                                 ldrd(CurrentCond(),
10709                                      Register(rt),
10710                                      Register(rt2),
10711                                      MemOperand(pc, minus, 0));
10712                               } else {
10713                                 ldrd(CurrentCond(),
10714                                      Register(rt),
10715                                      Register(rt2),
10716                                      &location);
10717                               }
10718                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
10719                                 UnpredictableT32(instr);
10720                               }
10721                               break;
10722                             }
10723                             default: {
10724                               if (((instr & 0xf0000) == 0xf0000)) {
10725                                 UnallocatedT32(instr);
10726                                 return;
10727                               }
10728                               unsigned rt = (instr >> 12) & 0xf;
10729                               unsigned rt2 = (instr >> 8) & 0xf;
10730                               unsigned rn = (instr >> 16) & 0xf;
10731                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10732                                                                      : plus);
10733                               int32_t offset = (instr & 0xff) << 2;
10734                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
10735                               ldrd(CurrentCond(),
10736                                    Register(rt),
10737                                    Register(rt2),
10738                                    MemOperand(Register(rn),
10739                                               sign,
10740                                               offset,
10741                                               PreIndex));
10742                               break;
10743                             }
10744                           }
10745                           break;
10746                         }
10747                       }
10748                       break;
10749                     }
10750                   }
10751                   break;
10752                 }
10753                 case 0x10000000: {
10754                   // 0xf8000000
10755                   switch (instr & 0x01a00000) {
10756                     case 0x00000000: {
10757                       // 0xf8000000
10758                       switch (instr & 0x00400d00) {
10759                         case 0x00000000: {
10760                           // 0xf8000000
10761                           if ((instr & 0x000002c0) == 0x00000000) {
10762                             if (((instr & 0xf0000) == 0xf0000)) {
10763                               UnallocatedT32(instr);
10764                               return;
10765                             }
10766                             unsigned rt = (instr >> 12) & 0xf;
10767                             unsigned rn = (instr >> 16) & 0xf;
10768                             Sign sign(plus);
10769                             unsigned rm = instr & 0xf;
10770                             Shift shift = LSL;
10771                             uint32_t amount = (instr >> 4) & 0x3;
10772                             AddrMode addrmode = Offset;
10773                             if ((rt < kNumberOfT32LowRegisters) &&
10774                                 (rn < kNumberOfT32LowRegisters) &&
10775                                 (rm < kNumberOfT32LowRegisters) &&
10776                                 shift.IsLSL() && (amount == 0) &&
10777                                 sign.IsPlus()) {
10778                               // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
10779                               strb(CurrentCond(),
10780                                    Wide,
10781                                    Register(rt),
10782                                    MemOperand(Register(rn),
10783                                               sign,
10784                                               Register(rm),
10785                                               addrmode));
10786                             } else {
10787                               // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
10788                               strb(CurrentCond(),
10789                                    Best,
10790                                    Register(rt),
10791                                    MemOperand(Register(rn),
10792                                               sign,
10793                                               Register(rm),
10794                                               shift,
10795                                               amount,
10796                                               addrmode));
10797                             }
10798                           } else {
10799                             UnallocatedT32(instr);
10800                           }
10801                           break;
10802                         }
10803                         case 0x00000900: {
10804                           // 0xf8000900
10805                           if (((instr & 0xf0000) == 0xf0000)) {
10806                             UnallocatedT32(instr);
10807                             return;
10808                           }
10809                           unsigned rt = (instr >> 12) & 0xf;
10810                           unsigned rn = (instr >> 16) & 0xf;
10811                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10812                           int32_t offset = instr & 0xff;
10813                           // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
10814                           strb(CurrentCond(),
10815                                Best,
10816                                Register(rt),
10817                                MemOperand(Register(rn),
10818                                           sign,
10819                                           offset,
10820                                           PostIndex));
10821                           break;
10822                         }
10823                         case 0x00000c00: {
10824                           // 0xf8000c00
10825                           switch (instr & 0x00000200) {
10826                             case 0x00000000: {
10827                               // 0xf8000c00
10828                               if (((instr & 0xf0000) == 0xf0000)) {
10829                                 UnallocatedT32(instr);
10830                                 return;
10831                               }
10832                               unsigned rt = (instr >> 12) & 0xf;
10833                               unsigned rn = (instr >> 16) & 0xf;
10834                               int32_t offset = instr & 0xff;
10835                               // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
10836                               strb(CurrentCond(),
10837                                    Best,
10838                                    Register(rt),
10839                                    MemOperand(Register(rn),
10840                                               minus,
10841                                               offset,
10842                                               Offset));
10843                               break;
10844                             }
10845                             case 0x00000200: {
10846                               // 0xf8000e00
10847                               if (((instr & 0xf0000) == 0xf0000)) {
10848                                 UnallocatedT32(instr);
10849                                 return;
10850                               }
10851                               UnimplementedT32_32("STRBT", instr);
10852                               break;
10853                             }
10854                           }
10855                           break;
10856                         }
10857                         case 0x00000d00: {
10858                           // 0xf8000d00
10859                           if (((instr & 0xf0000) == 0xf0000)) {
10860                             UnallocatedT32(instr);
10861                             return;
10862                           }
10863                           unsigned rt = (instr >> 12) & 0xf;
10864                           unsigned rn = (instr >> 16) & 0xf;
10865                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10866                           int32_t offset = instr & 0xff;
10867                           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
10868                           strb(CurrentCond(),
10869                                Best,
10870                                Register(rt),
10871                                MemOperand(Register(rn),
10872                                           sign,
10873                                           offset,
10874                                           PreIndex));
10875                           break;
10876                         }
10877                         case 0x00400000: {
10878                           // 0xf8400000
10879                           if ((instr & 0x000002c0) == 0x00000000) {
10880                             if (((instr & 0xf0000) == 0xf0000)) {
10881                               UnallocatedT32(instr);
10882                               return;
10883                             }
10884                             unsigned rt = (instr >> 12) & 0xf;
10885                             unsigned rn = (instr >> 16) & 0xf;
10886                             Sign sign(plus);
10887                             unsigned rm = instr & 0xf;
10888                             Shift shift = LSL;
10889                             uint32_t amount = (instr >> 4) & 0x3;
10890                             AddrMode addrmode = Offset;
10891                             if ((rt < kNumberOfT32LowRegisters) &&
10892                                 (rn < kNumberOfT32LowRegisters) &&
10893                                 (rm < kNumberOfT32LowRegisters) &&
10894                                 shift.IsLSL() && (amount == 0) &&
10895                                 sign.IsPlus()) {
10896                               // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
10897                               str(CurrentCond(),
10898                                   Wide,
10899                                   Register(rt),
10900                                   MemOperand(Register(rn),
10901                                              sign,
10902                                              Register(rm),
10903                                              addrmode));
10904                             } else {
10905                               // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
10906                               str(CurrentCond(),
10907                                   Best,
10908                                   Register(rt),
10909                                   MemOperand(Register(rn),
10910                                              sign,
10911                                              Register(rm),
10912                                              shift,
10913                                              amount,
10914                                              addrmode));
10915                             }
10916                           } else {
10917                             UnallocatedT32(instr);
10918                           }
10919                           break;
10920                         }
10921                         case 0x00400900: {
10922                           // 0xf8400900
10923                           if (((instr & 0xf0000) == 0xf0000)) {
10924                             UnallocatedT32(instr);
10925                             return;
10926                           }
10927                           unsigned rt = (instr >> 12) & 0xf;
10928                           unsigned rn = (instr >> 16) & 0xf;
10929                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10930                           int32_t offset = instr & 0xff;
10931                           // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
10932                           str(CurrentCond(),
10933                               Best,
10934                               Register(rt),
10935                               MemOperand(Register(rn),
10936                                          sign,
10937                                          offset,
10938                                          PostIndex));
10939                           break;
10940                         }
10941                         case 0x00400c00: {
10942                           // 0xf8400c00
10943                           switch (instr & 0x00000200) {
10944                             case 0x00000000: {
10945                               // 0xf8400c00
10946                               if (((instr & 0xf0000) == 0xf0000)) {
10947                                 UnallocatedT32(instr);
10948                                 return;
10949                               }
10950                               unsigned rt = (instr >> 12) & 0xf;
10951                               unsigned rn = (instr >> 16) & 0xf;
10952                               int32_t offset = instr & 0xff;
10953                               // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
10954                               str(CurrentCond(),
10955                                   Best,
10956                                   Register(rt),
10957                                   MemOperand(Register(rn),
10958                                              minus,
10959                                              offset,
10960                                              Offset));
10961                               break;
10962                             }
10963                             case 0x00000200: {
10964                               // 0xf8400e00
10965                               if (((instr & 0xf0000) == 0xf0000)) {
10966                                 UnallocatedT32(instr);
10967                                 return;
10968                               }
10969                               UnimplementedT32_32("STRT", instr);
10970                               break;
10971                             }
10972                           }
10973                           break;
10974                         }
10975                         case 0x00400d00: {
10976                           // 0xf8400d00
10977                           if (((instr & 0xf0000) == 0xf0000)) {
10978                             UnallocatedT32(instr);
10979                             return;
10980                           }
10981                           if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
10982                                Uint32(0xd)) &&
10983                               ((Uint32((instr >> 9)) & Uint32(0x1)) ==
10984                                Uint32(0x0)) &&
10985                               ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
10986                             unsigned rt = (instr >> 12) & 0xf;
10987                             if ((rt <= 7) || (rt == kLRRegNum)) {
10988                               // PUSH{<c>}.W <single_register_list> ; T4
10989                               push(CurrentCond(), Wide, Register(rt));
10990                             } else {
10991                               // PUSH{<c>}{<q>} <single_register_list> ; T4
10992                               push(CurrentCond(), Best, Register(rt));
10993                             }
10994                             return;
10995                           }
10996                           unsigned rt = (instr >> 12) & 0xf;
10997                           unsigned rn = (instr >> 16) & 0xf;
10998                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10999                           int32_t offset = instr & 0xff;
11000                           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
11001                           str(CurrentCond(),
11002                               Best,
11003                               Register(rt),
11004                               MemOperand(Register(rn), sign, offset, PreIndex));
11005                           break;
11006                         }
11007                         default:
11008                           UnallocatedT32(instr);
11009                           break;
11010                       }
11011                       break;
11012                     }
11013                     case 0x00200000: {
11014                       // 0xf8200000
11015                       switch (instr & 0x00400d00) {
11016                         case 0x00000000: {
11017                           // 0xf8200000
11018                           if ((instr & 0x000002c0) == 0x00000000) {
11019                             if (((instr & 0xf0000) == 0xf0000)) {
11020                               UnallocatedT32(instr);
11021                               return;
11022                             }
11023                             unsigned rt = (instr >> 12) & 0xf;
11024                             unsigned rn = (instr >> 16) & 0xf;
11025                             Sign sign(plus);
11026                             unsigned rm = instr & 0xf;
11027                             Shift shift = LSL;
11028                             uint32_t amount = (instr >> 4) & 0x3;
11029                             AddrMode addrmode = Offset;
11030                             if ((rt < kNumberOfT32LowRegisters) &&
11031                                 (rn < kNumberOfT32LowRegisters) &&
11032                                 (rm < kNumberOfT32LowRegisters) &&
11033                                 shift.IsLSL() && (amount == 0) &&
11034                                 sign.IsPlus()) {
11035                               // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
11036                               strh(CurrentCond(),
11037                                    Wide,
11038                                    Register(rt),
11039                                    MemOperand(Register(rn),
11040                                               sign,
11041                                               Register(rm),
11042                                               addrmode));
11043                             } else {
11044                               // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
11045                               strh(CurrentCond(),
11046                                    Best,
11047                                    Register(rt),
11048                                    MemOperand(Register(rn),
11049                                               sign,
11050                                               Register(rm),
11051                                               shift,
11052                                               amount,
11053                                               addrmode));
11054                             }
11055                           } else {
11056                             UnallocatedT32(instr);
11057                           }
11058                           break;
11059                         }
11060                         case 0x00000900: {
11061                           // 0xf8200900
11062                           if (((instr & 0xf0000) == 0xf0000)) {
11063                             UnallocatedT32(instr);
11064                             return;
11065                           }
11066                           unsigned rt = (instr >> 12) & 0xf;
11067                           unsigned rn = (instr >> 16) & 0xf;
11068                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11069                           int32_t offset = instr & 0xff;
11070                           // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
11071                           strh(CurrentCond(),
11072                                Best,
11073                                Register(rt),
11074                                MemOperand(Register(rn),
11075                                           sign,
11076                                           offset,
11077                                           PostIndex));
11078                           break;
11079                         }
11080                         case 0x00000c00: {
11081                           // 0xf8200c00
11082                           switch (instr & 0x00000200) {
11083                             case 0x00000000: {
11084                               // 0xf8200c00
11085                               if (((instr & 0xf0000) == 0xf0000)) {
11086                                 UnallocatedT32(instr);
11087                                 return;
11088                               }
11089                               unsigned rt = (instr >> 12) & 0xf;
11090                               unsigned rn = (instr >> 16) & 0xf;
11091                               int32_t offset = instr & 0xff;
11092                               // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
11093                               strh(CurrentCond(),
11094                                    Best,
11095                                    Register(rt),
11096                                    MemOperand(Register(rn),
11097                                               minus,
11098                                               offset,
11099                                               Offset));
11100                               break;
11101                             }
11102                             case 0x00000200: {
11103                               // 0xf8200e00
11104                               if (((instr & 0xf0000) == 0xf0000)) {
11105                                 UnallocatedT32(instr);
11106                                 return;
11107                               }
11108                               UnimplementedT32_32("STRHT", instr);
11109                               break;
11110                             }
11111                           }
11112                           break;
11113                         }
11114                         case 0x00000d00: {
11115                           // 0xf8200d00
11116                           if (((instr & 0xf0000) == 0xf0000)) {
11117                             UnallocatedT32(instr);
11118                             return;
11119                           }
11120                           unsigned rt = (instr >> 12) & 0xf;
11121                           unsigned rn = (instr >> 16) & 0xf;
11122                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11123                           int32_t offset = instr & 0xff;
11124                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
11125                           strh(CurrentCond(),
11126                                Best,
11127                                Register(rt),
11128                                MemOperand(Register(rn),
11129                                           sign,
11130                                           offset,
11131                                           PreIndex));
11132                           break;
11133                         }
11134                         default:
11135                           UnallocatedT32(instr);
11136                           break;
11137                       }
11138                       break;
11139                     }
11140                     case 0x00800000: {
11141                       // 0xf8800000
11142                       switch (instr & 0x00400000) {
11143                         case 0x00000000: {
11144                           // 0xf8800000
11145                           if (((instr & 0xf0000) == 0xf0000)) {
11146                             UnallocatedT32(instr);
11147                             return;
11148                           }
11149                           unsigned rt = (instr >> 12) & 0xf;
11150                           unsigned rn = (instr >> 16) & 0xf;
11151                           int32_t offset = instr & 0xfff;
11152                           if ((rt < kNumberOfT32LowRegisters) &&
11153                               (rn < kNumberOfT32LowRegisters) &&
11154                               ((offset >= 0) && (offset <= 31))) {
11155                             // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11156                             strb(CurrentCond(),
11157                                  Wide,
11158                                  Register(rt),
11159                                  MemOperand(Register(rn),
11160                                             plus,
11161                                             offset,
11162                                             Offset));
11163                           } else {
11164                             // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11165                             strb(CurrentCond(),
11166                                  Best,
11167                                  Register(rt),
11168                                  MemOperand(Register(rn),
11169                                             plus,
11170                                             offset,
11171                                             Offset));
11172                           }
11173                           break;
11174                         }
11175                         case 0x00400000: {
11176                           // 0xf8c00000
11177                           if (((instr & 0xf0000) == 0xf0000)) {
11178                             UnallocatedT32(instr);
11179                             return;
11180                           }
11181                           unsigned rt = (instr >> 12) & 0xf;
11182                           unsigned rn = (instr >> 16) & 0xf;
11183                           int32_t offset = instr & 0xfff;
11184                           if (((rt < kNumberOfT32LowRegisters) &&
11185                                (rn < kNumberOfT32LowRegisters) &&
11186                                ((offset >= 0) && (offset <= 124) &&
11187                                 ((offset & 3) == 0))) ||
11188                               ((rt < kNumberOfT32LowRegisters) &&
11189                                (rn == sp.GetCode()) &&
11190                                ((offset >= 0) && (offset <= 1020) &&
11191                                 ((offset & 3) == 0)))) {
11192                             // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
11193                             str(CurrentCond(),
11194                                 Wide,
11195                                 Register(rt),
11196                                 MemOperand(Register(rn), plus, offset, Offset));
11197                           } else {
11198                             // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
11199                             str(CurrentCond(),
11200                                 Best,
11201                                 Register(rt),
11202                                 MemOperand(Register(rn), plus, offset, Offset));
11203                           }
11204                           break;
11205                         }
11206                       }
11207                       break;
11208                     }
11209                     case 0x00a00000: {
11210                       // 0xf8a00000
11211                       if ((instr & 0x00400000) == 0x00000000) {
11212                         if (((instr & 0xf0000) == 0xf0000)) {
11213                           UnallocatedT32(instr);
11214                           return;
11215                         }
11216                         unsigned rt = (instr >> 12) & 0xf;
11217                         unsigned rn = (instr >> 16) & 0xf;
11218                         int32_t offset = instr & 0xfff;
11219                         if ((rt < kNumberOfT32LowRegisters) &&
11220                             (rn < kNumberOfT32LowRegisters) &&
11221                             ((offset >= 0) && (offset <= 62) &&
11222                              ((offset & 1) == 0))) {
11223                           // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11224                           strh(CurrentCond(),
11225                                Wide,
11226                                Register(rt),
11227                                MemOperand(Register(rn), plus, offset, Offset));
11228                         } else {
11229                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11230                           strh(CurrentCond(),
11231                                Best,
11232                                Register(rt),
11233                                MemOperand(Register(rn), plus, offset, Offset));
11234                         }
11235                       } else {
11236                         UnallocatedT32(instr);
11237                       }
11238                       break;
11239                     }
11240                     case 0x01000000: {
11241                       // 0xf9000000
11242                       switch (instr & 0x0000000d) {
11243                         case 0x0000000d: {
11244                           // 0xf900000d
11245                           switch (instr & 0x00000002) {
11246                             case 0x00000000: {
11247                               // 0xf900000d
11248                               switch (instr & 0x00000f00) {
11249                                 case 0x00000000: {
11250                                   // 0xf900000d
11251                                   DataType dt =
11252                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11253                                   if (dt.Is(kDataTypeValueInvalid)) {
11254                                     UnallocatedT32(instr);
11255                                     return;
11256                                   }
11257                                   Alignment align =
11258                                       Align_align_4_Decode((instr >> 4) & 0x3);
11259                                   if (dt.Is(kDataTypeValueInvalid) ||
11260                                       align.Is(kBadAlignment)) {
11261                                     UnallocatedT32(instr);
11262                                     return;
11263                                   }
11264                                   unsigned first =
11265                                       ExtractDRegister(instr, 22, 12);
11266                                   unsigned length;
11267                                   SpacingType spacing;
11268                                   switch ((instr >> 8) & 0xf) {
11269                                     default:
11270                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11271                                     case 0x0:
11272                                       length = 4;
11273                                       spacing = kSingle;
11274                                       break;
11275                                     case 0x1:
11276                                       length = 4;
11277                                       spacing = kDouble;
11278                                       break;
11279                                   }
11280                                   unsigned last =
11281                                       first +
11282                                       (length - 1) *
11283                                           (spacing == kSingle ? 1 : 2);
11284                                   TransferType transfer = kMultipleLanes;
11285                                   unsigned rn = (instr >> 16) & 0xf;
11286                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11287                                   vst4(CurrentCond(),
11288                                        dt,
11289                                        NeonRegisterList(DRegister(first),
11290                                                         DRegister(last),
11291                                                         spacing,
11292                                                         transfer),
11293                                        AlignedMemOperand(Register(rn),
11294                                                          align,
11295                                                          PostIndex));
11296                                   break;
11297                                 }
11298                                 case 0x00000100: {
11299                                   // 0xf900010d
11300                                   DataType dt =
11301                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11302                                   if (dt.Is(kDataTypeValueInvalid)) {
11303                                     UnallocatedT32(instr);
11304                                     return;
11305                                   }
11306                                   Alignment align =
11307                                       Align_align_4_Decode((instr >> 4) & 0x3);
11308                                   if (dt.Is(kDataTypeValueInvalid) ||
11309                                       align.Is(kBadAlignment)) {
11310                                     UnallocatedT32(instr);
11311                                     return;
11312                                   }
11313                                   unsigned first =
11314                                       ExtractDRegister(instr, 22, 12);
11315                                   unsigned length;
11316                                   SpacingType spacing;
11317                                   switch ((instr >> 8) & 0xf) {
11318                                     default:
11319                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11320                                     case 0x0:
11321                                       length = 4;
11322                                       spacing = kSingle;
11323                                       break;
11324                                     case 0x1:
11325                                       length = 4;
11326                                       spacing = kDouble;
11327                                       break;
11328                                   }
11329                                   unsigned last =
11330                                       first +
11331                                       (length - 1) *
11332                                           (spacing == kSingle ? 1 : 2);
11333                                   TransferType transfer = kMultipleLanes;
11334                                   unsigned rn = (instr >> 16) & 0xf;
11335                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11336                                   vst4(CurrentCond(),
11337                                        dt,
11338                                        NeonRegisterList(DRegister(first),
11339                                                         DRegister(last),
11340                                                         spacing,
11341                                                         transfer),
11342                                        AlignedMemOperand(Register(rn),
11343                                                          align,
11344                                                          PostIndex));
11345                                   break;
11346                                 }
11347                                 case 0x00000200: {
11348                                   // 0xf900020d
11349                                   if (((instr & 0xe20) == 0x620) ||
11350                                       ((instr & 0xf30) == 0xa30)) {
11351                                     UnallocatedT32(instr);
11352                                     return;
11353                                   }
11354                                   DataType dt =
11355                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11356                                   if (dt.Is(kDataTypeValueInvalid)) {
11357                                     UnallocatedT32(instr);
11358                                     return;
11359                                   }
11360                                   Alignment align =
11361                                       Align_align_5_Decode((instr >> 4) & 0x3);
11362                                   if (dt.Is(kDataTypeValueInvalid) ||
11363                                       align.Is(kBadAlignment)) {
11364                                     UnallocatedT32(instr);
11365                                     return;
11366                                   }
11367                                   unsigned first =
11368                                       ExtractDRegister(instr, 22, 12);
11369                                   unsigned length;
11370                                   SpacingType spacing = kSingle;
11371                                   switch ((instr >> 8) & 0xf) {
11372                                     default:
11373                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11374                                     case 0x7:
11375                                       length = 1;
11376                                       break;
11377                                     case 0xa:
11378                                       length = 2;
11379                                       break;
11380                                     case 0x6:
11381                                       length = 3;
11382                                       break;
11383                                     case 0x2:
11384                                       length = 4;
11385                                       break;
11386                                   }
11387                                   unsigned last = first + length - 1;
11388                                   TransferType transfer = kMultipleLanes;
11389                                   unsigned rn = (instr >> 16) & 0xf;
11390                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11391                                   vst1(CurrentCond(),
11392                                        dt,
11393                                        NeonRegisterList(DRegister(first),
11394                                                         DRegister(last),
11395                                                         spacing,
11396                                                         transfer),
11397                                        AlignedMemOperand(Register(rn),
11398                                                          align,
11399                                                          PostIndex));
11400                                   break;
11401                                 }
11402                                 case 0x00000300: {
11403                                   // 0xf900030d
11404                                   if (((instr & 0xe30) == 0x830)) {
11405                                     UnallocatedT32(instr);
11406                                     return;
11407                                   }
11408                                   DataType dt =
11409                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11410                                   if (dt.Is(kDataTypeValueInvalid)) {
11411                                     UnallocatedT32(instr);
11412                                     return;
11413                                   }
11414                                   Alignment align =
11415                                       Align_align_2_Decode((instr >> 4) & 0x3);
11416                                   if (dt.Is(kDataTypeValueInvalid) ||
11417                                       align.Is(kBadAlignment)) {
11418                                     UnallocatedT32(instr);
11419                                     return;
11420                                   }
11421                                   unsigned first =
11422                                       ExtractDRegister(instr, 22, 12);
11423                                   unsigned length;
11424                                   SpacingType spacing;
11425                                   switch ((instr >> 8) & 0xf) {
11426                                     default:
11427                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11428                                     case 0x8:
11429                                       length = 2;
11430                                       spacing = kSingle;
11431                                       break;
11432                                     case 0x9:
11433                                       length = 2;
11434                                       spacing = kDouble;
11435                                       break;
11436                                     case 0x3:
11437                                       length = 4;
11438                                       spacing = kSingle;
11439                                       break;
11440                                   }
11441                                   unsigned last =
11442                                       first +
11443                                       (length - 1) *
11444                                           (spacing == kSingle ? 1 : 2);
11445                                   TransferType transfer = kMultipleLanes;
11446                                   unsigned rn = (instr >> 16) & 0xf;
11447                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11448                                   vst2(CurrentCond(),
11449                                        dt,
11450                                        NeonRegisterList(DRegister(first),
11451                                                         DRegister(last),
11452                                                         spacing,
11453                                                         transfer),
11454                                        AlignedMemOperand(Register(rn),
11455                                                          align,
11456                                                          PostIndex));
11457                                   break;
11458                                 }
11459                                 case 0x00000400: {
11460                                   // 0xf900040d
11461                                   if (((instr & 0x20) == 0x20)) {
11462                                     UnallocatedT32(instr);
11463                                     return;
11464                                   }
11465                                   DataType dt =
11466                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11467                                   if (dt.Is(kDataTypeValueInvalid)) {
11468                                     UnallocatedT32(instr);
11469                                     return;
11470                                   }
11471                                   Alignment align =
11472                                       Align_align_3_Decode((instr >> 4) & 0x3);
11473                                   if (dt.Is(kDataTypeValueInvalid) ||
11474                                       align.Is(kBadAlignment)) {
11475                                     UnallocatedT32(instr);
11476                                     return;
11477                                   }
11478                                   unsigned first =
11479                                       ExtractDRegister(instr, 22, 12);
11480                                   unsigned length;
11481                                   SpacingType spacing;
11482                                   switch ((instr >> 8) & 0xf) {
11483                                     default:
11484                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11485                                     case 0x4:
11486                                       length = 3;
11487                                       spacing = kSingle;
11488                                       break;
11489                                     case 0x5:
11490                                       length = 3;
11491                                       spacing = kDouble;
11492                                       break;
11493                                   }
11494                                   unsigned last =
11495                                       first +
11496                                       (length - 1) *
11497                                           (spacing == kSingle ? 1 : 2);
11498                                   TransferType transfer = kMultipleLanes;
11499                                   unsigned rn = (instr >> 16) & 0xf;
11500                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11501                                   vst3(CurrentCond(),
11502                                        dt,
11503                                        NeonRegisterList(DRegister(first),
11504                                                         DRegister(last),
11505                                                         spacing,
11506                                                         transfer),
11507                                        AlignedMemOperand(Register(rn),
11508                                                          align,
11509                                                          PostIndex));
11510                                   break;
11511                                 }
11512                                 case 0x00000500: {
11513                                   // 0xf900050d
11514                                   if (((instr & 0x20) == 0x20)) {
11515                                     UnallocatedT32(instr);
11516                                     return;
11517                                   }
11518                                   DataType dt =
11519                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11520                                   if (dt.Is(kDataTypeValueInvalid)) {
11521                                     UnallocatedT32(instr);
11522                                     return;
11523                                   }
11524                                   Alignment align =
11525                                       Align_align_3_Decode((instr >> 4) & 0x3);
11526                                   if (dt.Is(kDataTypeValueInvalid) ||
11527                                       align.Is(kBadAlignment)) {
11528                                     UnallocatedT32(instr);
11529                                     return;
11530                                   }
11531                                   unsigned first =
11532                                       ExtractDRegister(instr, 22, 12);
11533                                   unsigned length;
11534                                   SpacingType spacing;
11535                                   switch ((instr >> 8) & 0xf) {
11536                                     default:
11537                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11538                                     case 0x4:
11539                                       length = 3;
11540                                       spacing = kSingle;
11541                                       break;
11542                                     case 0x5:
11543                                       length = 3;
11544                                       spacing = kDouble;
11545                                       break;
11546                                   }
11547                                   unsigned last =
11548                                       first +
11549                                       (length - 1) *
11550                                           (spacing == kSingle ? 1 : 2);
11551                                   TransferType transfer = kMultipleLanes;
11552                                   unsigned rn = (instr >> 16) & 0xf;
11553                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11554                                   vst3(CurrentCond(),
11555                                        dt,
11556                                        NeonRegisterList(DRegister(first),
11557                                                         DRegister(last),
11558                                                         spacing,
11559                                                         transfer),
11560                                        AlignedMemOperand(Register(rn),
11561                                                          align,
11562                                                          PostIndex));
11563                                   break;
11564                                 }
11565                                 case 0x00000600: {
11566                                   // 0xf900060d
11567                                   if (((instr & 0xe20) == 0x620) ||
11568                                       ((instr & 0xf30) == 0xa30)) {
11569                                     UnallocatedT32(instr);
11570                                     return;
11571                                   }
11572                                   DataType dt =
11573                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11574                                   if (dt.Is(kDataTypeValueInvalid)) {
11575                                     UnallocatedT32(instr);
11576                                     return;
11577                                   }
11578                                   Alignment align =
11579                                       Align_align_5_Decode((instr >> 4) & 0x3);
11580                                   if (dt.Is(kDataTypeValueInvalid) ||
11581                                       align.Is(kBadAlignment)) {
11582                                     UnallocatedT32(instr);
11583                                     return;
11584                                   }
11585                                   unsigned first =
11586                                       ExtractDRegister(instr, 22, 12);
11587                                   unsigned length;
11588                                   SpacingType spacing = kSingle;
11589                                   switch ((instr >> 8) & 0xf) {
11590                                     default:
11591                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11592                                     case 0x7:
11593                                       length = 1;
11594                                       break;
11595                                     case 0xa:
11596                                       length = 2;
11597                                       break;
11598                                     case 0x6:
11599                                       length = 3;
11600                                       break;
11601                                     case 0x2:
11602                                       length = 4;
11603                                       break;
11604                                   }
11605                                   unsigned last = first + length - 1;
11606                                   TransferType transfer = kMultipleLanes;
11607                                   unsigned rn = (instr >> 16) & 0xf;
11608                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11609                                   vst1(CurrentCond(),
11610                                        dt,
11611                                        NeonRegisterList(DRegister(first),
11612                                                         DRegister(last),
11613                                                         spacing,
11614                                                         transfer),
11615                                        AlignedMemOperand(Register(rn),
11616                                                          align,
11617                                                          PostIndex));
11618                                   break;
11619                                 }
11620                                 case 0x00000700: {
11621                                   // 0xf900070d
11622                                   if (((instr & 0xe20) == 0x620) ||
11623                                       ((instr & 0xf30) == 0xa30)) {
11624                                     UnallocatedT32(instr);
11625                                     return;
11626                                   }
11627                                   DataType dt =
11628                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11629                                   if (dt.Is(kDataTypeValueInvalid)) {
11630                                     UnallocatedT32(instr);
11631                                     return;
11632                                   }
11633                                   Alignment align =
11634                                       Align_align_5_Decode((instr >> 4) & 0x3);
11635                                   if (dt.Is(kDataTypeValueInvalid) ||
11636                                       align.Is(kBadAlignment)) {
11637                                     UnallocatedT32(instr);
11638                                     return;
11639                                   }
11640                                   unsigned first =
11641                                       ExtractDRegister(instr, 22, 12);
11642                                   unsigned length;
11643                                   SpacingType spacing = kSingle;
11644                                   switch ((instr >> 8) & 0xf) {
11645                                     default:
11646                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11647                                     case 0x7:
11648                                       length = 1;
11649                                       break;
11650                                     case 0xa:
11651                                       length = 2;
11652                                       break;
11653                                     case 0x6:
11654                                       length = 3;
11655                                       break;
11656                                     case 0x2:
11657                                       length = 4;
11658                                       break;
11659                                   }
11660                                   unsigned last = first + length - 1;
11661                                   TransferType transfer = kMultipleLanes;
11662                                   unsigned rn = (instr >> 16) & 0xf;
11663                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11664                                   vst1(CurrentCond(),
11665                                        dt,
11666                                        NeonRegisterList(DRegister(first),
11667                                                         DRegister(last),
11668                                                         spacing,
11669                                                         transfer),
11670                                        AlignedMemOperand(Register(rn),
11671                                                          align,
11672                                                          PostIndex));
11673                                   break;
11674                                 }
11675                                 case 0x00000800: {
11676                                   // 0xf900080d
11677                                   if (((instr & 0xe30) == 0x830)) {
11678                                     UnallocatedT32(instr);
11679                                     return;
11680                                   }
11681                                   DataType dt =
11682                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11683                                   if (dt.Is(kDataTypeValueInvalid)) {
11684                                     UnallocatedT32(instr);
11685                                     return;
11686                                   }
11687                                   Alignment align =
11688                                       Align_align_2_Decode((instr >> 4) & 0x3);
11689                                   if (dt.Is(kDataTypeValueInvalid) ||
11690                                       align.Is(kBadAlignment)) {
11691                                     UnallocatedT32(instr);
11692                                     return;
11693                                   }
11694                                   unsigned first =
11695                                       ExtractDRegister(instr, 22, 12);
11696                                   unsigned length;
11697                                   SpacingType spacing;
11698                                   switch ((instr >> 8) & 0xf) {
11699                                     default:
11700                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11701                                     case 0x8:
11702                                       length = 2;
11703                                       spacing = kSingle;
11704                                       break;
11705                                     case 0x9:
11706                                       length = 2;
11707                                       spacing = kDouble;
11708                                       break;
11709                                     case 0x3:
11710                                       length = 4;
11711                                       spacing = kSingle;
11712                                       break;
11713                                   }
11714                                   unsigned last =
11715                                       first +
11716                                       (length - 1) *
11717                                           (spacing == kSingle ? 1 : 2);
11718                                   TransferType transfer = kMultipleLanes;
11719                                   unsigned rn = (instr >> 16) & 0xf;
11720                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11721                                   vst2(CurrentCond(),
11722                                        dt,
11723                                        NeonRegisterList(DRegister(first),
11724                                                         DRegister(last),
11725                                                         spacing,
11726                                                         transfer),
11727                                        AlignedMemOperand(Register(rn),
11728                                                          align,
11729                                                          PostIndex));
11730                                   break;
11731                                 }
11732                                 case 0x00000900: {
11733                                   // 0xf900090d
11734                                   if (((instr & 0xe30) == 0x830)) {
11735                                     UnallocatedT32(instr);
11736                                     return;
11737                                   }
11738                                   DataType dt =
11739                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11740                                   if (dt.Is(kDataTypeValueInvalid)) {
11741                                     UnallocatedT32(instr);
11742                                     return;
11743                                   }
11744                                   Alignment align =
11745                                       Align_align_2_Decode((instr >> 4) & 0x3);
11746                                   if (dt.Is(kDataTypeValueInvalid) ||
11747                                       align.Is(kBadAlignment)) {
11748                                     UnallocatedT32(instr);
11749                                     return;
11750                                   }
11751                                   unsigned first =
11752                                       ExtractDRegister(instr, 22, 12);
11753                                   unsigned length;
11754                                   SpacingType spacing;
11755                                   switch ((instr >> 8) & 0xf) {
11756                                     default:
11757                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11758                                     case 0x8:
11759                                       length = 2;
11760                                       spacing = kSingle;
11761                                       break;
11762                                     case 0x9:
11763                                       length = 2;
11764                                       spacing = kDouble;
11765                                       break;
11766                                     case 0x3:
11767                                       length = 4;
11768                                       spacing = kSingle;
11769                                       break;
11770                                   }
11771                                   unsigned last =
11772                                       first +
11773                                       (length - 1) *
11774                                           (spacing == kSingle ? 1 : 2);
11775                                   TransferType transfer = kMultipleLanes;
11776                                   unsigned rn = (instr >> 16) & 0xf;
11777                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11778                                   vst2(CurrentCond(),
11779                                        dt,
11780                                        NeonRegisterList(DRegister(first),
11781                                                         DRegister(last),
11782                                                         spacing,
11783                                                         transfer),
11784                                        AlignedMemOperand(Register(rn),
11785                                                          align,
11786                                                          PostIndex));
11787                                   break;
11788                                 }
11789                                 case 0x00000a00: {
11790                                   // 0xf9000a0d
11791                                   if (((instr & 0xe20) == 0x620) ||
11792                                       ((instr & 0xf30) == 0xa30)) {
11793                                     UnallocatedT32(instr);
11794                                     return;
11795                                   }
11796                                   DataType dt =
11797                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11798                                   if (dt.Is(kDataTypeValueInvalid)) {
11799                                     UnallocatedT32(instr);
11800                                     return;
11801                                   }
11802                                   Alignment align =
11803                                       Align_align_5_Decode((instr >> 4) & 0x3);
11804                                   if (dt.Is(kDataTypeValueInvalid) ||
11805                                       align.Is(kBadAlignment)) {
11806                                     UnallocatedT32(instr);
11807                                     return;
11808                                   }
11809                                   unsigned first =
11810                                       ExtractDRegister(instr, 22, 12);
11811                                   unsigned length;
11812                                   SpacingType spacing = kSingle;
11813                                   switch ((instr >> 8) & 0xf) {
11814                                     default:
11815                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11816                                     case 0x7:
11817                                       length = 1;
11818                                       break;
11819                                     case 0xa:
11820                                       length = 2;
11821                                       break;
11822                                     case 0x6:
11823                                       length = 3;
11824                                       break;
11825                                     case 0x2:
11826                                       length = 4;
11827                                       break;
11828                                   }
11829                                   unsigned last = first + length - 1;
11830                                   TransferType transfer = kMultipleLanes;
11831                                   unsigned rn = (instr >> 16) & 0xf;
11832                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11833                                   vst1(CurrentCond(),
11834                                        dt,
11835                                        NeonRegisterList(DRegister(first),
11836                                                         DRegister(last),
11837                                                         spacing,
11838                                                         transfer),
11839                                        AlignedMemOperand(Register(rn),
11840                                                          align,
11841                                                          PostIndex));
11842                                   break;
11843                                 }
11844                                 default:
11845                                   UnallocatedT32(instr);
11846                                   break;
11847                               }
11848                               break;
11849                             }
11850                             case 0x00000002: {
11851                               // 0xf900000f
11852                               switch (instr & 0x00000f00) {
11853                                 case 0x00000000: {
11854                                   // 0xf900000d
11855                                   DataType dt =
11856                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11857                                   if (dt.Is(kDataTypeValueInvalid)) {
11858                                     UnallocatedT32(instr);
11859                                     return;
11860                                   }
11861                                   Alignment align =
11862                                       Align_align_4_Decode((instr >> 4) & 0x3);
11863                                   if (dt.Is(kDataTypeValueInvalid) ||
11864                                       align.Is(kBadAlignment)) {
11865                                     UnallocatedT32(instr);
11866                                     return;
11867                                   }
11868                                   unsigned first =
11869                                       ExtractDRegister(instr, 22, 12);
11870                                   unsigned length;
11871                                   SpacingType spacing;
11872                                   switch ((instr >> 8) & 0xf) {
11873                                     default:
11874                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11875                                     case 0x0:
11876                                       length = 4;
11877                                       spacing = kSingle;
11878                                       break;
11879                                     case 0x1:
11880                                       length = 4;
11881                                       spacing = kDouble;
11882                                       break;
11883                                   }
11884                                   unsigned last =
11885                                       first +
11886                                       (length - 1) *
11887                                           (spacing == kSingle ? 1 : 2);
11888                                   TransferType transfer = kMultipleLanes;
11889                                   unsigned rn = (instr >> 16) & 0xf;
11890                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11891                                   vst4(CurrentCond(),
11892                                        dt,
11893                                        NeonRegisterList(DRegister(first),
11894                                                         DRegister(last),
11895                                                         spacing,
11896                                                         transfer),
11897                                        AlignedMemOperand(Register(rn),
11898                                                          align,
11899                                                          Offset));
11900                                   break;
11901                                 }
11902                                 case 0x00000100: {
11903                                   // 0xf900010d
11904                                   DataType dt =
11905                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11906                                   if (dt.Is(kDataTypeValueInvalid)) {
11907                                     UnallocatedT32(instr);
11908                                     return;
11909                                   }
11910                                   Alignment align =
11911                                       Align_align_4_Decode((instr >> 4) & 0x3);
11912                                   if (dt.Is(kDataTypeValueInvalid) ||
11913                                       align.Is(kBadAlignment)) {
11914                                     UnallocatedT32(instr);
11915                                     return;
11916                                   }
11917                                   unsigned first =
11918                                       ExtractDRegister(instr, 22, 12);
11919                                   unsigned length;
11920                                   SpacingType spacing;
11921                                   switch ((instr >> 8) & 0xf) {
11922                                     default:
11923                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11924                                     case 0x0:
11925                                       length = 4;
11926                                       spacing = kSingle;
11927                                       break;
11928                                     case 0x1:
11929                                       length = 4;
11930                                       spacing = kDouble;
11931                                       break;
11932                                   }
11933                                   unsigned last =
11934                                       first +
11935                                       (length - 1) *
11936                                           (spacing == kSingle ? 1 : 2);
11937                                   TransferType transfer = kMultipleLanes;
11938                                   unsigned rn = (instr >> 16) & 0xf;
11939                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11940                                   vst4(CurrentCond(),
11941                                        dt,
11942                                        NeonRegisterList(DRegister(first),
11943                                                         DRegister(last),
11944                                                         spacing,
11945                                                         transfer),
11946                                        AlignedMemOperand(Register(rn),
11947                                                          align,
11948                                                          Offset));
11949                                   break;
11950                                 }
11951                                 case 0x00000200: {
11952                                   // 0xf900020d
11953                                   if (((instr & 0xe20) == 0x620) ||
11954                                       ((instr & 0xf30) == 0xa30)) {
11955                                     UnallocatedT32(instr);
11956                                     return;
11957                                   }
11958                                   DataType dt =
11959                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11960                                   if (dt.Is(kDataTypeValueInvalid)) {
11961                                     UnallocatedT32(instr);
11962                                     return;
11963                                   }
11964                                   Alignment align =
11965                                       Align_align_5_Decode((instr >> 4) & 0x3);
11966                                   if (dt.Is(kDataTypeValueInvalid) ||
11967                                       align.Is(kBadAlignment)) {
11968                                     UnallocatedT32(instr);
11969                                     return;
11970                                   }
11971                                   unsigned first =
11972                                       ExtractDRegister(instr, 22, 12);
11973                                   unsigned length;
11974                                   SpacingType spacing = kSingle;
11975                                   switch ((instr >> 8) & 0xf) {
11976                                     default:
11977                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11978                                     case 0x7:
11979                                       length = 1;
11980                                       break;
11981                                     case 0xa:
11982                                       length = 2;
11983                                       break;
11984                                     case 0x6:
11985                                       length = 3;
11986                                       break;
11987                                     case 0x2:
11988                                       length = 4;
11989                                       break;
11990                                   }
11991                                   unsigned last = first + length - 1;
11992                                   TransferType transfer = kMultipleLanes;
11993                                   unsigned rn = (instr >> 16) & 0xf;
11994                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11995                                   vst1(CurrentCond(),
11996                                        dt,
11997                                        NeonRegisterList(DRegister(first),
11998                                                         DRegister(last),
11999                                                         spacing,
12000                                                         transfer),
12001                                        AlignedMemOperand(Register(rn),
12002                                                          align,
12003                                                          Offset));
12004                                   break;
12005                                 }
12006                                 case 0x00000300: {
12007                                   // 0xf900030d
12008                                   if (((instr & 0xe30) == 0x830)) {
12009                                     UnallocatedT32(instr);
12010                                     return;
12011                                   }
12012                                   DataType dt =
12013                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12014                                   if (dt.Is(kDataTypeValueInvalid)) {
12015                                     UnallocatedT32(instr);
12016                                     return;
12017                                   }
12018                                   Alignment align =
12019                                       Align_align_2_Decode((instr >> 4) & 0x3);
12020                                   if (dt.Is(kDataTypeValueInvalid) ||
12021                                       align.Is(kBadAlignment)) {
12022                                     UnallocatedT32(instr);
12023                                     return;
12024                                   }
12025                                   unsigned first =
12026                                       ExtractDRegister(instr, 22, 12);
12027                                   unsigned length;
12028                                   SpacingType spacing;
12029                                   switch ((instr >> 8) & 0xf) {
12030                                     default:
12031                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12032                                     case 0x8:
12033                                       length = 2;
12034                                       spacing = kSingle;
12035                                       break;
12036                                     case 0x9:
12037                                       length = 2;
12038                                       spacing = kDouble;
12039                                       break;
12040                                     case 0x3:
12041                                       length = 4;
12042                                       spacing = kSingle;
12043                                       break;
12044                                   }
12045                                   unsigned last =
12046                                       first +
12047                                       (length - 1) *
12048                                           (spacing == kSingle ? 1 : 2);
12049                                   TransferType transfer = kMultipleLanes;
12050                                   unsigned rn = (instr >> 16) & 0xf;
12051                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12052                                   vst2(CurrentCond(),
12053                                        dt,
12054                                        NeonRegisterList(DRegister(first),
12055                                                         DRegister(last),
12056                                                         spacing,
12057                                                         transfer),
12058                                        AlignedMemOperand(Register(rn),
12059                                                          align,
12060                                                          Offset));
12061                                   break;
12062                                 }
12063                                 case 0x00000400: {
12064                                   // 0xf900040d
12065                                   if (((instr & 0x20) == 0x20)) {
12066                                     UnallocatedT32(instr);
12067                                     return;
12068                                   }
12069                                   DataType dt =
12070                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12071                                   if (dt.Is(kDataTypeValueInvalid)) {
12072                                     UnallocatedT32(instr);
12073                                     return;
12074                                   }
12075                                   Alignment align =
12076                                       Align_align_3_Decode((instr >> 4) & 0x3);
12077                                   if (dt.Is(kDataTypeValueInvalid) ||
12078                                       align.Is(kBadAlignment)) {
12079                                     UnallocatedT32(instr);
12080                                     return;
12081                                   }
12082                                   unsigned first =
12083                                       ExtractDRegister(instr, 22, 12);
12084                                   unsigned length;
12085                                   SpacingType spacing;
12086                                   switch ((instr >> 8) & 0xf) {
12087                                     default:
12088                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12089                                     case 0x4:
12090                                       length = 3;
12091                                       spacing = kSingle;
12092                                       break;
12093                                     case 0x5:
12094                                       length = 3;
12095                                       spacing = kDouble;
12096                                       break;
12097                                   }
12098                                   unsigned last =
12099                                       first +
12100                                       (length - 1) *
12101                                           (spacing == kSingle ? 1 : 2);
12102                                   TransferType transfer = kMultipleLanes;
12103                                   unsigned rn = (instr >> 16) & 0xf;
12104                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12105                                   vst3(CurrentCond(),
12106                                        dt,
12107                                        NeonRegisterList(DRegister(first),
12108                                                         DRegister(last),
12109                                                         spacing,
12110                                                         transfer),
12111                                        AlignedMemOperand(Register(rn),
12112                                                          align,
12113                                                          Offset));
12114                                   break;
12115                                 }
12116                                 case 0x00000500: {
12117                                   // 0xf900050d
12118                                   if (((instr & 0x20) == 0x20)) {
12119                                     UnallocatedT32(instr);
12120                                     return;
12121                                   }
12122                                   DataType dt =
12123                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12124                                   if (dt.Is(kDataTypeValueInvalid)) {
12125                                     UnallocatedT32(instr);
12126                                     return;
12127                                   }
12128                                   Alignment align =
12129                                       Align_align_3_Decode((instr >> 4) & 0x3);
12130                                   if (dt.Is(kDataTypeValueInvalid) ||
12131                                       align.Is(kBadAlignment)) {
12132                                     UnallocatedT32(instr);
12133                                     return;
12134                                   }
12135                                   unsigned first =
12136                                       ExtractDRegister(instr, 22, 12);
12137                                   unsigned length;
12138                                   SpacingType spacing;
12139                                   switch ((instr >> 8) & 0xf) {
12140                                     default:
12141                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12142                                     case 0x4:
12143                                       length = 3;
12144                                       spacing = kSingle;
12145                                       break;
12146                                     case 0x5:
12147                                       length = 3;
12148                                       spacing = kDouble;
12149                                       break;
12150                                   }
12151                                   unsigned last =
12152                                       first +
12153                                       (length - 1) *
12154                                           (spacing == kSingle ? 1 : 2);
12155                                   TransferType transfer = kMultipleLanes;
12156                                   unsigned rn = (instr >> 16) & 0xf;
12157                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12158                                   vst3(CurrentCond(),
12159                                        dt,
12160                                        NeonRegisterList(DRegister(first),
12161                                                         DRegister(last),
12162                                                         spacing,
12163                                                         transfer),
12164                                        AlignedMemOperand(Register(rn),
12165                                                          align,
12166                                                          Offset));
12167                                   break;
12168                                 }
12169                                 case 0x00000600: {
12170                                   // 0xf900060d
12171                                   if (((instr & 0xe20) == 0x620) ||
12172                                       ((instr & 0xf30) == 0xa30)) {
12173                                     UnallocatedT32(instr);
12174                                     return;
12175                                   }
12176                                   DataType dt =
12177                                       Dt_size_6_Decode((instr >> 6) & 0x3);
12178                                   if (dt.Is(kDataTypeValueInvalid)) {
12179                                     UnallocatedT32(instr);
12180                                     return;
12181                                   }
12182                                   Alignment align =
12183                                       Align_align_5_Decode((instr >> 4) & 0x3);
12184                                   if (dt.Is(kDataTypeValueInvalid) ||
12185                                       align.Is(kBadAlignment)) {
12186                                     UnallocatedT32(instr);
12187                                     return;
12188                                   }
12189                                   unsigned first =
12190                                       ExtractDRegister(instr, 22, 12);
12191                                   unsigned length;
12192                                   SpacingType spacing = kSingle;
12193                                   switch ((instr >> 8) & 0xf) {
12194                                     default:
12195                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12196                                     case 0x7:
12197                                       length = 1;
12198                                       break;
12199                                     case 0xa:
12200                                       length = 2;
12201                                       break;
12202                                     case 0x6:
12203                                       length = 3;
12204                                       break;
12205                                     case 0x2:
12206                                       length = 4;
12207                                       break;
12208                                   }
12209                                   unsigned last = first + length - 1;
12210                                   TransferType transfer = kMultipleLanes;
12211                                   unsigned rn = (instr >> 16) & 0xf;
12212                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12213                                   vst1(CurrentCond(),
12214                                        dt,
12215                                        NeonRegisterList(DRegister(first),
12216                                                         DRegister(last),
12217                                                         spacing,
12218                                                         transfer),
12219                                        AlignedMemOperand(Register(rn),
12220                                                          align,
12221                                                          Offset));
12222                                   break;
12223                                 }
12224                                 case 0x00000700: {
12225                                   // 0xf900070d
12226                                   if (((instr & 0xe20) == 0x620) ||
12227                                       ((instr & 0xf30) == 0xa30)) {
12228                                     UnallocatedT32(instr);
12229                                     return;
12230                                   }
12231                                   DataType dt =
12232                                       Dt_size_6_Decode((instr >> 6) & 0x3);
12233                                   if (dt.Is(kDataTypeValueInvalid)) {
12234                                     UnallocatedT32(instr);
12235                                     return;
12236                                   }
12237                                   Alignment align =
12238                                       Align_align_5_Decode((instr >> 4) & 0x3);
12239                                   if (dt.Is(kDataTypeValueInvalid) ||
12240                                       align.Is(kBadAlignment)) {
12241                                     UnallocatedT32(instr);
12242                                     return;
12243                                   }
12244                                   unsigned first =
12245                                       ExtractDRegister(instr, 22, 12);
12246                                   unsigned length;
12247                                   SpacingType spacing = kSingle;
12248                                   switch ((instr >> 8) & 0xf) {
12249                                     default:
12250                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12251                                     case 0x7:
12252                                       length = 1;
12253                                       break;
12254                                     case 0xa:
12255                                       length = 2;
12256                                       break;
12257                                     case 0x6:
12258                                       length = 3;
12259                                       break;
12260                                     case 0x2:
12261                                       length = 4;
12262                                       break;
12263                                   }
12264                                   unsigned last = first + length - 1;
12265                                   TransferType transfer = kMultipleLanes;
12266                                   unsigned rn = (instr >> 16) & 0xf;
12267                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12268                                   vst1(CurrentCond(),
12269                                        dt,
12270                                        NeonRegisterList(DRegister(first),
12271                                                         DRegister(last),
12272                                                         spacing,
12273                                                         transfer),
12274                                        AlignedMemOperand(Register(rn),
12275                                                          align,
12276                                                          Offset));
12277                                   break;
12278                                 }
12279                                 case 0x00000800: {
12280                                   // 0xf900080d
12281                                   if (((instr & 0xe30) == 0x830)) {
12282                                     UnallocatedT32(instr);
12283                                     return;
12284                                   }
12285                                   DataType dt =
12286                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12287                                   if (dt.Is(kDataTypeValueInvalid)) {
12288                                     UnallocatedT32(instr);
12289                                     return;
12290                                   }
12291                                   Alignment align =
12292                                       Align_align_2_Decode((instr >> 4) & 0x3);
12293                                   if (dt.Is(kDataTypeValueInvalid) ||
12294                                       align.Is(kBadAlignment)) {
12295                                     UnallocatedT32(instr);
12296                                     return;
12297                                   }
12298                                   unsigned first =
12299                                       ExtractDRegister(instr, 22, 12);
12300                                   unsigned length;
12301                                   SpacingType spacing;
12302                                   switch ((instr >> 8) & 0xf) {
12303                                     default:
12304                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12305                                     case 0x8:
12306                                       length = 2;
12307                                       spacing = kSingle;
12308                                       break;
12309                                     case 0x9:
12310                                       length = 2;
12311                                       spacing = kDouble;
12312                                       break;
12313                                     case 0x3:
12314                                       length = 4;
12315                                       spacing = kSingle;
12316                                       break;
12317                                   }
12318                                   unsigned last =
12319                                       first +
12320                                       (length - 1) *
12321                                           (spacing == kSingle ? 1 : 2);
12322                                   TransferType transfer = kMultipleLanes;
12323                                   unsigned rn = (instr >> 16) & 0xf;
12324                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12325                                   vst2(CurrentCond(),
12326                                        dt,
12327                                        NeonRegisterList(DRegister(first),
12328                                                         DRegister(last),
12329                                                         spacing,
12330                                                         transfer),
12331                                        AlignedMemOperand(Register(rn),
12332                                                          align,
12333                                                          Offset));
12334                                   break;
12335                                 }
12336                                 case 0x00000900: {
12337                                   // 0xf900090d
12338                                   if (((instr & 0xe30) == 0x830)) {
12339                                     UnallocatedT32(instr);
12340                                     return;
12341                                   }
12342                                   DataType dt =
12343                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12344                                   if (dt.Is(kDataTypeValueInvalid)) {
12345                                     UnallocatedT32(instr);
12346                                     return;
12347                                   }
12348                                   Alignment align =
12349                                       Align_align_2_Decode((instr >> 4) & 0x3);
12350                                   if (dt.Is(kDataTypeValueInvalid) ||
12351                                       align.Is(kBadAlignment)) {
12352                                     UnallocatedT32(instr);
12353                                     return;
12354                                   }
12355                                   unsigned first =
12356                                       ExtractDRegister(instr, 22, 12);
12357                                   unsigned length;
12358                                   SpacingType spacing;
12359                                   switch ((instr >> 8) & 0xf) {
12360                                     default:
12361                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12362                                     case 0x8:
12363                                       length = 2;
12364                                       spacing = kSingle;
12365                                       break;
12366                                     case 0x9:
12367                                       length = 2;
12368                                       spacing = kDouble;
12369                                       break;
12370                                     case 0x3:
12371                                       length = 4;
12372                                       spacing = kSingle;
12373                                       break;
12374                                   }
12375                                   unsigned last =
12376                                       first +
12377                                       (length - 1) *
12378                                           (spacing == kSingle ? 1 : 2);
12379                                   TransferType transfer = kMultipleLanes;
12380                                   unsigned rn = (instr >> 16) & 0xf;
12381                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12382                                   vst2(CurrentCond(),
12383                                        dt,
12384                                        NeonRegisterList(DRegister(first),
12385                                                         DRegister(last),
12386                                                         spacing,
12387                                                         transfer),
12388                                        AlignedMemOperand(Register(rn),
12389                                                          align,
12390                                                          Offset));
12391                                   break;
12392                                 }
12393                                 case 0x00000a00: {
12394                                   // 0xf9000a0d
12395                                   if (((instr & 0xe20) == 0x620) ||
12396                                       ((instr & 0xf30) == 0xa30)) {
12397                                     UnallocatedT32(instr);
12398                                     return;
12399                                   }
12400                                   DataType dt =
12401                                       Dt_size_6_Decode((instr >> 6) & 0x3);
12402                                   if (dt.Is(kDataTypeValueInvalid)) {
12403                                     UnallocatedT32(instr);
12404                                     return;
12405                                   }
12406                                   Alignment align =
12407                                       Align_align_5_Decode((instr >> 4) & 0x3);
12408                                   if (dt.Is(kDataTypeValueInvalid) ||
12409                                       align.Is(kBadAlignment)) {
12410                                     UnallocatedT32(instr);
12411                                     return;
12412                                   }
12413                                   unsigned first =
12414                                       ExtractDRegister(instr, 22, 12);
12415                                   unsigned length;
12416                                   SpacingType spacing = kSingle;
12417                                   switch ((instr >> 8) & 0xf) {
12418                                     default:
12419                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12420                                     case 0x7:
12421                                       length = 1;
12422                                       break;
12423                                     case 0xa:
12424                                       length = 2;
12425                                       break;
12426                                     case 0x6:
12427                                       length = 3;
12428                                       break;
12429                                     case 0x2:
12430                                       length = 4;
12431                                       break;
12432                                   }
12433                                   unsigned last = first + length - 1;
12434                                   TransferType transfer = kMultipleLanes;
12435                                   unsigned rn = (instr >> 16) & 0xf;
12436                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12437                                   vst1(CurrentCond(),
12438                                        dt,
12439                                        NeonRegisterList(DRegister(first),
12440                                                         DRegister(last),
12441                                                         spacing,
12442                                                         transfer),
12443                                        AlignedMemOperand(Register(rn),
12444                                                          align,
12445                                                          Offset));
12446                                   break;
12447                                 }
12448                                 default:
12449                                   UnallocatedT32(instr);
12450                                   break;
12451                               }
12452                               break;
12453                             }
12454                           }
12455                           break;
12456                         }
12457                         default: {
12458                           switch (instr & 0x00000f00) {
12459                             case 0x00000000: {
12460                               // 0xf9000000
12461                               if (((instr & 0xd) == 0xd)) {
12462                                 UnallocatedT32(instr);
12463                                 return;
12464                               }
12465                               DataType dt =
12466                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12467                               if (dt.Is(kDataTypeValueInvalid)) {
12468                                 UnallocatedT32(instr);
12469                                 return;
12470                               }
12471                               Alignment align =
12472                                   Align_align_4_Decode((instr >> 4) & 0x3);
12473                               if (dt.Is(kDataTypeValueInvalid) ||
12474                                   align.Is(kBadAlignment)) {
12475                                 UnallocatedT32(instr);
12476                                 return;
12477                               }
12478                               unsigned first = ExtractDRegister(instr, 22, 12);
12479                               unsigned length;
12480                               SpacingType spacing;
12481                               switch ((instr >> 8) & 0xf) {
12482                                 default:
12483                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12484                                 case 0x0:
12485                                   length = 4;
12486                                   spacing = kSingle;
12487                                   break;
12488                                 case 0x1:
12489                                   length = 4;
12490                                   spacing = kDouble;
12491                                   break;
12492                               }
12493                               unsigned last =
12494                                   first +
12495                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12496                               TransferType transfer = kMultipleLanes;
12497                               unsigned rn = (instr >> 16) & 0xf;
12498                               unsigned rm = instr & 0xf;
12499                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12500                               vst4(CurrentCond(),
12501                                    dt,
12502                                    NeonRegisterList(DRegister(first),
12503                                                     DRegister(last),
12504                                                     spacing,
12505                                                     transfer),
12506                                    AlignedMemOperand(Register(rn),
12507                                                      align,
12508                                                      Register(rm),
12509                                                      PostIndex));
12510                               break;
12511                             }
12512                             case 0x00000100: {
12513                               // 0xf9000100
12514                               if (((instr & 0xd) == 0xd)) {
12515                                 UnallocatedT32(instr);
12516                                 return;
12517                               }
12518                               DataType dt =
12519                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12520                               if (dt.Is(kDataTypeValueInvalid)) {
12521                                 UnallocatedT32(instr);
12522                                 return;
12523                               }
12524                               Alignment align =
12525                                   Align_align_4_Decode((instr >> 4) & 0x3);
12526                               if (dt.Is(kDataTypeValueInvalid) ||
12527                                   align.Is(kBadAlignment)) {
12528                                 UnallocatedT32(instr);
12529                                 return;
12530                               }
12531                               unsigned first = ExtractDRegister(instr, 22, 12);
12532                               unsigned length;
12533                               SpacingType spacing;
12534                               switch ((instr >> 8) & 0xf) {
12535                                 default:
12536                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12537                                 case 0x0:
12538                                   length = 4;
12539                                   spacing = kSingle;
12540                                   break;
12541                                 case 0x1:
12542                                   length = 4;
12543                                   spacing = kDouble;
12544                                   break;
12545                               }
12546                               unsigned last =
12547                                   first +
12548                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12549                               TransferType transfer = kMultipleLanes;
12550                               unsigned rn = (instr >> 16) & 0xf;
12551                               unsigned rm = instr & 0xf;
12552                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12553                               vst4(CurrentCond(),
12554                                    dt,
12555                                    NeonRegisterList(DRegister(first),
12556                                                     DRegister(last),
12557                                                     spacing,
12558                                                     transfer),
12559                                    AlignedMemOperand(Register(rn),
12560                                                      align,
12561                                                      Register(rm),
12562                                                      PostIndex));
12563                               break;
12564                             }
12565                             case 0x00000200: {
12566                               // 0xf9000200
12567                               if (((instr & 0xd) == 0xd) ||
12568                                   ((instr & 0xe20) == 0x620) ||
12569                                   ((instr & 0xf30) == 0xa30)) {
12570                                 UnallocatedT32(instr);
12571                                 return;
12572                               }
12573                               DataType dt =
12574                                   Dt_size_6_Decode((instr >> 6) & 0x3);
12575                               if (dt.Is(kDataTypeValueInvalid)) {
12576                                 UnallocatedT32(instr);
12577                                 return;
12578                               }
12579                               Alignment align =
12580                                   Align_align_5_Decode((instr >> 4) & 0x3);
12581                               if (dt.Is(kDataTypeValueInvalid) ||
12582                                   align.Is(kBadAlignment)) {
12583                                 UnallocatedT32(instr);
12584                                 return;
12585                               }
12586                               unsigned first = ExtractDRegister(instr, 22, 12);
12587                               unsigned length;
12588                               SpacingType spacing = kSingle;
12589                               switch ((instr >> 8) & 0xf) {
12590                                 default:
12591                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12592                                 case 0x7:
12593                                   length = 1;
12594                                   break;
12595                                 case 0xa:
12596                                   length = 2;
12597                                   break;
12598                                 case 0x6:
12599                                   length = 3;
12600                                   break;
12601                                 case 0x2:
12602                                   length = 4;
12603                                   break;
12604                               }
12605                               unsigned last = first + length - 1;
12606                               TransferType transfer = kMultipleLanes;
12607                               unsigned rn = (instr >> 16) & 0xf;
12608                               unsigned rm = instr & 0xf;
12609                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12610                               vst1(CurrentCond(),
12611                                    dt,
12612                                    NeonRegisterList(DRegister(first),
12613                                                     DRegister(last),
12614                                                     spacing,
12615                                                     transfer),
12616                                    AlignedMemOperand(Register(rn),
12617                                                      align,
12618                                                      Register(rm),
12619                                                      PostIndex));
12620                               break;
12621                             }
12622                             case 0x00000300: {
12623                               // 0xf9000300
12624                               if (((instr & 0xd) == 0xd) ||
12625                                   ((instr & 0xe30) == 0x830)) {
12626                                 UnallocatedT32(instr);
12627                                 return;
12628                               }
12629                               DataType dt =
12630                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12631                               if (dt.Is(kDataTypeValueInvalid)) {
12632                                 UnallocatedT32(instr);
12633                                 return;
12634                               }
12635                               Alignment align =
12636                                   Align_align_2_Decode((instr >> 4) & 0x3);
12637                               if (dt.Is(kDataTypeValueInvalid) ||
12638                                   align.Is(kBadAlignment)) {
12639                                 UnallocatedT32(instr);
12640                                 return;
12641                               }
12642                               unsigned first = ExtractDRegister(instr, 22, 12);
12643                               unsigned length;
12644                               SpacingType spacing;
12645                               switch ((instr >> 8) & 0xf) {
12646                                 default:
12647                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12648                                 case 0x8:
12649                                   length = 2;
12650                                   spacing = kSingle;
12651                                   break;
12652                                 case 0x9:
12653                                   length = 2;
12654                                   spacing = kDouble;
12655                                   break;
12656                                 case 0x3:
12657                                   length = 4;
12658                                   spacing = kSingle;
12659                                   break;
12660                               }
12661                               unsigned last =
12662                                   first +
12663                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12664                               TransferType transfer = kMultipleLanes;
12665                               unsigned rn = (instr >> 16) & 0xf;
12666                               unsigned rm = instr & 0xf;
12667                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12668                               vst2(CurrentCond(),
12669                                    dt,
12670                                    NeonRegisterList(DRegister(first),
12671                                                     DRegister(last),
12672                                                     spacing,
12673                                                     transfer),
12674                                    AlignedMemOperand(Register(rn),
12675                                                      align,
12676                                                      Register(rm),
12677                                                      PostIndex));
12678                               break;
12679                             }
12680                             case 0x00000400: {
12681                               // 0xf9000400
12682                               if (((instr & 0xd) == 0xd) ||
12683                                   ((instr & 0x20) == 0x20)) {
12684                                 UnallocatedT32(instr);
12685                                 return;
12686                               }
12687                               DataType dt =
12688                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12689                               if (dt.Is(kDataTypeValueInvalid)) {
12690                                 UnallocatedT32(instr);
12691                                 return;
12692                               }
12693                               Alignment align =
12694                                   Align_align_3_Decode((instr >> 4) & 0x3);
12695                               if (dt.Is(kDataTypeValueInvalid) ||
12696                                   align.Is(kBadAlignment)) {
12697                                 UnallocatedT32(instr);
12698                                 return;
12699                               }
12700                               unsigned first = ExtractDRegister(instr, 22, 12);
12701                               unsigned length;
12702                               SpacingType spacing;
12703                               switch ((instr >> 8) & 0xf) {
12704                                 default:
12705                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12706                                 case 0x4:
12707                                   length = 3;
12708                                   spacing = kSingle;
12709                                   break;
12710                                 case 0x5:
12711                                   length = 3;
12712                                   spacing = kDouble;
12713                                   break;
12714                               }
12715                               unsigned last =
12716                                   first +
12717                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12718                               TransferType transfer = kMultipleLanes;
12719                               unsigned rn = (instr >> 16) & 0xf;
12720                               unsigned rm = instr & 0xf;
12721                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12722                               vst3(CurrentCond(),
12723                                    dt,
12724                                    NeonRegisterList(DRegister(first),
12725                                                     DRegister(last),
12726                                                     spacing,
12727                                                     transfer),
12728                                    AlignedMemOperand(Register(rn),
12729                                                      align,
12730                                                      Register(rm),
12731                                                      PostIndex));
12732                               break;
12733                             }
12734                             case 0x00000500: {
12735                               // 0xf9000500
12736                               if (((instr & 0xd) == 0xd) ||
12737                                   ((instr & 0x20) == 0x20)) {
12738                                 UnallocatedT32(instr);
12739                                 return;
12740                               }
12741                               DataType dt =
12742                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12743                               if (dt.Is(kDataTypeValueInvalid)) {
12744                                 UnallocatedT32(instr);
12745                                 return;
12746                               }
12747                               Alignment align =
12748                                   Align_align_3_Decode((instr >> 4) & 0x3);
12749                               if (dt.Is(kDataTypeValueInvalid) ||
12750                                   align.Is(kBadAlignment)) {
12751                                 UnallocatedT32(instr);
12752                                 return;
12753                               }
12754                               unsigned first = ExtractDRegister(instr, 22, 12);
12755                               unsigned length;
12756                               SpacingType spacing;
12757                               switch ((instr >> 8) & 0xf) {
12758                                 default:
12759                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12760                                 case 0x4:
12761                                   length = 3;
12762                                   spacing = kSingle;
12763                                   break;
12764                                 case 0x5:
12765                                   length = 3;
12766                                   spacing = kDouble;
12767                                   break;
12768                               }
12769                               unsigned last =
12770                                   first +
12771                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12772                               TransferType transfer = kMultipleLanes;
12773                               unsigned rn = (instr >> 16) & 0xf;
12774                               unsigned rm = instr & 0xf;
12775                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12776                               vst3(CurrentCond(),
12777                                    dt,
12778                                    NeonRegisterList(DRegister(first),
12779                                                     DRegister(last),
12780                                                     spacing,
12781                                                     transfer),
12782                                    AlignedMemOperand(Register(rn),
12783                                                      align,
12784                                                      Register(rm),
12785                                                      PostIndex));
12786                               break;
12787                             }
12788                             case 0x00000600: {
12789                               // 0xf9000600
12790                               if (((instr & 0xd) == 0xd) ||
12791                                   ((instr & 0xe20) == 0x620) ||
12792                                   ((instr & 0xf30) == 0xa30)) {
12793                                 UnallocatedT32(instr);
12794                                 return;
12795                               }
12796                               DataType dt =
12797                                   Dt_size_6_Decode((instr >> 6) & 0x3);
12798                               if (dt.Is(kDataTypeValueInvalid)) {
12799                                 UnallocatedT32(instr);
12800                                 return;
12801                               }
12802                               Alignment align =
12803                                   Align_align_5_Decode((instr >> 4) & 0x3);
12804                               if (dt.Is(kDataTypeValueInvalid) ||
12805                                   align.Is(kBadAlignment)) {
12806                                 UnallocatedT32(instr);
12807                                 return;
12808                               }
12809                               unsigned first = ExtractDRegister(instr, 22, 12);
12810                               unsigned length;
12811                               SpacingType spacing = kSingle;
12812                               switch ((instr >> 8) & 0xf) {
12813                                 default:
12814                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12815                                 case 0x7:
12816                                   length = 1;
12817                                   break;
12818                                 case 0xa:
12819                                   length = 2;
12820                                   break;
12821                                 case 0x6:
12822                                   length = 3;
12823                                   break;
12824                                 case 0x2:
12825                                   length = 4;
12826                                   break;
12827                               }
12828                               unsigned last = first + length - 1;
12829                               TransferType transfer = kMultipleLanes;
12830                               unsigned rn = (instr >> 16) & 0xf;
12831                               unsigned rm = instr & 0xf;
12832                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12833                               vst1(CurrentCond(),
12834                                    dt,
12835                                    NeonRegisterList(DRegister(first),
12836                                                     DRegister(last),
12837                                                     spacing,
12838                                                     transfer),
12839                                    AlignedMemOperand(Register(rn),
12840                                                      align,
12841                                                      Register(rm),
12842                                                      PostIndex));
12843                               break;
12844                             }
12845                             case 0x00000700: {
12846                               // 0xf9000700
12847                               if (((instr & 0xd) == 0xd) ||
12848                                   ((instr & 0xe20) == 0x620) ||
12849                                   ((instr & 0xf30) == 0xa30)) {
12850                                 UnallocatedT32(instr);
12851                                 return;
12852                               }
12853                               DataType dt =
12854                                   Dt_size_6_Decode((instr >> 6) & 0x3);
12855                               if (dt.Is(kDataTypeValueInvalid)) {
12856                                 UnallocatedT32(instr);
12857                                 return;
12858                               }
12859                               Alignment align =
12860                                   Align_align_5_Decode((instr >> 4) & 0x3);
12861                               if (dt.Is(kDataTypeValueInvalid) ||
12862                                   align.Is(kBadAlignment)) {
12863                                 UnallocatedT32(instr);
12864                                 return;
12865                               }
12866                               unsigned first = ExtractDRegister(instr, 22, 12);
12867                               unsigned length;
12868                               SpacingType spacing = kSingle;
12869                               switch ((instr >> 8) & 0xf) {
12870                                 default:
12871                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12872                                 case 0x7:
12873                                   length = 1;
12874                                   break;
12875                                 case 0xa:
12876                                   length = 2;
12877                                   break;
12878                                 case 0x6:
12879                                   length = 3;
12880                                   break;
12881                                 case 0x2:
12882                                   length = 4;
12883                                   break;
12884                               }
12885                               unsigned last = first + length - 1;
12886                               TransferType transfer = kMultipleLanes;
12887                               unsigned rn = (instr >> 16) & 0xf;
12888                               unsigned rm = instr & 0xf;
12889                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12890                               vst1(CurrentCond(),
12891                                    dt,
12892                                    NeonRegisterList(DRegister(first),
12893                                                     DRegister(last),
12894                                                     spacing,
12895                                                     transfer),
12896                                    AlignedMemOperand(Register(rn),
12897                                                      align,
12898                                                      Register(rm),
12899                                                      PostIndex));
12900                               break;
12901                             }
12902                             case 0x00000800: {
12903                               // 0xf9000800
12904                               if (((instr & 0xd) == 0xd) ||
12905                                   ((instr & 0xe30) == 0x830)) {
12906                                 UnallocatedT32(instr);
12907                                 return;
12908                               }
12909                               DataType dt =
12910                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12911                               if (dt.Is(kDataTypeValueInvalid)) {
12912                                 UnallocatedT32(instr);
12913                                 return;
12914                               }
12915                               Alignment align =
12916                                   Align_align_2_Decode((instr >> 4) & 0x3);
12917                               if (dt.Is(kDataTypeValueInvalid) ||
12918                                   align.Is(kBadAlignment)) {
12919                                 UnallocatedT32(instr);
12920                                 return;
12921                               }
12922                               unsigned first = ExtractDRegister(instr, 22, 12);
12923                               unsigned length;
12924                               SpacingType spacing;
12925                               switch ((instr >> 8) & 0xf) {
12926                                 default:
12927                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12928                                 case 0x8:
12929                                   length = 2;
12930                                   spacing = kSingle;
12931                                   break;
12932                                 case 0x9:
12933                                   length = 2;
12934                                   spacing = kDouble;
12935                                   break;
12936                                 case 0x3:
12937                                   length = 4;
12938                                   spacing = kSingle;
12939                                   break;
12940                               }
12941                               unsigned last =
12942                                   first +
12943                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12944                               TransferType transfer = kMultipleLanes;
12945                               unsigned rn = (instr >> 16) & 0xf;
12946                               unsigned rm = instr & 0xf;
12947                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12948                               vst2(CurrentCond(),
12949                                    dt,
12950                                    NeonRegisterList(DRegister(first),
12951                                                     DRegister(last),
12952                                                     spacing,
12953                                                     transfer),
12954                                    AlignedMemOperand(Register(rn),
12955                                                      align,
12956                                                      Register(rm),
12957                                                      PostIndex));
12958                               break;
12959                             }
12960                             case 0x00000900: {
12961                               // 0xf9000900
12962                               if (((instr & 0xd) == 0xd) ||
12963                                   ((instr & 0xe30) == 0x830)) {
12964                                 UnallocatedT32(instr);
12965                                 return;
12966                               }
12967                               DataType dt =
12968                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12969                               if (dt.Is(kDataTypeValueInvalid)) {
12970                                 UnallocatedT32(instr);
12971                                 return;
12972                               }
12973                               Alignment align =
12974                                   Align_align_2_Decode((instr >> 4) & 0x3);
12975                               if (dt.Is(kDataTypeValueInvalid) ||
12976                                   align.Is(kBadAlignment)) {
12977                                 UnallocatedT32(instr);
12978                                 return;
12979                               }
12980                               unsigned first = ExtractDRegister(instr, 22, 12);
12981                               unsigned length;
12982                               SpacingType spacing;
12983                               switch ((instr >> 8) & 0xf) {
12984                                 default:
12985                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12986                                 case 0x8:
12987                                   length = 2;
12988                                   spacing = kSingle;
12989                                   break;
12990                                 case 0x9:
12991                                   length = 2;
12992                                   spacing = kDouble;
12993                                   break;
12994                                 case 0x3:
12995                                   length = 4;
12996                                   spacing = kSingle;
12997                                   break;
12998                               }
12999                               unsigned last =
13000                                   first +
13001                                   (length - 1) * (spacing == kSingle ? 1 : 2);
13002                               TransferType transfer = kMultipleLanes;
13003                               unsigned rn = (instr >> 16) & 0xf;
13004                               unsigned rm = instr & 0xf;
13005                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
13006                               vst2(CurrentCond(),
13007                                    dt,
13008                                    NeonRegisterList(DRegister(first),
13009                                                     DRegister(last),
13010                                                     spacing,
13011                                                     transfer),
13012                                    AlignedMemOperand(Register(rn),
13013                                                      align,
13014                                                      Register(rm),
13015                                                      PostIndex));
13016                               break;
13017                             }
13018                             case 0x00000a00: {
13019                               // 0xf9000a00
13020                               if (((instr & 0xd) == 0xd) ||
13021                                   ((instr & 0xe20) == 0x620) ||
13022                                   ((instr & 0xf30) == 0xa30)) {
13023                                 UnallocatedT32(instr);
13024                                 return;
13025                               }
13026                               DataType dt =
13027                                   Dt_size_6_Decode((instr >> 6) & 0x3);
13028                               if (dt.Is(kDataTypeValueInvalid)) {
13029                                 UnallocatedT32(instr);
13030                                 return;
13031                               }
13032                               Alignment align =
13033                                   Align_align_5_Decode((instr >> 4) & 0x3);
13034                               if (dt.Is(kDataTypeValueInvalid) ||
13035                                   align.Is(kBadAlignment)) {
13036                                 UnallocatedT32(instr);
13037                                 return;
13038                               }
13039                               unsigned first = ExtractDRegister(instr, 22, 12);
13040                               unsigned length;
13041                               SpacingType spacing = kSingle;
13042                               switch ((instr >> 8) & 0xf) {
13043                                 default:
13044                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
13045                                 case 0x7:
13046                                   length = 1;
13047                                   break;
13048                                 case 0xa:
13049                                   length = 2;
13050                                   break;
13051                                 case 0x6:
13052                                   length = 3;
13053                                   break;
13054                                 case 0x2:
13055                                   length = 4;
13056                                   break;
13057                               }
13058                               unsigned last = first + length - 1;
13059                               TransferType transfer = kMultipleLanes;
13060                               unsigned rn = (instr >> 16) & 0xf;
13061                               unsigned rm = instr & 0xf;
13062                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
13063                               vst1(CurrentCond(),
13064                                    dt,
13065                                    NeonRegisterList(DRegister(first),
13066                                                     DRegister(last),
13067                                                     spacing,
13068                                                     transfer),
13069                                    AlignedMemOperand(Register(rn),
13070                                                      align,
13071                                                      Register(rm),
13072                                                      PostIndex));
13073                               break;
13074                             }
13075                             default:
13076                               UnallocatedT32(instr);
13077                               break;
13078                           }
13079                           break;
13080                         }
13081                       }
13082                       break;
13083                     }
13084                     case 0x01200000: {
13085                       // 0xf9200000
13086                       switch (instr & 0x0000000d) {
13087                         case 0x0000000d: {
13088                           // 0xf920000d
13089                           switch (instr & 0x00000002) {
13090                             case 0x00000000: {
13091                               // 0xf920000d
13092                               switch (instr & 0x00000f00) {
13093                                 case 0x00000000: {
13094                                   // 0xf920000d
13095                                   DataType dt =
13096                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13097                                   if (dt.Is(kDataTypeValueInvalid)) {
13098                                     UnallocatedT32(instr);
13099                                     return;
13100                                   }
13101                                   Alignment align =
13102                                       Align_align_4_Decode((instr >> 4) & 0x3);
13103                                   if (dt.Is(kDataTypeValueInvalid) ||
13104                                       align.Is(kBadAlignment)) {
13105                                     UnallocatedT32(instr);
13106                                     return;
13107                                   }
13108                                   unsigned first =
13109                                       ExtractDRegister(instr, 22, 12);
13110                                   unsigned length;
13111                                   SpacingType spacing;
13112                                   switch ((instr >> 8) & 0xf) {
13113                                     default:
13114                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13115                                     case 0x0:
13116                                       length = 4;
13117                                       spacing = kSingle;
13118                                       break;
13119                                     case 0x1:
13120                                       length = 4;
13121                                       spacing = kDouble;
13122                                       break;
13123                                   }
13124                                   unsigned last =
13125                                       first +
13126                                       (length - 1) *
13127                                           (spacing == kSingle ? 1 : 2);
13128                                   TransferType transfer = kMultipleLanes;
13129                                   unsigned rn = (instr >> 16) & 0xf;
13130                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13131                                   vld4(CurrentCond(),
13132                                        dt,
13133                                        NeonRegisterList(DRegister(first),
13134                                                         DRegister(last),
13135                                                         spacing,
13136                                                         transfer),
13137                                        AlignedMemOperand(Register(rn),
13138                                                          align,
13139                                                          PostIndex));
13140                                   break;
13141                                 }
13142                                 case 0x00000100: {
13143                                   // 0xf920010d
13144                                   DataType dt =
13145                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13146                                   if (dt.Is(kDataTypeValueInvalid)) {
13147                                     UnallocatedT32(instr);
13148                                     return;
13149                                   }
13150                                   Alignment align =
13151                                       Align_align_4_Decode((instr >> 4) & 0x3);
13152                                   if (dt.Is(kDataTypeValueInvalid) ||
13153                                       align.Is(kBadAlignment)) {
13154                                     UnallocatedT32(instr);
13155                                     return;
13156                                   }
13157                                   unsigned first =
13158                                       ExtractDRegister(instr, 22, 12);
13159                                   unsigned length;
13160                                   SpacingType spacing;
13161                                   switch ((instr >> 8) & 0xf) {
13162                                     default:
13163                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13164                                     case 0x0:
13165                                       length = 4;
13166                                       spacing = kSingle;
13167                                       break;
13168                                     case 0x1:
13169                                       length = 4;
13170                                       spacing = kDouble;
13171                                       break;
13172                                   }
13173                                   unsigned last =
13174                                       first +
13175                                       (length - 1) *
13176                                           (spacing == kSingle ? 1 : 2);
13177                                   TransferType transfer = kMultipleLanes;
13178                                   unsigned rn = (instr >> 16) & 0xf;
13179                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13180                                   vld4(CurrentCond(),
13181                                        dt,
13182                                        NeonRegisterList(DRegister(first),
13183                                                         DRegister(last),
13184                                                         spacing,
13185                                                         transfer),
13186                                        AlignedMemOperand(Register(rn),
13187                                                          align,
13188                                                          PostIndex));
13189                                   break;
13190                                 }
13191                                 case 0x00000200: {
13192                                   // 0xf920020d
13193                                   if (((instr & 0xe20) == 0x620) ||
13194                                       ((instr & 0xf30) == 0xa30)) {
13195                                     UnallocatedT32(instr);
13196                                     return;
13197                                   }
13198                                   DataType dt =
13199                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13200                                   if (dt.Is(kDataTypeValueInvalid)) {
13201                                     UnallocatedT32(instr);
13202                                     return;
13203                                   }
13204                                   Alignment align =
13205                                       Align_align_1_Decode((instr >> 4) & 0x3);
13206                                   if (dt.Is(kDataTypeValueInvalid) ||
13207                                       align.Is(kBadAlignment)) {
13208                                     UnallocatedT32(instr);
13209                                     return;
13210                                   }
13211                                   unsigned first =
13212                                       ExtractDRegister(instr, 22, 12);
13213                                   unsigned length;
13214                                   SpacingType spacing = kSingle;
13215                                   switch ((instr >> 8) & 0xf) {
13216                                     default:
13217                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13218                                     case 0x7:
13219                                       length = 1;
13220                                       break;
13221                                     case 0xa:
13222                                       length = 2;
13223                                       break;
13224                                     case 0x6:
13225                                       length = 3;
13226                                       break;
13227                                     case 0x2:
13228                                       length = 4;
13229                                       break;
13230                                   }
13231                                   unsigned last = first + length - 1;
13232                                   TransferType transfer = kMultipleLanes;
13233                                   unsigned rn = (instr >> 16) & 0xf;
13234                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13235                                   vld1(CurrentCond(),
13236                                        dt,
13237                                        NeonRegisterList(DRegister(first),
13238                                                         DRegister(last),
13239                                                         spacing,
13240                                                         transfer),
13241                                        AlignedMemOperand(Register(rn),
13242                                                          align,
13243                                                          PostIndex));
13244                                   break;
13245                                 }
13246                                 case 0x00000300: {
13247                                   // 0xf920030d
13248                                   if (((instr & 0xe30) == 0x830)) {
13249                                     UnallocatedT32(instr);
13250                                     return;
13251                                   }
13252                                   DataType dt =
13253                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13254                                   if (dt.Is(kDataTypeValueInvalid)) {
13255                                     UnallocatedT32(instr);
13256                                     return;
13257                                   }
13258                                   Alignment align =
13259                                       Align_align_2_Decode((instr >> 4) & 0x3);
13260                                   if (dt.Is(kDataTypeValueInvalid) ||
13261                                       align.Is(kBadAlignment)) {
13262                                     UnallocatedT32(instr);
13263                                     return;
13264                                   }
13265                                   unsigned first =
13266                                       ExtractDRegister(instr, 22, 12);
13267                                   unsigned length;
13268                                   SpacingType spacing;
13269                                   switch ((instr >> 8) & 0xf) {
13270                                     default:
13271                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13272                                     case 0x8:
13273                                       length = 2;
13274                                       spacing = kSingle;
13275                                       break;
13276                                     case 0x9:
13277                                       length = 2;
13278                                       spacing = kDouble;
13279                                       break;
13280                                     case 0x3:
13281                                       length = 4;
13282                                       spacing = kSingle;
13283                                       break;
13284                                   }
13285                                   unsigned last =
13286                                       first +
13287                                       (length - 1) *
13288                                           (spacing == kSingle ? 1 : 2);
13289                                   TransferType transfer = kMultipleLanes;
13290                                   unsigned rn = (instr >> 16) & 0xf;
13291                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13292                                   vld2(CurrentCond(),
13293                                        dt,
13294                                        NeonRegisterList(DRegister(first),
13295                                                         DRegister(last),
13296                                                         spacing,
13297                                                         transfer),
13298                                        AlignedMemOperand(Register(rn),
13299                                                          align,
13300                                                          PostIndex));
13301                                   break;
13302                                 }
13303                                 case 0x00000400: {
13304                                   // 0xf920040d
13305                                   DataType dt =
13306                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13307                                   if (dt.Is(kDataTypeValueInvalid)) {
13308                                     UnallocatedT32(instr);
13309                                     return;
13310                                   }
13311                                   Alignment align =
13312                                       Align_align_3_Decode((instr >> 4) & 0x3);
13313                                   if (dt.Is(kDataTypeValueInvalid) ||
13314                                       align.Is(kBadAlignment)) {
13315                                     UnallocatedT32(instr);
13316                                     return;
13317                                   }
13318                                   unsigned first =
13319                                       ExtractDRegister(instr, 22, 12);
13320                                   unsigned length;
13321                                   SpacingType spacing;
13322                                   switch ((instr >> 8) & 0xf) {
13323                                     default:
13324                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13325                                     case 0x4:
13326                                       length = 3;
13327                                       spacing = kSingle;
13328                                       break;
13329                                     case 0x5:
13330                                       length = 3;
13331                                       spacing = kDouble;
13332                                       break;
13333                                   }
13334                                   unsigned last =
13335                                       first +
13336                                       (length - 1) *
13337                                           (spacing == kSingle ? 1 : 2);
13338                                   TransferType transfer = kMultipleLanes;
13339                                   unsigned rn = (instr >> 16) & 0xf;
13340                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13341                                   vld3(CurrentCond(),
13342                                        dt,
13343                                        NeonRegisterList(DRegister(first),
13344                                                         DRegister(last),
13345                                                         spacing,
13346                                                         transfer),
13347                                        AlignedMemOperand(Register(rn),
13348                                                          align,
13349                                                          PostIndex));
13350                                   break;
13351                                 }
13352                                 case 0x00000500: {
13353                                   // 0xf920050d
13354                                   DataType dt =
13355                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13356                                   if (dt.Is(kDataTypeValueInvalid)) {
13357                                     UnallocatedT32(instr);
13358                                     return;
13359                                   }
13360                                   Alignment align =
13361                                       Align_align_3_Decode((instr >> 4) & 0x3);
13362                                   if (dt.Is(kDataTypeValueInvalid) ||
13363                                       align.Is(kBadAlignment)) {
13364                                     UnallocatedT32(instr);
13365                                     return;
13366                                   }
13367                                   unsigned first =
13368                                       ExtractDRegister(instr, 22, 12);
13369                                   unsigned length;
13370                                   SpacingType spacing;
13371                                   switch ((instr >> 8) & 0xf) {
13372                                     default:
13373                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13374                                     case 0x4:
13375                                       length = 3;
13376                                       spacing = kSingle;
13377                                       break;
13378                                     case 0x5:
13379                                       length = 3;
13380                                       spacing = kDouble;
13381                                       break;
13382                                   }
13383                                   unsigned last =
13384                                       first +
13385                                       (length - 1) *
13386                                           (spacing == kSingle ? 1 : 2);
13387                                   TransferType transfer = kMultipleLanes;
13388                                   unsigned rn = (instr >> 16) & 0xf;
13389                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13390                                   vld3(CurrentCond(),
13391                                        dt,
13392                                        NeonRegisterList(DRegister(first),
13393                                                         DRegister(last),
13394                                                         spacing,
13395                                                         transfer),
13396                                        AlignedMemOperand(Register(rn),
13397                                                          align,
13398                                                          PostIndex));
13399                                   break;
13400                                 }
13401                                 case 0x00000600: {
13402                                   // 0xf920060d
13403                                   if (((instr & 0xe20) == 0x620) ||
13404                                       ((instr & 0xf30) == 0xa30)) {
13405                                     UnallocatedT32(instr);
13406                                     return;
13407                                   }
13408                                   DataType dt =
13409                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13410                                   if (dt.Is(kDataTypeValueInvalid)) {
13411                                     UnallocatedT32(instr);
13412                                     return;
13413                                   }
13414                                   Alignment align =
13415                                       Align_align_1_Decode((instr >> 4) & 0x3);
13416                                   if (dt.Is(kDataTypeValueInvalid) ||
13417                                       align.Is(kBadAlignment)) {
13418                                     UnallocatedT32(instr);
13419                                     return;
13420                                   }
13421                                   unsigned first =
13422                                       ExtractDRegister(instr, 22, 12);
13423                                   unsigned length;
13424                                   SpacingType spacing = kSingle;
13425                                   switch ((instr >> 8) & 0xf) {
13426                                     default:
13427                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13428                                     case 0x7:
13429                                       length = 1;
13430                                       break;
13431                                     case 0xa:
13432                                       length = 2;
13433                                       break;
13434                                     case 0x6:
13435                                       length = 3;
13436                                       break;
13437                                     case 0x2:
13438                                       length = 4;
13439                                       break;
13440                                   }
13441                                   unsigned last = first + length - 1;
13442                                   TransferType transfer = kMultipleLanes;
13443                                   unsigned rn = (instr >> 16) & 0xf;
13444                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13445                                   vld1(CurrentCond(),
13446                                        dt,
13447                                        NeonRegisterList(DRegister(first),
13448                                                         DRegister(last),
13449                                                         spacing,
13450                                                         transfer),
13451                                        AlignedMemOperand(Register(rn),
13452                                                          align,
13453                                                          PostIndex));
13454                                   break;
13455                                 }
13456                                 case 0x00000700: {
13457                                   // 0xf920070d
13458                                   if (((instr & 0xe20) == 0x620) ||
13459                                       ((instr & 0xf30) == 0xa30)) {
13460                                     UnallocatedT32(instr);
13461                                     return;
13462                                   }
13463                                   DataType dt =
13464                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13465                                   if (dt.Is(kDataTypeValueInvalid)) {
13466                                     UnallocatedT32(instr);
13467                                     return;
13468                                   }
13469                                   Alignment align =
13470                                       Align_align_1_Decode((instr >> 4) & 0x3);
13471                                   if (dt.Is(kDataTypeValueInvalid) ||
13472                                       align.Is(kBadAlignment)) {
13473                                     UnallocatedT32(instr);
13474                                     return;
13475                                   }
13476                                   unsigned first =
13477                                       ExtractDRegister(instr, 22, 12);
13478                                   unsigned length;
13479                                   SpacingType spacing = kSingle;
13480                                   switch ((instr >> 8) & 0xf) {
13481                                     default:
13482                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13483                                     case 0x7:
13484                                       length = 1;
13485                                       break;
13486                                     case 0xa:
13487                                       length = 2;
13488                                       break;
13489                                     case 0x6:
13490                                       length = 3;
13491                                       break;
13492                                     case 0x2:
13493                                       length = 4;
13494                                       break;
13495                                   }
13496                                   unsigned last = first + length - 1;
13497                                   TransferType transfer = kMultipleLanes;
13498                                   unsigned rn = (instr >> 16) & 0xf;
13499                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13500                                   vld1(CurrentCond(),
13501                                        dt,
13502                                        NeonRegisterList(DRegister(first),
13503                                                         DRegister(last),
13504                                                         spacing,
13505                                                         transfer),
13506                                        AlignedMemOperand(Register(rn),
13507                                                          align,
13508                                                          PostIndex));
13509                                   break;
13510                                 }
13511                                 case 0x00000800: {
13512                                   // 0xf920080d
13513                                   if (((instr & 0xe30) == 0x830)) {
13514                                     UnallocatedT32(instr);
13515                                     return;
13516                                   }
13517                                   DataType dt =
13518                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13519                                   if (dt.Is(kDataTypeValueInvalid)) {
13520                                     UnallocatedT32(instr);
13521                                     return;
13522                                   }
13523                                   Alignment align =
13524                                       Align_align_2_Decode((instr >> 4) & 0x3);
13525                                   if (dt.Is(kDataTypeValueInvalid) ||
13526                                       align.Is(kBadAlignment)) {
13527                                     UnallocatedT32(instr);
13528                                     return;
13529                                   }
13530                                   unsigned first =
13531                                       ExtractDRegister(instr, 22, 12);
13532                                   unsigned length;
13533                                   SpacingType spacing;
13534                                   switch ((instr >> 8) & 0xf) {
13535                                     default:
13536                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13537                                     case 0x8:
13538                                       length = 2;
13539                                       spacing = kSingle;
13540                                       break;
13541                                     case 0x9:
13542                                       length = 2;
13543                                       spacing = kDouble;
13544                                       break;
13545                                     case 0x3:
13546                                       length = 4;
13547                                       spacing = kSingle;
13548                                       break;
13549                                   }
13550                                   unsigned last =
13551                                       first +
13552                                       (length - 1) *
13553                                           (spacing == kSingle ? 1 : 2);
13554                                   TransferType transfer = kMultipleLanes;
13555                                   unsigned rn = (instr >> 16) & 0xf;
13556                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13557                                   vld2(CurrentCond(),
13558                                        dt,
13559                                        NeonRegisterList(DRegister(first),
13560                                                         DRegister(last),
13561                                                         spacing,
13562                                                         transfer),
13563                                        AlignedMemOperand(Register(rn),
13564                                                          align,
13565                                                          PostIndex));
13566                                   break;
13567                                 }
13568                                 case 0x00000900: {
13569                                   // 0xf920090d
13570                                   if (((instr & 0xe30) == 0x830)) {
13571                                     UnallocatedT32(instr);
13572                                     return;
13573                                   }
13574                                   DataType dt =
13575                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13576                                   if (dt.Is(kDataTypeValueInvalid)) {
13577                                     UnallocatedT32(instr);
13578                                     return;
13579                                   }
13580                                   Alignment align =
13581                                       Align_align_2_Decode((instr >> 4) & 0x3);
13582                                   if (dt.Is(kDataTypeValueInvalid) ||
13583                                       align.Is(kBadAlignment)) {
13584                                     UnallocatedT32(instr);
13585                                     return;
13586                                   }
13587                                   unsigned first =
13588                                       ExtractDRegister(instr, 22, 12);
13589                                   unsigned length;
13590                                   SpacingType spacing;
13591                                   switch ((instr >> 8) & 0xf) {
13592                                     default:
13593                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13594                                     case 0x8:
13595                                       length = 2;
13596                                       spacing = kSingle;
13597                                       break;
13598                                     case 0x9:
13599                                       length = 2;
13600                                       spacing = kDouble;
13601                                       break;
13602                                     case 0x3:
13603                                       length = 4;
13604                                       spacing = kSingle;
13605                                       break;
13606                                   }
13607                                   unsigned last =
13608                                       first +
13609                                       (length - 1) *
13610                                           (spacing == kSingle ? 1 : 2);
13611                                   TransferType transfer = kMultipleLanes;
13612                                   unsigned rn = (instr >> 16) & 0xf;
13613                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13614                                   vld2(CurrentCond(),
13615                                        dt,
13616                                        NeonRegisterList(DRegister(first),
13617                                                         DRegister(last),
13618                                                         spacing,
13619                                                         transfer),
13620                                        AlignedMemOperand(Register(rn),
13621                                                          align,
13622                                                          PostIndex));
13623                                   break;
13624                                 }
13625                                 case 0x00000a00: {
13626                                   // 0xf9200a0d
13627                                   if (((instr & 0xe20) == 0x620) ||
13628                                       ((instr & 0xf30) == 0xa30)) {
13629                                     UnallocatedT32(instr);
13630                                     return;
13631                                   }
13632                                   DataType dt =
13633                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13634                                   if (dt.Is(kDataTypeValueInvalid)) {
13635                                     UnallocatedT32(instr);
13636                                     return;
13637                                   }
13638                                   Alignment align =
13639                                       Align_align_1_Decode((instr >> 4) & 0x3);
13640                                   if (dt.Is(kDataTypeValueInvalid) ||
13641                                       align.Is(kBadAlignment)) {
13642                                     UnallocatedT32(instr);
13643                                     return;
13644                                   }
13645                                   unsigned first =
13646                                       ExtractDRegister(instr, 22, 12);
13647                                   unsigned length;
13648                                   SpacingType spacing = kSingle;
13649                                   switch ((instr >> 8) & 0xf) {
13650                                     default:
13651                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13652                                     case 0x7:
13653                                       length = 1;
13654                                       break;
13655                                     case 0xa:
13656                                       length = 2;
13657                                       break;
13658                                     case 0x6:
13659                                       length = 3;
13660                                       break;
13661                                     case 0x2:
13662                                       length = 4;
13663                                       break;
13664                                   }
13665                                   unsigned last = first + length - 1;
13666                                   TransferType transfer = kMultipleLanes;
13667                                   unsigned rn = (instr >> 16) & 0xf;
13668                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13669                                   vld1(CurrentCond(),
13670                                        dt,
13671                                        NeonRegisterList(DRegister(first),
13672                                                         DRegister(last),
13673                                                         spacing,
13674                                                         transfer),
13675                                        AlignedMemOperand(Register(rn),
13676                                                          align,
13677                                                          PostIndex));
13678                                   break;
13679                                 }
13680                                 default:
13681                                   UnallocatedT32(instr);
13682                                   break;
13683                               }
13684                               break;
13685                             }
13686                             case 0x00000002: {
13687                               // 0xf920000f
13688                               switch (instr & 0x00000f00) {
13689                                 case 0x00000000: {
13690                                   // 0xf920000d
13691                                   DataType dt =
13692                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13693                                   if (dt.Is(kDataTypeValueInvalid)) {
13694                                     UnallocatedT32(instr);
13695                                     return;
13696                                   }
13697                                   Alignment align =
13698                                       Align_align_4_Decode((instr >> 4) & 0x3);
13699                                   if (dt.Is(kDataTypeValueInvalid) ||
13700                                       align.Is(kBadAlignment)) {
13701                                     UnallocatedT32(instr);
13702                                     return;
13703                                   }
13704                                   unsigned first =
13705                                       ExtractDRegister(instr, 22, 12);
13706                                   unsigned length;
13707                                   SpacingType spacing;
13708                                   switch ((instr >> 8) & 0xf) {
13709                                     default:
13710                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13711                                     case 0x0:
13712                                       length = 4;
13713                                       spacing = kSingle;
13714                                       break;
13715                                     case 0x1:
13716                                       length = 4;
13717                                       spacing = kDouble;
13718                                       break;
13719                                   }
13720                                   unsigned last =
13721                                       first +
13722                                       (length - 1) *
13723                                           (spacing == kSingle ? 1 : 2);
13724                                   TransferType transfer = kMultipleLanes;
13725                                   unsigned rn = (instr >> 16) & 0xf;
13726                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13727                                   vld4(CurrentCond(),
13728                                        dt,
13729                                        NeonRegisterList(DRegister(first),
13730                                                         DRegister(last),
13731                                                         spacing,
13732                                                         transfer),
13733                                        AlignedMemOperand(Register(rn),
13734                                                          align,
13735                                                          Offset));
13736                                   break;
13737                                 }
13738                                 case 0x00000100: {
13739                                   // 0xf920010d
13740                                   DataType dt =
13741                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13742                                   if (dt.Is(kDataTypeValueInvalid)) {
13743                                     UnallocatedT32(instr);
13744                                     return;
13745                                   }
13746                                   Alignment align =
13747                                       Align_align_4_Decode((instr >> 4) & 0x3);
13748                                   if (dt.Is(kDataTypeValueInvalid) ||
13749                                       align.Is(kBadAlignment)) {
13750                                     UnallocatedT32(instr);
13751                                     return;
13752                                   }
13753                                   unsigned first =
13754                                       ExtractDRegister(instr, 22, 12);
13755                                   unsigned length;
13756                                   SpacingType spacing;
13757                                   switch ((instr >> 8) & 0xf) {
13758                                     default:
13759                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13760                                     case 0x0:
13761                                       length = 4;
13762                                       spacing = kSingle;
13763                                       break;
13764                                     case 0x1:
13765                                       length = 4;
13766                                       spacing = kDouble;
13767                                       break;
13768                                   }
13769                                   unsigned last =
13770                                       first +
13771                                       (length - 1) *
13772                                           (spacing == kSingle ? 1 : 2);
13773                                   TransferType transfer = kMultipleLanes;
13774                                   unsigned rn = (instr >> 16) & 0xf;
13775                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13776                                   vld4(CurrentCond(),
13777                                        dt,
13778                                        NeonRegisterList(DRegister(first),
13779                                                         DRegister(last),
13780                                                         spacing,
13781                                                         transfer),
13782                                        AlignedMemOperand(Register(rn),
13783                                                          align,
13784                                                          Offset));
13785                                   break;
13786                                 }
13787                                 case 0x00000200: {
13788                                   // 0xf920020d
13789                                   if (((instr & 0xe20) == 0x620) ||
13790                                       ((instr & 0xf30) == 0xa30)) {
13791                                     UnallocatedT32(instr);
13792                                     return;
13793                                   }
13794                                   DataType dt =
13795                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13796                                   if (dt.Is(kDataTypeValueInvalid)) {
13797                                     UnallocatedT32(instr);
13798                                     return;
13799                                   }
13800                                   Alignment align =
13801                                       Align_align_1_Decode((instr >> 4) & 0x3);
13802                                   if (dt.Is(kDataTypeValueInvalid) ||
13803                                       align.Is(kBadAlignment)) {
13804                                     UnallocatedT32(instr);
13805                                     return;
13806                                   }
13807                                   unsigned first =
13808                                       ExtractDRegister(instr, 22, 12);
13809                                   unsigned length;
13810                                   SpacingType spacing = kSingle;
13811                                   switch ((instr >> 8) & 0xf) {
13812                                     default:
13813                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13814                                     case 0x7:
13815                                       length = 1;
13816                                       break;
13817                                     case 0xa:
13818                                       length = 2;
13819                                       break;
13820                                     case 0x6:
13821                                       length = 3;
13822                                       break;
13823                                     case 0x2:
13824                                       length = 4;
13825                                       break;
13826                                   }
13827                                   unsigned last = first + length - 1;
13828                                   TransferType transfer = kMultipleLanes;
13829                                   unsigned rn = (instr >> 16) & 0xf;
13830                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13831                                   vld1(CurrentCond(),
13832                                        dt,
13833                                        NeonRegisterList(DRegister(first),
13834                                                         DRegister(last),
13835                                                         spacing,
13836                                                         transfer),
13837                                        AlignedMemOperand(Register(rn),
13838                                                          align,
13839                                                          Offset));
13840                                   break;
13841                                 }
13842                                 case 0x00000300: {
13843                                   // 0xf920030d
13844                                   if (((instr & 0xe30) == 0x830)) {
13845                                     UnallocatedT32(instr);
13846                                     return;
13847                                   }
13848                                   DataType dt =
13849                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13850                                   if (dt.Is(kDataTypeValueInvalid)) {
13851                                     UnallocatedT32(instr);
13852                                     return;
13853                                   }
13854                                   Alignment align =
13855                                       Align_align_2_Decode((instr >> 4) & 0x3);
13856                                   if (dt.Is(kDataTypeValueInvalid) ||
13857                                       align.Is(kBadAlignment)) {
13858                                     UnallocatedT32(instr);
13859                                     return;
13860                                   }
13861                                   unsigned first =
13862                                       ExtractDRegister(instr, 22, 12);
13863                                   unsigned length;
13864                                   SpacingType spacing;
13865                                   switch ((instr >> 8) & 0xf) {
13866                                     default:
13867                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13868                                     case 0x8:
13869                                       length = 2;
13870                                       spacing = kSingle;
13871                                       break;
13872                                     case 0x9:
13873                                       length = 2;
13874                                       spacing = kDouble;
13875                                       break;
13876                                     case 0x3:
13877                                       length = 4;
13878                                       spacing = kSingle;
13879                                       break;
13880                                   }
13881                                   unsigned last =
13882                                       first +
13883                                       (length - 1) *
13884                                           (spacing == kSingle ? 1 : 2);
13885                                   TransferType transfer = kMultipleLanes;
13886                                   unsigned rn = (instr >> 16) & 0xf;
13887                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13888                                   vld2(CurrentCond(),
13889                                        dt,
13890                                        NeonRegisterList(DRegister(first),
13891                                                         DRegister(last),
13892                                                         spacing,
13893                                                         transfer),
13894                                        AlignedMemOperand(Register(rn),
13895                                                          align,
13896                                                          Offset));
13897                                   break;
13898                                 }
13899                                 case 0x00000400: {
13900                                   // 0xf920040d
13901                                   DataType dt =
13902                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13903                                   if (dt.Is(kDataTypeValueInvalid)) {
13904                                     UnallocatedT32(instr);
13905                                     return;
13906                                   }
13907                                   Alignment align =
13908                                       Align_align_3_Decode((instr >> 4) & 0x3);
13909                                   if (dt.Is(kDataTypeValueInvalid) ||
13910                                       align.Is(kBadAlignment)) {
13911                                     UnallocatedT32(instr);
13912                                     return;
13913                                   }
13914                                   unsigned first =
13915                                       ExtractDRegister(instr, 22, 12);
13916                                   unsigned length;
13917                                   SpacingType spacing;
13918                                   switch ((instr >> 8) & 0xf) {
13919                                     default:
13920                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13921                                     case 0x4:
13922                                       length = 3;
13923                                       spacing = kSingle;
13924                                       break;
13925                                     case 0x5:
13926                                       length = 3;
13927                                       spacing = kDouble;
13928                                       break;
13929                                   }
13930                                   unsigned last =
13931                                       first +
13932                                       (length - 1) *
13933                                           (spacing == kSingle ? 1 : 2);
13934                                   TransferType transfer = kMultipleLanes;
13935                                   unsigned rn = (instr >> 16) & 0xf;
13936                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13937                                   vld3(CurrentCond(),
13938                                        dt,
13939                                        NeonRegisterList(DRegister(first),
13940                                                         DRegister(last),
13941                                                         spacing,
13942                                                         transfer),
13943                                        AlignedMemOperand(Register(rn),
13944                                                          align,
13945                                                          Offset));
13946                                   break;
13947                                 }
13948                                 case 0x00000500: {
13949                                   // 0xf920050d
13950                                   DataType dt =
13951                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13952                                   if (dt.Is(kDataTypeValueInvalid)) {
13953                                     UnallocatedT32(instr);
13954                                     return;
13955                                   }
13956                                   Alignment align =
13957                                       Align_align_3_Decode((instr >> 4) & 0x3);
13958                                   if (dt.Is(kDataTypeValueInvalid) ||
13959                                       align.Is(kBadAlignment)) {
13960                                     UnallocatedT32(instr);
13961                                     return;
13962                                   }
13963                                   unsigned first =
13964                                       ExtractDRegister(instr, 22, 12);
13965                                   unsigned length;
13966                                   SpacingType spacing;
13967                                   switch ((instr >> 8) & 0xf) {
13968                                     default:
13969                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13970                                     case 0x4:
13971                                       length = 3;
13972                                       spacing = kSingle;
13973                                       break;
13974                                     case 0x5:
13975                                       length = 3;
13976                                       spacing = kDouble;
13977                                       break;
13978                                   }
13979                                   unsigned last =
13980                                       first +
13981                                       (length - 1) *
13982                                           (spacing == kSingle ? 1 : 2);
13983                                   TransferType transfer = kMultipleLanes;
13984                                   unsigned rn = (instr >> 16) & 0xf;
13985                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13986                                   vld3(CurrentCond(),
13987                                        dt,
13988                                        NeonRegisterList(DRegister(first),
13989                                                         DRegister(last),
13990                                                         spacing,
13991                                                         transfer),
13992                                        AlignedMemOperand(Register(rn),
13993                                                          align,
13994                                                          Offset));
13995                                   break;
13996                                 }
13997                                 case 0x00000600: {
13998                                   // 0xf920060d
13999                                   if (((instr & 0xe20) == 0x620) ||
14000                                       ((instr & 0xf30) == 0xa30)) {
14001                                     UnallocatedT32(instr);
14002                                     return;
14003                                   }
14004                                   DataType dt =
14005                                       Dt_size_6_Decode((instr >> 6) & 0x3);
14006                                   if (dt.Is(kDataTypeValueInvalid)) {
14007                                     UnallocatedT32(instr);
14008                                     return;
14009                                   }
14010                                   Alignment align =
14011                                       Align_align_1_Decode((instr >> 4) & 0x3);
14012                                   if (dt.Is(kDataTypeValueInvalid) ||
14013                                       align.Is(kBadAlignment)) {
14014                                     UnallocatedT32(instr);
14015                                     return;
14016                                   }
14017                                   unsigned first =
14018                                       ExtractDRegister(instr, 22, 12);
14019                                   unsigned length;
14020                                   SpacingType spacing = kSingle;
14021                                   switch ((instr >> 8) & 0xf) {
14022                                     default:
14023                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14024                                     case 0x7:
14025                                       length = 1;
14026                                       break;
14027                                     case 0xa:
14028                                       length = 2;
14029                                       break;
14030                                     case 0x6:
14031                                       length = 3;
14032                                       break;
14033                                     case 0x2:
14034                                       length = 4;
14035                                       break;
14036                                   }
14037                                   unsigned last = first + length - 1;
14038                                   TransferType transfer = kMultipleLanes;
14039                                   unsigned rn = (instr >> 16) & 0xf;
14040                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14041                                   vld1(CurrentCond(),
14042                                        dt,
14043                                        NeonRegisterList(DRegister(first),
14044                                                         DRegister(last),
14045                                                         spacing,
14046                                                         transfer),
14047                                        AlignedMemOperand(Register(rn),
14048                                                          align,
14049                                                          Offset));
14050                                   break;
14051                                 }
14052                                 case 0x00000700: {
14053                                   // 0xf920070d
14054                                   if (((instr & 0xe20) == 0x620) ||
14055                                       ((instr & 0xf30) == 0xa30)) {
14056                                     UnallocatedT32(instr);
14057                                     return;
14058                                   }
14059                                   DataType dt =
14060                                       Dt_size_6_Decode((instr >> 6) & 0x3);
14061                                   if (dt.Is(kDataTypeValueInvalid)) {
14062                                     UnallocatedT32(instr);
14063                                     return;
14064                                   }
14065                                   Alignment align =
14066                                       Align_align_1_Decode((instr >> 4) & 0x3);
14067                                   if (dt.Is(kDataTypeValueInvalid) ||
14068                                       align.Is(kBadAlignment)) {
14069                                     UnallocatedT32(instr);
14070                                     return;
14071                                   }
14072                                   unsigned first =
14073                                       ExtractDRegister(instr, 22, 12);
14074                                   unsigned length;
14075                                   SpacingType spacing = kSingle;
14076                                   switch ((instr >> 8) & 0xf) {
14077                                     default:
14078                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14079                                     case 0x7:
14080                                       length = 1;
14081                                       break;
14082                                     case 0xa:
14083                                       length = 2;
14084                                       break;
14085                                     case 0x6:
14086                                       length = 3;
14087                                       break;
14088                                     case 0x2:
14089                                       length = 4;
14090                                       break;
14091                                   }
14092                                   unsigned last = first + length - 1;
14093                                   TransferType transfer = kMultipleLanes;
14094                                   unsigned rn = (instr >> 16) & 0xf;
14095                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14096                                   vld1(CurrentCond(),
14097                                        dt,
14098                                        NeonRegisterList(DRegister(first),
14099                                                         DRegister(last),
14100                                                         spacing,
14101                                                         transfer),
14102                                        AlignedMemOperand(Register(rn),
14103                                                          align,
14104                                                          Offset));
14105                                   break;
14106                                 }
14107                                 case 0x00000800: {
14108                                   // 0xf920080d
14109                                   if (((instr & 0xe30) == 0x830)) {
14110                                     UnallocatedT32(instr);
14111                                     return;
14112                                   }
14113                                   DataType dt =
14114                                       Dt_size_7_Decode((instr >> 6) & 0x3);
14115                                   if (dt.Is(kDataTypeValueInvalid)) {
14116                                     UnallocatedT32(instr);
14117                                     return;
14118                                   }
14119                                   Alignment align =
14120                                       Align_align_2_Decode((instr >> 4) & 0x3);
14121                                   if (dt.Is(kDataTypeValueInvalid) ||
14122                                       align.Is(kBadAlignment)) {
14123                                     UnallocatedT32(instr);
14124                                     return;
14125                                   }
14126                                   unsigned first =
14127                                       ExtractDRegister(instr, 22, 12);
14128                                   unsigned length;
14129                                   SpacingType spacing;
14130                                   switch ((instr >> 8) & 0xf) {
14131                                     default:
14132                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14133                                     case 0x8:
14134                                       length = 2;
14135                                       spacing = kSingle;
14136                                       break;
14137                                     case 0x9:
14138                                       length = 2;
14139                                       spacing = kDouble;
14140                                       break;
14141                                     case 0x3:
14142                                       length = 4;
14143                                       spacing = kSingle;
14144                                       break;
14145                                   }
14146                                   unsigned last =
14147                                       first +
14148                                       (length - 1) *
14149                                           (spacing == kSingle ? 1 : 2);
14150                                   TransferType transfer = kMultipleLanes;
14151                                   unsigned rn = (instr >> 16) & 0xf;
14152                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14153                                   vld2(CurrentCond(),
14154                                        dt,
14155                                        NeonRegisterList(DRegister(first),
14156                                                         DRegister(last),
14157                                                         spacing,
14158                                                         transfer),
14159                                        AlignedMemOperand(Register(rn),
14160                                                          align,
14161                                                          Offset));
14162                                   break;
14163                                 }
14164                                 case 0x00000900: {
14165                                   // 0xf920090d
14166                                   if (((instr & 0xe30) == 0x830)) {
14167                                     UnallocatedT32(instr);
14168                                     return;
14169                                   }
14170                                   DataType dt =
14171                                       Dt_size_7_Decode((instr >> 6) & 0x3);
14172                                   if (dt.Is(kDataTypeValueInvalid)) {
14173                                     UnallocatedT32(instr);
14174                                     return;
14175                                   }
14176                                   Alignment align =
14177                                       Align_align_2_Decode((instr >> 4) & 0x3);
14178                                   if (dt.Is(kDataTypeValueInvalid) ||
14179                                       align.Is(kBadAlignment)) {
14180                                     UnallocatedT32(instr);
14181                                     return;
14182                                   }
14183                                   unsigned first =
14184                                       ExtractDRegister(instr, 22, 12);
14185                                   unsigned length;
14186                                   SpacingType spacing;
14187                                   switch ((instr >> 8) & 0xf) {
14188                                     default:
14189                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14190                                     case 0x8:
14191                                       length = 2;
14192                                       spacing = kSingle;
14193                                       break;
14194                                     case 0x9:
14195                                       length = 2;
14196                                       spacing = kDouble;
14197                                       break;
14198                                     case 0x3:
14199                                       length = 4;
14200                                       spacing = kSingle;
14201                                       break;
14202                                   }
14203                                   unsigned last =
14204                                       first +
14205                                       (length - 1) *
14206                                           (spacing == kSingle ? 1 : 2);
14207                                   TransferType transfer = kMultipleLanes;
14208                                   unsigned rn = (instr >> 16) & 0xf;
14209                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14210                                   vld2(CurrentCond(),
14211                                        dt,
14212                                        NeonRegisterList(DRegister(first),
14213                                                         DRegister(last),
14214                                                         spacing,
14215                                                         transfer),
14216                                        AlignedMemOperand(Register(rn),
14217                                                          align,
14218                                                          Offset));
14219                                   break;
14220                                 }
14221                                 case 0x00000a00: {
14222                                   // 0xf9200a0d
14223                                   if (((instr & 0xe20) == 0x620) ||
14224                                       ((instr & 0xf30) == 0xa30)) {
14225                                     UnallocatedT32(instr);
14226                                     return;
14227                                   }
14228                                   DataType dt =
14229                                       Dt_size_6_Decode((instr >> 6) & 0x3);
14230                                   if (dt.Is(kDataTypeValueInvalid)) {
14231                                     UnallocatedT32(instr);
14232                                     return;
14233                                   }
14234                                   Alignment align =
14235                                       Align_align_1_Decode((instr >> 4) & 0x3);
14236                                   if (dt.Is(kDataTypeValueInvalid) ||
14237                                       align.Is(kBadAlignment)) {
14238                                     UnallocatedT32(instr);
14239                                     return;
14240                                   }
14241                                   unsigned first =
14242                                       ExtractDRegister(instr, 22, 12);
14243                                   unsigned length;
14244                                   SpacingType spacing = kSingle;
14245                                   switch ((instr >> 8) & 0xf) {
14246                                     default:
14247                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14248                                     case 0x7:
14249                                       length = 1;
14250                                       break;
14251                                     case 0xa:
14252                                       length = 2;
14253                                       break;
14254                                     case 0x6:
14255                                       length = 3;
14256                                       break;
14257                                     case 0x2:
14258                                       length = 4;
14259                                       break;
14260                                   }
14261                                   unsigned last = first + length - 1;
14262                                   TransferType transfer = kMultipleLanes;
14263                                   unsigned rn = (instr >> 16) & 0xf;
14264                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14265                                   vld1(CurrentCond(),
14266                                        dt,
14267                                        NeonRegisterList(DRegister(first),
14268                                                         DRegister(last),
14269                                                         spacing,
14270                                                         transfer),
14271                                        AlignedMemOperand(Register(rn),
14272                                                          align,
14273                                                          Offset));
14274                                   break;
14275                                 }
14276                                 default:
14277                                   UnallocatedT32(instr);
14278                                   break;
14279                               }
14280                               break;
14281                             }
14282                           }
14283                           break;
14284                         }
14285                         default: {
14286                           switch (instr & 0x00000f00) {
14287                             case 0x00000000: {
14288                               // 0xf9200000
14289                               if (((instr & 0xd) == 0xd)) {
14290                                 UnallocatedT32(instr);
14291                                 return;
14292                               }
14293                               DataType dt =
14294                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14295                               if (dt.Is(kDataTypeValueInvalid)) {
14296                                 UnallocatedT32(instr);
14297                                 return;
14298                               }
14299                               Alignment align =
14300                                   Align_align_4_Decode((instr >> 4) & 0x3);
14301                               if (dt.Is(kDataTypeValueInvalid) ||
14302                                   align.Is(kBadAlignment)) {
14303                                 UnallocatedT32(instr);
14304                                 return;
14305                               }
14306                               unsigned first = ExtractDRegister(instr, 22, 12);
14307                               unsigned length;
14308                               SpacingType spacing;
14309                               switch ((instr >> 8) & 0xf) {
14310                                 default:
14311                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14312                                 case 0x0:
14313                                   length = 4;
14314                                   spacing = kSingle;
14315                                   break;
14316                                 case 0x1:
14317                                   length = 4;
14318                                   spacing = kDouble;
14319                                   break;
14320                               }
14321                               unsigned last =
14322                                   first +
14323                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14324                               TransferType transfer = kMultipleLanes;
14325                               unsigned rn = (instr >> 16) & 0xf;
14326                               unsigned rm = instr & 0xf;
14327                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14328                               vld4(CurrentCond(),
14329                                    dt,
14330                                    NeonRegisterList(DRegister(first),
14331                                                     DRegister(last),
14332                                                     spacing,
14333                                                     transfer),
14334                                    AlignedMemOperand(Register(rn),
14335                                                      align,
14336                                                      Register(rm),
14337                                                      PostIndex));
14338                               break;
14339                             }
14340                             case 0x00000100: {
14341                               // 0xf9200100
14342                               if (((instr & 0xd) == 0xd)) {
14343                                 UnallocatedT32(instr);
14344                                 return;
14345                               }
14346                               DataType dt =
14347                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14348                               if (dt.Is(kDataTypeValueInvalid)) {
14349                                 UnallocatedT32(instr);
14350                                 return;
14351                               }
14352                               Alignment align =
14353                                   Align_align_4_Decode((instr >> 4) & 0x3);
14354                               if (dt.Is(kDataTypeValueInvalid) ||
14355                                   align.Is(kBadAlignment)) {
14356                                 UnallocatedT32(instr);
14357                                 return;
14358                               }
14359                               unsigned first = ExtractDRegister(instr, 22, 12);
14360                               unsigned length;
14361                               SpacingType spacing;
14362                               switch ((instr >> 8) & 0xf) {
14363                                 default:
14364                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14365                                 case 0x0:
14366                                   length = 4;
14367                                   spacing = kSingle;
14368                                   break;
14369                                 case 0x1:
14370                                   length = 4;
14371                                   spacing = kDouble;
14372                                   break;
14373                               }
14374                               unsigned last =
14375                                   first +
14376                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14377                               TransferType transfer = kMultipleLanes;
14378                               unsigned rn = (instr >> 16) & 0xf;
14379                               unsigned rm = instr & 0xf;
14380                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14381                               vld4(CurrentCond(),
14382                                    dt,
14383                                    NeonRegisterList(DRegister(first),
14384                                                     DRegister(last),
14385                                                     spacing,
14386                                                     transfer),
14387                                    AlignedMemOperand(Register(rn),
14388                                                      align,
14389                                                      Register(rm),
14390                                                      PostIndex));
14391                               break;
14392                             }
14393                             case 0x00000200: {
14394                               // 0xf9200200
14395                               if (((instr & 0xd) == 0xd) ||
14396                                   ((instr & 0xe20) == 0x620) ||
14397                                   ((instr & 0xf30) == 0xa30)) {
14398                                 UnallocatedT32(instr);
14399                                 return;
14400                               }
14401                               DataType dt =
14402                                   Dt_size_6_Decode((instr >> 6) & 0x3);
14403                               if (dt.Is(kDataTypeValueInvalid)) {
14404                                 UnallocatedT32(instr);
14405                                 return;
14406                               }
14407                               Alignment align =
14408                                   Align_align_1_Decode((instr >> 4) & 0x3);
14409                               if (dt.Is(kDataTypeValueInvalid) ||
14410                                   align.Is(kBadAlignment)) {
14411                                 UnallocatedT32(instr);
14412                                 return;
14413                               }
14414                               unsigned first = ExtractDRegister(instr, 22, 12);
14415                               unsigned length;
14416                               SpacingType spacing = kSingle;
14417                               switch ((instr >> 8) & 0xf) {
14418                                 default:
14419                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14420                                 case 0x7:
14421                                   length = 1;
14422                                   break;
14423                                 case 0xa:
14424                                   length = 2;
14425                                   break;
14426                                 case 0x6:
14427                                   length = 3;
14428                                   break;
14429                                 case 0x2:
14430                                   length = 4;
14431                                   break;
14432                               }
14433                               unsigned last = first + length - 1;
14434                               TransferType transfer = kMultipleLanes;
14435                               unsigned rn = (instr >> 16) & 0xf;
14436                               unsigned rm = instr & 0xf;
14437                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14438                               vld1(CurrentCond(),
14439                                    dt,
14440                                    NeonRegisterList(DRegister(first),
14441                                                     DRegister(last),
14442                                                     spacing,
14443                                                     transfer),
14444                                    AlignedMemOperand(Register(rn),
14445                                                      align,
14446                                                      Register(rm),
14447                                                      PostIndex));
14448                               break;
14449                             }
14450                             case 0x00000300: {
14451                               // 0xf9200300
14452                               if (((instr & 0xd) == 0xd) ||
14453                                   ((instr & 0xe30) == 0x830)) {
14454                                 UnallocatedT32(instr);
14455                                 return;
14456                               }
14457                               DataType dt =
14458                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14459                               if (dt.Is(kDataTypeValueInvalid)) {
14460                                 UnallocatedT32(instr);
14461                                 return;
14462                               }
14463                               Alignment align =
14464                                   Align_align_2_Decode((instr >> 4) & 0x3);
14465                               if (dt.Is(kDataTypeValueInvalid) ||
14466                                   align.Is(kBadAlignment)) {
14467                                 UnallocatedT32(instr);
14468                                 return;
14469                               }
14470                               unsigned first = ExtractDRegister(instr, 22, 12);
14471                               unsigned length;
14472                               SpacingType spacing;
14473                               switch ((instr >> 8) & 0xf) {
14474                                 default:
14475                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14476                                 case 0x8:
14477                                   length = 2;
14478                                   spacing = kSingle;
14479                                   break;
14480                                 case 0x9:
14481                                   length = 2;
14482                                   spacing = kDouble;
14483                                   break;
14484                                 case 0x3:
14485                                   length = 4;
14486                                   spacing = kSingle;
14487                                   break;
14488                               }
14489                               unsigned last =
14490                                   first +
14491                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14492                               TransferType transfer = kMultipleLanes;
14493                               unsigned rn = (instr >> 16) & 0xf;
14494                               unsigned rm = instr & 0xf;
14495                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14496                               vld2(CurrentCond(),
14497                                    dt,
14498                                    NeonRegisterList(DRegister(first),
14499                                                     DRegister(last),
14500                                                     spacing,
14501                                                     transfer),
14502                                    AlignedMemOperand(Register(rn),
14503                                                      align,
14504                                                      Register(rm),
14505                                                      PostIndex));
14506                               break;
14507                             }
14508                             case 0x00000400: {
14509                               // 0xf9200400
14510                               if (((instr & 0xd) == 0xd)) {
14511                                 UnallocatedT32(instr);
14512                                 return;
14513                               }
14514                               DataType dt =
14515                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14516                               if (dt.Is(kDataTypeValueInvalid)) {
14517                                 UnallocatedT32(instr);
14518                                 return;
14519                               }
14520                               Alignment align =
14521                                   Align_align_3_Decode((instr >> 4) & 0x3);
14522                               if (dt.Is(kDataTypeValueInvalid) ||
14523                                   align.Is(kBadAlignment)) {
14524                                 UnallocatedT32(instr);
14525                                 return;
14526                               }
14527                               unsigned first = ExtractDRegister(instr, 22, 12);
14528                               unsigned length;
14529                               SpacingType spacing;
14530                               switch ((instr >> 8) & 0xf) {
14531                                 default:
14532                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14533                                 case 0x4:
14534                                   length = 3;
14535                                   spacing = kSingle;
14536                                   break;
14537                                 case 0x5:
14538                                   length = 3;
14539                                   spacing = kDouble;
14540                                   break;
14541                               }
14542                               unsigned last =
14543                                   first +
14544                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14545                               TransferType transfer = kMultipleLanes;
14546                               unsigned rn = (instr >> 16) & 0xf;
14547                               unsigned rm = instr & 0xf;
14548                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14549                               vld3(CurrentCond(),
14550                                    dt,
14551                                    NeonRegisterList(DRegister(first),
14552                                                     DRegister(last),
14553                                                     spacing,
14554                                                     transfer),
14555                                    AlignedMemOperand(Register(rn),
14556                                                      align,
14557                                                      Register(rm),
14558                                                      PostIndex));
14559                               break;
14560                             }
14561                             case 0x00000500: {
14562                               // 0xf9200500
14563                               if (((instr & 0xd) == 0xd)) {
14564                                 UnallocatedT32(instr);
14565                                 return;
14566                               }
14567                               DataType dt =
14568                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14569                               if (dt.Is(kDataTypeValueInvalid)) {
14570                                 UnallocatedT32(instr);
14571                                 return;
14572                               }
14573                               Alignment align =
14574                                   Align_align_3_Decode((instr >> 4) & 0x3);
14575                               if (dt.Is(kDataTypeValueInvalid) ||
14576                                   align.Is(kBadAlignment)) {
14577                                 UnallocatedT32(instr);
14578                                 return;
14579                               }
14580                               unsigned first = ExtractDRegister(instr, 22, 12);
14581                               unsigned length;
14582                               SpacingType spacing;
14583                               switch ((instr >> 8) & 0xf) {
14584                                 default:
14585                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14586                                 case 0x4:
14587                                   length = 3;
14588                                   spacing = kSingle;
14589                                   break;
14590                                 case 0x5:
14591                                   length = 3;
14592                                   spacing = kDouble;
14593                                   break;
14594                               }
14595                               unsigned last =
14596                                   first +
14597                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14598                               TransferType transfer = kMultipleLanes;
14599                               unsigned rn = (instr >> 16) & 0xf;
14600                               unsigned rm = instr & 0xf;
14601                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14602                               vld3(CurrentCond(),
14603                                    dt,
14604                                    NeonRegisterList(DRegister(first),
14605                                                     DRegister(last),
14606                                                     spacing,
14607                                                     transfer),
14608                                    AlignedMemOperand(Register(rn),
14609                                                      align,
14610                                                      Register(rm),
14611                                                      PostIndex));
14612                               break;
14613                             }
14614                             case 0x00000600: {
14615                               // 0xf9200600
14616                               if (((instr & 0xd) == 0xd) ||
14617                                   ((instr & 0xe20) == 0x620) ||
14618                                   ((instr & 0xf30) == 0xa30)) {
14619                                 UnallocatedT32(instr);
14620                                 return;
14621                               }
14622                               DataType dt =
14623                                   Dt_size_6_Decode((instr >> 6) & 0x3);
14624                               if (dt.Is(kDataTypeValueInvalid)) {
14625                                 UnallocatedT32(instr);
14626                                 return;
14627                               }
14628                               Alignment align =
14629                                   Align_align_1_Decode((instr >> 4) & 0x3);
14630                               if (dt.Is(kDataTypeValueInvalid) ||
14631                                   align.Is(kBadAlignment)) {
14632                                 UnallocatedT32(instr);
14633                                 return;
14634                               }
14635                               unsigned first = ExtractDRegister(instr, 22, 12);
14636                               unsigned length;
14637                               SpacingType spacing = kSingle;
14638                               switch ((instr >> 8) & 0xf) {
14639                                 default:
14640                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14641                                 case 0x7:
14642                                   length = 1;
14643                                   break;
14644                                 case 0xa:
14645                                   length = 2;
14646                                   break;
14647                                 case 0x6:
14648                                   length = 3;
14649                                   break;
14650                                 case 0x2:
14651                                   length = 4;
14652                                   break;
14653                               }
14654                               unsigned last = first + length - 1;
14655                               TransferType transfer = kMultipleLanes;
14656                               unsigned rn = (instr >> 16) & 0xf;
14657                               unsigned rm = instr & 0xf;
14658                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14659                               vld1(CurrentCond(),
14660                                    dt,
14661                                    NeonRegisterList(DRegister(first),
14662                                                     DRegister(last),
14663                                                     spacing,
14664                                                     transfer),
14665                                    AlignedMemOperand(Register(rn),
14666                                                      align,
14667                                                      Register(rm),
14668                                                      PostIndex));
14669                               break;
14670                             }
14671                             case 0x00000700: {
14672                               // 0xf9200700
14673                               if (((instr & 0xd) == 0xd) ||
14674                                   ((instr & 0xe20) == 0x620) ||
14675                                   ((instr & 0xf30) == 0xa30)) {
14676                                 UnallocatedT32(instr);
14677                                 return;
14678                               }
14679                               DataType dt =
14680                                   Dt_size_6_Decode((instr >> 6) & 0x3);
14681                               if (dt.Is(kDataTypeValueInvalid)) {
14682                                 UnallocatedT32(instr);
14683                                 return;
14684                               }
14685                               Alignment align =
14686                                   Align_align_1_Decode((instr >> 4) & 0x3);
14687                               if (dt.Is(kDataTypeValueInvalid) ||
14688                                   align.Is(kBadAlignment)) {
14689                                 UnallocatedT32(instr);
14690                                 return;
14691                               }
14692                               unsigned first = ExtractDRegister(instr, 22, 12);
14693                               unsigned length;
14694                               SpacingType spacing = kSingle;
14695                               switch ((instr >> 8) & 0xf) {
14696                                 default:
14697                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14698                                 case 0x7:
14699                                   length = 1;
14700                                   break;
14701                                 case 0xa:
14702                                   length = 2;
14703                                   break;
14704                                 case 0x6:
14705                                   length = 3;
14706                                   break;
14707                                 case 0x2:
14708                                   length = 4;
14709                                   break;
14710                               }
14711                               unsigned last = first + length - 1;
14712                               TransferType transfer = kMultipleLanes;
14713                               unsigned rn = (instr >> 16) & 0xf;
14714                               unsigned rm = instr & 0xf;
14715                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14716                               vld1(CurrentCond(),
14717                                    dt,
14718                                    NeonRegisterList(DRegister(first),
14719                                                     DRegister(last),
14720                                                     spacing,
14721                                                     transfer),
14722                                    AlignedMemOperand(Register(rn),
14723                                                      align,
14724                                                      Register(rm),
14725                                                      PostIndex));
14726                               break;
14727                             }
14728                             case 0x00000800: {
14729                               // 0xf9200800
14730                               if (((instr & 0xd) == 0xd) ||
14731                                   ((instr & 0xe30) == 0x830)) {
14732                                 UnallocatedT32(instr);
14733                                 return;
14734                               }
14735                               DataType dt =
14736                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14737                               if (dt.Is(kDataTypeValueInvalid)) {
14738                                 UnallocatedT32(instr);
14739                                 return;
14740                               }
14741                               Alignment align =
14742                                   Align_align_2_Decode((instr >> 4) & 0x3);
14743                               if (dt.Is(kDataTypeValueInvalid) ||
14744                                   align.Is(kBadAlignment)) {
14745                                 UnallocatedT32(instr);
14746                                 return;
14747                               }
14748                               unsigned first = ExtractDRegister(instr, 22, 12);
14749                               unsigned length;
14750                               SpacingType spacing;
14751                               switch ((instr >> 8) & 0xf) {
14752                                 default:
14753                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14754                                 case 0x8:
14755                                   length = 2;
14756                                   spacing = kSingle;
14757                                   break;
14758                                 case 0x9:
14759                                   length = 2;
14760                                   spacing = kDouble;
14761                                   break;
14762                                 case 0x3:
14763                                   length = 4;
14764                                   spacing = kSingle;
14765                                   break;
14766                               }
14767                               unsigned last =
14768                                   first +
14769                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14770                               TransferType transfer = kMultipleLanes;
14771                               unsigned rn = (instr >> 16) & 0xf;
14772                               unsigned rm = instr & 0xf;
14773                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14774                               vld2(CurrentCond(),
14775                                    dt,
14776                                    NeonRegisterList(DRegister(first),
14777                                                     DRegister(last),
14778                                                     spacing,
14779                                                     transfer),
14780                                    AlignedMemOperand(Register(rn),
14781                                                      align,
14782                                                      Register(rm),
14783                                                      PostIndex));
14784                               break;
14785                             }
14786                             case 0x00000900: {
14787                               // 0xf9200900
14788                               if (((instr & 0xd) == 0xd) ||
14789                                   ((instr & 0xe30) == 0x830)) {
14790                                 UnallocatedT32(instr);
14791                                 return;
14792                               }
14793                               DataType dt =
14794                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14795                               if (dt.Is(kDataTypeValueInvalid)) {
14796                                 UnallocatedT32(instr);
14797                                 return;
14798                               }
14799                               Alignment align =
14800                                   Align_align_2_Decode((instr >> 4) & 0x3);
14801                               if (dt.Is(kDataTypeValueInvalid) ||
14802                                   align.Is(kBadAlignment)) {
14803                                 UnallocatedT32(instr);
14804                                 return;
14805                               }
14806                               unsigned first = ExtractDRegister(instr, 22, 12);
14807                               unsigned length;
14808                               SpacingType spacing;
14809                               switch ((instr >> 8) & 0xf) {
14810                                 default:
14811                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14812                                 case 0x8:
14813                                   length = 2;
14814                                   spacing = kSingle;
14815                                   break;
14816                                 case 0x9:
14817                                   length = 2;
14818                                   spacing = kDouble;
14819                                   break;
14820                                 case 0x3:
14821                                   length = 4;
14822                                   spacing = kSingle;
14823                                   break;
14824                               }
14825                               unsigned last =
14826                                   first +
14827                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14828                               TransferType transfer = kMultipleLanes;
14829                               unsigned rn = (instr >> 16) & 0xf;
14830                               unsigned rm = instr & 0xf;
14831                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14832                               vld2(CurrentCond(),
14833                                    dt,
14834                                    NeonRegisterList(DRegister(first),
14835                                                     DRegister(last),
14836                                                     spacing,
14837                                                     transfer),
14838                                    AlignedMemOperand(Register(rn),
14839                                                      align,
14840                                                      Register(rm),
14841                                                      PostIndex));
14842                               break;
14843                             }
14844                             case 0x00000a00: {
14845                               // 0xf9200a00
14846                               if (((instr & 0xd) == 0xd) ||
14847                                   ((instr & 0xe20) == 0x620) ||
14848                                   ((instr & 0xf30) == 0xa30)) {
14849                                 UnallocatedT32(instr);
14850                                 return;
14851                               }
14852                               DataType dt =
14853                                   Dt_size_6_Decode((instr >> 6) & 0x3);
14854                               if (dt.Is(kDataTypeValueInvalid)) {
14855                                 UnallocatedT32(instr);
14856                                 return;
14857                               }
14858                               Alignment align =
14859                                   Align_align_1_Decode((instr >> 4) & 0x3);
14860                               if (dt.Is(kDataTypeValueInvalid) ||
14861                                   align.Is(kBadAlignment)) {
14862                                 UnallocatedT32(instr);
14863                                 return;
14864                               }
14865                               unsigned first = ExtractDRegister(instr, 22, 12);
14866                               unsigned length;
14867                               SpacingType spacing = kSingle;
14868                               switch ((instr >> 8) & 0xf) {
14869                                 default:
14870                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14871                                 case 0x7:
14872                                   length = 1;
14873                                   break;
14874                                 case 0xa:
14875                                   length = 2;
14876                                   break;
14877                                 case 0x6:
14878                                   length = 3;
14879                                   break;
14880                                 case 0x2:
14881                                   length = 4;
14882                                   break;
14883                               }
14884                               unsigned last = first + length - 1;
14885                               TransferType transfer = kMultipleLanes;
14886                               unsigned rn = (instr >> 16) & 0xf;
14887                               unsigned rm = instr & 0xf;
14888                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14889                               vld1(CurrentCond(),
14890                                    dt,
14891                                    NeonRegisterList(DRegister(first),
14892                                                     DRegister(last),
14893                                                     spacing,
14894                                                     transfer),
14895                                    AlignedMemOperand(Register(rn),
14896                                                      align,
14897                                                      Register(rm),
14898                                                      PostIndex));
14899                               break;
14900                             }
14901                             default:
14902                               UnallocatedT32(instr);
14903                               break;
14904                           }
14905                           break;
14906                         }
14907                       }
14908                       break;
14909                     }
14910                     case 0x01800000: {
14911                       // 0xf9800000
14912                       switch (instr & 0x00000300) {
14913                         case 0x00000000: {
14914                           // 0xf9800000
14915                           switch (instr & 0x00000c00) {
14916                             case 0x00000c00: {
14917                               // 0xf9800c00
14918                               UnallocatedT32(instr);
14919                               break;
14920                             }
14921                             default: {
14922                               switch (instr & 0x0000000d) {
14923                                 case 0x0000000d: {
14924                                   // 0xf980000d
14925                                   switch (instr & 0x00000002) {
14926                                     case 0x00000000: {
14927                                       // 0xf980000d
14928                                       if (((instr & 0xc00) == 0xc00)) {
14929                                         UnallocatedT32(instr);
14930                                         return;
14931                                       }
14932                                       DataType dt =
14933                                           Dt_size_7_Decode((instr >> 10) & 0x3);
14934                                       if (dt.Is(kDataTypeValueInvalid)) {
14935                                         UnallocatedT32(instr);
14936                                         return;
14937                                       }
14938                                       DecodeNeonAndAlign decode_neon =
14939                                           Align_index_align_1_Decode((instr >>
14940                                                                       4) &
14941                                                                          0xf,
14942                                                                      dt);
14943                                       if (!decode_neon.IsValid()) {
14944                                         UnallocatedT32(instr);
14945                                         return;
14946                                       }
14947                                       Alignment align = decode_neon.GetAlign();
14948                                       int lane = decode_neon.GetLane();
14949                                       SpacingType spacing =
14950                                           decode_neon.GetSpacing();
14951                                       unsigned first =
14952                                           ExtractDRegister(instr, 22, 12);
14953                                       unsigned length = 1;
14954                                       unsigned last = first + length - 1;
14955                                       unsigned rn = (instr >> 16) & 0xf;
14956                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
14957                                       vst1(CurrentCond(),
14958                                            dt,
14959                                            NeonRegisterList(DRegister(first),
14960                                                             DRegister(last),
14961                                                             spacing,
14962                                                             lane),
14963                                            AlignedMemOperand(Register(rn),
14964                                                              align,
14965                                                              PostIndex));
14966                                       break;
14967                                     }
14968                                     case 0x00000002: {
14969                                       // 0xf980000f
14970                                       if (((instr & 0xc00) == 0xc00)) {
14971                                         UnallocatedT32(instr);
14972                                         return;
14973                                       }
14974                                       DataType dt =
14975                                           Dt_size_7_Decode((instr >> 10) & 0x3);
14976                                       if (dt.Is(kDataTypeValueInvalid)) {
14977                                         UnallocatedT32(instr);
14978                                         return;
14979                                       }
14980                                       DecodeNeonAndAlign decode_neon =
14981                                           Align_index_align_1_Decode((instr >>
14982                                                                       4) &
14983                                                                          0xf,
14984                                                                      dt);
14985                                       if (!decode_neon.IsValid()) {
14986                                         UnallocatedT32(instr);
14987                                         return;
14988                                       }
14989                                       Alignment align = decode_neon.GetAlign();
14990                                       int lane = decode_neon.GetLane();
14991                                       SpacingType spacing =
14992                                           decode_neon.GetSpacing();
14993                                       unsigned first =
14994                                           ExtractDRegister(instr, 22, 12);
14995                                       unsigned length = 1;
14996                                       unsigned last = first + length - 1;
14997                                       unsigned rn = (instr >> 16) & 0xf;
14998                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14999                                       vst1(CurrentCond(),
15000                                            dt,
15001                                            NeonRegisterList(DRegister(first),
15002                                                             DRegister(last),
15003                                                             spacing,
15004                                                             lane),
15005                                            AlignedMemOperand(Register(rn),
15006                                                              align,
15007                                                              Offset));
15008                                       break;
15009                                     }
15010                                   }
15011                                   break;
15012                                 }
15013                                 default: {
15014                                   if (((instr & 0xc00) == 0xc00) ||
15015                                       ((instr & 0xd) == 0xd)) {
15016                                     UnallocatedT32(instr);
15017                                     return;
15018                                   }
15019                                   DataType dt =
15020                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15021                                   if (dt.Is(kDataTypeValueInvalid)) {
15022                                     UnallocatedT32(instr);
15023                                     return;
15024                                   }
15025                                   DecodeNeonAndAlign decode_neon =
15026                                       Align_index_align_1_Decode((instr >> 4) &
15027                                                                      0xf,
15028                                                                  dt);
15029                                   if (!decode_neon.IsValid()) {
15030                                     UnallocatedT32(instr);
15031                                     return;
15032                                   }
15033                                   Alignment align = decode_neon.GetAlign();
15034                                   int lane = decode_neon.GetLane();
15035                                   SpacingType spacing =
15036                                       decode_neon.GetSpacing();
15037                                   unsigned first =
15038                                       ExtractDRegister(instr, 22, 12);
15039                                   unsigned length = 1;
15040                                   unsigned last = first + length - 1;
15041                                   unsigned rn = (instr >> 16) & 0xf;
15042                                   unsigned rm = instr & 0xf;
15043                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15044                                   vst1(CurrentCond(),
15045                                        dt,
15046                                        NeonRegisterList(DRegister(first),
15047                                                         DRegister(last),
15048                                                         spacing,
15049                                                         lane),
15050                                        AlignedMemOperand(Register(rn),
15051                                                          align,
15052                                                          Register(rm),
15053                                                          PostIndex));
15054                                   break;
15055                                 }
15056                               }
15057                               break;
15058                             }
15059                           }
15060                           break;
15061                         }
15062                         case 0x00000100: {
15063                           // 0xf9800100
15064                           switch (instr & 0x00000c00) {
15065                             case 0x00000c00: {
15066                               // 0xf9800d00
15067                               UnallocatedT32(instr);
15068                               break;
15069                             }
15070                             default: {
15071                               switch (instr & 0x0000000d) {
15072                                 case 0x0000000d: {
15073                                   // 0xf980010d
15074                                   switch (instr & 0x00000002) {
15075                                     case 0x00000000: {
15076                                       // 0xf980010d
15077                                       if (((instr & 0xc00) == 0xc00)) {
15078                                         UnallocatedT32(instr);
15079                                         return;
15080                                       }
15081                                       DataType dt =
15082                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15083                                       if (dt.Is(kDataTypeValueInvalid)) {
15084                                         UnallocatedT32(instr);
15085                                         return;
15086                                       }
15087                                       DecodeNeonAndAlign decode_neon =
15088                                           Align_index_align_2_Decode((instr >>
15089                                                                       4) &
15090                                                                          0xf,
15091                                                                      dt);
15092                                       if (!decode_neon.IsValid()) {
15093                                         UnallocatedT32(instr);
15094                                         return;
15095                                       }
15096                                       Alignment align = decode_neon.GetAlign();
15097                                       int lane = decode_neon.GetLane();
15098                                       SpacingType spacing =
15099                                           decode_neon.GetSpacing();
15100                                       unsigned first =
15101                                           ExtractDRegister(instr, 22, 12);
15102                                       unsigned length = 2;
15103                                       unsigned last =
15104                                           first +
15105                                           (length - 1) *
15106                                               (spacing == kSingle ? 1 : 2);
15107                                       unsigned rn = (instr >> 16) & 0xf;
15108                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15109                                       vst2(CurrentCond(),
15110                                            dt,
15111                                            NeonRegisterList(DRegister(first),
15112                                                             DRegister(last),
15113                                                             spacing,
15114                                                             lane),
15115                                            AlignedMemOperand(Register(rn),
15116                                                              align,
15117                                                              PostIndex));
15118                                       break;
15119                                     }
15120                                     case 0x00000002: {
15121                                       // 0xf980010f
15122                                       if (((instr & 0xc00) == 0xc00)) {
15123                                         UnallocatedT32(instr);
15124                                         return;
15125                                       }
15126                                       DataType dt =
15127                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15128                                       if (dt.Is(kDataTypeValueInvalid)) {
15129                                         UnallocatedT32(instr);
15130                                         return;
15131                                       }
15132                                       DecodeNeonAndAlign decode_neon =
15133                                           Align_index_align_2_Decode((instr >>
15134                                                                       4) &
15135                                                                          0xf,
15136                                                                      dt);
15137                                       if (!decode_neon.IsValid()) {
15138                                         UnallocatedT32(instr);
15139                                         return;
15140                                       }
15141                                       Alignment align = decode_neon.GetAlign();
15142                                       int lane = decode_neon.GetLane();
15143                                       SpacingType spacing =
15144                                           decode_neon.GetSpacing();
15145                                       unsigned first =
15146                                           ExtractDRegister(instr, 22, 12);
15147                                       unsigned length = 2;
15148                                       unsigned last =
15149                                           first +
15150                                           (length - 1) *
15151                                               (spacing == kSingle ? 1 : 2);
15152                                       unsigned rn = (instr >> 16) & 0xf;
15153                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15154                                       vst2(CurrentCond(),
15155                                            dt,
15156                                            NeonRegisterList(DRegister(first),
15157                                                             DRegister(last),
15158                                                             spacing,
15159                                                             lane),
15160                                            AlignedMemOperand(Register(rn),
15161                                                              align,
15162                                                              Offset));
15163                                       break;
15164                                     }
15165                                   }
15166                                   break;
15167                                 }
15168                                 default: {
15169                                   if (((instr & 0xc00) == 0xc00) ||
15170                                       ((instr & 0xd) == 0xd)) {
15171                                     UnallocatedT32(instr);
15172                                     return;
15173                                   }
15174                                   DataType dt =
15175                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15176                                   if (dt.Is(kDataTypeValueInvalid)) {
15177                                     UnallocatedT32(instr);
15178                                     return;
15179                                   }
15180                                   DecodeNeonAndAlign decode_neon =
15181                                       Align_index_align_2_Decode((instr >> 4) &
15182                                                                      0xf,
15183                                                                  dt);
15184                                   if (!decode_neon.IsValid()) {
15185                                     UnallocatedT32(instr);
15186                                     return;
15187                                   }
15188                                   Alignment align = decode_neon.GetAlign();
15189                                   int lane = decode_neon.GetLane();
15190                                   SpacingType spacing =
15191                                       decode_neon.GetSpacing();
15192                                   unsigned first =
15193                                       ExtractDRegister(instr, 22, 12);
15194                                   unsigned length = 2;
15195                                   unsigned last =
15196                                       first +
15197                                       (length - 1) *
15198                                           (spacing == kSingle ? 1 : 2);
15199                                   unsigned rn = (instr >> 16) & 0xf;
15200                                   unsigned rm = instr & 0xf;
15201                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15202                                   vst2(CurrentCond(),
15203                                        dt,
15204                                        NeonRegisterList(DRegister(first),
15205                                                         DRegister(last),
15206                                                         spacing,
15207                                                         lane),
15208                                        AlignedMemOperand(Register(rn),
15209                                                          align,
15210                                                          Register(rm),
15211                                                          PostIndex));
15212                                   break;
15213                                 }
15214                               }
15215                               break;
15216                             }
15217                           }
15218                           break;
15219                         }
15220                         case 0x00000200: {
15221                           // 0xf9800200
15222                           switch (instr & 0x00000c30) {
15223                             case 0x00000010: {
15224                               // 0xf9800210
15225                               UnallocatedT32(instr);
15226                               break;
15227                             }
15228                             case 0x00000030: {
15229                               // 0xf9800230
15230                               UnallocatedT32(instr);
15231                               break;
15232                             }
15233                             case 0x00000410: {
15234                               // 0xf9800610
15235                               UnallocatedT32(instr);
15236                               break;
15237                             }
15238                             case 0x00000430: {
15239                               // 0xf9800630
15240                               UnallocatedT32(instr);
15241                               break;
15242                             }
15243                             case 0x00000810: {
15244                               // 0xf9800a10
15245                               UnallocatedT32(instr);
15246                               break;
15247                             }
15248                             case 0x00000820: {
15249                               // 0xf9800a20
15250                               UnallocatedT32(instr);
15251                               break;
15252                             }
15253                             case 0x00000830: {
15254                               // 0xf9800a30
15255                               UnallocatedT32(instr);
15256                               break;
15257                             }
15258                             case 0x00000c00: {
15259                               // 0xf9800e00
15260                               UnallocatedT32(instr);
15261                               break;
15262                             }
15263                             case 0x00000c10: {
15264                               // 0xf9800e10
15265                               UnallocatedT32(instr);
15266                               break;
15267                             }
15268                             case 0x00000c20: {
15269                               // 0xf9800e20
15270                               UnallocatedT32(instr);
15271                               break;
15272                             }
15273                             case 0x00000c30: {
15274                               // 0xf9800e30
15275                               UnallocatedT32(instr);
15276                               break;
15277                             }
15278                             default: {
15279                               switch (instr & 0x0000000d) {
15280                                 case 0x0000000d: {
15281                                   // 0xf980020d
15282                                   switch (instr & 0x00000002) {
15283                                     case 0x00000000: {
15284                                       // 0xf980020d
15285                                       if (((instr & 0xc00) == 0xc00) ||
15286                                           ((instr & 0x810) == 0x10) ||
15287                                           ((instr & 0xc30) == 0x810) ||
15288                                           ((instr & 0xc30) == 0x820) ||
15289                                           ((instr & 0xc30) == 0x830)) {
15290                                         UnallocatedT32(instr);
15291                                         return;
15292                                       }
15293                                       DataType dt =
15294                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15295                                       if (dt.Is(kDataTypeValueInvalid)) {
15296                                         UnallocatedT32(instr);
15297                                         return;
15298                                       }
15299                                       DecodeNeon decode_neon =
15300                                           Index_1_Decode((instr >> 4) & 0xf,
15301                                                          dt);
15302                                       if (!decode_neon.IsValid()) {
15303                                         UnallocatedT32(instr);
15304                                         return;
15305                                       }
15306                                       int lane = decode_neon.GetLane();
15307                                       SpacingType spacing =
15308                                           decode_neon.GetSpacing();
15309                                       unsigned first =
15310                                           ExtractDRegister(instr, 22, 12);
15311                                       unsigned length = 3;
15312                                       unsigned last =
15313                                           first +
15314                                           (length - 1) *
15315                                               (spacing == kSingle ? 1 : 2);
15316                                       unsigned rn = (instr >> 16) & 0xf;
15317                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
15318                                       vst3(CurrentCond(),
15319                                            dt,
15320                                            NeonRegisterList(DRegister(first),
15321                                                             DRegister(last),
15322                                                             spacing,
15323                                                             lane),
15324                                            MemOperand(Register(rn), PostIndex));
15325                                       break;
15326                                     }
15327                                     case 0x00000002: {
15328                                       // 0xf980020f
15329                                       if (((instr & 0xc00) == 0xc00) ||
15330                                           ((instr & 0x810) == 0x10) ||
15331                                           ((instr & 0xc30) == 0x810) ||
15332                                           ((instr & 0xc30) == 0x820) ||
15333                                           ((instr & 0xc30) == 0x830)) {
15334                                         UnallocatedT32(instr);
15335                                         return;
15336                                       }
15337                                       DataType dt =
15338                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15339                                       if (dt.Is(kDataTypeValueInvalid)) {
15340                                         UnallocatedT32(instr);
15341                                         return;
15342                                       }
15343                                       DecodeNeon decode_neon =
15344                                           Index_1_Decode((instr >> 4) & 0xf,
15345                                                          dt);
15346                                       if (!decode_neon.IsValid()) {
15347                                         UnallocatedT32(instr);
15348                                         return;
15349                                       }
15350                                       int lane = decode_neon.GetLane();
15351                                       SpacingType spacing =
15352                                           decode_neon.GetSpacing();
15353                                       unsigned first =
15354                                           ExtractDRegister(instr, 22, 12);
15355                                       unsigned length = 3;
15356                                       unsigned last =
15357                                           first +
15358                                           (length - 1) *
15359                                               (spacing == kSingle ? 1 : 2);
15360                                       unsigned rn = (instr >> 16) & 0xf;
15361                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
15362                                       vst3(CurrentCond(),
15363                                            dt,
15364                                            NeonRegisterList(DRegister(first),
15365                                                             DRegister(last),
15366                                                             spacing,
15367                                                             lane),
15368                                            MemOperand(Register(rn), Offset));
15369                                       break;
15370                                     }
15371                                   }
15372                                   break;
15373                                 }
15374                                 default: {
15375                                   if (((instr & 0xc00) == 0xc00) ||
15376                                       ((instr & 0xd) == 0xd) ||
15377                                       ((instr & 0x810) == 0x10) ||
15378                                       ((instr & 0xc30) == 0x810) ||
15379                                       ((instr & 0xc30) == 0x820) ||
15380                                       ((instr & 0xc30) == 0x830)) {
15381                                     UnallocatedT32(instr);
15382                                     return;
15383                                   }
15384                                   DataType dt =
15385                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15386                                   if (dt.Is(kDataTypeValueInvalid)) {
15387                                     UnallocatedT32(instr);
15388                                     return;
15389                                   }
15390                                   DecodeNeon decode_neon =
15391                                       Index_1_Decode((instr >> 4) & 0xf, dt);
15392                                   if (!decode_neon.IsValid()) {
15393                                     UnallocatedT32(instr);
15394                                     return;
15395                                   }
15396                                   int lane = decode_neon.GetLane();
15397                                   SpacingType spacing =
15398                                       decode_neon.GetSpacing();
15399                                   unsigned first =
15400                                       ExtractDRegister(instr, 22, 12);
15401                                   unsigned length = 3;
15402                                   unsigned last =
15403                                       first +
15404                                       (length - 1) *
15405                                           (spacing == kSingle ? 1 : 2);
15406                                   unsigned rn = (instr >> 16) & 0xf;
15407                                   Sign sign(plus);
15408                                   unsigned rm = instr & 0xf;
15409                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
15410                                   vst3(CurrentCond(),
15411                                        dt,
15412                                        NeonRegisterList(DRegister(first),
15413                                                         DRegister(last),
15414                                                         spacing,
15415                                                         lane),
15416                                        MemOperand(Register(rn),
15417                                                   sign,
15418                                                   Register(rm),
15419                                                   PostIndex));
15420                                   break;
15421                                 }
15422                               }
15423                               break;
15424                             }
15425                           }
15426                           break;
15427                         }
15428                         case 0x00000300: {
15429                           // 0xf9800300
15430                           switch (instr & 0x00000c00) {
15431                             case 0x00000c00: {
15432                               // 0xf9800f00
15433                               UnallocatedT32(instr);
15434                               break;
15435                             }
15436                             default: {
15437                               switch (instr & 0x0000000d) {
15438                                 case 0x0000000d: {
15439                                   // 0xf980030d
15440                                   switch (instr & 0x00000002) {
15441                                     case 0x00000000: {
15442                                       // 0xf980030d
15443                                       if (((instr & 0xc00) == 0xc00)) {
15444                                         UnallocatedT32(instr);
15445                                         return;
15446                                       }
15447                                       DataType dt =
15448                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15449                                       if (dt.Is(kDataTypeValueInvalid)) {
15450                                         UnallocatedT32(instr);
15451                                         return;
15452                                       }
15453                                       DecodeNeonAndAlign decode_neon =
15454                                           Align_index_align_3_Decode((instr >>
15455                                                                       4) &
15456                                                                          0xf,
15457                                                                      dt);
15458                                       if (!decode_neon.IsValid()) {
15459                                         UnallocatedT32(instr);
15460                                         return;
15461                                       }
15462                                       Alignment align = decode_neon.GetAlign();
15463                                       int lane = decode_neon.GetLane();
15464                                       SpacingType spacing =
15465                                           decode_neon.GetSpacing();
15466                                       unsigned first =
15467                                           ExtractDRegister(instr, 22, 12);
15468                                       unsigned length = 4;
15469                                       unsigned last =
15470                                           first +
15471                                           (length - 1) *
15472                                               (spacing == kSingle ? 1 : 2);
15473                                       unsigned rn = (instr >> 16) & 0xf;
15474                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15475                                       vst4(CurrentCond(),
15476                                            dt,
15477                                            NeonRegisterList(DRegister(first),
15478                                                             DRegister(last),
15479                                                             spacing,
15480                                                             lane),
15481                                            AlignedMemOperand(Register(rn),
15482                                                              align,
15483                                                              PostIndex));
15484                                       break;
15485                                     }
15486                                     case 0x00000002: {
15487                                       // 0xf980030f
15488                                       if (((instr & 0xc00) == 0xc00)) {
15489                                         UnallocatedT32(instr);
15490                                         return;
15491                                       }
15492                                       DataType dt =
15493                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15494                                       if (dt.Is(kDataTypeValueInvalid)) {
15495                                         UnallocatedT32(instr);
15496                                         return;
15497                                       }
15498                                       DecodeNeonAndAlign decode_neon =
15499                                           Align_index_align_3_Decode((instr >>
15500                                                                       4) &
15501                                                                          0xf,
15502                                                                      dt);
15503                                       if (!decode_neon.IsValid()) {
15504                                         UnallocatedT32(instr);
15505                                         return;
15506                                       }
15507                                       Alignment align = decode_neon.GetAlign();
15508                                       int lane = decode_neon.GetLane();
15509                                       SpacingType spacing =
15510                                           decode_neon.GetSpacing();
15511                                       unsigned first =
15512                                           ExtractDRegister(instr, 22, 12);
15513                                       unsigned length = 4;
15514                                       unsigned last =
15515                                           first +
15516                                           (length - 1) *
15517                                               (spacing == kSingle ? 1 : 2);
15518                                       unsigned rn = (instr >> 16) & 0xf;
15519                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15520                                       vst4(CurrentCond(),
15521                                            dt,
15522                                            NeonRegisterList(DRegister(first),
15523                                                             DRegister(last),
15524                                                             spacing,
15525                                                             lane),
15526                                            AlignedMemOperand(Register(rn),
15527                                                              align,
15528                                                              Offset));
15529                                       break;
15530                                     }
15531                                   }
15532                                   break;
15533                                 }
15534                                 default: {
15535                                   if (((instr & 0xc00) == 0xc00) ||
15536                                       ((instr & 0xd) == 0xd)) {
15537                                     UnallocatedT32(instr);
15538                                     return;
15539                                   }
15540                                   DataType dt =
15541                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15542                                   if (dt.Is(kDataTypeValueInvalid)) {
15543                                     UnallocatedT32(instr);
15544                                     return;
15545                                   }
15546                                   DecodeNeonAndAlign decode_neon =
15547                                       Align_index_align_3_Decode((instr >> 4) &
15548                                                                      0xf,
15549                                                                  dt);
15550                                   if (!decode_neon.IsValid()) {
15551                                     UnallocatedT32(instr);
15552                                     return;
15553                                   }
15554                                   Alignment align = decode_neon.GetAlign();
15555                                   int lane = decode_neon.GetLane();
15556                                   SpacingType spacing =
15557                                       decode_neon.GetSpacing();
15558                                   unsigned first =
15559                                       ExtractDRegister(instr, 22, 12);
15560                                   unsigned length = 4;
15561                                   unsigned last =
15562                                       first +
15563                                       (length - 1) *
15564                                           (spacing == kSingle ? 1 : 2);
15565                                   unsigned rn = (instr >> 16) & 0xf;
15566                                   unsigned rm = instr & 0xf;
15567                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15568                                   vst4(CurrentCond(),
15569                                        dt,
15570                                        NeonRegisterList(DRegister(first),
15571                                                         DRegister(last),
15572                                                         spacing,
15573                                                         lane),
15574                                        AlignedMemOperand(Register(rn),
15575                                                          align,
15576                                                          Register(rm),
15577                                                          PostIndex));
15578                                   break;
15579                                 }
15580                               }
15581                               break;
15582                             }
15583                           }
15584                           break;
15585                         }
15586                       }
15587                       break;
15588                     }
15589                     case 0x01a00000: {
15590                       // 0xf9a00000
15591                       switch (instr & 0x00000300) {
15592                         case 0x00000000: {
15593                           // 0xf9a00000
15594                           switch (instr & 0x00000c00) {
15595                             case 0x00000c00: {
15596                               // 0xf9a00c00
15597                               switch (instr & 0x0000000d) {
15598                                 case 0x0000000d: {
15599                                   // 0xf9a00c0d
15600                                   switch (instr & 0x00000002) {
15601                                     case 0x00000000: {
15602                                       // 0xf9a00c0d
15603                                       DataType dt =
15604                                           Dt_size_7_Decode((instr >> 6) & 0x3);
15605                                       if (dt.Is(kDataTypeValueInvalid)) {
15606                                         UnallocatedT32(instr);
15607                                         return;
15608                                       }
15609                                       Alignment align =
15610                                           Align_a_1_Decode((instr >> 4) & 0x1,
15611                                                            dt);
15612                                       if (dt.Is(kDataTypeValueInvalid) ||
15613                                           align.Is(kBadAlignment)) {
15614                                         UnallocatedT32(instr);
15615                                         return;
15616                                       }
15617                                       unsigned first =
15618                                           ExtractDRegister(instr, 22, 12);
15619                                       unsigned length;
15620                                       SpacingType spacing = kSingle;
15621                                       switch ((instr >> 5) & 0x1) {
15622                                         default:
15623                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
15624                                         case 0x0:
15625                                           length = 1;
15626                                           break;
15627                                         case 0x1:
15628                                           length = 2;
15629                                           break;
15630                                       }
15631                                       unsigned last = first + length - 1;
15632                                       TransferType transfer = kAllLanes;
15633                                       unsigned rn = (instr >> 16) & 0xf;
15634                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15635                                       vld1(CurrentCond(),
15636                                            dt,
15637                                            NeonRegisterList(DRegister(first),
15638                                                             DRegister(last),
15639                                                             spacing,
15640                                                             transfer),
15641                                            AlignedMemOperand(Register(rn),
15642                                                              align,
15643                                                              PostIndex));
15644                                       break;
15645                                     }
15646                                     case 0x00000002: {
15647                                       // 0xf9a00c0f
15648                                       DataType dt =
15649                                           Dt_size_7_Decode((instr >> 6) & 0x3);
15650                                       if (dt.Is(kDataTypeValueInvalid)) {
15651                                         UnallocatedT32(instr);
15652                                         return;
15653                                       }
15654                                       Alignment align =
15655                                           Align_a_1_Decode((instr >> 4) & 0x1,
15656                                                            dt);
15657                                       if (dt.Is(kDataTypeValueInvalid) ||
15658                                           align.Is(kBadAlignment)) {
15659                                         UnallocatedT32(instr);
15660                                         return;
15661                                       }
15662                                       unsigned first =
15663                                           ExtractDRegister(instr, 22, 12);
15664                                       unsigned length;
15665                                       SpacingType spacing = kSingle;
15666                                       switch ((instr >> 5) & 0x1) {
15667                                         default:
15668                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
15669                                         case 0x0:
15670                                           length = 1;
15671                                           break;
15672                                         case 0x1:
15673                                           length = 2;
15674                                           break;
15675                                       }
15676                                       unsigned last = first + length - 1;
15677                                       TransferType transfer = kAllLanes;
15678                                       unsigned rn = (instr >> 16) & 0xf;
15679                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15680                                       vld1(CurrentCond(),
15681                                            dt,
15682                                            NeonRegisterList(DRegister(first),
15683                                                             DRegister(last),
15684                                                             spacing,
15685                                                             transfer),
15686                                            AlignedMemOperand(Register(rn),
15687                                                              align,
15688                                                              Offset));
15689                                       break;
15690                                     }
15691                                   }
15692                                   break;
15693                                 }
15694                                 default: {
15695                                   if (((instr & 0xd) == 0xd)) {
15696                                     UnallocatedT32(instr);
15697                                     return;
15698                                   }
15699                                   DataType dt =
15700                                       Dt_size_7_Decode((instr >> 6) & 0x3);
15701                                   if (dt.Is(kDataTypeValueInvalid)) {
15702                                     UnallocatedT32(instr);
15703                                     return;
15704                                   }
15705                                   Alignment align =
15706                                       Align_a_1_Decode((instr >> 4) & 0x1, dt);
15707                                   if (dt.Is(kDataTypeValueInvalid) ||
15708                                       align.Is(kBadAlignment)) {
15709                                     UnallocatedT32(instr);
15710                                     return;
15711                                   }
15712                                   unsigned first =
15713                                       ExtractDRegister(instr, 22, 12);
15714                                   unsigned length;
15715                                   SpacingType spacing = kSingle;
15716                                   switch ((instr >> 5) & 0x1) {
15717                                     default:
15718                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
15719                                     case 0x0:
15720                                       length = 1;
15721                                       break;
15722                                     case 0x1:
15723                                       length = 2;
15724                                       break;
15725                                   }
15726                                   unsigned last = first + length - 1;
15727                                   TransferType transfer = kAllLanes;
15728                                   unsigned rn = (instr >> 16) & 0xf;
15729                                   unsigned rm = instr & 0xf;
15730                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15731                                   vld1(CurrentCond(),
15732                                        dt,
15733                                        NeonRegisterList(DRegister(first),
15734                                                         DRegister(last),
15735                                                         spacing,
15736                                                         transfer),
15737                                        AlignedMemOperand(Register(rn),
15738                                                          align,
15739                                                          Register(rm),
15740                                                          PostIndex));
15741                                   break;
15742                                 }
15743                               }
15744                               break;
15745                             }
15746                             default: {
15747                               switch (instr & 0x0000000d) {
15748                                 case 0x0000000d: {
15749                                   // 0xf9a0000d
15750                                   switch (instr & 0x00000002) {
15751                                     case 0x00000000: {
15752                                       // 0xf9a0000d
15753                                       if (((instr & 0xc00) == 0xc00)) {
15754                                         UnallocatedT32(instr);
15755                                         return;
15756                                       }
15757                                       DataType dt =
15758                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15759                                       if (dt.Is(kDataTypeValueInvalid)) {
15760                                         UnallocatedT32(instr);
15761                                         return;
15762                                       }
15763                                       DecodeNeonAndAlign decode_neon =
15764                                           Align_index_align_1_Decode((instr >>
15765                                                                       4) &
15766                                                                          0xf,
15767                                                                      dt);
15768                                       if (!decode_neon.IsValid()) {
15769                                         UnallocatedT32(instr);
15770                                         return;
15771                                       }
15772                                       Alignment align = decode_neon.GetAlign();
15773                                       int lane = decode_neon.GetLane();
15774                                       SpacingType spacing =
15775                                           decode_neon.GetSpacing();
15776                                       unsigned first =
15777                                           ExtractDRegister(instr, 22, 12);
15778                                       unsigned length = 1;
15779                                       unsigned last = first + length - 1;
15780                                       unsigned rn = (instr >> 16) & 0xf;
15781                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15782                                       vld1(CurrentCond(),
15783                                            dt,
15784                                            NeonRegisterList(DRegister(first),
15785                                                             DRegister(last),
15786                                                             spacing,
15787                                                             lane),
15788                                            AlignedMemOperand(Register(rn),
15789                                                              align,
15790                                                              PostIndex));
15791                                       break;
15792                                     }
15793                                     case 0x00000002: {
15794                                       // 0xf9a0000f
15795                                       if (((instr & 0xc00) == 0xc00)) {
15796                                         UnallocatedT32(instr);
15797                                         return;
15798                                       }
15799                                       DataType dt =
15800                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15801                                       if (dt.Is(kDataTypeValueInvalid)) {
15802                                         UnallocatedT32(instr);
15803                                         return;
15804                                       }
15805                                       DecodeNeonAndAlign decode_neon =
15806                                           Align_index_align_1_Decode((instr >>
15807                                                                       4) &
15808                                                                          0xf,
15809                                                                      dt);
15810                                       if (!decode_neon.IsValid()) {
15811                                         UnallocatedT32(instr);
15812                                         return;
15813                                       }
15814                                       Alignment align = decode_neon.GetAlign();
15815                                       int lane = decode_neon.GetLane();
15816                                       SpacingType spacing =
15817                                           decode_neon.GetSpacing();
15818                                       unsigned first =
15819                                           ExtractDRegister(instr, 22, 12);
15820                                       unsigned length = 1;
15821                                       unsigned last = first + length - 1;
15822                                       unsigned rn = (instr >> 16) & 0xf;
15823                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15824                                       vld1(CurrentCond(),
15825                                            dt,
15826                                            NeonRegisterList(DRegister(first),
15827                                                             DRegister(last),
15828                                                             spacing,
15829                                                             lane),
15830                                            AlignedMemOperand(Register(rn),
15831                                                              align,
15832                                                              Offset));
15833                                       break;
15834                                     }
15835                                   }
15836                                   break;
15837                                 }
15838                                 default: {
15839                                   if (((instr & 0xc00) == 0xc00) ||
15840                                       ((instr & 0xd) == 0xd)) {
15841                                     UnallocatedT32(instr);
15842                                     return;
15843                                   }
15844                                   DataType dt =
15845                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15846                                   if (dt.Is(kDataTypeValueInvalid)) {
15847                                     UnallocatedT32(instr);
15848                                     return;
15849                                   }
15850                                   DecodeNeonAndAlign decode_neon =
15851                                       Align_index_align_1_Decode((instr >> 4) &
15852                                                                      0xf,
15853                                                                  dt);
15854                                   if (!decode_neon.IsValid()) {
15855                                     UnallocatedT32(instr);
15856                                     return;
15857                                   }
15858                                   Alignment align = decode_neon.GetAlign();
15859                                   int lane = decode_neon.GetLane();
15860                                   SpacingType spacing =
15861                                       decode_neon.GetSpacing();
15862                                   unsigned first =
15863                                       ExtractDRegister(instr, 22, 12);
15864                                   unsigned length = 1;
15865                                   unsigned last = first + length - 1;
15866                                   unsigned rn = (instr >> 16) & 0xf;
15867                                   unsigned rm = instr & 0xf;
15868                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15869                                   vld1(CurrentCond(),
15870                                        dt,
15871                                        NeonRegisterList(DRegister(first),
15872                                                         DRegister(last),
15873                                                         spacing,
15874                                                         lane),
15875                                        AlignedMemOperand(Register(rn),
15876                                                          align,
15877                                                          Register(rm),
15878                                                          PostIndex));
15879                                   break;
15880                                 }
15881                               }
15882                               break;
15883                             }
15884                           }
15885                           break;
15886                         }
15887                         case 0x00000100: {
15888                           // 0xf9a00100
15889                           switch (instr & 0x00000c00) {
15890                             case 0x00000c00: {
15891                               // 0xf9a00d00
15892                               switch (instr & 0x0000000d) {
15893                                 case 0x0000000d: {
15894                                   // 0xf9a00d0d
15895                                   switch (instr & 0x00000002) {
15896                                     case 0x00000000: {
15897                                       // 0xf9a00d0d
15898                                       DataType dt =
15899                                           Dt_size_7_Decode((instr >> 6) & 0x3);
15900                                       if (dt.Is(kDataTypeValueInvalid)) {
15901                                         UnallocatedT32(instr);
15902                                         return;
15903                                       }
15904                                       Alignment align =
15905                                           Align_a_2_Decode((instr >> 4) & 0x1,
15906                                                            dt);
15907                                       if (dt.Is(kDataTypeValueInvalid) ||
15908                                           align.Is(kBadAlignment)) {
15909                                         UnallocatedT32(instr);
15910                                         return;
15911                                       }
15912                                       unsigned first =
15913                                           ExtractDRegister(instr, 22, 12);
15914                                       unsigned length;
15915                                       SpacingType spacing;
15916                                       switch ((instr >> 5) & 0x1) {
15917                                         default:
15918                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
15919                                         case 0x0:
15920                                           length = 2;
15921                                           spacing = kSingle;
15922                                           break;
15923                                         case 0x1:
15924                                           length = 2;
15925                                           spacing = kDouble;
15926                                           break;
15927                                       }
15928                                       unsigned last =
15929                                           first +
15930                                           (length - 1) *
15931                                               (spacing == kSingle ? 1 : 2);
15932                                       TransferType transfer = kAllLanes;
15933                                       unsigned rn = (instr >> 16) & 0xf;
15934                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15935                                       vld2(CurrentCond(),
15936                                            dt,
15937                                            NeonRegisterList(DRegister(first),
15938                                                             DRegister(last),
15939                                                             spacing,
15940                                                             transfer),
15941                                            AlignedMemOperand(Register(rn),
15942                                                              align,
15943                                                              PostIndex));
15944                                       break;
15945                                     }
15946                                     case 0x00000002: {
15947                                       // 0xf9a00d0f
15948                                       DataType dt =
15949                                           Dt_size_7_Decode((instr >> 6) & 0x3);
15950                                       if (dt.Is(kDataTypeValueInvalid)) {
15951                                         UnallocatedT32(instr);
15952                                         return;
15953                                       }
15954                                       Alignment align =
15955                                           Align_a_2_Decode((instr >> 4) & 0x1,
15956                                                            dt);
15957                                       if (dt.Is(kDataTypeValueInvalid) ||
15958                                           align.Is(kBadAlignment)) {
15959                                         UnallocatedT32(instr);
15960                                         return;
15961                                       }
15962                                       unsigned first =
15963                                           ExtractDRegister(instr, 22, 12);
15964                                       unsigned length;
15965                                       SpacingType spacing;
15966                                       switch ((instr >> 5) & 0x1) {
15967                                         default:
15968                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
15969                                         case 0x0:
15970                                           length = 2;
15971                                           spacing = kSingle;
15972                                           break;
15973                                         case 0x1:
15974                                           length = 2;
15975                                           spacing = kDouble;
15976                                           break;
15977                                       }
15978                                       unsigned last =
15979                                           first +
15980                                           (length - 1) *
15981                                               (spacing == kSingle ? 1 : 2);
15982                                       TransferType transfer = kAllLanes;
15983                                       unsigned rn = (instr >> 16) & 0xf;
15984                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15985                                       vld2(CurrentCond(),
15986                                            dt,
15987                                            NeonRegisterList(DRegister(first),
15988                                                             DRegister(last),
15989                                                             spacing,
15990                                                             transfer),
15991                                            AlignedMemOperand(Register(rn),
15992                                                              align,
15993                                                              Offset));
15994                                       break;
15995                                     }
15996                                   }
15997                                   break;
15998                                 }
15999                                 default: {
16000                                   if (((instr & 0xd) == 0xd)) {
16001                                     UnallocatedT32(instr);
16002                                     return;
16003                                   }
16004                                   DataType dt =
16005                                       Dt_size_7_Decode((instr >> 6) & 0x3);
16006                                   if (dt.Is(kDataTypeValueInvalid)) {
16007                                     UnallocatedT32(instr);
16008                                     return;
16009                                   }
16010                                   Alignment align =
16011                                       Align_a_2_Decode((instr >> 4) & 0x1, dt);
16012                                   if (dt.Is(kDataTypeValueInvalid) ||
16013                                       align.Is(kBadAlignment)) {
16014                                     UnallocatedT32(instr);
16015                                     return;
16016                                   }
16017                                   unsigned first =
16018                                       ExtractDRegister(instr, 22, 12);
16019                                   unsigned length;
16020                                   SpacingType spacing;
16021                                   switch ((instr >> 5) & 0x1) {
16022                                     default:
16023                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
16024                                     case 0x0:
16025                                       length = 2;
16026                                       spacing = kSingle;
16027                                       break;
16028                                     case 0x1:
16029                                       length = 2;
16030                                       spacing = kDouble;
16031                                       break;
16032                                   }
16033                                   unsigned last =
16034                                       first +
16035                                       (length - 1) *
16036                                           (spacing == kSingle ? 1 : 2);
16037                                   TransferType transfer = kAllLanes;
16038                                   unsigned rn = (instr >> 16) & 0xf;
16039                                   unsigned rm = instr & 0xf;
16040                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16041                                   vld2(CurrentCond(),
16042                                        dt,
16043                                        NeonRegisterList(DRegister(first),
16044                                                         DRegister(last),
16045                                                         spacing,
16046                                                         transfer),
16047                                        AlignedMemOperand(Register(rn),
16048                                                          align,
16049                                                          Register(rm),
16050                                                          PostIndex));
16051                                   break;
16052                                 }
16053                               }
16054                               break;
16055                             }
16056                             default: {
16057                               switch (instr & 0x0000000d) {
16058                                 case 0x0000000d: {
16059                                   // 0xf9a0010d
16060                                   switch (instr & 0x00000002) {
16061                                     case 0x00000000: {
16062                                       // 0xf9a0010d
16063                                       if (((instr & 0xc00) == 0xc00)) {
16064                                         UnallocatedT32(instr);
16065                                         return;
16066                                       }
16067                                       DataType dt =
16068                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16069                                       if (dt.Is(kDataTypeValueInvalid)) {
16070                                         UnallocatedT32(instr);
16071                                         return;
16072                                       }
16073                                       DecodeNeonAndAlign decode_neon =
16074                                           Align_index_align_2_Decode((instr >>
16075                                                                       4) &
16076                                                                          0xf,
16077                                                                      dt);
16078                                       if (!decode_neon.IsValid()) {
16079                                         UnallocatedT32(instr);
16080                                         return;
16081                                       }
16082                                       Alignment align = decode_neon.GetAlign();
16083                                       int lane = decode_neon.GetLane();
16084                                       SpacingType spacing =
16085                                           decode_neon.GetSpacing();
16086                                       unsigned first =
16087                                           ExtractDRegister(instr, 22, 12);
16088                                       unsigned length = 2;
16089                                       unsigned last =
16090                                           first +
16091                                           (length - 1) *
16092                                               (spacing == kSingle ? 1 : 2);
16093                                       unsigned rn = (instr >> 16) & 0xf;
16094                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16095                                       vld2(CurrentCond(),
16096                                            dt,
16097                                            NeonRegisterList(DRegister(first),
16098                                                             DRegister(last),
16099                                                             spacing,
16100                                                             lane),
16101                                            AlignedMemOperand(Register(rn),
16102                                                              align,
16103                                                              PostIndex));
16104                                       break;
16105                                     }
16106                                     case 0x00000002: {
16107                                       // 0xf9a0010f
16108                                       if (((instr & 0xc00) == 0xc00)) {
16109                                         UnallocatedT32(instr);
16110                                         return;
16111                                       }
16112                                       DataType dt =
16113                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16114                                       if (dt.Is(kDataTypeValueInvalid)) {
16115                                         UnallocatedT32(instr);
16116                                         return;
16117                                       }
16118                                       DecodeNeonAndAlign decode_neon =
16119                                           Align_index_align_2_Decode((instr >>
16120                                                                       4) &
16121                                                                          0xf,
16122                                                                      dt);
16123                                       if (!decode_neon.IsValid()) {
16124                                         UnallocatedT32(instr);
16125                                         return;
16126                                       }
16127                                       Alignment align = decode_neon.GetAlign();
16128                                       int lane = decode_neon.GetLane();
16129                                       SpacingType spacing =
16130                                           decode_neon.GetSpacing();
16131                                       unsigned first =
16132                                           ExtractDRegister(instr, 22, 12);
16133                                       unsigned length = 2;
16134                                       unsigned last =
16135                                           first +
16136                                           (length - 1) *
16137                                               (spacing == kSingle ? 1 : 2);
16138                                       unsigned rn = (instr >> 16) & 0xf;
16139                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16140                                       vld2(CurrentCond(),
16141                                            dt,
16142                                            NeonRegisterList(DRegister(first),
16143                                                             DRegister(last),
16144                                                             spacing,
16145                                                             lane),
16146                                            AlignedMemOperand(Register(rn),
16147                                                              align,
16148                                                              Offset));
16149                                       break;
16150                                     }
16151                                   }
16152                                   break;
16153                                 }
16154                                 default: {
16155                                   if (((instr & 0xc00) == 0xc00) ||
16156                                       ((instr & 0xd) == 0xd)) {
16157                                     UnallocatedT32(instr);
16158                                     return;
16159                                   }
16160                                   DataType dt =
16161                                       Dt_size_7_Decode((instr >> 10) & 0x3);
16162                                   if (dt.Is(kDataTypeValueInvalid)) {
16163                                     UnallocatedT32(instr);
16164                                     return;
16165                                   }
16166                                   DecodeNeonAndAlign decode_neon =
16167                                       Align_index_align_2_Decode((instr >> 4) &
16168                                                                      0xf,
16169                                                                  dt);
16170                                   if (!decode_neon.IsValid()) {
16171                                     UnallocatedT32(instr);
16172                                     return;
16173                                   }
16174                                   Alignment align = decode_neon.GetAlign();
16175                                   int lane = decode_neon.GetLane();
16176                                   SpacingType spacing =
16177                                       decode_neon.GetSpacing();
16178                                   unsigned first =
16179                                       ExtractDRegister(instr, 22, 12);
16180                                   unsigned length = 2;
16181                                   unsigned last =
16182                                       first +
16183                                       (length - 1) *
16184                                           (spacing == kSingle ? 1 : 2);
16185                                   unsigned rn = (instr >> 16) & 0xf;
16186                                   unsigned rm = instr & 0xf;
16187                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16188                                   vld2(CurrentCond(),
16189                                        dt,
16190                                        NeonRegisterList(DRegister(first),
16191                                                         DRegister(last),
16192                                                         spacing,
16193                                                         lane),
16194                                        AlignedMemOperand(Register(rn),
16195                                                          align,
16196                                                          Register(rm),
16197                                                          PostIndex));
16198                                   break;
16199                                 }
16200                               }
16201                               break;
16202                             }
16203                           }
16204                           break;
16205                         }
16206                         case 0x00000200: {
16207                           // 0xf9a00200
16208                           switch (instr & 0x00000c00) {
16209                             case 0x00000c00: {
16210                               // 0xf9a00e00
16211                               switch (instr & 0x00000010) {
16212                                 case 0x00000000: {
16213                                   // 0xf9a00e00
16214                                   switch (instr & 0x0000000d) {
16215                                     case 0x0000000d: {
16216                                       // 0xf9a00e0d
16217                                       switch (instr & 0x00000002) {
16218                                         case 0x00000000: {
16219                                           // 0xf9a00e0d
16220                                           DataType dt = Dt_size_7_Decode(
16221                                               (instr >> 6) & 0x3);
16222                                           if (dt.Is(kDataTypeValueInvalid)) {
16223                                             UnallocatedT32(instr);
16224                                             return;
16225                                           }
16226                                           unsigned first =
16227                                               ExtractDRegister(instr, 22, 12);
16228                                           unsigned length;
16229                                           SpacingType spacing;
16230                                           switch ((instr >> 5) & 0x1) {
16231                                             default:
16232                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
16233                                             case 0x0:
16234                                               length = 3;
16235                                               spacing = kSingle;
16236                                               break;
16237                                             case 0x1:
16238                                               length = 3;
16239                                               spacing = kDouble;
16240                                               break;
16241                                           }
16242                                           unsigned last =
16243                                               first +
16244                                               (length - 1) *
16245                                                   (spacing == kSingle ? 1 : 2);
16246                                           TransferType transfer = kAllLanes;
16247                                           unsigned rn = (instr >> 16) & 0xf;
16248                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
16249                                           vld3(CurrentCond(),
16250                                                dt,
16251                                                NeonRegisterList(DRegister(
16252                                                                     first),
16253                                                                 DRegister(last),
16254                                                                 spacing,
16255                                                                 transfer),
16256                                                MemOperand(Register(rn),
16257                                                           PostIndex));
16258                                           break;
16259                                         }
16260                                         case 0x00000002: {
16261                                           // 0xf9a00e0f
16262                                           DataType dt = Dt_size_7_Decode(
16263                                               (instr >> 6) & 0x3);
16264                                           if (dt.Is(kDataTypeValueInvalid)) {
16265                                             UnallocatedT32(instr);
16266                                             return;
16267                                           }
16268                                           unsigned first =
16269                                               ExtractDRegister(instr, 22, 12);
16270                                           unsigned length;
16271                                           SpacingType spacing;
16272                                           switch ((instr >> 5) & 0x1) {
16273                                             default:
16274                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
16275                                             case 0x0:
16276                                               length = 3;
16277                                               spacing = kSingle;
16278                                               break;
16279                                             case 0x1:
16280                                               length = 3;
16281                                               spacing = kDouble;
16282                                               break;
16283                                           }
16284                                           unsigned last =
16285                                               first +
16286                                               (length - 1) *
16287                                                   (spacing == kSingle ? 1 : 2);
16288                                           TransferType transfer = kAllLanes;
16289                                           unsigned rn = (instr >> 16) & 0xf;
16290                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
16291                                           vld3(CurrentCond(),
16292                                                dt,
16293                                                NeonRegisterList(DRegister(
16294                                                                     first),
16295                                                                 DRegister(last),
16296                                                                 spacing,
16297                                                                 transfer),
16298                                                MemOperand(Register(rn),
16299                                                           Offset));
16300                                           break;
16301                                         }
16302                                       }
16303                                       break;
16304                                     }
16305                                     default: {
16306                                       if (((instr & 0xd) == 0xd)) {
16307                                         UnallocatedT32(instr);
16308                                         return;
16309                                       }
16310                                       DataType dt =
16311                                           Dt_size_7_Decode((instr >> 6) & 0x3);
16312                                       if (dt.Is(kDataTypeValueInvalid)) {
16313                                         UnallocatedT32(instr);
16314                                         return;
16315                                       }
16316                                       unsigned first =
16317                                           ExtractDRegister(instr, 22, 12);
16318                                       unsigned length;
16319                                       SpacingType spacing;
16320                                       switch ((instr >> 5) & 0x1) {
16321                                         default:
16322                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
16323                                         case 0x0:
16324                                           length = 3;
16325                                           spacing = kSingle;
16326                                           break;
16327                                         case 0x1:
16328                                           length = 3;
16329                                           spacing = kDouble;
16330                                           break;
16331                                       }
16332                                       unsigned last =
16333                                           first +
16334                                           (length - 1) *
16335                                               (spacing == kSingle ? 1 : 2);
16336                                       TransferType transfer = kAllLanes;
16337                                       unsigned rn = (instr >> 16) & 0xf;
16338                                       Sign sign(plus);
16339                                       unsigned rm = instr & 0xf;
16340                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
16341                                       vld3(CurrentCond(),
16342                                            dt,
16343                                            NeonRegisterList(DRegister(first),
16344                                                             DRegister(last),
16345                                                             spacing,
16346                                                             transfer),
16347                                            MemOperand(Register(rn),
16348                                                       sign,
16349                                                       Register(rm),
16350                                                       PostIndex));
16351                                       break;
16352                                     }
16353                                   }
16354                                   break;
16355                                 }
16356                                 default:
16357                                   UnallocatedT32(instr);
16358                                   break;
16359                               }
16360                               break;
16361                             }
16362                             default: {
16363                               switch (instr & 0x0000000d) {
16364                                 case 0x0000000d: {
16365                                   // 0xf9a0020d
16366                                   switch (instr & 0x00000002) {
16367                                     case 0x00000000: {
16368                                       // 0xf9a0020d
16369                                       if (((instr & 0xc00) == 0xc00)) {
16370                                         UnallocatedT32(instr);
16371                                         return;
16372                                       }
16373                                       DataType dt =
16374                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16375                                       if (dt.Is(kDataTypeValueInvalid)) {
16376                                         UnallocatedT32(instr);
16377                                         return;
16378                                       }
16379                                       DecodeNeon decode_neon =
16380                                           Index_1_Decode((instr >> 4) & 0xf,
16381                                                          dt);
16382                                       if (!decode_neon.IsValid()) {
16383                                         UnallocatedT32(instr);
16384                                         return;
16385                                       }
16386                                       int lane = decode_neon.GetLane();
16387                                       SpacingType spacing =
16388                                           decode_neon.GetSpacing();
16389                                       unsigned first =
16390                                           ExtractDRegister(instr, 22, 12);
16391                                       unsigned length = 3;
16392                                       unsigned last =
16393                                           first +
16394                                           (length - 1) *
16395                                               (spacing == kSingle ? 1 : 2);
16396                                       unsigned rn = (instr >> 16) & 0xf;
16397                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
16398                                       vld3(CurrentCond(),
16399                                            dt,
16400                                            NeonRegisterList(DRegister(first),
16401                                                             DRegister(last),
16402                                                             spacing,
16403                                                             lane),
16404                                            MemOperand(Register(rn), PostIndex));
16405                                       break;
16406                                     }
16407                                     case 0x00000002: {
16408                                       // 0xf9a0020f
16409                                       if (((instr & 0xc00) == 0xc00)) {
16410                                         UnallocatedT32(instr);
16411                                         return;
16412                                       }
16413                                       DataType dt =
16414                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16415                                       if (dt.Is(kDataTypeValueInvalid)) {
16416                                         UnallocatedT32(instr);
16417                                         return;
16418                                       }
16419                                       DecodeNeon decode_neon =
16420                                           Index_1_Decode((instr >> 4) & 0xf,
16421                                                          dt);
16422                                       if (!decode_neon.IsValid()) {
16423                                         UnallocatedT32(instr);
16424                                         return;
16425                                       }
16426                                       int lane = decode_neon.GetLane();
16427                                       SpacingType spacing =
16428                                           decode_neon.GetSpacing();
16429                                       unsigned first =
16430                                           ExtractDRegister(instr, 22, 12);
16431                                       unsigned length = 3;
16432                                       unsigned last =
16433                                           first +
16434                                           (length - 1) *
16435                                               (spacing == kSingle ? 1 : 2);
16436                                       unsigned rn = (instr >> 16) & 0xf;
16437                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
16438                                       vld3(CurrentCond(),
16439                                            dt,
16440                                            NeonRegisterList(DRegister(first),
16441                                                             DRegister(last),
16442                                                             spacing,
16443                                                             lane),
16444                                            MemOperand(Register(rn), Offset));
16445                                       break;
16446                                     }
16447                                   }
16448                                   break;
16449                                 }
16450                                 default: {
16451                                   if (((instr & 0xc00) == 0xc00) ||
16452                                       ((instr & 0xd) == 0xd)) {
16453                                     UnallocatedT32(instr);
16454                                     return;
16455                                   }
16456                                   DataType dt =
16457                                       Dt_size_7_Decode((instr >> 10) & 0x3);
16458                                   if (dt.Is(kDataTypeValueInvalid)) {
16459                                     UnallocatedT32(instr);
16460                                     return;
16461                                   }
16462                                   DecodeNeon decode_neon =
16463                                       Index_1_Decode((instr >> 4) & 0xf, dt);
16464                                   if (!decode_neon.IsValid()) {
16465                                     UnallocatedT32(instr);
16466                                     return;
16467                                   }
16468                                   int lane = decode_neon.GetLane();
16469                                   SpacingType spacing =
16470                                       decode_neon.GetSpacing();
16471                                   unsigned first =
16472                                       ExtractDRegister(instr, 22, 12);
16473                                   unsigned length = 3;
16474                                   unsigned last =
16475                                       first +
16476                                       (length - 1) *
16477                                           (spacing == kSingle ? 1 : 2);
16478                                   unsigned rn = (instr >> 16) & 0xf;
16479                                   Sign sign(plus);
16480                                   unsigned rm = instr & 0xf;
16481                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
16482                                   vld3(CurrentCond(),
16483                                        dt,
16484                                        NeonRegisterList(DRegister(first),
16485                                                         DRegister(last),
16486                                                         spacing,
16487                                                         lane),
16488                                        MemOperand(Register(rn),
16489                                                   sign,
16490                                                   Register(rm),
16491                                                   PostIndex));
16492                                   break;
16493                                 }
16494                               }
16495                               break;
16496                             }
16497                           }
16498                           break;
16499                         }
16500                         case 0x00000300: {
16501                           // 0xf9a00300
16502                           switch (instr & 0x00000c00) {
16503                             case 0x00000c00: {
16504                               // 0xf9a00f00
16505                               switch (instr & 0x0000000d) {
16506                                 case 0x0000000d: {
16507                                   // 0xf9a00f0d
16508                                   switch (instr & 0x00000002) {
16509                                     case 0x00000000: {
16510                                       // 0xf9a00f0d
16511                                       DataType dt =
16512                                           Dt_size_8_Decode((instr >> 6) & 0x3);
16513                                       if (dt.Is(kDataTypeValueInvalid)) {
16514                                         UnallocatedT32(instr);
16515                                         return;
16516                                       }
16517                                       Alignment align =
16518                                           Align_a_3_Decode((instr >> 4) & 0x1,
16519                                                            dt,
16520                                                            (instr >> 6) & 0x3);
16521                                       if (dt.Is(kDataTypeValueInvalid) ||
16522                                           align.Is(kBadAlignment)) {
16523                                         UnallocatedT32(instr);
16524                                         return;
16525                                       }
16526                                       unsigned first =
16527                                           ExtractDRegister(instr, 22, 12);
16528                                       unsigned length;
16529                                       SpacingType spacing;
16530                                       switch ((instr >> 5) & 0x1) {
16531                                         default:
16532                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
16533                                         case 0x0:
16534                                           length = 4;
16535                                           spacing = kSingle;
16536                                           break;
16537                                         case 0x1:
16538                                           length = 4;
16539                                           spacing = kDouble;
16540                                           break;
16541                                       }
16542                                       unsigned last =
16543                                           first +
16544                                           (length - 1) *
16545                                               (spacing == kSingle ? 1 : 2);
16546                                       TransferType transfer = kAllLanes;
16547                                       unsigned rn = (instr >> 16) & 0xf;
16548                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16549                                       vld4(CurrentCond(),
16550                                            dt,
16551                                            NeonRegisterList(DRegister(first),
16552                                                             DRegister(last),
16553                                                             spacing,
16554                                                             transfer),
16555                                            AlignedMemOperand(Register(rn),
16556                                                              align,
16557                                                              PostIndex));
16558                                       break;
16559                                     }
16560                                     case 0x00000002: {
16561                                       // 0xf9a00f0f
16562                                       DataType dt =
16563                                           Dt_size_8_Decode((instr >> 6) & 0x3);
16564                                       if (dt.Is(kDataTypeValueInvalid)) {
16565                                         UnallocatedT32(instr);
16566                                         return;
16567                                       }
16568                                       Alignment align =
16569                                           Align_a_3_Decode((instr >> 4) & 0x1,
16570                                                            dt,
16571                                                            (instr >> 6) & 0x3);
16572                                       if (dt.Is(kDataTypeValueInvalid) ||
16573                                           align.Is(kBadAlignment)) {
16574                                         UnallocatedT32(instr);
16575                                         return;
16576                                       }
16577                                       unsigned first =
16578                                           ExtractDRegister(instr, 22, 12);
16579                                       unsigned length;
16580                                       SpacingType spacing;
16581                                       switch ((instr >> 5) & 0x1) {
16582                                         default:
16583                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
16584                                         case 0x0:
16585                                           length = 4;
16586                                           spacing = kSingle;
16587                                           break;
16588                                         case 0x1:
16589                                           length = 4;
16590                                           spacing = kDouble;
16591                                           break;
16592                                       }
16593                                       unsigned last =
16594                                           first +
16595                                           (length - 1) *
16596                                               (spacing == kSingle ? 1 : 2);
16597                                       TransferType transfer = kAllLanes;
16598                                       unsigned rn = (instr >> 16) & 0xf;
16599                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16600                                       vld4(CurrentCond(),
16601                                            dt,
16602                                            NeonRegisterList(DRegister(first),
16603                                                             DRegister(last),
16604                                                             spacing,
16605                                                             transfer),
16606                                            AlignedMemOperand(Register(rn),
16607                                                              align,
16608                                                              Offset));
16609                                       break;
16610                                     }
16611                                   }
16612                                   break;
16613                                 }
16614                                 default: {
16615                                   if (((instr & 0xd) == 0xd)) {
16616                                     UnallocatedT32(instr);
16617                                     return;
16618                                   }
16619                                   DataType dt =
16620                                       Dt_size_8_Decode((instr >> 6) & 0x3);
16621                                   if (dt.Is(kDataTypeValueInvalid)) {
16622                                     UnallocatedT32(instr);
16623                                     return;
16624                                   }
16625                                   Alignment align =
16626                                       Align_a_3_Decode((instr >> 4) & 0x1,
16627                                                        dt,
16628                                                        (instr >> 6) & 0x3);
16629                                   if (dt.Is(kDataTypeValueInvalid) ||
16630                                       align.Is(kBadAlignment)) {
16631                                     UnallocatedT32(instr);
16632                                     return;
16633                                   }
16634                                   unsigned first =
16635                                       ExtractDRegister(instr, 22, 12);
16636                                   unsigned length;
16637                                   SpacingType spacing;
16638                                   switch ((instr >> 5) & 0x1) {
16639                                     default:
16640                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
16641                                     case 0x0:
16642                                       length = 4;
16643                                       spacing = kSingle;
16644                                       break;
16645                                     case 0x1:
16646                                       length = 4;
16647                                       spacing = kDouble;
16648                                       break;
16649                                   }
16650                                   unsigned last =
16651                                       first +
16652                                       (length - 1) *
16653                                           (spacing == kSingle ? 1 : 2);
16654                                   TransferType transfer = kAllLanes;
16655                                   unsigned rn = (instr >> 16) & 0xf;
16656                                   unsigned rm = instr & 0xf;
16657                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16658                                   vld4(CurrentCond(),
16659                                        dt,
16660                                        NeonRegisterList(DRegister(first),
16661                                                         DRegister(last),
16662                                                         spacing,
16663                                                         transfer),
16664                                        AlignedMemOperand(Register(rn),
16665                                                          align,
16666                                                          Register(rm),
16667                                                          PostIndex));
16668                                   break;
16669                                 }
16670                               }
16671                               break;
16672                             }
16673                             default: {
16674                               switch (instr & 0x0000000d) {
16675                                 case 0x0000000d: {
16676                                   // 0xf9a0030d
16677                                   switch (instr & 0x00000002) {
16678                                     case 0x00000000: {
16679                                       // 0xf9a0030d
16680                                       if (((instr & 0xc00) == 0xc00)) {
16681                                         UnallocatedT32(instr);
16682                                         return;
16683                                       }
16684                                       DataType dt =
16685                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16686                                       if (dt.Is(kDataTypeValueInvalid)) {
16687                                         UnallocatedT32(instr);
16688                                         return;
16689                                       }
16690                                       DecodeNeonAndAlign decode_neon =
16691                                           Align_index_align_3_Decode((instr >>
16692                                                                       4) &
16693                                                                          0xf,
16694                                                                      dt);
16695                                       if (!decode_neon.IsValid()) {
16696                                         UnallocatedT32(instr);
16697                                         return;
16698                                       }
16699                                       Alignment align = decode_neon.GetAlign();
16700                                       int lane = decode_neon.GetLane();
16701                                       SpacingType spacing =
16702                                           decode_neon.GetSpacing();
16703                                       unsigned first =
16704                                           ExtractDRegister(instr, 22, 12);
16705                                       unsigned length = 4;
16706                                       unsigned last =
16707                                           first +
16708                                           (length - 1) *
16709                                               (spacing == kSingle ? 1 : 2);
16710                                       unsigned rn = (instr >> 16) & 0xf;
16711                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16712                                       vld4(CurrentCond(),
16713                                            dt,
16714                                            NeonRegisterList(DRegister(first),
16715                                                             DRegister(last),
16716                                                             spacing,
16717                                                             lane),
16718                                            AlignedMemOperand(Register(rn),
16719                                                              align,
16720                                                              PostIndex));
16721                                       break;
16722                                     }
16723                                     case 0x00000002: {
16724                                       // 0xf9a0030f
16725                                       if (((instr & 0xc00) == 0xc00)) {
16726                                         UnallocatedT32(instr);
16727                                         return;
16728                                       }
16729                                       DataType dt =
16730                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16731                                       if (dt.Is(kDataTypeValueInvalid)) {
16732                                         UnallocatedT32(instr);
16733                                         return;
16734                                       }
16735                                       DecodeNeonAndAlign decode_neon =
16736                                           Align_index_align_3_Decode((instr >>
16737                                                                       4) &
16738                                                                          0xf,
16739                                                                      dt);
16740                                       if (!decode_neon.IsValid()) {
16741                                         UnallocatedT32(instr);
16742                                         return;
16743                                       }
16744                                       Alignment align = decode_neon.GetAlign();
16745                                       int lane = decode_neon.GetLane();
16746                                       SpacingType spacing =
16747                                           decode_neon.GetSpacing();
16748                                       unsigned first =
16749                                           ExtractDRegister(instr, 22, 12);
16750                                       unsigned length = 4;
16751                                       unsigned last =
16752                                           first +
16753                                           (length - 1) *
16754                                               (spacing == kSingle ? 1 : 2);
16755                                       unsigned rn = (instr >> 16) & 0xf;
16756                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16757                                       vld4(CurrentCond(),
16758                                            dt,
16759                                            NeonRegisterList(DRegister(first),
16760                                                             DRegister(last),
16761                                                             spacing,
16762                                                             lane),
16763                                            AlignedMemOperand(Register(rn),
16764                                                              align,
16765                                                              Offset));
16766                                       break;
16767                                     }
16768                                   }
16769                                   break;
16770                                 }
16771                                 default: {
16772                                   if (((instr & 0xc00) == 0xc00) ||
16773                                       ((instr & 0xd) == 0xd)) {
16774                                     UnallocatedT32(instr);
16775                                     return;
16776                                   }
16777                                   DataType dt =
16778                                       Dt_size_7_Decode((instr >> 10) & 0x3);
16779                                   if (dt.Is(kDataTypeValueInvalid)) {
16780                                     UnallocatedT32(instr);
16781                                     return;
16782                                   }
16783                                   DecodeNeonAndAlign decode_neon =
16784                                       Align_index_align_3_Decode((instr >> 4) &
16785                                                                      0xf,
16786                                                                  dt);
16787                                   if (!decode_neon.IsValid()) {
16788                                     UnallocatedT32(instr);
16789                                     return;
16790                                   }
16791                                   Alignment align = decode_neon.GetAlign();
16792                                   int lane = decode_neon.GetLane();
16793                                   SpacingType spacing =
16794                                       decode_neon.GetSpacing();
16795                                   unsigned first =
16796                                       ExtractDRegister(instr, 22, 12);
16797                                   unsigned length = 4;
16798                                   unsigned last =
16799                                       first +
16800                                       (length - 1) *
16801                                           (spacing == kSingle ? 1 : 2);
16802                                   unsigned rn = (instr >> 16) & 0xf;
16803                                   unsigned rm = instr & 0xf;
16804                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16805                                   vld4(CurrentCond(),
16806                                        dt,
16807                                        NeonRegisterList(DRegister(first),
16808                                                         DRegister(last),
16809                                                         spacing,
16810                                                         lane),
16811                                        AlignedMemOperand(Register(rn),
16812                                                          align,
16813                                                          Register(rm),
16814                                                          PostIndex));
16815                                   break;
16816                                 }
16817                               }
16818                               break;
16819                             }
16820                           }
16821                           break;
16822                         }
16823                       }
16824                       break;
16825                     }
16826                   }
16827                   break;
16828                 }
16829                 case 0x10100000: {
16830                   // 0xf8100000
16831                   switch (instr & 0x01400000) {
16832                     case 0x00000000: {
16833                       // 0xf8100000
16834                       switch (instr & 0x000f0000) {
16835                         case 0x000f0000: {
16836                           // 0xf81f0000
16837                           switch (instr & 0x0000f000) {
16838                             case 0x0000f000: {
16839                               // 0xf81ff000
16840                               uint32_t U = (instr >> 23) & 0x1;
16841                               int32_t imm = instr & 0xfff;
16842                               if (U == 0) imm = -imm;
16843                               bool minus_zero = (imm == 0) && (U == 0);
16844                               Location location(imm, kT32PcDelta);
16845                               // PLD{<c>}{<q>} <label> ; T1
16846                               if (minus_zero) {
16847                                 pld(CurrentCond(), MemOperand(pc, minus, 0));
16848                               } else {
16849                                 pld(CurrentCond(), &location);
16850                               }
16851                               if (((instr & 0xff7ff000) != 0xf81ff000)) {
16852                                 UnpredictableT32(instr);
16853                               }
16854                               break;
16855                             }
16856                             default: {
16857                               switch (instr & 0x00200000) {
16858                                 case 0x00000000: {
16859                                   // 0xf81f0000
16860                                   if (((instr & 0xf000) == 0xf000)) {
16861                                     UnallocatedT32(instr);
16862                                     return;
16863                                   }
16864                                   unsigned rt = (instr >> 12) & 0xf;
16865                                   uint32_t U = (instr >> 23) & 0x1;
16866                                   int32_t imm = instr & 0xfff;
16867                                   if (U == 0) imm = -imm;
16868                                   bool minus_zero = (imm == 0) && (U == 0);
16869                                   Location location(imm, kT32PcDelta);
16870                                   // LDRB{<c>}{<q>} <Rt>, <label> ; T1
16871                                   if (minus_zero) {
16872                                     ldrb(CurrentCond(),
16873                                          Best,
16874                                          Register(rt),
16875                                          MemOperand(pc, minus, 0));
16876                                   } else {
16877                                     ldrb(CurrentCond(),
16878                                          Register(rt),
16879                                          &location);
16880                                   }
16881                                   break;
16882                                 }
16883                                 case 0x00200000: {
16884                                   // 0xf83f0000
16885                                   if (((instr & 0xf000) == 0xf000)) {
16886                                     UnallocatedT32(instr);
16887                                     return;
16888                                   }
16889                                   unsigned rt = (instr >> 12) & 0xf;
16890                                   uint32_t U = (instr >> 23) & 0x1;
16891                                   int32_t imm = instr & 0xfff;
16892                                   if (U == 0) imm = -imm;
16893                                   bool minus_zero = (imm == 0) && (U == 0);
16894                                   Location location(imm, kT32PcDelta);
16895                                   // LDRH{<c>}{<q>} <Rt>, <label> ; T1
16896                                   if (minus_zero) {
16897                                     ldrh(CurrentCond(),
16898                                          Best,
16899                                          Register(rt),
16900                                          MemOperand(pc, minus, 0));
16901                                   } else {
16902                                     ldrh(CurrentCond(),
16903                                          Register(rt),
16904                                          &location);
16905                                   }
16906                                   break;
16907                                 }
16908                               }
16909                               break;
16910                             }
16911                           }
16912                           break;
16913                         }
16914                         default: {
16915                           switch (instr & 0x00a00000) {
16916                             case 0x00000000: {
16917                               // 0xf8100000
16918                               switch (instr & 0x00000d00) {
16919                                 case 0x00000000: {
16920                                   // 0xf8100000
16921                                   switch (instr & 0x000002c0) {
16922                                     case 0x00000000: {
16923                                       // 0xf8100000
16924                                       switch (instr & 0x0000f000) {
16925                                         case 0x0000f000: {
16926                                           // 0xf810f000
16927                                           if (((instr & 0xf0000) == 0xf0000)) {
16928                                             UnallocatedT32(instr);
16929                                             return;
16930                                           }
16931                                           unsigned rn = (instr >> 16) & 0xf;
16932                                           Sign sign(plus);
16933                                           unsigned rm = instr & 0xf;
16934                                           Shift shift = LSL;
16935                                           uint32_t amount = (instr >> 4) & 0x3;
16936                                           AddrMode addrmode = Offset;
16937                                           // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
16938                                           pld(CurrentCond(),
16939                                               MemOperand(Register(rn),
16940                                                          sign,
16941                                                          Register(rm),
16942                                                          shift,
16943                                                          amount,
16944                                                          addrmode));
16945                                           break;
16946                                         }
16947                                         default: {
16948                                           if (((instr & 0xf0000) == 0xf0000) ||
16949                                               ((instr & 0xf000) == 0xf000)) {
16950                                             UnallocatedT32(instr);
16951                                             return;
16952                                           }
16953                                           unsigned rt = (instr >> 12) & 0xf;
16954                                           unsigned rn = (instr >> 16) & 0xf;
16955                                           Sign sign(plus);
16956                                           unsigned rm = instr & 0xf;
16957                                           Shift shift = LSL;
16958                                           uint32_t amount = (instr >> 4) & 0x3;
16959                                           AddrMode addrmode = Offset;
16960                                           if ((rt < kNumberOfT32LowRegisters) &&
16961                                               (rn < kNumberOfT32LowRegisters) &&
16962                                               (rm < kNumberOfT32LowRegisters) &&
16963                                               shift.IsLSL() && (amount == 0) &&
16964                                               sign.IsPlus()) {
16965                                             // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
16966                                             ldrb(CurrentCond(),
16967                                                  Wide,
16968                                                  Register(rt),
16969                                                  MemOperand(Register(rn),
16970                                                             sign,
16971                                                             Register(rm),
16972                                                             addrmode));
16973                                           } else {
16974                                             // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
16975                                             ldrb(CurrentCond(),
16976                                                  Best,
16977                                                  Register(rt),
16978                                                  MemOperand(Register(rn),
16979                                                             sign,
16980                                                             Register(rm),
16981                                                             shift,
16982                                                             amount,
16983                                                             addrmode));
16984                                           }
16985                                           break;
16986                                         }
16987                                       }
16988                                       break;
16989                                     }
16990                                     default:
16991                                       UnallocatedT32(instr);
16992                                       break;
16993                                   }
16994                                   break;
16995                                 }
16996                                 case 0x00000900: {
16997                                   // 0xf8100900
16998                                   if (((instr & 0xf0000) == 0xf0000)) {
16999                                     UnallocatedT32(instr);
17000                                     return;
17001                                   }
17002                                   unsigned rt = (instr >> 12) & 0xf;
17003                                   unsigned rn = (instr >> 16) & 0xf;
17004                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17005                                                                         : plus);
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                                                   sign,
17013                                                   offset,
17014                                                   PostIndex));
17015                                   break;
17016                                 }
17017                                 case 0x00000c00: {
17018                                   // 0xf8100c00
17019                                   switch (instr & 0x00000200) {
17020                                     case 0x00000000: {
17021                                       // 0xf8100c00
17022                                       switch (instr & 0x0000f000) {
17023                                         case 0x0000f000: {
17024                                           // 0xf810fc00
17025                                           if (((instr & 0xf0000) == 0xf0000)) {
17026                                             UnallocatedT32(instr);
17027                                             return;
17028                                           }
17029                                           unsigned rn = (instr >> 16) & 0xf;
17030                                           int32_t offset = instr & 0xff;
17031                                           // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17032                                           pld(CurrentCond(),
17033                                               MemOperand(Register(rn),
17034                                                          minus,
17035                                                          offset,
17036                                                          Offset));
17037                                           break;
17038                                         }
17039                                         default: {
17040                                           if (((instr & 0xf0000) == 0xf0000) ||
17041                                               ((instr & 0xf000) == 0xf000)) {
17042                                             UnallocatedT32(instr);
17043                                             return;
17044                                           }
17045                                           unsigned rt = (instr >> 12) & 0xf;
17046                                           unsigned rn = (instr >> 16) & 0xf;
17047                                           int32_t offset = instr & 0xff;
17048                                           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
17049                                           ldrb(CurrentCond(),
17050                                                Best,
17051                                                Register(rt),
17052                                                MemOperand(Register(rn),
17053                                                           minus,
17054                                                           offset,
17055                                                           Offset));
17056                                           break;
17057                                         }
17058                                       }
17059                                       break;
17060                                     }
17061                                     case 0x00000200: {
17062                                       // 0xf8100e00
17063                                       if (((instr & 0xf0000) == 0xf0000)) {
17064                                         UnallocatedT32(instr);
17065                                         return;
17066                                       }
17067                                       UnimplementedT32_32("LDRBT", instr);
17068                                       break;
17069                                     }
17070                                   }
17071                                   break;
17072                                 }
17073                                 case 0x00000d00: {
17074                                   // 0xf8100d00
17075                                   if (((instr & 0xf0000) == 0xf0000)) {
17076                                     UnallocatedT32(instr);
17077                                     return;
17078                                   }
17079                                   unsigned rt = (instr >> 12) & 0xf;
17080                                   unsigned rn = (instr >> 16) & 0xf;
17081                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17082                                                                         : plus);
17083                                   int32_t offset = instr & 0xff;
17084                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
17085                                   ldrb(CurrentCond(),
17086                                        Best,
17087                                        Register(rt),
17088                                        MemOperand(Register(rn),
17089                                                   sign,
17090                                                   offset,
17091                                                   PreIndex));
17092                                   break;
17093                                 }
17094                                 default:
17095                                   UnallocatedT32(instr);
17096                                   break;
17097                               }
17098                               break;
17099                             }
17100                             case 0x00200000: {
17101                               // 0xf8300000
17102                               switch (instr & 0x00000d00) {
17103                                 case 0x00000000: {
17104                                   // 0xf8300000
17105                                   switch (instr & 0x000002c0) {
17106                                     case 0x00000000: {
17107                                       // 0xf8300000
17108                                       switch (instr & 0x0000f000) {
17109                                         case 0x0000f000: {
17110                                           // 0xf830f000
17111                                           if (((instr & 0xf0000) == 0xf0000)) {
17112                                             UnallocatedT32(instr);
17113                                             return;
17114                                           }
17115                                           unsigned rn = (instr >> 16) & 0xf;
17116                                           Sign sign(plus);
17117                                           unsigned rm = instr & 0xf;
17118                                           Shift shift = LSL;
17119                                           uint32_t amount = (instr >> 4) & 0x3;
17120                                           AddrMode addrmode = Offset;
17121                                           // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
17122                                           pldw(CurrentCond(),
17123                                                MemOperand(Register(rn),
17124                                                           sign,
17125                                                           Register(rm),
17126                                                           shift,
17127                                                           amount,
17128                                                           addrmode));
17129                                           break;
17130                                         }
17131                                         default: {
17132                                           if (((instr & 0xf0000) == 0xf0000) ||
17133                                               ((instr & 0xf000) == 0xf000)) {
17134                                             UnallocatedT32(instr);
17135                                             return;
17136                                           }
17137                                           unsigned rt = (instr >> 12) & 0xf;
17138                                           unsigned rn = (instr >> 16) & 0xf;
17139                                           Sign sign(plus);
17140                                           unsigned rm = instr & 0xf;
17141                                           Shift shift = LSL;
17142                                           uint32_t amount = (instr >> 4) & 0x3;
17143                                           AddrMode addrmode = Offset;
17144                                           if ((rt < kNumberOfT32LowRegisters) &&
17145                                               (rn < kNumberOfT32LowRegisters) &&
17146                                               (rm < kNumberOfT32LowRegisters) &&
17147                                               shift.IsLSL() && (amount == 0) &&
17148                                               sign.IsPlus()) {
17149                                             // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17150                                             ldrh(CurrentCond(),
17151                                                  Wide,
17152                                                  Register(rt),
17153                                                  MemOperand(Register(rn),
17154                                                             sign,
17155                                                             Register(rm),
17156                                                             addrmode));
17157                                           } else {
17158                                             // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17159                                             ldrh(CurrentCond(),
17160                                                  Best,
17161                                                  Register(rt),
17162                                                  MemOperand(Register(rn),
17163                                                             sign,
17164                                                             Register(rm),
17165                                                             shift,
17166                                                             amount,
17167                                                             addrmode));
17168                                           }
17169                                           break;
17170                                         }
17171                                       }
17172                                       break;
17173                                     }
17174                                     default:
17175                                       UnallocatedT32(instr);
17176                                       break;
17177                                   }
17178                                   break;
17179                                 }
17180                                 case 0x00000900: {
17181                                   // 0xf8300900
17182                                   if (((instr & 0xf0000) == 0xf0000)) {
17183                                     UnallocatedT32(instr);
17184                                     return;
17185                                   }
17186                                   unsigned rt = (instr >> 12) & 0xf;
17187                                   unsigned rn = (instr >> 16) & 0xf;
17188                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17189                                                                         : plus);
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                                                   sign,
17197                                                   offset,
17198                                                   PostIndex));
17199                                   break;
17200                                 }
17201                                 case 0x00000c00: {
17202                                   // 0xf8300c00
17203                                   switch (instr & 0x00000200) {
17204                                     case 0x00000000: {
17205                                       // 0xf8300c00
17206                                       switch (instr & 0x0000f000) {
17207                                         case 0x0000f000: {
17208                                           // 0xf830fc00
17209                                           if (((instr & 0xf0000) == 0xf0000)) {
17210                                             UnallocatedT32(instr);
17211                                             return;
17212                                           }
17213                                           unsigned rn = (instr >> 16) & 0xf;
17214                                           int32_t offset = instr & 0xff;
17215                                           // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17216                                           pldw(CurrentCond(),
17217                                                MemOperand(Register(rn),
17218                                                           minus,
17219                                                           offset,
17220                                                           Offset));
17221                                           break;
17222                                         }
17223                                         default: {
17224                                           if (((instr & 0xf0000) == 0xf0000) ||
17225                                               ((instr & 0xf000) == 0xf000)) {
17226                                             UnallocatedT32(instr);
17227                                             return;
17228                                           }
17229                                           unsigned rt = (instr >> 12) & 0xf;
17230                                           unsigned rn = (instr >> 16) & 0xf;
17231                                           int32_t offset = instr & 0xff;
17232                                           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
17233                                           ldrh(CurrentCond(),
17234                                                Best,
17235                                                Register(rt),
17236                                                MemOperand(Register(rn),
17237                                                           minus,
17238                                                           offset,
17239                                                           Offset));
17240                                           break;
17241                                         }
17242                                       }
17243                                       break;
17244                                     }
17245                                     case 0x00000200: {
17246                                       // 0xf8300e00
17247                                       if (((instr & 0xf0000) == 0xf0000)) {
17248                                         UnallocatedT32(instr);
17249                                         return;
17250                                       }
17251                                       UnimplementedT32_32("LDRHT", instr);
17252                                       break;
17253                                     }
17254                                   }
17255                                   break;
17256                                 }
17257                                 case 0x00000d00: {
17258                                   // 0xf8300d00
17259                                   if (((instr & 0xf0000) == 0xf0000)) {
17260                                     UnallocatedT32(instr);
17261                                     return;
17262                                   }
17263                                   unsigned rt = (instr >> 12) & 0xf;
17264                                   unsigned rn = (instr >> 16) & 0xf;
17265                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17266                                                                         : plus);
17267                                   int32_t offset = instr & 0xff;
17268                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
17269                                   ldrh(CurrentCond(),
17270                                        Best,
17271                                        Register(rt),
17272                                        MemOperand(Register(rn),
17273                                                   sign,
17274                                                   offset,
17275                                                   PreIndex));
17276                                   break;
17277                                 }
17278                                 default:
17279                                   UnallocatedT32(instr);
17280                                   break;
17281                               }
17282                               break;
17283                             }
17284                             case 0x00800000: {
17285                               // 0xf8900000
17286                               switch (instr & 0x0000f000) {
17287                                 case 0x0000f000: {
17288                                   // 0xf890f000
17289                                   if (((instr & 0xf0000) == 0xf0000)) {
17290                                     UnallocatedT32(instr);
17291                                     return;
17292                                   }
17293                                   unsigned rn = (instr >> 16) & 0xf;
17294                                   int32_t offset = instr & 0xfff;
17295                                   // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17296                                   pld(CurrentCond(),
17297                                       MemOperand(Register(rn),
17298                                                  plus,
17299                                                  offset,
17300                                                  Offset));
17301                                   break;
17302                                 }
17303                                 default: {
17304                                   if (((instr & 0xf0000) == 0xf0000) ||
17305                                       ((instr & 0xf000) == 0xf000)) {
17306                                     UnallocatedT32(instr);
17307                                     return;
17308                                   }
17309                                   unsigned rt = (instr >> 12) & 0xf;
17310                                   unsigned rn = (instr >> 16) & 0xf;
17311                                   int32_t offset = instr & 0xfff;
17312                                   if ((rt < kNumberOfT32LowRegisters) &&
17313                                       (rn < kNumberOfT32LowRegisters) &&
17314                                       ((offset >= 0) && (offset <= 31))) {
17315                                     // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17316                                     ldrb(CurrentCond(),
17317                                          Wide,
17318                                          Register(rt),
17319                                          MemOperand(Register(rn),
17320                                                     plus,
17321                                                     offset,
17322                                                     Offset));
17323                                   } else {
17324                                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17325                                     ldrb(CurrentCond(),
17326                                          Best,
17327                                          Register(rt),
17328                                          MemOperand(Register(rn),
17329                                                     plus,
17330                                                     offset,
17331                                                     Offset));
17332                                   }
17333                                   break;
17334                                 }
17335                               }
17336                               break;
17337                             }
17338                             case 0x00a00000: {
17339                               // 0xf8b00000
17340                               switch (instr & 0x0000f000) {
17341                                 case 0x0000f000: {
17342                                   // 0xf8b0f000
17343                                   if (((instr & 0xf0000) == 0xf0000)) {
17344                                     UnallocatedT32(instr);
17345                                     return;
17346                                   }
17347                                   unsigned rn = (instr >> 16) & 0xf;
17348                                   int32_t offset = instr & 0xfff;
17349                                   // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17350                                   pldw(CurrentCond(),
17351                                        MemOperand(Register(rn),
17352                                                   plus,
17353                                                   offset,
17354                                                   Offset));
17355                                   break;
17356                                 }
17357                                 default: {
17358                                   if (((instr & 0xf0000) == 0xf0000) ||
17359                                       ((instr & 0xf000) == 0xf000)) {
17360                                     UnallocatedT32(instr);
17361                                     return;
17362                                   }
17363                                   unsigned rt = (instr >> 12) & 0xf;
17364                                   unsigned rn = (instr >> 16) & 0xf;
17365                                   int32_t offset = instr & 0xfff;
17366                                   if ((rt < kNumberOfT32LowRegisters) &&
17367                                       (rn < kNumberOfT32LowRegisters) &&
17368                                       ((offset >= 0) && (offset <= 62) &&
17369                                        ((offset & 1) == 0))) {
17370                                     // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17371                                     ldrh(CurrentCond(),
17372                                          Wide,
17373                                          Register(rt),
17374                                          MemOperand(Register(rn),
17375                                                     plus,
17376                                                     offset,
17377                                                     Offset));
17378                                   } else {
17379                                     // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17380                                     ldrh(CurrentCond(),
17381                                          Best,
17382                                          Register(rt),
17383                                          MemOperand(Register(rn),
17384                                                     plus,
17385                                                     offset,
17386                                                     Offset));
17387                                   }
17388                                   break;
17389                                 }
17390                               }
17391                               break;
17392                             }
17393                           }
17394                           break;
17395                         }
17396                       }
17397                       break;
17398                     }
17399                     case 0x00400000: {
17400                       // 0xf8500000
17401                       switch (instr & 0x00200000) {
17402                         case 0x00000000: {
17403                           // 0xf8500000
17404                           switch (instr & 0x000f0000) {
17405                             case 0x000f0000: {
17406                               // 0xf85f0000
17407                               unsigned rt = (instr >> 12) & 0xf;
17408                               uint32_t U = (instr >> 23) & 0x1;
17409                               int32_t imm = instr & 0xfff;
17410                               if (U == 0) imm = -imm;
17411                               bool minus_zero = (imm == 0) && (U == 0);
17412                               Location location(imm, kT32PcDelta);
17413                               if ((imm >= -4095) && (imm <= 4095) &&
17414                                   ((rt < kNumberOfT32LowRegisters) &&
17415                                    (imm >= 0) && (imm <= 1020) &&
17416                                    ((imm & 3) == 0))) {
17417                                 // LDR{<c>}.W <Rt>, <label> ; T2
17418                                 if (minus_zero) {
17419                                   ldr(CurrentCond(),
17420                                       Wide,
17421                                       Register(rt),
17422                                       MemOperand(pc, minus, 0));
17423                                 } else {
17424                                   ldr(CurrentCond(),
17425                                       Wide,
17426                                       Register(rt),
17427                                       &location);
17428                                 }
17429                               } else if ((imm >= -4095) && (imm <= 4095)) {
17430                                 // LDR{<c>}{<q>} <Rt>, <label> ; T2
17431                                 if (minus_zero) {
17432                                   ldr(CurrentCond(),
17433                                       Best,
17434                                       Register(rt),
17435                                       MemOperand(pc, minus, 0));
17436                                 } else {
17437                                   ldr(CurrentCond(),
17438                                       Best,
17439                                       Register(rt),
17440                                       &location);
17441                                 }
17442                               } else {
17443                                 UnallocatedT32(instr);
17444                               }
17445                               break;
17446                             }
17447                             default: {
17448                               switch (instr & 0x00800000) {
17449                                 case 0x00000000: {
17450                                   // 0xf8500000
17451                                   switch (instr & 0x00000d00) {
17452                                     case 0x00000000: {
17453                                       // 0xf8500000
17454                                       if ((instr & 0x000002c0) == 0x00000000) {
17455                                         if (((instr & 0xf0000) == 0xf0000)) {
17456                                           UnallocatedT32(instr);
17457                                           return;
17458                                         }
17459                                         unsigned rt = (instr >> 12) & 0xf;
17460                                         unsigned rn = (instr >> 16) & 0xf;
17461                                         Sign sign(plus);
17462                                         unsigned rm = instr & 0xf;
17463                                         Shift shift = LSL;
17464                                         uint32_t amount = (instr >> 4) & 0x3;
17465                                         AddrMode addrmode = Offset;
17466                                         if ((rt < kNumberOfT32LowRegisters) &&
17467                                             (rn < kNumberOfT32LowRegisters) &&
17468                                             (rm < kNumberOfT32LowRegisters) &&
17469                                             shift.IsLSL() && (amount == 0) &&
17470                                             sign.IsPlus()) {
17471                                           // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17472                                           ldr(CurrentCond(),
17473                                               Wide,
17474                                               Register(rt),
17475                                               MemOperand(Register(rn),
17476                                                          sign,
17477                                                          Register(rm),
17478                                                          addrmode));
17479                                         } else {
17480                                           // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17481                                           ldr(CurrentCond(),
17482                                               Best,
17483                                               Register(rt),
17484                                               MemOperand(Register(rn),
17485                                                          sign,
17486                                                          Register(rm),
17487                                                          shift,
17488                                                          amount,
17489                                                          addrmode));
17490                                         }
17491                                       } else {
17492                                         UnallocatedT32(instr);
17493                                       }
17494                                       break;
17495                                     }
17496                                     case 0x00000900: {
17497                                       // 0xf8500900
17498                                       if (((instr & 0xf0000) == 0xf0000)) {
17499                                         UnallocatedT32(instr);
17500                                         return;
17501                                       }
17502                                       if (((Uint32((instr >> 16)) &
17503                                             Uint32(0xf)) == Uint32(0xd)) &&
17504                                           ((Uint32((instr >> 9)) &
17505                                             Uint32(0x1)) == Uint32(0x1)) &&
17506                                           ((Uint32(instr) & Uint32(0xff)) ==
17507                                            Uint32(0x4))) {
17508                                         unsigned rt = (instr >> 12) & 0xf;
17509                                         if ((rt <= 7) || (rt == kPCRegNum)) {
17510                                           // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length)
17511                                           pop(CurrentCond(),
17512                                               Wide,
17513                                               Register(rt));
17514                                         } else {
17515                                           // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length)
17516                                           pop(CurrentCond(),
17517                                               Best,
17518                                               Register(rt));
17519                                         }
17520                                         return;
17521                                       }
17522                                       unsigned rt = (instr >> 12) & 0xf;
17523                                       unsigned rn = (instr >> 16) & 0xf;
17524                                       Sign sign((((instr >> 9) & 0x1) == 0)
17525                                                     ? minus
17526                                                     : plus);
17527                                       int32_t offset = instr & 0xff;
17528                                       // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length)
17529                                       ldr(CurrentCond(),
17530                                           Best,
17531                                           Register(rt),
17532                                           MemOperand(Register(rn),
17533                                                      sign,
17534                                                      offset,
17535                                                      PostIndex));
17536                                       break;
17537                                     }
17538                                     case 0x00000c00: {
17539                                       // 0xf8500c00
17540                                       switch (instr & 0x00000200) {
17541                                         case 0x00000000: {
17542                                           // 0xf8500c00
17543                                           if (((instr & 0xf0000) == 0xf0000)) {
17544                                             UnallocatedT32(instr);
17545                                             return;
17546                                           }
17547                                           unsigned rt = (instr >> 12) & 0xf;
17548                                           unsigned rn = (instr >> 16) & 0xf;
17549                                           int32_t offset = instr & 0xff;
17550                                           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length)
17551                                           ldr(CurrentCond(),
17552                                               Best,
17553                                               Register(rt),
17554                                               MemOperand(Register(rn),
17555                                                          minus,
17556                                                          offset,
17557                                                          Offset));
17558                                           break;
17559                                         }
17560                                         case 0x00000200: {
17561                                           // 0xf8500e00
17562                                           if (((instr & 0xf0000) == 0xf0000)) {
17563                                             UnallocatedT32(instr);
17564                                             return;
17565                                           }
17566                                           UnimplementedT32_32("LDRT", instr);
17567                                           break;
17568                                         }
17569                                       }
17570                                       break;
17571                                     }
17572                                     case 0x00000d00: {
17573                                       // 0xf8500d00
17574                                       if (((instr & 0xf0000) == 0xf0000)) {
17575                                         UnallocatedT32(instr);
17576                                         return;
17577                                       }
17578                                       unsigned rt = (instr >> 12) & 0xf;
17579                                       unsigned rn = (instr >> 16) & 0xf;
17580                                       Sign sign((((instr >> 9) & 0x1) == 0)
17581                                                     ? minus
17582                                                     : plus);
17583                                       int32_t offset = instr & 0xff;
17584                                       // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length)
17585                                       ldr(CurrentCond(),
17586                                           Best,
17587                                           Register(rt),
17588                                           MemOperand(Register(rn),
17589                                                      sign,
17590                                                      offset,
17591                                                      PreIndex));
17592                                       break;
17593                                     }
17594                                     default:
17595                                       UnallocatedT32(instr);
17596                                       break;
17597                                   }
17598                                   break;
17599                                 }
17600                                 case 0x00800000: {
17601                                   // 0xf8d00000
17602                                   if (((instr & 0xf0000) == 0xf0000)) {
17603                                     UnallocatedT32(instr);
17604                                     return;
17605                                   }
17606                                   unsigned rt = (instr >> 12) & 0xf;
17607                                   unsigned rn = (instr >> 16) & 0xf;
17608                                   int32_t offset = instr & 0xfff;
17609                                   if (((rt < kNumberOfT32LowRegisters) &&
17610                                        (rn < kNumberOfT32LowRegisters) &&
17611                                        ((offset >= 0) && (offset <= 124) &&
17612                                         ((offset & 3) == 0))) ||
17613                                       ((rt < kNumberOfT32LowRegisters) &&
17614                                        (rn == sp.GetCode()) &&
17615                                        ((offset >= 0) && (offset <= 1020) &&
17616                                         ((offset & 3) == 0)))) {
17617                                     // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
17618                                     ldr(CurrentCond(),
17619                                         Wide,
17620                                         Register(rt),
17621                                         MemOperand(Register(rn),
17622                                                    plus,
17623                                                    offset,
17624                                                    Offset));
17625                                   } else {
17626                                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
17627                                     ldr(CurrentCond(),
17628                                         Best,
17629                                         Register(rt),
17630                                         MemOperand(Register(rn),
17631                                                    plus,
17632                                                    offset,
17633                                                    Offset));
17634                                   }
17635                                   break;
17636                                 }
17637                               }
17638                               break;
17639                             }
17640                           }
17641                           break;
17642                         }
17643                         default:
17644                           UnallocatedT32(instr);
17645                           break;
17646                       }
17647                       break;
17648                     }
17649                     case 0x01000000: {
17650                       // 0xf9100000
17651                       switch (instr & 0x00200000) {
17652                         case 0x00000000: {
17653                           // 0xf9100000
17654                           switch (instr & 0x000f0000) {
17655                             case 0x000f0000: {
17656                               // 0xf91f0000
17657                               switch (instr & 0x0000f000) {
17658                                 case 0x0000f000: {
17659                                   // 0xf91ff000
17660                                   uint32_t U = (instr >> 23) & 0x1;
17661                                   int32_t imm = instr & 0xfff;
17662                                   if (U == 0) imm = -imm;
17663                                   bool minus_zero = (imm == 0) && (U == 0);
17664                                   Location location(imm, kT32PcDelta);
17665                                   // PLI{<c>}{<q>} <label> ; T3
17666                                   if (minus_zero) {
17667                                     pli(CurrentCond(),
17668                                         MemOperand(pc, minus, 0));
17669                                   } else {
17670                                     pli(CurrentCond(), &location);
17671                                   }
17672                                   break;
17673                                 }
17674                                 default: {
17675                                   if (((instr & 0xf000) == 0xf000)) {
17676                                     UnallocatedT32(instr);
17677                                     return;
17678                                   }
17679                                   unsigned rt = (instr >> 12) & 0xf;
17680                                   uint32_t U = (instr >> 23) & 0x1;
17681                                   int32_t imm = instr & 0xfff;
17682                                   if (U == 0) imm = -imm;
17683                                   bool minus_zero = (imm == 0) && (U == 0);
17684                                   Location location(imm, kT32PcDelta);
17685                                   // LDRSB{<c>}{<q>} <Rt>, <label> ; T1
17686                                   if (minus_zero) {
17687                                     ldrsb(CurrentCond(),
17688                                           Best,
17689                                           Register(rt),
17690                                           MemOperand(pc, minus, 0));
17691                                   } else {
17692                                     ldrsb(CurrentCond(),
17693                                           Register(rt),
17694                                           &location);
17695                                   }
17696                                   break;
17697                                 }
17698                               }
17699                               break;
17700                             }
17701                             default: {
17702                               switch (instr & 0x00800000) {
17703                                 case 0x00000000: {
17704                                   // 0xf9100000
17705                                   switch (instr & 0x00000d00) {
17706                                     case 0x00000000: {
17707                                       // 0xf9100000
17708                                       switch (instr & 0x000002c0) {
17709                                         case 0x00000000: {
17710                                           // 0xf9100000
17711                                           switch (instr & 0x0000f000) {
17712                                             case 0x0000f000: {
17713                                               // 0xf910f000
17714                                               if (((instr & 0xf0000) ==
17715                                                    0xf0000)) {
17716                                                 UnallocatedT32(instr);
17717                                                 return;
17718                                               }
17719                                               unsigned rn = (instr >> 16) & 0xf;
17720                                               Sign sign(plus);
17721                                               unsigned rm = instr & 0xf;
17722                                               Shift shift = LSL;
17723                                               uint32_t amount =
17724                                                   (instr >> 4) & 0x3;
17725                                               AddrMode addrmode = Offset;
17726                                               // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
17727                                               pli(CurrentCond(),
17728                                                   MemOperand(Register(rn),
17729                                                              sign,
17730                                                              Register(rm),
17731                                                              shift,
17732                                                              amount,
17733                                                              addrmode));
17734                                               break;
17735                                             }
17736                                             default: {
17737                                               if (((instr & 0xf0000) ==
17738                                                    0xf0000) ||
17739                                                   ((instr & 0xf000) ==
17740                                                    0xf000)) {
17741                                                 UnallocatedT32(instr);
17742                                                 return;
17743                                               }
17744                                               unsigned rt = (instr >> 12) & 0xf;
17745                                               unsigned rn = (instr >> 16) & 0xf;
17746                                               Sign sign(plus);
17747                                               unsigned rm = instr & 0xf;
17748                                               Shift shift = LSL;
17749                                               uint32_t amount =
17750                                                   (instr >> 4) & 0x3;
17751                                               AddrMode addrmode = Offset;
17752                                               if ((rt <
17753                                                    kNumberOfT32LowRegisters) &&
17754                                                   (rn <
17755                                                    kNumberOfT32LowRegisters) &&
17756                                                   (rm <
17757                                                    kNumberOfT32LowRegisters) &&
17758                                                   shift.IsLSL() &&
17759                                                   (amount == 0) &&
17760                                                   sign.IsPlus()) {
17761                                                 // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17762                                                 ldrsb(CurrentCond(),
17763                                                       Wide,
17764                                                       Register(rt),
17765                                                       MemOperand(Register(rn),
17766                                                                  sign,
17767                                                                  Register(rm),
17768                                                                  addrmode));
17769                                               } else {
17770                                                 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17771                                                 ldrsb(CurrentCond(),
17772                                                       Best,
17773                                                       Register(rt),
17774                                                       MemOperand(Register(rn),
17775                                                                  sign,
17776                                                                  Register(rm),
17777                                                                  shift,
17778                                                                  amount,
17779                                                                  addrmode));
17780                                               }
17781                                               break;
17782                                             }
17783                                           }
17784                                           break;
17785                                         }
17786                                         default:
17787                                           UnallocatedT32(instr);
17788                                           break;
17789                                       }
17790                                       break;
17791                                     }
17792                                     case 0x00000900: {
17793                                       // 0xf9100900
17794                                       if (((instr & 0xf0000) == 0xf0000)) {
17795                                         UnallocatedT32(instr);
17796                                         return;
17797                                       }
17798                                       unsigned rt = (instr >> 12) & 0xf;
17799                                       unsigned rn = (instr >> 16) & 0xf;
17800                                       Sign sign((((instr >> 9) & 0x1) == 0)
17801                                                     ? minus
17802                                                     : plus);
17803                                       int32_t offset = instr & 0xff;
17804                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
17805                                       ldrsb(CurrentCond(),
17806                                             Best,
17807                                             Register(rt),
17808                                             MemOperand(Register(rn),
17809                                                        sign,
17810                                                        offset,
17811                                                        PostIndex));
17812                                       break;
17813                                     }
17814                                     case 0x00000c00: {
17815                                       // 0xf9100c00
17816                                       switch (instr & 0x00000200) {
17817                                         case 0x00000000: {
17818                                           // 0xf9100c00
17819                                           switch (instr & 0x0000f000) {
17820                                             case 0x0000f000: {
17821                                               // 0xf910fc00
17822                                               if (((instr & 0xf0000) ==
17823                                                    0xf0000)) {
17824                                                 UnallocatedT32(instr);
17825                                                 return;
17826                                               }
17827                                               unsigned rn = (instr >> 16) & 0xf;
17828                                               int32_t offset = instr & 0xff;
17829                                               // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17830                                               pli(CurrentCond(),
17831                                                   MemOperand(Register(rn),
17832                                                              minus,
17833                                                              offset,
17834                                                              Offset));
17835                                               break;
17836                                             }
17837                                             default: {
17838                                               if (((instr & 0xf0000) ==
17839                                                    0xf0000) ||
17840                                                   ((instr & 0xf000) ==
17841                                                    0xf000)) {
17842                                                 UnallocatedT32(instr);
17843                                                 return;
17844                                               }
17845                                               unsigned rt = (instr >> 12) & 0xf;
17846                                               unsigned rn = (instr >> 16) & 0xf;
17847                                               int32_t offset = instr & 0xff;
17848                                               // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17849                                               ldrsb(CurrentCond(),
17850                                                     Best,
17851                                                     Register(rt),
17852                                                     MemOperand(Register(rn),
17853                                                                minus,
17854                                                                offset,
17855                                                                Offset));
17856                                               break;
17857                                             }
17858                                           }
17859                                           break;
17860                                         }
17861                                         case 0x00000200: {
17862                                           // 0xf9100e00
17863                                           if (((instr & 0xf0000) == 0xf0000)) {
17864                                             UnallocatedT32(instr);
17865                                             return;
17866                                           }
17867                                           UnimplementedT32_32("LDRSBT", instr);
17868                                           break;
17869                                         }
17870                                       }
17871                                       break;
17872                                     }
17873                                     case 0x00000d00: {
17874                                       // 0xf9100d00
17875                                       if (((instr & 0xf0000) == 0xf0000)) {
17876                                         UnallocatedT32(instr);
17877                                         return;
17878                                       }
17879                                       unsigned rt = (instr >> 12) & 0xf;
17880                                       unsigned rn = (instr >> 16) & 0xf;
17881                                       Sign sign((((instr >> 9) & 0x1) == 0)
17882                                                     ? minus
17883                                                     : plus);
17884                                       int32_t offset = instr & 0xff;
17885                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
17886                                       ldrsb(CurrentCond(),
17887                                             Best,
17888                                             Register(rt),
17889                                             MemOperand(Register(rn),
17890                                                        sign,
17891                                                        offset,
17892                                                        PreIndex));
17893                                       break;
17894                                     }
17895                                     default:
17896                                       UnallocatedT32(instr);
17897                                       break;
17898                                   }
17899                                   break;
17900                                 }
17901                                 case 0x00800000: {
17902                                   // 0xf9900000
17903                                   switch (instr & 0x0000f000) {
17904                                     case 0x0000f000: {
17905                                       // 0xf990f000
17906                                       if (((instr & 0xf0000) == 0xf0000)) {
17907                                         UnallocatedT32(instr);
17908                                         return;
17909                                       }
17910                                       unsigned rn = (instr >> 16) & 0xf;
17911                                       int32_t offset = instr & 0xfff;
17912                                       // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17913                                       pli(CurrentCond(),
17914                                           MemOperand(Register(rn),
17915                                                      plus,
17916                                                      offset,
17917                                                      Offset));
17918                                       break;
17919                                     }
17920                                     default: {
17921                                       if (((instr & 0xf0000) == 0xf0000) ||
17922                                           ((instr & 0xf000) == 0xf000)) {
17923                                         UnallocatedT32(instr);
17924                                         return;
17925                                       }
17926                                       unsigned rt = (instr >> 12) & 0xf;
17927                                       unsigned rn = (instr >> 16) & 0xf;
17928                                       int32_t offset = instr & 0xfff;
17929                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
17930                                       ldrsb(CurrentCond(),
17931                                             Best,
17932                                             Register(rt),
17933                                             MemOperand(Register(rn),
17934                                                        plus,
17935                                                        offset,
17936                                                        Offset));
17937                                       break;
17938                                     }
17939                                   }
17940                                   break;
17941                                 }
17942                               }
17943                               break;
17944                             }
17945                           }
17946                           break;
17947                         }
17948                         case 0x00200000: {
17949                           // 0xf9300000
17950                           switch (instr & 0x000f0000) {
17951                             case 0x000f0000: {
17952                               // 0xf93f0000
17953                               if (((instr & 0xf000) == 0xf000)) {
17954                                 UnallocatedT32(instr);
17955                                 return;
17956                               }
17957                               unsigned rt = (instr >> 12) & 0xf;
17958                               uint32_t U = (instr >> 23) & 0x1;
17959                               int32_t imm = instr & 0xfff;
17960                               if (U == 0) imm = -imm;
17961                               bool minus_zero = (imm == 0) && (U == 0);
17962                               Location location(imm, kT32PcDelta);
17963                               // LDRSH{<c>}{<q>} <Rt>, <label> ; T1
17964                               if (minus_zero) {
17965                                 ldrsh(CurrentCond(),
17966                                       Best,
17967                                       Register(rt),
17968                                       MemOperand(pc, minus, 0));
17969                               } else {
17970                                 ldrsh(CurrentCond(), Register(rt), &location);
17971                               }
17972                               break;
17973                             }
17974                             default: {
17975                               switch (instr & 0x00800000) {
17976                                 case 0x00000000: {
17977                                   // 0xf9300000
17978                                   switch (instr & 0x00000d00) {
17979                                     case 0x00000000: {
17980                                       // 0xf9300000
17981                                       if ((instr & 0x000002c0) == 0x00000000) {
17982                                         if (((instr & 0xf0000) == 0xf0000) ||
17983                                             ((instr & 0xf000) == 0xf000)) {
17984                                           UnallocatedT32(instr);
17985                                           return;
17986                                         }
17987                                         unsigned rt = (instr >> 12) & 0xf;
17988                                         unsigned rn = (instr >> 16) & 0xf;
17989                                         Sign sign(plus);
17990                                         unsigned rm = instr & 0xf;
17991                                         Shift shift = LSL;
17992                                         uint32_t amount = (instr >> 4) & 0x3;
17993                                         AddrMode addrmode = Offset;
17994                                         if ((rt < kNumberOfT32LowRegisters) &&
17995                                             (rn < kNumberOfT32LowRegisters) &&
17996                                             (rm < kNumberOfT32LowRegisters) &&
17997                                             shift.IsLSL() && (amount == 0) &&
17998                                             sign.IsPlus()) {
17999                                           // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
18000                                           ldrsh(CurrentCond(),
18001                                                 Wide,
18002                                                 Register(rt),
18003                                                 MemOperand(Register(rn),
18004                                                            sign,
18005                                                            Register(rm),
18006                                                            addrmode));
18007                                         } else {
18008                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
18009                                           ldrsh(CurrentCond(),
18010                                                 Best,
18011                                                 Register(rt),
18012                                                 MemOperand(Register(rn),
18013                                                            sign,
18014                                                            Register(rm),
18015                                                            shift,
18016                                                            amount,
18017                                                            addrmode));
18018                                         }
18019                                       } else {
18020                                         UnallocatedT32(instr);
18021                                       }
18022                                       break;
18023                                     }
18024                                     case 0x00000900: {
18025                                       // 0xf9300900
18026                                       if (((instr & 0xf0000) == 0xf0000)) {
18027                                         UnallocatedT32(instr);
18028                                         return;
18029                                       }
18030                                       unsigned rt = (instr >> 12) & 0xf;
18031                                       unsigned rn = (instr >> 16) & 0xf;
18032                                       Sign sign((((instr >> 9) & 0x1) == 0)
18033                                                     ? minus
18034                                                     : plus);
18035                                       int32_t offset = instr & 0xff;
18036                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
18037                                       ldrsh(CurrentCond(),
18038                                             Best,
18039                                             Register(rt),
18040                                             MemOperand(Register(rn),
18041                                                        sign,
18042                                                        offset,
18043                                                        PostIndex));
18044                                       break;
18045                                     }
18046                                     case 0x00000c00: {
18047                                       // 0xf9300c00
18048                                       switch (instr & 0x00000200) {
18049                                         case 0x00000000: {
18050                                           // 0xf9300c00
18051                                           if (((instr & 0xf0000) == 0xf0000) ||
18052                                               ((instr & 0xf000) == 0xf000)) {
18053                                             UnallocatedT32(instr);
18054                                             return;
18055                                           }
18056                                           unsigned rt = (instr >> 12) & 0xf;
18057                                           unsigned rn = (instr >> 16) & 0xf;
18058                                           int32_t offset = instr & 0xff;
18059                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
18060                                           ldrsh(CurrentCond(),
18061                                                 Best,
18062                                                 Register(rt),
18063                                                 MemOperand(Register(rn),
18064                                                            minus,
18065                                                            offset,
18066                                                            Offset));
18067                                           break;
18068                                         }
18069                                         case 0x00000200: {
18070                                           // 0xf9300e00
18071                                           if (((instr & 0xf0000) == 0xf0000)) {
18072                                             UnallocatedT32(instr);
18073                                             return;
18074                                           }
18075                                           UnimplementedT32_32("LDRSHT", instr);
18076                                           break;
18077                                         }
18078                                       }
18079                                       break;
18080                                     }
18081                                     case 0x00000d00: {
18082                                       // 0xf9300d00
18083                                       if (((instr & 0xf0000) == 0xf0000)) {
18084                                         UnallocatedT32(instr);
18085                                         return;
18086                                       }
18087                                       unsigned rt = (instr >> 12) & 0xf;
18088                                       unsigned rn = (instr >> 16) & 0xf;
18089                                       Sign sign((((instr >> 9) & 0x1) == 0)
18090                                                     ? minus
18091                                                     : plus);
18092                                       int32_t offset = instr & 0xff;
18093                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
18094                                       ldrsh(CurrentCond(),
18095                                             Best,
18096                                             Register(rt),
18097                                             MemOperand(Register(rn),
18098                                                        sign,
18099                                                        offset,
18100                                                        PreIndex));
18101                                       break;
18102                                     }
18103                                     default:
18104                                       UnallocatedT32(instr);
18105                                       break;
18106                                   }
18107                                   break;
18108                                 }
18109                                 case 0x00800000: {
18110                                   // 0xf9b00000
18111                                   if (((instr & 0xf0000) == 0xf0000) ||
18112                                       ((instr & 0xf000) == 0xf000)) {
18113                                     UnallocatedT32(instr);
18114                                     return;
18115                                   }
18116                                   unsigned rt = (instr >> 12) & 0xf;
18117                                   unsigned rn = (instr >> 16) & 0xf;
18118                                   int32_t offset = instr & 0xfff;
18119                                   // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
18120                                   ldrsh(CurrentCond(),
18121                                         Best,
18122                                         Register(rt),
18123                                         MemOperand(Register(rn),
18124                                                    plus,
18125                                                    offset,
18126                                                    Offset));
18127                                   break;
18128                                 }
18129                               }
18130                               break;
18131                             }
18132                           }
18133                           break;
18134                         }
18135                       }
18136                       break;
18137                     }
18138                     default:
18139                       UnallocatedT32(instr);
18140                       break;
18141                   }
18142                   break;
18143                 }
18144               }
18145               break;
18146             }
18147             case 0x02000000: {
18148               // 0xea000000
18149               switch (instr & 0x11900000) {
18150                 case 0x00000000: {
18151                   // 0xea000000
18152                   switch (instr & 0x00600000) {
18153                     case 0x00000000: {
18154                       // 0xea000000
18155                       switch (instr & 0x000070f0) {
18156                         case 0x00000030: {
18157                           // 0xea000030
18158                           unsigned rd = (instr >> 8) & 0xf;
18159                           unsigned rn = (instr >> 16) & 0xf;
18160                           unsigned rm = instr & 0xf;
18161                           // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18162                           and_(CurrentCond(),
18163                                Best,
18164                                Register(rd),
18165                                Register(rn),
18166                                Operand(Register(rm), RRX));
18167                           if (((instr & 0xfff0f0f0) != 0xea000030)) {
18168                             UnpredictableT32(instr);
18169                           }
18170                           break;
18171                         }
18172                         default: {
18173                           if (((instr & 0x70f0) == 0x30)) {
18174                             UnallocatedT32(instr);
18175                             return;
18176                           }
18177                           unsigned rd = (instr >> 8) & 0xf;
18178                           unsigned rn = (instr >> 16) & 0xf;
18179                           unsigned rm = instr & 0xf;
18180                           ImmediateShiftOperand
18181                               shift_operand((instr >> 4) & 0x3,
18182                                             ((instr >> 6) & 0x3) |
18183                                                 ((instr >> 10) & 0x1c));
18184                           if (InITBlock() &&
18185                               (instr & 0x00100000) == 0x00000000 &&
18186                               shift_operand.GetShift().IsLSL() &&
18187                               (shift_operand.GetAmount() == 0) &&
18188                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18189                                (rm < kNumberOfT32LowRegisters))) {
18190                             // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18191                             and_(CurrentCond(),
18192                                  Wide,
18193                                  Register(rd),
18194                                  Register(rn),
18195                                  Register(rm));
18196                             if (((instr & 0xfff08000) != 0xea000000)) {
18197                               UnpredictableT32(instr);
18198                             }
18199                           } else if ((instr & 0x00100000) == 0x00000000) {
18200                             // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18201                             and_(CurrentCond(),
18202                                  Best,
18203                                  Register(rd),
18204                                  Register(rn),
18205                                  Operand(Register(rm),
18206                                          shift_operand.GetType(),
18207                                          shift_operand.GetAmount()));
18208                             if (((instr & 0xfff08000) != 0xea000000)) {
18209                               UnpredictableT32(instr);
18210                             }
18211                           } else {
18212                             UnallocatedT32(instr);
18213                           }
18214                           break;
18215                         }
18216                       }
18217                       break;
18218                     }
18219                     case 0x00200000: {
18220                       // 0xea200000
18221                       switch (instr & 0x000070f0) {
18222                         case 0x00000030: {
18223                           // 0xea200030
18224                           unsigned rd = (instr >> 8) & 0xf;
18225                           unsigned rn = (instr >> 16) & 0xf;
18226                           unsigned rm = instr & 0xf;
18227                           // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18228                           bic(CurrentCond(),
18229                               Best,
18230                               Register(rd),
18231                               Register(rn),
18232                               Operand(Register(rm), RRX));
18233                           if (((instr & 0xfff0f0f0) != 0xea200030)) {
18234                             UnpredictableT32(instr);
18235                           }
18236                           break;
18237                         }
18238                         default: {
18239                           if (((instr & 0x70f0) == 0x30)) {
18240                             UnallocatedT32(instr);
18241                             return;
18242                           }
18243                           unsigned rd = (instr >> 8) & 0xf;
18244                           unsigned rn = (instr >> 16) & 0xf;
18245                           unsigned rm = instr & 0xf;
18246                           ImmediateShiftOperand
18247                               shift_operand((instr >> 4) & 0x3,
18248                                             ((instr >> 6) & 0x3) |
18249                                                 ((instr >> 10) & 0x1c));
18250                           if (InITBlock() &&
18251                               (instr & 0x00100000) == 0x00000000 &&
18252                               shift_operand.GetShift().IsLSL() &&
18253                               (shift_operand.GetAmount() == 0) &&
18254                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18255                                (rm < kNumberOfT32LowRegisters))) {
18256                             // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18257                             bic(CurrentCond(),
18258                                 Wide,
18259                                 Register(rd),
18260                                 Register(rn),
18261                                 Register(rm));
18262                             if (((instr & 0xfff08000) != 0xea200000)) {
18263                               UnpredictableT32(instr);
18264                             }
18265                           } else if ((instr & 0x00100000) == 0x00000000) {
18266                             // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18267                             bic(CurrentCond(),
18268                                 Best,
18269                                 Register(rd),
18270                                 Register(rn),
18271                                 Operand(Register(rm),
18272                                         shift_operand.GetType(),
18273                                         shift_operand.GetAmount()));
18274                             if (((instr & 0xfff08000) != 0xea200000)) {
18275                               UnpredictableT32(instr);
18276                             }
18277                           } else {
18278                             UnallocatedT32(instr);
18279                           }
18280                           break;
18281                         }
18282                       }
18283                       break;
18284                     }
18285                     case 0x00400000: {
18286                       // 0xea400000
18287                       switch (instr & 0x000f0000) {
18288                         case 0x000f0000: {
18289                           // 0xea4f0000
18290                           switch (instr & 0x000070f0) {
18291                             case 0x00000030: {
18292                               // 0xea4f0030
18293                               unsigned rd = (instr >> 8) & 0xf;
18294                               unsigned rm = instr & 0xf;
18295                               // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3
18296                               rrx(CurrentCond(), Register(rd), Register(rm));
18297                               if (((instr & 0xfffff0f0) != 0xea4f0030)) {
18298                                 UnpredictableT32(instr);
18299                               }
18300                               break;
18301                             }
18302                             default: {
18303                               if (((instr & 0x70f0) == 0x30)) {
18304                                 UnallocatedT32(instr);
18305                                 return;
18306                               }
18307                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18308                                    Uint32(0x2))) {
18309                                 unsigned rd = (instr >> 8) & 0xf;
18310                                 unsigned rm = instr & 0xf;
18311                                 uint32_t amount = ((instr >> 6) & 0x3) |
18312                                                   ((instr >> 10) & 0x1c);
18313                                 if (amount == 0) amount = 32;
18314                                 if (InITBlock() &&
18315                                     ((rd < kNumberOfT32LowRegisters) &&
18316                                      (rm < kNumberOfT32LowRegisters) &&
18317                                      ((amount >= 1) && (amount <= 32)))) {
18318                                   // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18319                                   asr(CurrentCond(),
18320                                       Wide,
18321                                       Register(rd),
18322                                       Register(rm),
18323                                       amount);
18324                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
18325                                     UnpredictableT32(instr);
18326                                   }
18327                                 } else {
18328                                   // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18329                                   asr(CurrentCond(),
18330                                       Best,
18331                                       Register(rd),
18332                                       Register(rm),
18333                                       amount);
18334                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
18335                                     UnpredictableT32(instr);
18336                                   }
18337                                 }
18338                                 return;
18339                               }
18340                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18341                                    Uint32(0x0)) &&
18342                                   ((instr & 0x000070c0) != 0x00000000)) {
18343                                 unsigned rd = (instr >> 8) & 0xf;
18344                                 unsigned rm = instr & 0xf;
18345                                 uint32_t amount = ((instr >> 6) & 0x3) |
18346                                                   ((instr >> 10) & 0x1c);
18347                                 if (InITBlock() &&
18348                                     ((rd < kNumberOfT32LowRegisters) &&
18349                                      (rm < kNumberOfT32LowRegisters) &&
18350                                      ((amount >= 1) && (amount <= 31)))) {
18351                                   // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18352                                   lsl(CurrentCond(),
18353                                       Wide,
18354                                       Register(rd),
18355                                       Register(rm),
18356                                       amount);
18357                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
18358                                     UnpredictableT32(instr);
18359                                   }
18360                                 } else {
18361                                   // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18362                                   lsl(CurrentCond(),
18363                                       Best,
18364                                       Register(rd),
18365                                       Register(rm),
18366                                       amount);
18367                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
18368                                     UnpredictableT32(instr);
18369                                   }
18370                                 }
18371                                 return;
18372                               }
18373                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18374                                    Uint32(0x1))) {
18375                                 unsigned rd = (instr >> 8) & 0xf;
18376                                 unsigned rm = instr & 0xf;
18377                                 uint32_t amount = ((instr >> 6) & 0x3) |
18378                                                   ((instr >> 10) & 0x1c);
18379                                 if (amount == 0) amount = 32;
18380                                 if (InITBlock() &&
18381                                     ((rd < kNumberOfT32LowRegisters) &&
18382                                      (rm < kNumberOfT32LowRegisters) &&
18383                                      ((amount >= 1) && (amount <= 32)))) {
18384                                   // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18385                                   lsr(CurrentCond(),
18386                                       Wide,
18387                                       Register(rd),
18388                                       Register(rm),
18389                                       amount);
18390                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
18391                                     UnpredictableT32(instr);
18392                                   }
18393                                 } else {
18394                                   // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18395                                   lsr(CurrentCond(),
18396                                       Best,
18397                                       Register(rd),
18398                                       Register(rm),
18399                                       amount);
18400                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
18401                                     UnpredictableT32(instr);
18402                                   }
18403                                 }
18404                                 return;
18405                               }
18406                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18407                                    Uint32(0x3)) &&
18408                                   ((instr & 0x000070c0) != 0x00000000)) {
18409                                 unsigned rd = (instr >> 8) & 0xf;
18410                                 unsigned rm = instr & 0xf;
18411                                 uint32_t amount = ((instr >> 6) & 0x3) |
18412                                                   ((instr >> 10) & 0x1c);
18413                                 // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18414                                 ror(CurrentCond(),
18415                                     Best,
18416                                     Register(rd),
18417                                     Register(rm),
18418                                     amount);
18419                                 if (((instr & 0xffff8030) != 0xea4f0030)) {
18420                                   UnpredictableT32(instr);
18421                                 }
18422                                 return;
18423                               }
18424                               unsigned rd = (instr >> 8) & 0xf;
18425                               unsigned rm = instr & 0xf;
18426                               ImmediateShiftOperand
18427                                   shift_operand((instr >> 4) & 0x3,
18428                                                 ((instr >> 6) & 0x3) |
18429                                                     ((instr >> 10) & 0x1c));
18430                               if ((instr & 0x00100000) == 0x00000000 &&
18431                                   (shift_operand.GetShift().IsLSL() &&
18432                                    (shift_operand.GetAmount() == 0))) {
18433                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18434                                 mov(CurrentCond(),
18435                                     Wide,
18436                                     Register(rd),
18437                                     Operand(Register(rm),
18438                                             shift_operand.GetType(),
18439                                             shift_operand.GetAmount()));
18440                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
18441                                   UnpredictableT32(instr);
18442                                 }
18443                               } else if (InITBlock() &&
18444                                          (instr & 0x00100000) == 0x00000000 &&
18445                                          ((rd < kNumberOfT32LowRegisters) &&
18446                                           (rm < kNumberOfT32LowRegisters))) {
18447                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18448                                 mov(CurrentCond(),
18449                                     Wide,
18450                                     Register(rd),
18451                                     Operand(Register(rm),
18452                                             shift_operand.GetType(),
18453                                             shift_operand.GetAmount()));
18454                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
18455                                   UnpredictableT32(instr);
18456                                 }
18457                               } else if ((instr & 0x00100000) == 0x00000000) {
18458                                 // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18459                                 mov(CurrentCond(),
18460                                     Best,
18461                                     Register(rd),
18462                                     Operand(Register(rm),
18463                                             shift_operand.GetType(),
18464                                             shift_operand.GetAmount()));
18465                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
18466                                   UnpredictableT32(instr);
18467                                 }
18468                               } else {
18469                                 UnallocatedT32(instr);
18470                               }
18471                               break;
18472                             }
18473                           }
18474                           break;
18475                         }
18476                         default: {
18477                           switch (instr & 0x000070f0) {
18478                             case 0x00000030: {
18479                               // 0xea400030
18480                               if (((instr & 0xf0000) == 0xf0000)) {
18481                                 UnallocatedT32(instr);
18482                                 return;
18483                               }
18484                               unsigned rd = (instr >> 8) & 0xf;
18485                               unsigned rn = (instr >> 16) & 0xf;
18486                               unsigned rm = instr & 0xf;
18487                               // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18488                               orr(CurrentCond(),
18489                                   Best,
18490                                   Register(rd),
18491                                   Register(rn),
18492                                   Operand(Register(rm), RRX));
18493                               if (((instr & 0xfff0f0f0) != 0xea400030)) {
18494                                 UnpredictableT32(instr);
18495                               }
18496                               break;
18497                             }
18498                             default: {
18499                               if (((instr & 0xf0000) == 0xf0000) ||
18500                                   ((instr & 0x70f0) == 0x30)) {
18501                                 UnallocatedT32(instr);
18502                                 return;
18503                               }
18504                               unsigned rd = (instr >> 8) & 0xf;
18505                               unsigned rn = (instr >> 16) & 0xf;
18506                               unsigned rm = instr & 0xf;
18507                               ImmediateShiftOperand
18508                                   shift_operand((instr >> 4) & 0x3,
18509                                                 ((instr >> 6) & 0x3) |
18510                                                     ((instr >> 10) & 0x1c));
18511                               if (InITBlock() &&
18512                                   (instr & 0x00100000) == 0x00000000 &&
18513                                   shift_operand.GetShift().IsLSL() &&
18514                                   (shift_operand.GetAmount() == 0) &&
18515                                   ((rd == rn) &&
18516                                    (rd < kNumberOfT32LowRegisters) &&
18517                                    (rm < kNumberOfT32LowRegisters))) {
18518                                 // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18519                                 orr(CurrentCond(),
18520                                     Wide,
18521                                     Register(rd),
18522                                     Register(rn),
18523                                     Register(rm));
18524                                 if (((instr & 0xfff08000) != 0xea400000)) {
18525                                   UnpredictableT32(instr);
18526                                 }
18527                               } else if ((instr & 0x00100000) == 0x00000000) {
18528                                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18529                                 orr(CurrentCond(),
18530                                     Best,
18531                                     Register(rd),
18532                                     Register(rn),
18533                                     Operand(Register(rm),
18534                                             shift_operand.GetType(),
18535                                             shift_operand.GetAmount()));
18536                                 if (((instr & 0xfff08000) != 0xea400000)) {
18537                                   UnpredictableT32(instr);
18538                                 }
18539                               } else {
18540                                 UnallocatedT32(instr);
18541                               }
18542                               break;
18543                             }
18544                           }
18545                           break;
18546                         }
18547                       }
18548                       break;
18549                     }
18550                     case 0x00600000: {
18551                       // 0xea600000
18552                       switch (instr & 0x000f0000) {
18553                         case 0x000f0000: {
18554                           // 0xea6f0000
18555                           switch (instr & 0x000070f0) {
18556                             case 0x00000030: {
18557                               // 0xea6f0030
18558                               unsigned rd = (instr >> 8) & 0xf;
18559                               unsigned rm = instr & 0xf;
18560                               // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
18561                               mvn(CurrentCond(),
18562                                   Best,
18563                                   Register(rd),
18564                                   Operand(Register(rm), RRX));
18565                               if (((instr & 0xfffff0f0) != 0xea6f0030)) {
18566                                 UnpredictableT32(instr);
18567                               }
18568                               break;
18569                             }
18570                             default: {
18571                               if (((instr & 0x70f0) == 0x30)) {
18572                                 UnallocatedT32(instr);
18573                                 return;
18574                               }
18575                               unsigned rd = (instr >> 8) & 0xf;
18576                               unsigned rm = instr & 0xf;
18577                               ImmediateShiftOperand
18578                                   shift_operand((instr >> 4) & 0x3,
18579                                                 ((instr >> 6) & 0x3) |
18580                                                     ((instr >> 10) & 0x1c));
18581                               if (InITBlock() &&
18582                                   (instr & 0x00100000) == 0x00000000 &&
18583                                   shift_operand.GetShift().IsLSL() &&
18584                                   (shift_operand.GetAmount() == 0) &&
18585                                   ((rd < kNumberOfT32LowRegisters) &&
18586                                    (rm < kNumberOfT32LowRegisters))) {
18587                                 // MVN<c>.W <Rd>, <Rm> ; T2
18588                                 mvn(CurrentCond(),
18589                                     Wide,
18590                                     Register(rd),
18591                                     Register(rm));
18592                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
18593                                   UnpredictableT32(instr);
18594                                 }
18595                               } else if ((instr & 0x00100000) == 0x00000000) {
18596                                 // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18597                                 mvn(CurrentCond(),
18598                                     Best,
18599                                     Register(rd),
18600                                     Operand(Register(rm),
18601                                             shift_operand.GetType(),
18602                                             shift_operand.GetAmount()));
18603                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
18604                                   UnpredictableT32(instr);
18605                                 }
18606                               } else {
18607                                 UnallocatedT32(instr);
18608                               }
18609                               break;
18610                             }
18611                           }
18612                           break;
18613                         }
18614                         default: {
18615                           switch (instr & 0x000070f0) {
18616                             case 0x00000030: {
18617                               // 0xea600030
18618                               if (((instr & 0xf0000) == 0xf0000)) {
18619                                 UnallocatedT32(instr);
18620                                 return;
18621                               }
18622                               unsigned rd = (instr >> 8) & 0xf;
18623                               unsigned rn = (instr >> 16) & 0xf;
18624                               unsigned rm = instr & 0xf;
18625                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
18626                               orn(CurrentCond(),
18627                                   Register(rd),
18628                                   Register(rn),
18629                                   Operand(Register(rm), RRX));
18630                               if (((instr & 0xfff0f0f0) != 0xea600030)) {
18631                                 UnpredictableT32(instr);
18632                               }
18633                               break;
18634                             }
18635                             default: {
18636                               if (((instr & 0xf0000) == 0xf0000) ||
18637                                   ((instr & 0x70f0) == 0x30)) {
18638                                 UnallocatedT32(instr);
18639                                 return;
18640                               }
18641                               unsigned rd = (instr >> 8) & 0xf;
18642                               unsigned rn = (instr >> 16) & 0xf;
18643                               unsigned rm = instr & 0xf;
18644                               ImmediateShiftOperand
18645                                   shift_operand((instr >> 4) & 0x3,
18646                                                 ((instr >> 6) & 0x3) |
18647                                                     ((instr >> 10) & 0x1c));
18648                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
18649                               orn(CurrentCond(),
18650                                   Register(rd),
18651                                   Register(rn),
18652                                   Operand(Register(rm),
18653                                           shift_operand.GetType(),
18654                                           shift_operand.GetAmount()));
18655                               if (((instr & 0xfff08000) != 0xea600000)) {
18656                                 UnpredictableT32(instr);
18657                               }
18658                               break;
18659                             }
18660                           }
18661                           break;
18662                         }
18663                       }
18664                       break;
18665                     }
18666                   }
18667                   break;
18668                 }
18669                 case 0x00100000: {
18670                   // 0xea100000
18671                   switch (instr & 0x00600000) {
18672                     case 0x00000000: {
18673                       // 0xea100000
18674                       switch (instr & 0x00000f00) {
18675                         case 0x00000f00: {
18676                           // 0xea100f00
18677                           switch (instr & 0x000070f0) {
18678                             case 0x00000030: {
18679                               // 0xea100f30
18680                               unsigned rn = (instr >> 16) & 0xf;
18681                               unsigned rm = instr & 0xf;
18682                               // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
18683                               tst(CurrentCond(),
18684                                   Best,
18685                                   Register(rn),
18686                                   Operand(Register(rm), RRX));
18687                               if (((instr & 0xfff0fff0) != 0xea100f30)) {
18688                                 UnpredictableT32(instr);
18689                               }
18690                               break;
18691                             }
18692                             default: {
18693                               if (((instr & 0x70f0) == 0x30)) {
18694                                 UnallocatedT32(instr);
18695                                 return;
18696                               }
18697                               unsigned rn = (instr >> 16) & 0xf;
18698                               unsigned rm = instr & 0xf;
18699                               ImmediateShiftOperand
18700                                   shift_operand((instr >> 4) & 0x3,
18701                                                 ((instr >> 6) & 0x3) |
18702                                                     ((instr >> 10) & 0x1c));
18703                               if (shift_operand.GetShift().IsLSL() &&
18704                                   (shift_operand.GetAmount() == 0) &&
18705                                   ((rn < kNumberOfT32LowRegisters) &&
18706                                    (rm < kNumberOfT32LowRegisters))) {
18707                                 // TST{<c>}.W <Rn>, <Rm> ; T2
18708                                 tst(CurrentCond(),
18709                                     Wide,
18710                                     Register(rn),
18711                                     Register(rm));
18712                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
18713                                   UnpredictableT32(instr);
18714                                 }
18715                               } else {
18716                                 // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18717                                 tst(CurrentCond(),
18718                                     Best,
18719                                     Register(rn),
18720                                     Operand(Register(rm),
18721                                             shift_operand.GetType(),
18722                                             shift_operand.GetAmount()));
18723                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
18724                                   UnpredictableT32(instr);
18725                                 }
18726                               }
18727                               break;
18728                             }
18729                           }
18730                           break;
18731                         }
18732                         default: {
18733                           switch (instr & 0x000070f0) {
18734                             case 0x00000030: {
18735                               // 0xea100030
18736                               if (((instr & 0xf00) == 0xf00)) {
18737                                 UnallocatedT32(instr);
18738                                 return;
18739                               }
18740                               unsigned rd = (instr >> 8) & 0xf;
18741                               unsigned rn = (instr >> 16) & 0xf;
18742                               unsigned rm = instr & 0xf;
18743                               // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18744                               ands(CurrentCond(),
18745                                    Best,
18746                                    Register(rd),
18747                                    Register(rn),
18748                                    Operand(Register(rm), RRX));
18749                               if (((instr & 0xfff0f0f0) != 0xea100030)) {
18750                                 UnpredictableT32(instr);
18751                               }
18752                               break;
18753                             }
18754                             default: {
18755                               if (((instr & 0x70f0) == 0x30) ||
18756                                   ((instr & 0xf00) == 0xf00)) {
18757                                 UnallocatedT32(instr);
18758                                 return;
18759                               }
18760                               unsigned rd = (instr >> 8) & 0xf;
18761                               unsigned rn = (instr >> 16) & 0xf;
18762                               unsigned rm = instr & 0xf;
18763                               ImmediateShiftOperand
18764                                   shift_operand((instr >> 4) & 0x3,
18765                                                 ((instr >> 6) & 0x3) |
18766                                                     ((instr >> 10) & 0x1c));
18767                               if (OutsideITBlock() &&
18768                                   (instr & 0x00100000) == 0x00100000 &&
18769                                   shift_operand.GetShift().IsLSL() &&
18770                                   (shift_operand.GetAmount() == 0) &&
18771                                   ((rd == rn) &&
18772                                    (rd < kNumberOfT32LowRegisters) &&
18773                                    (rm < kNumberOfT32LowRegisters))) {
18774                                 // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2
18775                                 ands(Condition::None(),
18776                                      Wide,
18777                                      Register(rd),
18778                                      Register(rn),
18779                                      Register(rm));
18780                                 if (((instr & 0xfff08000) != 0xea100000)) {
18781                                   UnpredictableT32(instr);
18782                                 }
18783                               } else if ((instr & 0x00100000) == 0x00100000) {
18784                                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18785                                 ands(CurrentCond(),
18786                                      Best,
18787                                      Register(rd),
18788                                      Register(rn),
18789                                      Operand(Register(rm),
18790                                              shift_operand.GetType(),
18791                                              shift_operand.GetAmount()));
18792                                 if (((instr & 0xfff08000) != 0xea100000)) {
18793                                   UnpredictableT32(instr);
18794                                 }
18795                               } else {
18796                                 UnallocatedT32(instr);
18797                               }
18798                               break;
18799                             }
18800                           }
18801                           break;
18802                         }
18803                       }
18804                       break;
18805                     }
18806                     case 0x00200000: {
18807                       // 0xea300000
18808                       switch (instr & 0x000070f0) {
18809                         case 0x00000030: {
18810                           // 0xea300030
18811                           unsigned rd = (instr >> 8) & 0xf;
18812                           unsigned rn = (instr >> 16) & 0xf;
18813                           unsigned rm = instr & 0xf;
18814                           // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18815                           bics(CurrentCond(),
18816                                Best,
18817                                Register(rd),
18818                                Register(rn),
18819                                Operand(Register(rm), RRX));
18820                           if (((instr & 0xfff0f0f0) != 0xea300030)) {
18821                             UnpredictableT32(instr);
18822                           }
18823                           break;
18824                         }
18825                         default: {
18826                           if (((instr & 0x70f0) == 0x30)) {
18827                             UnallocatedT32(instr);
18828                             return;
18829                           }
18830                           unsigned rd = (instr >> 8) & 0xf;
18831                           unsigned rn = (instr >> 16) & 0xf;
18832                           unsigned rm = instr & 0xf;
18833                           ImmediateShiftOperand
18834                               shift_operand((instr >> 4) & 0x3,
18835                                             ((instr >> 6) & 0x3) |
18836                                                 ((instr >> 10) & 0x1c));
18837                           if (OutsideITBlock() &&
18838                               (instr & 0x00100000) == 0x00100000 &&
18839                               shift_operand.GetShift().IsLSL() &&
18840                               (shift_operand.GetAmount() == 0) &&
18841                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18842                                (rm < kNumberOfT32LowRegisters))) {
18843                             // BICS.W {<Rd>}, <Rn>, <Rm> ; T2
18844                             bics(Condition::None(),
18845                                  Wide,
18846                                  Register(rd),
18847                                  Register(rn),
18848                                  Register(rm));
18849                             if (((instr & 0xfff08000) != 0xea300000)) {
18850                               UnpredictableT32(instr);
18851                             }
18852                           } else if ((instr & 0x00100000) == 0x00100000) {
18853                             // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18854                             bics(CurrentCond(),
18855                                  Best,
18856                                  Register(rd),
18857                                  Register(rn),
18858                                  Operand(Register(rm),
18859                                          shift_operand.GetType(),
18860                                          shift_operand.GetAmount()));
18861                             if (((instr & 0xfff08000) != 0xea300000)) {
18862                               UnpredictableT32(instr);
18863                             }
18864                           } else {
18865                             UnallocatedT32(instr);
18866                           }
18867                           break;
18868                         }
18869                       }
18870                       break;
18871                     }
18872                     case 0x00400000: {
18873                       // 0xea500000
18874                       switch (instr & 0x000f0000) {
18875                         case 0x000f0000: {
18876                           // 0xea5f0000
18877                           switch (instr & 0x000070f0) {
18878                             case 0x00000030: {
18879                               // 0xea5f0030
18880                               unsigned rd = (instr >> 8) & 0xf;
18881                               unsigned rm = instr & 0xf;
18882                               // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3
18883                               rrxs(CurrentCond(), Register(rd), Register(rm));
18884                               if (((instr & 0xfffff0f0) != 0xea5f0030)) {
18885                                 UnpredictableT32(instr);
18886                               }
18887                               break;
18888                             }
18889                             default: {
18890                               if (((instr & 0x70f0) == 0x30)) {
18891                                 UnallocatedT32(instr);
18892                                 return;
18893                               }
18894                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18895                                    Uint32(0x2))) {
18896                                 unsigned rd = (instr >> 8) & 0xf;
18897                                 unsigned rm = instr & 0xf;
18898                                 uint32_t amount = ((instr >> 6) & 0x3) |
18899                                                   ((instr >> 10) & 0x1c);
18900                                 if (amount == 0) amount = 32;
18901                                 if (OutsideITBlock() &&
18902                                     ((rd < kNumberOfT32LowRegisters) &&
18903                                      (rm < kNumberOfT32LowRegisters) &&
18904                                      ((amount >= 1) && (amount <= 32)))) {
18905                                   // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3
18906                                   asrs(Condition::None(),
18907                                        Wide,
18908                                        Register(rd),
18909                                        Register(rm),
18910                                        amount);
18911                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
18912                                     UnpredictableT32(instr);
18913                                   }
18914                                 } else {
18915                                   // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18916                                   asrs(CurrentCond(),
18917                                        Best,
18918                                        Register(rd),
18919                                        Register(rm),
18920                                        amount);
18921                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
18922                                     UnpredictableT32(instr);
18923                                   }
18924                                 }
18925                                 return;
18926                               }
18927                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18928                                    Uint32(0x0)) &&
18929                                   ((instr & 0x000070c0) != 0x00000000)) {
18930                                 unsigned rd = (instr >> 8) & 0xf;
18931                                 unsigned rm = instr & 0xf;
18932                                 uint32_t amount = ((instr >> 6) & 0x3) |
18933                                                   ((instr >> 10) & 0x1c);
18934                                 if (OutsideITBlock() &&
18935                                     ((rd < kNumberOfT32LowRegisters) &&
18936                                      (rm < kNumberOfT32LowRegisters) &&
18937                                      ((amount >= 1) && (amount <= 31)))) {
18938                                   // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3
18939                                   lsls(Condition::None(),
18940                                        Wide,
18941                                        Register(rd),
18942                                        Register(rm),
18943                                        amount);
18944                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
18945                                     UnpredictableT32(instr);
18946                                   }
18947                                 } else {
18948                                   // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18949                                   lsls(CurrentCond(),
18950                                        Best,
18951                                        Register(rd),
18952                                        Register(rm),
18953                                        amount);
18954                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
18955                                     UnpredictableT32(instr);
18956                                   }
18957                                 }
18958                                 return;
18959                               }
18960                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18961                                    Uint32(0x1))) {
18962                                 unsigned rd = (instr >> 8) & 0xf;
18963                                 unsigned rm = instr & 0xf;
18964                                 uint32_t amount = ((instr >> 6) & 0x3) |
18965                                                   ((instr >> 10) & 0x1c);
18966                                 if (amount == 0) amount = 32;
18967                                 if (OutsideITBlock() &&
18968                                     ((rd < kNumberOfT32LowRegisters) &&
18969                                      (rm < kNumberOfT32LowRegisters) &&
18970                                      ((amount >= 1) && (amount <= 32)))) {
18971                                   // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3
18972                                   lsrs(Condition::None(),
18973                                        Wide,
18974                                        Register(rd),
18975                                        Register(rm),
18976                                        amount);
18977                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
18978                                     UnpredictableT32(instr);
18979                                   }
18980                                 } else {
18981                                   // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18982                                   lsrs(CurrentCond(),
18983                                        Best,
18984                                        Register(rd),
18985                                        Register(rm),
18986                                        amount);
18987                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
18988                                     UnpredictableT32(instr);
18989                                   }
18990                                 }
18991                                 return;
18992                               }
18993                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18994                                    Uint32(0x3)) &&
18995                                   ((instr & 0x000070c0) != 0x00000000)) {
18996                                 unsigned rd = (instr >> 8) & 0xf;
18997                                 unsigned rm = instr & 0xf;
18998                                 uint32_t amount = ((instr >> 6) & 0x3) |
18999                                                   ((instr >> 10) & 0x1c);
19000                                 // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
19001                                 rors(CurrentCond(),
19002                                      Best,
19003                                      Register(rd),
19004                                      Register(rm),
19005                                      amount);
19006                                 if (((instr & 0xffff8030) != 0xea5f0030)) {
19007                                   UnpredictableT32(instr);
19008                                 }
19009                                 return;
19010                               }
19011                               unsigned rd = (instr >> 8) & 0xf;
19012                               unsigned rm = instr & 0xf;
19013                               ImmediateShiftOperand
19014                                   shift_operand((instr >> 4) & 0x3,
19015                                                 ((instr >> 6) & 0x3) |
19016                                                     ((instr >> 10) & 0x1c));
19017                               if (OutsideITBlock() &&
19018                                   (instr & 0x00100000) == 0x00100000 &&
19019                                   ((rd < kNumberOfT32LowRegisters) &&
19020                                    (rm < kNumberOfT32LowRegisters))) {
19021                                 // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3
19022                                 movs(Condition::None(),
19023                                      Wide,
19024                                      Register(rd),
19025                                      Operand(Register(rm),
19026                                              shift_operand.GetType(),
19027                                              shift_operand.GetAmount()));
19028                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
19029                                   UnpredictableT32(instr);
19030                                 }
19031                               } else if ((instr & 0x00100000) == 0x00100000) {
19032                                 // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19033                                 movs(CurrentCond(),
19034                                      Best,
19035                                      Register(rd),
19036                                      Operand(Register(rm),
19037                                              shift_operand.GetType(),
19038                                              shift_operand.GetAmount()));
19039                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
19040                                   UnpredictableT32(instr);
19041                                 }
19042                               } else {
19043                                 UnallocatedT32(instr);
19044                               }
19045                               break;
19046                             }
19047                           }
19048                           break;
19049                         }
19050                         default: {
19051                           switch (instr & 0x000070f0) {
19052                             case 0x00000030: {
19053                               // 0xea500030
19054                               if (((instr & 0xf0000) == 0xf0000)) {
19055                                 UnallocatedT32(instr);
19056                                 return;
19057                               }
19058                               unsigned rd = (instr >> 8) & 0xf;
19059                               unsigned rn = (instr >> 16) & 0xf;
19060                               unsigned rm = instr & 0xf;
19061                               // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19062                               orrs(CurrentCond(),
19063                                    Best,
19064                                    Register(rd),
19065                                    Register(rn),
19066                                    Operand(Register(rm), RRX));
19067                               if (((instr & 0xfff0f0f0) != 0xea500030)) {
19068                                 UnpredictableT32(instr);
19069                               }
19070                               break;
19071                             }
19072                             default: {
19073                               if (((instr & 0xf0000) == 0xf0000) ||
19074                                   ((instr & 0x70f0) == 0x30)) {
19075                                 UnallocatedT32(instr);
19076                                 return;
19077                               }
19078                               unsigned rd = (instr >> 8) & 0xf;
19079                               unsigned rn = (instr >> 16) & 0xf;
19080                               unsigned rm = instr & 0xf;
19081                               ImmediateShiftOperand
19082                                   shift_operand((instr >> 4) & 0x3,
19083                                                 ((instr >> 6) & 0x3) |
19084                                                     ((instr >> 10) & 0x1c));
19085                               if (OutsideITBlock() &&
19086                                   (instr & 0x00100000) == 0x00100000 &&
19087                                   shift_operand.GetShift().IsLSL() &&
19088                                   (shift_operand.GetAmount() == 0) &&
19089                                   ((rd == rn) &&
19090                                    (rd < kNumberOfT32LowRegisters) &&
19091                                    (rm < kNumberOfT32LowRegisters))) {
19092                                 // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2
19093                                 orrs(Condition::None(),
19094                                      Wide,
19095                                      Register(rd),
19096                                      Register(rn),
19097                                      Register(rm));
19098                                 if (((instr & 0xfff08000) != 0xea500000)) {
19099                                   UnpredictableT32(instr);
19100                                 }
19101                               } else if ((instr & 0x00100000) == 0x00100000) {
19102                                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19103                                 orrs(CurrentCond(),
19104                                      Best,
19105                                      Register(rd),
19106                                      Register(rn),
19107                                      Operand(Register(rm),
19108                                              shift_operand.GetType(),
19109                                              shift_operand.GetAmount()));
19110                                 if (((instr & 0xfff08000) != 0xea500000)) {
19111                                   UnpredictableT32(instr);
19112                                 }
19113                               } else {
19114                                 UnallocatedT32(instr);
19115                               }
19116                               break;
19117                             }
19118                           }
19119                           break;
19120                         }
19121                       }
19122                       break;
19123                     }
19124                     case 0x00600000: {
19125                       // 0xea700000
19126                       switch (instr & 0x000f0000) {
19127                         case 0x000f0000: {
19128                           // 0xea7f0000
19129                           switch (instr & 0x000070f0) {
19130                             case 0x00000030: {
19131                               // 0xea7f0030
19132                               unsigned rd = (instr >> 8) & 0xf;
19133                               unsigned rm = instr & 0xf;
19134                               // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
19135                               mvns(CurrentCond(),
19136                                    Best,
19137                                    Register(rd),
19138                                    Operand(Register(rm), RRX));
19139                               if (((instr & 0xfffff0f0) != 0xea7f0030)) {
19140                                 UnpredictableT32(instr);
19141                               }
19142                               break;
19143                             }
19144                             default: {
19145                               if (((instr & 0x70f0) == 0x30)) {
19146                                 UnallocatedT32(instr);
19147                                 return;
19148                               }
19149                               unsigned rd = (instr >> 8) & 0xf;
19150                               unsigned rm = instr & 0xf;
19151                               ImmediateShiftOperand
19152                                   shift_operand((instr >> 4) & 0x3,
19153                                                 ((instr >> 6) & 0x3) |
19154                                                     ((instr >> 10) & 0x1c));
19155                               if (OutsideITBlock() &&
19156                                   (instr & 0x00100000) == 0x00100000 &&
19157                                   shift_operand.GetShift().IsLSL() &&
19158                                   (shift_operand.GetAmount() == 0) &&
19159                                   ((rd < kNumberOfT32LowRegisters) &&
19160                                    (rm < kNumberOfT32LowRegisters))) {
19161                                 // MVNS.W <Rd>, <Rm> ; T2
19162                                 mvns(Condition::None(),
19163                                      Wide,
19164                                      Register(rd),
19165                                      Register(rm));
19166                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
19167                                   UnpredictableT32(instr);
19168                                 }
19169                               } else if ((instr & 0x00100000) == 0x00100000) {
19170                                 // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19171                                 mvns(CurrentCond(),
19172                                      Best,
19173                                      Register(rd),
19174                                      Operand(Register(rm),
19175                                              shift_operand.GetType(),
19176                                              shift_operand.GetAmount()));
19177                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
19178                                   UnpredictableT32(instr);
19179                                 }
19180                               } else {
19181                                 UnallocatedT32(instr);
19182                               }
19183                               break;
19184                             }
19185                           }
19186                           break;
19187                         }
19188                         default: {
19189                           switch (instr & 0x000070f0) {
19190                             case 0x00000030: {
19191                               // 0xea700030
19192                               if (((instr & 0xf0000) == 0xf0000)) {
19193                                 UnallocatedT32(instr);
19194                                 return;
19195                               }
19196                               unsigned rd = (instr >> 8) & 0xf;
19197                               unsigned rn = (instr >> 16) & 0xf;
19198                               unsigned rm = instr & 0xf;
19199                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
19200                               orns(CurrentCond(),
19201                                    Register(rd),
19202                                    Register(rn),
19203                                    Operand(Register(rm), RRX));
19204                               if (((instr & 0xfff0f0f0) != 0xea700030)) {
19205                                 UnpredictableT32(instr);
19206                               }
19207                               break;
19208                             }
19209                             default: {
19210                               if (((instr & 0xf0000) == 0xf0000) ||
19211                                   ((instr & 0x70f0) == 0x30)) {
19212                                 UnallocatedT32(instr);
19213                                 return;
19214                               }
19215                               unsigned rd = (instr >> 8) & 0xf;
19216                               unsigned rn = (instr >> 16) & 0xf;
19217                               unsigned rm = instr & 0xf;
19218                               ImmediateShiftOperand
19219                                   shift_operand((instr >> 4) & 0x3,
19220                                                 ((instr >> 6) & 0x3) |
19221                                                     ((instr >> 10) & 0x1c));
19222                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
19223                               orns(CurrentCond(),
19224                                    Register(rd),
19225                                    Register(rn),
19226                                    Operand(Register(rm),
19227                                            shift_operand.GetType(),
19228                                            shift_operand.GetAmount()));
19229                               if (((instr & 0xfff08000) != 0xea700000)) {
19230                                 UnpredictableT32(instr);
19231                               }
19232                               break;
19233                             }
19234                           }
19235                           break;
19236                         }
19237                       }
19238                       break;
19239                     }
19240                   }
19241                   break;
19242                 }
19243                 case 0x00800000: {
19244                   // 0xea800000
19245                   switch (instr & 0x00600000) {
19246                     case 0x00000000: {
19247                       // 0xea800000
19248                       switch (instr & 0x000070f0) {
19249                         case 0x00000030: {
19250                           // 0xea800030
19251                           unsigned rd = (instr >> 8) & 0xf;
19252                           unsigned rn = (instr >> 16) & 0xf;
19253                           unsigned rm = instr & 0xf;
19254                           // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19255                           eor(CurrentCond(),
19256                               Best,
19257                               Register(rd),
19258                               Register(rn),
19259                               Operand(Register(rm), RRX));
19260                           if (((instr & 0xfff0f0f0) != 0xea800030)) {
19261                             UnpredictableT32(instr);
19262                           }
19263                           break;
19264                         }
19265                         default: {
19266                           if (((instr & 0x70f0) == 0x30)) {
19267                             UnallocatedT32(instr);
19268                             return;
19269                           }
19270                           unsigned rd = (instr >> 8) & 0xf;
19271                           unsigned rn = (instr >> 16) & 0xf;
19272                           unsigned rm = instr & 0xf;
19273                           ImmediateShiftOperand
19274                               shift_operand((instr >> 4) & 0x3,
19275                                             ((instr >> 6) & 0x3) |
19276                                                 ((instr >> 10) & 0x1c));
19277                           if (InITBlock() &&
19278                               (instr & 0x00100000) == 0x00000000 &&
19279                               shift_operand.GetShift().IsLSL() &&
19280                               (shift_operand.GetAmount() == 0) &&
19281                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19282                                (rm < kNumberOfT32LowRegisters))) {
19283                             // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19284                             eor(CurrentCond(),
19285                                 Wide,
19286                                 Register(rd),
19287                                 Register(rn),
19288                                 Register(rm));
19289                             if (((instr & 0xfff08000) != 0xea800000)) {
19290                               UnpredictableT32(instr);
19291                             }
19292                           } else if ((instr & 0x00100000) == 0x00000000) {
19293                             // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19294                             eor(CurrentCond(),
19295                                 Best,
19296                                 Register(rd),
19297                                 Register(rn),
19298                                 Operand(Register(rm),
19299                                         shift_operand.GetType(),
19300                                         shift_operand.GetAmount()));
19301                             if (((instr & 0xfff08000) != 0xea800000)) {
19302                               UnpredictableT32(instr);
19303                             }
19304                           } else {
19305                             UnallocatedT32(instr);
19306                           }
19307                           break;
19308                         }
19309                       }
19310                       break;
19311                     }
19312                     case 0x00400000: {
19313                       // 0xeac00000
19314                       switch (instr & 0x00000030) {
19315                         case 0x00000000: {
19316                           // 0xeac00000
19317                           unsigned rd = (instr >> 8) & 0xf;
19318                           unsigned rn = (instr >> 16) & 0xf;
19319                           unsigned rm = instr & 0xf;
19320                           uint32_t amount =
19321                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
19322                           // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length)
19323                           pkhbt(CurrentCond(),
19324                                 Register(rd),
19325                                 Register(rn),
19326                                 Operand(Register(rm), LSL, amount));
19327                           if (((instr & 0xfff08030) != 0xeac00000)) {
19328                             UnpredictableT32(instr);
19329                           }
19330                           break;
19331                         }
19332                         case 0x00000020: {
19333                           // 0xeac00020
19334                           unsigned rd = (instr >> 8) & 0xf;
19335                           unsigned rn = (instr >> 16) & 0xf;
19336                           unsigned rm = instr & 0xf;
19337                           uint32_t amount =
19338                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
19339                           if (amount == 0) amount = 32;
19340                           // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length)
19341                           pkhtb(CurrentCond(),
19342                                 Register(rd),
19343                                 Register(rn),
19344                                 Operand(Register(rm), ASR, amount));
19345                           if (((instr & 0xfff08030) != 0xeac00020)) {
19346                             UnpredictableT32(instr);
19347                           }
19348                           break;
19349                         }
19350                         default:
19351                           UnallocatedT32(instr);
19352                           break;
19353                       }
19354                       break;
19355                     }
19356                     default:
19357                       UnallocatedT32(instr);
19358                       break;
19359                   }
19360                   break;
19361                 }
19362                 case 0x00900000: {
19363                   // 0xea900000
19364                   switch (instr & 0x00600000) {
19365                     case 0x00000000: {
19366                       // 0xea900000
19367                       switch (instr & 0x00000f00) {
19368                         case 0x00000f00: {
19369                           // 0xea900f00
19370                           switch (instr & 0x000070f0) {
19371                             case 0x00000030: {
19372                               // 0xea900f30
19373                               unsigned rn = (instr >> 16) & 0xf;
19374                               unsigned rm = instr & 0xf;
19375                               // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1
19376                               teq(CurrentCond(),
19377                                   Register(rn),
19378                                   Operand(Register(rm), RRX));
19379                               if (((instr & 0xfff0fff0) != 0xea900f30)) {
19380                                 UnpredictableT32(instr);
19381                               }
19382                               break;
19383                             }
19384                             default: {
19385                               if (((instr & 0x70f0) == 0x30)) {
19386                                 UnallocatedT32(instr);
19387                                 return;
19388                               }
19389                               unsigned rn = (instr >> 16) & 0xf;
19390                               unsigned rm = instr & 0xf;
19391                               ImmediateShiftOperand
19392                                   shift_operand((instr >> 4) & 0x3,
19393                                                 ((instr >> 6) & 0x3) |
19394                                                     ((instr >> 10) & 0x1c));
19395                               // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
19396                               teq(CurrentCond(),
19397                                   Register(rn),
19398                                   Operand(Register(rm),
19399                                           shift_operand.GetType(),
19400                                           shift_operand.GetAmount()));
19401                               if (((instr & 0xfff08f00) != 0xea900f00)) {
19402                                 UnpredictableT32(instr);
19403                               }
19404                               break;
19405                             }
19406                           }
19407                           break;
19408                         }
19409                         default: {
19410                           switch (instr & 0x000070f0) {
19411                             case 0x00000030: {
19412                               // 0xea900030
19413                               if (((instr & 0xf00) == 0xf00)) {
19414                                 UnallocatedT32(instr);
19415                                 return;
19416                               }
19417                               unsigned rd = (instr >> 8) & 0xf;
19418                               unsigned rn = (instr >> 16) & 0xf;
19419                               unsigned rm = instr & 0xf;
19420                               // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19421                               eors(CurrentCond(),
19422                                    Best,
19423                                    Register(rd),
19424                                    Register(rn),
19425                                    Operand(Register(rm), RRX));
19426                               if (((instr & 0xfff0f0f0) != 0xea900030)) {
19427                                 UnpredictableT32(instr);
19428                               }
19429                               break;
19430                             }
19431                             default: {
19432                               if (((instr & 0x70f0) == 0x30) ||
19433                                   ((instr & 0xf00) == 0xf00)) {
19434                                 UnallocatedT32(instr);
19435                                 return;
19436                               }
19437                               unsigned rd = (instr >> 8) & 0xf;
19438                               unsigned rn = (instr >> 16) & 0xf;
19439                               unsigned rm = instr & 0xf;
19440                               ImmediateShiftOperand
19441                                   shift_operand((instr >> 4) & 0x3,
19442                                                 ((instr >> 6) & 0x3) |
19443                                                     ((instr >> 10) & 0x1c));
19444                               if (OutsideITBlock() &&
19445                                   (instr & 0x00100000) == 0x00100000 &&
19446                                   shift_operand.GetShift().IsLSL() &&
19447                                   (shift_operand.GetAmount() == 0) &&
19448                                   ((rd == rn) &&
19449                                    (rd < kNumberOfT32LowRegisters) &&
19450                                    (rm < kNumberOfT32LowRegisters))) {
19451                                 // EORS.W {<Rd>}, <Rn>, <Rm> ; T2
19452                                 eors(Condition::None(),
19453                                      Wide,
19454                                      Register(rd),
19455                                      Register(rn),
19456                                      Register(rm));
19457                                 if (((instr & 0xfff08000) != 0xea900000)) {
19458                                   UnpredictableT32(instr);
19459                                 }
19460                               } else if ((instr & 0x00100000) == 0x00100000) {
19461                                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19462                                 eors(CurrentCond(),
19463                                      Best,
19464                                      Register(rd),
19465                                      Register(rn),
19466                                      Operand(Register(rm),
19467                                              shift_operand.GetType(),
19468                                              shift_operand.GetAmount()));
19469                                 if (((instr & 0xfff08000) != 0xea900000)) {
19470                                   UnpredictableT32(instr);
19471                                 }
19472                               } else {
19473                                 UnallocatedT32(instr);
19474                               }
19475                               break;
19476                             }
19477                           }
19478                           break;
19479                         }
19480                       }
19481                       break;
19482                     }
19483                     default:
19484                       UnallocatedT32(instr);
19485                       break;
19486                   }
19487                   break;
19488                 }
19489                 case 0x01000000: {
19490                   // 0xeb000000
19491                   switch (instr & 0x00600000) {
19492                     case 0x00000000: {
19493                       // 0xeb000000
19494                       switch (instr & 0x000f0000) {
19495                         case 0x000d0000: {
19496                           // 0xeb0d0000
19497                           switch (instr & 0x000070f0) {
19498                             case 0x00000030: {
19499                               // 0xeb0d0030
19500                               unsigned rd = (instr >> 8) & 0xf;
19501                               unsigned rm = instr & 0xf;
19502                               // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
19503                               add(CurrentCond(),
19504                                   Best,
19505                                   Register(rd),
19506                                   sp,
19507                                   Operand(Register(rm), RRX));
19508                               if (((instr & 0xfffff0f0) != 0xeb0d0030)) {
19509                                 UnpredictableT32(instr);
19510                               }
19511                               break;
19512                             }
19513                             default: {
19514                               if (((instr & 0x70f0) == 0x30)) {
19515                                 UnallocatedT32(instr);
19516                                 return;
19517                               }
19518                               unsigned rd = (instr >> 8) & 0xf;
19519                               unsigned rm = instr & 0xf;
19520                               ImmediateShiftOperand
19521                                   shift_operand((instr >> 4) & 0x3,
19522                                                 ((instr >> 6) & 0x3) |
19523                                                     ((instr >> 10) & 0x1c));
19524                               if ((instr & 0x00100000) == 0x00000000 &&
19525                                   shift_operand.GetShift().IsLSL() &&
19526                                   (shift_operand.GetAmount() == 0) &&
19527                                   (((rd == rm)) || ((rd == sp.GetCode())))) {
19528                                 // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3
19529                                 add(CurrentCond(),
19530                                     Wide,
19531                                     Register(rd),
19532                                     sp,
19533                                     Register(rm));
19534                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
19535                                   UnpredictableT32(instr);
19536                                 }
19537                               } else if ((instr & 0x00100000) == 0x00000000) {
19538                                 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19539                                 add(CurrentCond(),
19540                                     Best,
19541                                     Register(rd),
19542                                     sp,
19543                                     Operand(Register(rm),
19544                                             shift_operand.GetType(),
19545                                             shift_operand.GetAmount()));
19546                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
19547                                   UnpredictableT32(instr);
19548                                 }
19549                               } else {
19550                                 UnallocatedT32(instr);
19551                               }
19552                               break;
19553                             }
19554                           }
19555                           break;
19556                         }
19557                         default: {
19558                           switch (instr & 0x000070f0) {
19559                             case 0x00000030: {
19560                               // 0xeb000030
19561                               if (((instr & 0xf0000) == 0xd0000)) {
19562                                 UnallocatedT32(instr);
19563                                 return;
19564                               }
19565                               unsigned rd = (instr >> 8) & 0xf;
19566                               unsigned rn = (instr >> 16) & 0xf;
19567                               unsigned rm = instr & 0xf;
19568                               // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
19569                               add(CurrentCond(),
19570                                   Best,
19571                                   Register(rd),
19572                                   Register(rn),
19573                                   Operand(Register(rm), RRX));
19574                               if (((instr & 0xfff0f0f0) != 0xeb000030)) {
19575                                 UnpredictableT32(instr);
19576                               }
19577                               break;
19578                             }
19579                             default: {
19580                               if (((instr & 0xf0000) == 0xd0000) ||
19581                                   ((instr & 0x70f0) == 0x30)) {
19582                                 UnallocatedT32(instr);
19583                                 return;
19584                               }
19585                               unsigned rd = (instr >> 8) & 0xf;
19586                               unsigned rn = (instr >> 16) & 0xf;
19587                               unsigned rm = instr & 0xf;
19588                               ImmediateShiftOperand
19589                                   shift_operand((instr >> 4) & 0x3,
19590                                                 ((instr >> 6) & 0x3) |
19591                                                     ((instr >> 10) & 0x1c));
19592                               if (InITBlock() &&
19593                                   (instr & 0x00100000) == 0x00000000 &&
19594                                   shift_operand.GetShift().IsLSL() &&
19595                                   (shift_operand.GetAmount() == 0) &&
19596                                   ((rd < kNumberOfT32LowRegisters) &&
19597                                    (rn < kNumberOfT32LowRegisters) &&
19598                                    (rm < kNumberOfT32LowRegisters))) {
19599                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
19600                                 add(CurrentCond(),
19601                                     Wide,
19602                                     Register(rd),
19603                                     Register(rn),
19604                                     Register(rm));
19605                                 if (((instr & 0xfff08000) != 0xeb000000)) {
19606                                   UnpredictableT32(instr);
19607                                 }
19608                               } else if ((instr & 0x00100000) == 0x00000000 &&
19609                                          shift_operand.GetShift().IsLSL() &&
19610                                          (shift_operand.GetAmount() == 0) &&
19611                                          ((rd == rn))) {
19612                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
19613                                 add(CurrentCond(),
19614                                     Wide,
19615                                     Register(rd),
19616                                     Register(rn),
19617                                     Register(rm));
19618                                 if (((instr & 0xfff08000) != 0xeb000000)) {
19619                                   UnpredictableT32(instr);
19620                                 }
19621                               } else if ((instr & 0x00100000) == 0x00000000) {
19622                                 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19623                                 add(CurrentCond(),
19624                                     Best,
19625                                     Register(rd),
19626                                     Register(rn),
19627                                     Operand(Register(rm),
19628                                             shift_operand.GetType(),
19629                                             shift_operand.GetAmount()));
19630                                 if (((instr & 0xfff08000) != 0xeb000000)) {
19631                                   UnpredictableT32(instr);
19632                                 }
19633                               } else {
19634                                 UnallocatedT32(instr);
19635                               }
19636                               break;
19637                             }
19638                           }
19639                           break;
19640                         }
19641                       }
19642                       break;
19643                     }
19644                     case 0x00400000: {
19645                       // 0xeb400000
19646                       switch (instr & 0x000070f0) {
19647                         case 0x00000030: {
19648                           // 0xeb400030
19649                           unsigned rd = (instr >> 8) & 0xf;
19650                           unsigned rn = (instr >> 16) & 0xf;
19651                           unsigned rm = instr & 0xf;
19652                           // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19653                           adc(CurrentCond(),
19654                               Best,
19655                               Register(rd),
19656                               Register(rn),
19657                               Operand(Register(rm), RRX));
19658                           if (((instr & 0xfff0f0f0) != 0xeb400030)) {
19659                             UnpredictableT32(instr);
19660                           }
19661                           break;
19662                         }
19663                         default: {
19664                           if (((instr & 0x70f0) == 0x30)) {
19665                             UnallocatedT32(instr);
19666                             return;
19667                           }
19668                           unsigned rd = (instr >> 8) & 0xf;
19669                           unsigned rn = (instr >> 16) & 0xf;
19670                           unsigned rm = instr & 0xf;
19671                           ImmediateShiftOperand
19672                               shift_operand((instr >> 4) & 0x3,
19673                                             ((instr >> 6) & 0x3) |
19674                                                 ((instr >> 10) & 0x1c));
19675                           if (InITBlock() &&
19676                               (instr & 0x00100000) == 0x00000000 &&
19677                               shift_operand.GetShift().IsLSL() &&
19678                               (shift_operand.GetAmount() == 0) &&
19679                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19680                                (rm < kNumberOfT32LowRegisters))) {
19681                             // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19682                             adc(CurrentCond(),
19683                                 Wide,
19684                                 Register(rd),
19685                                 Register(rn),
19686                                 Register(rm));
19687                             if (((instr & 0xfff08000) != 0xeb400000)) {
19688                               UnpredictableT32(instr);
19689                             }
19690                           } else if ((instr & 0x00100000) == 0x00000000) {
19691                             // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19692                             adc(CurrentCond(),
19693                                 Best,
19694                                 Register(rd),
19695                                 Register(rn),
19696                                 Operand(Register(rm),
19697                                         shift_operand.GetType(),
19698                                         shift_operand.GetAmount()));
19699                             if (((instr & 0xfff08000) != 0xeb400000)) {
19700                               UnpredictableT32(instr);
19701                             }
19702                           } else {
19703                             UnallocatedT32(instr);
19704                           }
19705                           break;
19706                         }
19707                       }
19708                       break;
19709                     }
19710                     case 0x00600000: {
19711                       // 0xeb600000
19712                       switch (instr & 0x000070f0) {
19713                         case 0x00000030: {
19714                           // 0xeb600030
19715                           unsigned rd = (instr >> 8) & 0xf;
19716                           unsigned rn = (instr >> 16) & 0xf;
19717                           unsigned rm = instr & 0xf;
19718                           // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19719                           sbc(CurrentCond(),
19720                               Best,
19721                               Register(rd),
19722                               Register(rn),
19723                               Operand(Register(rm), RRX));
19724                           if (((instr & 0xfff0f0f0) != 0xeb600030)) {
19725                             UnpredictableT32(instr);
19726                           }
19727                           break;
19728                         }
19729                         default: {
19730                           if (((instr & 0x70f0) == 0x30)) {
19731                             UnallocatedT32(instr);
19732                             return;
19733                           }
19734                           unsigned rd = (instr >> 8) & 0xf;
19735                           unsigned rn = (instr >> 16) & 0xf;
19736                           unsigned rm = instr & 0xf;
19737                           ImmediateShiftOperand
19738                               shift_operand((instr >> 4) & 0x3,
19739                                             ((instr >> 6) & 0x3) |
19740                                                 ((instr >> 10) & 0x1c));
19741                           if (InITBlock() &&
19742                               (instr & 0x00100000) == 0x00000000 &&
19743                               shift_operand.GetShift().IsLSL() &&
19744                               (shift_operand.GetAmount() == 0) &&
19745                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19746                                (rm < kNumberOfT32LowRegisters))) {
19747                             // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19748                             sbc(CurrentCond(),
19749                                 Wide,
19750                                 Register(rd),
19751                                 Register(rn),
19752                                 Register(rm));
19753                             if (((instr & 0xfff08000) != 0xeb600000)) {
19754                               UnpredictableT32(instr);
19755                             }
19756                           } else if ((instr & 0x00100000) == 0x00000000) {
19757                             // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19758                             sbc(CurrentCond(),
19759                                 Best,
19760                                 Register(rd),
19761                                 Register(rn),
19762                                 Operand(Register(rm),
19763                                         shift_operand.GetType(),
19764                                         shift_operand.GetAmount()));
19765                             if (((instr & 0xfff08000) != 0xeb600000)) {
19766                               UnpredictableT32(instr);
19767                             }
19768                           } else {
19769                             UnallocatedT32(instr);
19770                           }
19771                           break;
19772                         }
19773                       }
19774                       break;
19775                     }
19776                     default:
19777                       UnallocatedT32(instr);
19778                       break;
19779                   }
19780                   break;
19781                 }
19782                 case 0x01100000: {
19783                   // 0xeb100000
19784                   switch (instr & 0x00600000) {
19785                     case 0x00000000: {
19786                       // 0xeb100000
19787                       switch (instr & 0x00000f00) {
19788                         case 0x00000f00: {
19789                           // 0xeb100f00
19790                           switch (instr & 0x000070f0) {
19791                             case 0x00000030: {
19792                               // 0xeb100f30
19793                               unsigned rn = (instr >> 16) & 0xf;
19794                               unsigned rm = instr & 0xf;
19795                               // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
19796                               cmn(CurrentCond(),
19797                                   Best,
19798                                   Register(rn),
19799                                   Operand(Register(rm), RRX));
19800                               if (((instr & 0xfff0fff0) != 0xeb100f30)) {
19801                                 UnpredictableT32(instr);
19802                               }
19803                               break;
19804                             }
19805                             default: {
19806                               if (((instr & 0x70f0) == 0x30)) {
19807                                 UnallocatedT32(instr);
19808                                 return;
19809                               }
19810                               unsigned rn = (instr >> 16) & 0xf;
19811                               unsigned rm = instr & 0xf;
19812                               ImmediateShiftOperand
19813                                   shift_operand((instr >> 4) & 0x3,
19814                                                 ((instr >> 6) & 0x3) |
19815                                                     ((instr >> 10) & 0x1c));
19816                               if (shift_operand.GetShift().IsLSL() &&
19817                                   (shift_operand.GetAmount() == 0) &&
19818                                   ((rn < kNumberOfT32LowRegisters) &&
19819                                    (rm < kNumberOfT32LowRegisters))) {
19820                                 // CMN{<c>}.W <Rn>, <Rm> ; T2
19821                                 cmn(CurrentCond(),
19822                                     Wide,
19823                                     Register(rn),
19824                                     Register(rm));
19825                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
19826                                   UnpredictableT32(instr);
19827                                 }
19828                               } else {
19829                                 // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19830                                 cmn(CurrentCond(),
19831                                     Best,
19832                                     Register(rn),
19833                                     Operand(Register(rm),
19834                                             shift_operand.GetType(),
19835                                             shift_operand.GetAmount()));
19836                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
19837                                   UnpredictableT32(instr);
19838                                 }
19839                               }
19840                               break;
19841                             }
19842                           }
19843                           break;
19844                         }
19845                         default: {
19846                           switch (instr & 0x000f0000) {
19847                             case 0x000d0000: {
19848                               // 0xeb1d0000
19849                               switch (instr & 0x000070f0) {
19850                                 case 0x00000030: {
19851                                   // 0xeb1d0030
19852                                   if (((instr & 0xf00) == 0xf00)) {
19853                                     UnallocatedT32(instr);
19854                                     return;
19855                                   }
19856                                   unsigned rd = (instr >> 8) & 0xf;
19857                                   unsigned rm = instr & 0xf;
19858                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
19859                                   adds(CurrentCond(),
19860                                        Best,
19861                                        Register(rd),
19862                                        sp,
19863                                        Operand(Register(rm), RRX));
19864                                   if (((instr & 0xfffff0f0) != 0xeb1d0030)) {
19865                                     UnpredictableT32(instr);
19866                                   }
19867                                   break;
19868                                 }
19869                                 default: {
19870                                   if (((instr & 0x70f0) == 0x30) ||
19871                                       ((instr & 0xf00) == 0xf00)) {
19872                                     UnallocatedT32(instr);
19873                                     return;
19874                                   }
19875                                   unsigned rd = (instr >> 8) & 0xf;
19876                                   unsigned rm = instr & 0xf;
19877                                   ImmediateShiftOperand
19878                                       shift_operand((instr >> 4) & 0x3,
19879                                                     ((instr >> 6) & 0x3) |
19880                                                         ((instr >> 10) & 0x1c));
19881                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19882                                   adds(CurrentCond(),
19883                                        Best,
19884                                        Register(rd),
19885                                        sp,
19886                                        Operand(Register(rm),
19887                                                shift_operand.GetType(),
19888                                                shift_operand.GetAmount()));
19889                                   if (((instr & 0xffff8000) != 0xeb1d0000)) {
19890                                     UnpredictableT32(instr);
19891                                   }
19892                                   break;
19893                                 }
19894                               }
19895                               break;
19896                             }
19897                             default: {
19898                               switch (instr & 0x000070f0) {
19899                                 case 0x00000030: {
19900                                   // 0xeb100030
19901                                   if (((instr & 0xf0000) == 0xd0000) ||
19902                                       ((instr & 0xf00) == 0xf00)) {
19903                                     UnallocatedT32(instr);
19904                                     return;
19905                                   }
19906                                   unsigned rd = (instr >> 8) & 0xf;
19907                                   unsigned rn = (instr >> 16) & 0xf;
19908                                   unsigned rm = instr & 0xf;
19909                                   // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
19910                                   adds(CurrentCond(),
19911                                        Best,
19912                                        Register(rd),
19913                                        Register(rn),
19914                                        Operand(Register(rm), RRX));
19915                                   if (((instr & 0xfff0f0f0) != 0xeb100030)) {
19916                                     UnpredictableT32(instr);
19917                                   }
19918                                   break;
19919                                 }
19920                                 default: {
19921                                   if (((instr & 0xf0000) == 0xd0000) ||
19922                                       ((instr & 0x70f0) == 0x30) ||
19923                                       ((instr & 0xf00) == 0xf00)) {
19924                                     UnallocatedT32(instr);
19925                                     return;
19926                                   }
19927                                   unsigned rd = (instr >> 8) & 0xf;
19928                                   unsigned rn = (instr >> 16) & 0xf;
19929                                   unsigned rm = instr & 0xf;
19930                                   ImmediateShiftOperand
19931                                       shift_operand((instr >> 4) & 0x3,
19932                                                     ((instr >> 6) & 0x3) |
19933                                                         ((instr >> 10) & 0x1c));
19934                                   if (OutsideITBlock() &&
19935                                       (instr & 0x00100000) == 0x00100000 &&
19936                                       shift_operand.GetShift().IsLSL() &&
19937                                       (shift_operand.GetAmount() == 0) &&
19938                                       ((rd < kNumberOfT32LowRegisters) &&
19939                                        (rn < kNumberOfT32LowRegisters) &&
19940                                        (rm < kNumberOfT32LowRegisters))) {
19941                                     // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3
19942                                     adds(Condition::None(),
19943                                          Wide,
19944                                          Register(rd),
19945                                          Register(rn),
19946                                          Register(rm));
19947                                     if (((instr & 0xfff08000) != 0xeb100000)) {
19948                                       UnpredictableT32(instr);
19949                                     }
19950                                   } else if ((instr & 0x00100000) ==
19951                                              0x00100000) {
19952                                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19953                                     adds(CurrentCond(),
19954                                          Best,
19955                                          Register(rd),
19956                                          Register(rn),
19957                                          Operand(Register(rm),
19958                                                  shift_operand.GetType(),
19959                                                  shift_operand.GetAmount()));
19960                                     if (((instr & 0xfff08000) != 0xeb100000)) {
19961                                       UnpredictableT32(instr);
19962                                     }
19963                                   } else {
19964                                     UnallocatedT32(instr);
19965                                   }
19966                                   break;
19967                                 }
19968                               }
19969                               break;
19970                             }
19971                           }
19972                           break;
19973                         }
19974                       }
19975                       break;
19976                     }
19977                     case 0x00400000: {
19978                       // 0xeb500000
19979                       switch (instr & 0x000070f0) {
19980                         case 0x00000030: {
19981                           // 0xeb500030
19982                           unsigned rd = (instr >> 8) & 0xf;
19983                           unsigned rn = (instr >> 16) & 0xf;
19984                           unsigned rm = instr & 0xf;
19985                           // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19986                           adcs(CurrentCond(),
19987                                Best,
19988                                Register(rd),
19989                                Register(rn),
19990                                Operand(Register(rm), RRX));
19991                           if (((instr & 0xfff0f0f0) != 0xeb500030)) {
19992                             UnpredictableT32(instr);
19993                           }
19994                           break;
19995                         }
19996                         default: {
19997                           if (((instr & 0x70f0) == 0x30)) {
19998                             UnallocatedT32(instr);
19999                             return;
20000                           }
20001                           unsigned rd = (instr >> 8) & 0xf;
20002                           unsigned rn = (instr >> 16) & 0xf;
20003                           unsigned rm = instr & 0xf;
20004                           ImmediateShiftOperand
20005                               shift_operand((instr >> 4) & 0x3,
20006                                             ((instr >> 6) & 0x3) |
20007                                                 ((instr >> 10) & 0x1c));
20008                           if (OutsideITBlock() &&
20009                               (instr & 0x00100000) == 0x00100000 &&
20010                               shift_operand.GetShift().IsLSL() &&
20011                               (shift_operand.GetAmount() == 0) &&
20012                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
20013                                (rm < kNumberOfT32LowRegisters))) {
20014                             // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2
20015                             adcs(Condition::None(),
20016                                  Wide,
20017                                  Register(rd),
20018                                  Register(rn),
20019                                  Register(rm));
20020                             if (((instr & 0xfff08000) != 0xeb500000)) {
20021                               UnpredictableT32(instr);
20022                             }
20023                           } else if ((instr & 0x00100000) == 0x00100000) {
20024                             // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20025                             adcs(CurrentCond(),
20026                                  Best,
20027                                  Register(rd),
20028                                  Register(rn),
20029                                  Operand(Register(rm),
20030                                          shift_operand.GetType(),
20031                                          shift_operand.GetAmount()));
20032                             if (((instr & 0xfff08000) != 0xeb500000)) {
20033                               UnpredictableT32(instr);
20034                             }
20035                           } else {
20036                             UnallocatedT32(instr);
20037                           }
20038                           break;
20039                         }
20040                       }
20041                       break;
20042                     }
20043                     case 0x00600000: {
20044                       // 0xeb700000
20045                       switch (instr & 0x000070f0) {
20046                         case 0x00000030: {
20047                           // 0xeb700030
20048                           unsigned rd = (instr >> 8) & 0xf;
20049                           unsigned rn = (instr >> 16) & 0xf;
20050                           unsigned rm = instr & 0xf;
20051                           // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20052                           sbcs(CurrentCond(),
20053                                Best,
20054                                Register(rd),
20055                                Register(rn),
20056                                Operand(Register(rm), RRX));
20057                           if (((instr & 0xfff0f0f0) != 0xeb700030)) {
20058                             UnpredictableT32(instr);
20059                           }
20060                           break;
20061                         }
20062                         default: {
20063                           if (((instr & 0x70f0) == 0x30)) {
20064                             UnallocatedT32(instr);
20065                             return;
20066                           }
20067                           unsigned rd = (instr >> 8) & 0xf;
20068                           unsigned rn = (instr >> 16) & 0xf;
20069                           unsigned rm = instr & 0xf;
20070                           ImmediateShiftOperand
20071                               shift_operand((instr >> 4) & 0x3,
20072                                             ((instr >> 6) & 0x3) |
20073                                                 ((instr >> 10) & 0x1c));
20074                           if (OutsideITBlock() &&
20075                               (instr & 0x00100000) == 0x00100000 &&
20076                               shift_operand.GetShift().IsLSL() &&
20077                               (shift_operand.GetAmount() == 0) &&
20078                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
20079                                (rm < kNumberOfT32LowRegisters))) {
20080                             // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2
20081                             sbcs(Condition::None(),
20082                                  Wide,
20083                                  Register(rd),
20084                                  Register(rn),
20085                                  Register(rm));
20086                             if (((instr & 0xfff08000) != 0xeb700000)) {
20087                               UnpredictableT32(instr);
20088                             }
20089                           } else if ((instr & 0x00100000) == 0x00100000) {
20090                             // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20091                             sbcs(CurrentCond(),
20092                                  Best,
20093                                  Register(rd),
20094                                  Register(rn),
20095                                  Operand(Register(rm),
20096                                          shift_operand.GetType(),
20097                                          shift_operand.GetAmount()));
20098                             if (((instr & 0xfff08000) != 0xeb700000)) {
20099                               UnpredictableT32(instr);
20100                             }
20101                           } else {
20102                             UnallocatedT32(instr);
20103                           }
20104                           break;
20105                         }
20106                       }
20107                       break;
20108                     }
20109                     default:
20110                       UnallocatedT32(instr);
20111                       break;
20112                   }
20113                   break;
20114                 }
20115                 case 0x01800000: {
20116                   // 0xeb800000
20117                   switch (instr & 0x00600000) {
20118                     case 0x00200000: {
20119                       // 0xeba00000
20120                       switch (instr & 0x000f0000) {
20121                         case 0x000d0000: {
20122                           // 0xebad0000
20123                           switch (instr & 0x000070f0) {
20124                             case 0x00000030: {
20125                               // 0xebad0030
20126                               unsigned rd = (instr >> 8) & 0xf;
20127                               unsigned rm = instr & 0xf;
20128                               // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
20129                               sub(CurrentCond(),
20130                                   Best,
20131                                   Register(rd),
20132                                   sp,
20133                                   Operand(Register(rm), RRX));
20134                               if (((instr & 0xfffff0f0) != 0xebad0030)) {
20135                                 UnpredictableT32(instr);
20136                               }
20137                               break;
20138                             }
20139                             default: {
20140                               if (((instr & 0x70f0) == 0x30)) {
20141                                 UnallocatedT32(instr);
20142                                 return;
20143                               }
20144                               unsigned rd = (instr >> 8) & 0xf;
20145                               unsigned rm = instr & 0xf;
20146                               ImmediateShiftOperand
20147                                   shift_operand((instr >> 4) & 0x3,
20148                                                 ((instr >> 6) & 0x3) |
20149                                                     ((instr >> 10) & 0x1c));
20150                               if ((instr & 0x00100000) == 0x00000000 &&
20151                                   shift_operand.GetShift().IsLSL() &&
20152                                   (shift_operand.GetAmount() == 0)) {
20153                                 // SUB{<c>} {<Rd>}, SP, <Rm> ; T1
20154                                 sub(CurrentCond(),
20155                                     Best,
20156                                     Register(rd),
20157                                     sp,
20158                                     Register(rm));
20159                                 if (((instr & 0xffff8000) != 0xebad0000)) {
20160                                   UnpredictableT32(instr);
20161                                 }
20162                               } else if ((instr & 0x00100000) == 0x00000000) {
20163                                 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20164                                 sub(CurrentCond(),
20165                                     Best,
20166                                     Register(rd),
20167                                     sp,
20168                                     Operand(Register(rm),
20169                                             shift_operand.GetType(),
20170                                             shift_operand.GetAmount()));
20171                                 if (((instr & 0xffff8000) != 0xebad0000)) {
20172                                   UnpredictableT32(instr);
20173                                 }
20174                               } else {
20175                                 UnallocatedT32(instr);
20176                               }
20177                               break;
20178                             }
20179                           }
20180                           break;
20181                         }
20182                         default: {
20183                           switch (instr & 0x000070f0) {
20184                             case 0x00000030: {
20185                               // 0xeba00030
20186                               if (((instr & 0xf0000) == 0xd0000)) {
20187                                 UnallocatedT32(instr);
20188                                 return;
20189                               }
20190                               unsigned rd = (instr >> 8) & 0xf;
20191                               unsigned rn = (instr >> 16) & 0xf;
20192                               unsigned rm = instr & 0xf;
20193                               // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20194                               sub(CurrentCond(),
20195                                   Best,
20196                                   Register(rd),
20197                                   Register(rn),
20198                                   Operand(Register(rm), RRX));
20199                               if (((instr & 0xfff0f0f0) != 0xeba00030)) {
20200                                 UnpredictableT32(instr);
20201                               }
20202                               break;
20203                             }
20204                             default: {
20205                               if (((instr & 0xf0000) == 0xd0000) ||
20206                                   ((instr & 0x70f0) == 0x30)) {
20207                                 UnallocatedT32(instr);
20208                                 return;
20209                               }
20210                               unsigned rd = (instr >> 8) & 0xf;
20211                               unsigned rn = (instr >> 16) & 0xf;
20212                               unsigned rm = instr & 0xf;
20213                               ImmediateShiftOperand
20214                                   shift_operand((instr >> 4) & 0x3,
20215                                                 ((instr >> 6) & 0x3) |
20216                                                     ((instr >> 10) & 0x1c));
20217                               if (InITBlock() &&
20218                                   (instr & 0x00100000) == 0x00000000 &&
20219                                   shift_operand.GetShift().IsLSL() &&
20220                                   (shift_operand.GetAmount() == 0) &&
20221                                   ((rd < kNumberOfT32LowRegisters) &&
20222                                    (rn < kNumberOfT32LowRegisters) &&
20223                                    (rm < kNumberOfT32LowRegisters))) {
20224                                 // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2
20225                                 sub(CurrentCond(),
20226                                     Wide,
20227                                     Register(rd),
20228                                     Register(rn),
20229                                     Register(rm));
20230                                 if (((instr & 0xfff08000) != 0xeba00000)) {
20231                                   UnpredictableT32(instr);
20232                                 }
20233                               } else if ((instr & 0x00100000) == 0x00000000) {
20234                                 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20235                                 sub(CurrentCond(),
20236                                     Best,
20237                                     Register(rd),
20238                                     Register(rn),
20239                                     Operand(Register(rm),
20240                                             shift_operand.GetType(),
20241                                             shift_operand.GetAmount()));
20242                                 if (((instr & 0xfff08000) != 0xeba00000)) {
20243                                   UnpredictableT32(instr);
20244                                 }
20245                               } else {
20246                                 UnallocatedT32(instr);
20247                               }
20248                               break;
20249                             }
20250                           }
20251                           break;
20252                         }
20253                       }
20254                       break;
20255                     }
20256                     case 0x00400000: {
20257                       // 0xebc00000
20258                       switch (instr & 0x000070f0) {
20259                         case 0x00000030: {
20260                           // 0xebc00030
20261                           unsigned rd = (instr >> 8) & 0xf;
20262                           unsigned rn = (instr >> 16) & 0xf;
20263                           unsigned rm = instr & 0xf;
20264                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
20265                           rsb(CurrentCond(),
20266                               Best,
20267                               Register(rd),
20268                               Register(rn),
20269                               Operand(Register(rm), RRX));
20270                           if (((instr & 0xfff0f0f0) != 0xebc00030)) {
20271                             UnpredictableT32(instr);
20272                           }
20273                           break;
20274                         }
20275                         default: {
20276                           if (((instr & 0x70f0) == 0x30)) {
20277                             UnallocatedT32(instr);
20278                             return;
20279                           }
20280                           unsigned rd = (instr >> 8) & 0xf;
20281                           unsigned rn = (instr >> 16) & 0xf;
20282                           unsigned rm = instr & 0xf;
20283                           ImmediateShiftOperand
20284                               shift_operand((instr >> 4) & 0x3,
20285                                             ((instr >> 6) & 0x3) |
20286                                                 ((instr >> 10) & 0x1c));
20287                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20288                           rsb(CurrentCond(),
20289                               Best,
20290                               Register(rd),
20291                               Register(rn),
20292                               Operand(Register(rm),
20293                                       shift_operand.GetType(),
20294                                       shift_operand.GetAmount()));
20295                           if (((instr & 0xfff08000) != 0xebc00000)) {
20296                             UnpredictableT32(instr);
20297                           }
20298                           break;
20299                         }
20300                       }
20301                       break;
20302                     }
20303                     default:
20304                       UnallocatedT32(instr);
20305                       break;
20306                   }
20307                   break;
20308                 }
20309                 case 0x01900000: {
20310                   // 0xeb900000
20311                   switch (instr & 0x00600000) {
20312                     case 0x00200000: {
20313                       // 0xebb00000
20314                       switch (instr & 0x00000f00) {
20315                         case 0x00000f00: {
20316                           // 0xebb00f00
20317                           switch (instr & 0x000070f0) {
20318                             case 0x00000030: {
20319                               // 0xebb00f30
20320                               unsigned rn = (instr >> 16) & 0xf;
20321                               unsigned rm = instr & 0xf;
20322                               // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3
20323                               cmp(CurrentCond(),
20324                                   Best,
20325                                   Register(rn),
20326                                   Operand(Register(rm), RRX));
20327                               if (((instr & 0xfff0fff0) != 0xebb00f30)) {
20328                                 UnpredictableT32(instr);
20329                               }
20330                               break;
20331                             }
20332                             default: {
20333                               if (((instr & 0x70f0) == 0x30)) {
20334                                 UnallocatedT32(instr);
20335                                 return;
20336                               }
20337                               unsigned rn = (instr >> 16) & 0xf;
20338                               unsigned rm = instr & 0xf;
20339                               ImmediateShiftOperand
20340                                   shift_operand((instr >> 4) & 0x3,
20341                                                 ((instr >> 6) & 0x3) |
20342                                                     ((instr >> 10) & 0x1c));
20343                               if (shift_operand.GetShift().IsLSL() &&
20344                                   (shift_operand.GetAmount() == 0)) {
20345                                 // CMP{<c>}.W <Rn>, <Rm> ; T3
20346                                 cmp(CurrentCond(),
20347                                     Wide,
20348                                     Register(rn),
20349                                     Register(rm));
20350                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
20351                                   UnpredictableT32(instr);
20352                                 }
20353                               } else {
20354                                 // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length)
20355                                 cmp(CurrentCond(),
20356                                     Best,
20357                                     Register(rn),
20358                                     Operand(Register(rm),
20359                                             shift_operand.GetType(),
20360                                             shift_operand.GetAmount()));
20361                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
20362                                   UnpredictableT32(instr);
20363                                 }
20364                               }
20365                               break;
20366                             }
20367                           }
20368                           break;
20369                         }
20370                         default: {
20371                           switch (instr & 0x000f0000) {
20372                             case 0x000d0000: {
20373                               // 0xebbd0000
20374                               switch (instr & 0x000070f0) {
20375                                 case 0x00000030: {
20376                                   // 0xebbd0030
20377                                   if (((instr & 0xf00) == 0xf00)) {
20378                                     UnallocatedT32(instr);
20379                                     return;
20380                                   }
20381                                   unsigned rd = (instr >> 8) & 0xf;
20382                                   unsigned rm = instr & 0xf;
20383                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
20384                                   subs(CurrentCond(),
20385                                        Best,
20386                                        Register(rd),
20387                                        sp,
20388                                        Operand(Register(rm), RRX));
20389                                   if (((instr & 0xfffff0f0) != 0xebbd0030)) {
20390                                     UnpredictableT32(instr);
20391                                   }
20392                                   break;
20393                                 }
20394                                 default: {
20395                                   if (((instr & 0x70f0) == 0x30) ||
20396                                       ((instr & 0xf00) == 0xf00)) {
20397                                     UnallocatedT32(instr);
20398                                     return;
20399                                   }
20400                                   unsigned rd = (instr >> 8) & 0xf;
20401                                   unsigned rm = instr & 0xf;
20402                                   ImmediateShiftOperand
20403                                       shift_operand((instr >> 4) & 0x3,
20404                                                     ((instr >> 6) & 0x3) |
20405                                                         ((instr >> 10) & 0x1c));
20406                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20407                                   subs(CurrentCond(),
20408                                        Best,
20409                                        Register(rd),
20410                                        sp,
20411                                        Operand(Register(rm),
20412                                                shift_operand.GetType(),
20413                                                shift_operand.GetAmount()));
20414                                   if (((instr & 0xffff8000) != 0xebbd0000)) {
20415                                     UnpredictableT32(instr);
20416                                   }
20417                                   break;
20418                                 }
20419                               }
20420                               break;
20421                             }
20422                             default: {
20423                               switch (instr & 0x000070f0) {
20424                                 case 0x00000030: {
20425                                   // 0xebb00030
20426                                   if (((instr & 0xf0000) == 0xd0000) ||
20427                                       ((instr & 0xf00) == 0xf00)) {
20428                                     UnallocatedT32(instr);
20429                                     return;
20430                                   }
20431                                   unsigned rd = (instr >> 8) & 0xf;
20432                                   unsigned rn = (instr >> 16) & 0xf;
20433                                   unsigned rm = instr & 0xf;
20434                                   // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20435                                   subs(CurrentCond(),
20436                                        Best,
20437                                        Register(rd),
20438                                        Register(rn),
20439                                        Operand(Register(rm), RRX));
20440                                   if (((instr & 0xfff0f0f0) != 0xebb00030)) {
20441                                     UnpredictableT32(instr);
20442                                   }
20443                                   break;
20444                                 }
20445                                 default: {
20446                                   if (((instr & 0xf0000) == 0xd0000) ||
20447                                       ((instr & 0x70f0) == 0x30) ||
20448                                       ((instr & 0xf00) == 0xf00)) {
20449                                     UnallocatedT32(instr);
20450                                     return;
20451                                   }
20452                                   unsigned rd = (instr >> 8) & 0xf;
20453                                   unsigned rn = (instr >> 16) & 0xf;
20454                                   unsigned rm = instr & 0xf;
20455                                   ImmediateShiftOperand
20456                                       shift_operand((instr >> 4) & 0x3,
20457                                                     ((instr >> 6) & 0x3) |
20458                                                         ((instr >> 10) & 0x1c));
20459                                   if (OutsideITBlock() &&
20460                                       (instr & 0x00100000) == 0x00100000 &&
20461                                       shift_operand.GetShift().IsLSL() &&
20462                                       (shift_operand.GetAmount() == 0) &&
20463                                       ((rd < kNumberOfT32LowRegisters) &&
20464                                        (rn < kNumberOfT32LowRegisters) &&
20465                                        (rm < kNumberOfT32LowRegisters))) {
20466                                     // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2
20467                                     subs(Condition::None(),
20468                                          Wide,
20469                                          Register(rd),
20470                                          Register(rn),
20471                                          Register(rm));
20472                                     if (((instr & 0xfff08000) != 0xebb00000)) {
20473                                       UnpredictableT32(instr);
20474                                     }
20475                                   } else if ((instr & 0x00100000) ==
20476                                              0x00100000) {
20477                                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20478                                     subs(CurrentCond(),
20479                                          Best,
20480                                          Register(rd),
20481                                          Register(rn),
20482                                          Operand(Register(rm),
20483                                                  shift_operand.GetType(),
20484                                                  shift_operand.GetAmount()));
20485                                     if (((instr & 0xfff08000) != 0xebb00000)) {
20486                                       UnpredictableT32(instr);
20487                                     }
20488                                   } else {
20489                                     UnallocatedT32(instr);
20490                                   }
20491                                   break;
20492                                 }
20493                               }
20494                               break;
20495                             }
20496                           }
20497                           break;
20498                         }
20499                       }
20500                       break;
20501                     }
20502                     case 0x00400000: {
20503                       // 0xebd00000
20504                       switch (instr & 0x000070f0) {
20505                         case 0x00000030: {
20506                           // 0xebd00030
20507                           unsigned rd = (instr >> 8) & 0xf;
20508                           unsigned rn = (instr >> 16) & 0xf;
20509                           unsigned rm = instr & 0xf;
20510                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
20511                           rsbs(CurrentCond(),
20512                                Best,
20513                                Register(rd),
20514                                Register(rn),
20515                                Operand(Register(rm), RRX));
20516                           if (((instr & 0xfff0f0f0) != 0xebd00030)) {
20517                             UnpredictableT32(instr);
20518                           }
20519                           break;
20520                         }
20521                         default: {
20522                           if (((instr & 0x70f0) == 0x30)) {
20523                             UnallocatedT32(instr);
20524                             return;
20525                           }
20526                           unsigned rd = (instr >> 8) & 0xf;
20527                           unsigned rn = (instr >> 16) & 0xf;
20528                           unsigned rm = instr & 0xf;
20529                           ImmediateShiftOperand
20530                               shift_operand((instr >> 4) & 0x3,
20531                                             ((instr >> 6) & 0x3) |
20532                                                 ((instr >> 10) & 0x1c));
20533                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20534                           rsbs(CurrentCond(),
20535                                Best,
20536                                Register(rd),
20537                                Register(rn),
20538                                Operand(Register(rm),
20539                                        shift_operand.GetType(),
20540                                        shift_operand.GetAmount()));
20541                           if (((instr & 0xfff08000) != 0xebd00000)) {
20542                             UnpredictableT32(instr);
20543                           }
20544                           break;
20545                         }
20546                       }
20547                       break;
20548                     }
20549                     default:
20550                       UnallocatedT32(instr);
20551                       break;
20552                   }
20553                   break;
20554                 }
20555                 case 0x10000000: {
20556                   // 0xfa000000
20557                   switch (instr & 0x0000f080) {
20558                     case 0x0000f000: {
20559                       // 0xfa00f000
20560                       if ((instr & 0x00000070) == 0x00000000) {
20561                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20562                              Uint32(0x2))) {
20563                           unsigned rd = (instr >> 8) & 0xf;
20564                           unsigned rm = (instr >> 16) & 0xf;
20565                           unsigned rs = instr & 0xf;
20566                           if (InITBlock() &&
20567                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20568                                (rs < kNumberOfT32LowRegisters))) {
20569                             // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20570                             asr(CurrentCond(),
20571                                 Wide,
20572                                 Register(rd),
20573                                 Register(rm),
20574                                 Register(rs));
20575                           } else {
20576                             // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20577                             asr(CurrentCond(),
20578                                 Best,
20579                                 Register(rd),
20580                                 Register(rm),
20581                                 Register(rs));
20582                           }
20583                           return;
20584                         }
20585                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20586                              Uint32(0x0))) {
20587                           unsigned rd = (instr >> 8) & 0xf;
20588                           unsigned rm = (instr >> 16) & 0xf;
20589                           unsigned rs = instr & 0xf;
20590                           if (InITBlock() &&
20591                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20592                                (rs < kNumberOfT32LowRegisters))) {
20593                             // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20594                             lsl(CurrentCond(),
20595                                 Wide,
20596                                 Register(rd),
20597                                 Register(rm),
20598                                 Register(rs));
20599                           } else {
20600                             // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20601                             lsl(CurrentCond(),
20602                                 Best,
20603                                 Register(rd),
20604                                 Register(rm),
20605                                 Register(rs));
20606                           }
20607                           return;
20608                         }
20609                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20610                              Uint32(0x1))) {
20611                           unsigned rd = (instr >> 8) & 0xf;
20612                           unsigned rm = (instr >> 16) & 0xf;
20613                           unsigned rs = instr & 0xf;
20614                           if (InITBlock() &&
20615                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20616                                (rs < kNumberOfT32LowRegisters))) {
20617                             // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20618                             lsr(CurrentCond(),
20619                                 Wide,
20620                                 Register(rd),
20621                                 Register(rm),
20622                                 Register(rs));
20623                           } else {
20624                             // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20625                             lsr(CurrentCond(),
20626                                 Best,
20627                                 Register(rd),
20628                                 Register(rm),
20629                                 Register(rs));
20630                           }
20631                           return;
20632                         }
20633                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20634                              Uint32(0x3))) {
20635                           unsigned rd = (instr >> 8) & 0xf;
20636                           unsigned rm = (instr >> 16) & 0xf;
20637                           unsigned rs = instr & 0xf;
20638                           if (InITBlock() &&
20639                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20640                                (rs < kNumberOfT32LowRegisters))) {
20641                             // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20642                             ror(CurrentCond(),
20643                                 Wide,
20644                                 Register(rd),
20645                                 Register(rm),
20646                                 Register(rs));
20647                           } else {
20648                             // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20649                             ror(CurrentCond(),
20650                                 Best,
20651                                 Register(rd),
20652                                 Register(rm),
20653                                 Register(rs));
20654                           }
20655                           return;
20656                         }
20657                         unsigned rd = (instr >> 8) & 0xf;
20658                         unsigned rm = (instr >> 16) & 0xf;
20659                         Shift shift((instr >> 21) & 0x3);
20660                         unsigned rs = instr & 0xf;
20661                         if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
20662                             ((rd < kNumberOfT32LowRegisters) &&
20663                              (rm < kNumberOfT32LowRegisters) &&
20664                              (rs < kNumberOfT32LowRegisters))) {
20665                           // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2
20666                           mov(CurrentCond(),
20667                               Wide,
20668                               Register(rd),
20669                               Operand(Register(rm),
20670                                       shift.GetType(),
20671                                       Register(rs)));
20672                         } else if ((instr & 0x00100000) == 0x00000000) {
20673                           // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
20674                           mov(CurrentCond(),
20675                               Best,
20676                               Register(rd),
20677                               Operand(Register(rm),
20678                                       shift.GetType(),
20679                                       Register(rs)));
20680                         } else {
20681                           UnallocatedT32(instr);
20682                         }
20683                       } else {
20684                         UnallocatedT32(instr);
20685                       }
20686                       break;
20687                     }
20688                     case 0x0000f080: {
20689                       // 0xfa00f080
20690                       switch (instr & 0x00600000) {
20691                         case 0x00000000: {
20692                           // 0xfa00f080
20693                           switch (instr & 0x000f0000) {
20694                             case 0x000f0000: {
20695                               // 0xfa0ff080
20696                               unsigned rd = (instr >> 8) & 0xf;
20697                               unsigned rm = instr & 0xf;
20698                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20699                               if ((amount == 0) &&
20700                                   ((rd < kNumberOfT32LowRegisters) &&
20701                                    (rm < kNumberOfT32LowRegisters))) {
20702                                 // SXTH{<c>}.W {<Rd>}, <Rm> ; T2
20703                                 sxth(CurrentCond(),
20704                                      Wide,
20705                                      Register(rd),
20706                                      Register(rm));
20707                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
20708                                   UnpredictableT32(instr);
20709                                 }
20710                               } else {
20711                                 // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20712                                 sxth(CurrentCond(),
20713                                      Best,
20714                                      Register(rd),
20715                                      Operand(Register(rm), ROR, amount));
20716                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
20717                                   UnpredictableT32(instr);
20718                                 }
20719                               }
20720                               break;
20721                             }
20722                             default: {
20723                               if (((instr & 0xf0000) == 0xf0000)) {
20724                                 UnallocatedT32(instr);
20725                                 return;
20726                               }
20727                               unsigned rd = (instr >> 8) & 0xf;
20728                               unsigned rn = (instr >> 16) & 0xf;
20729                               unsigned rm = instr & 0xf;
20730                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20731                               // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20732                               sxtah(CurrentCond(),
20733                                     Register(rd),
20734                                     Register(rn),
20735                                     Operand(Register(rm), ROR, amount));
20736                               if (((instr & 0xfff0f0c0) != 0xfa00f080)) {
20737                                 UnpredictableT32(instr);
20738                               }
20739                               break;
20740                             }
20741                           }
20742                           break;
20743                         }
20744                         case 0x00200000: {
20745                           // 0xfa20f080
20746                           switch (instr & 0x000f0000) {
20747                             case 0x000f0000: {
20748                               // 0xfa2ff080
20749                               unsigned rd = (instr >> 8) & 0xf;
20750                               unsigned rm = instr & 0xf;
20751                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20752                               // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20753                               sxtb16(CurrentCond(),
20754                                      Register(rd),
20755                                      Operand(Register(rm), ROR, amount));
20756                               if (((instr & 0xfffff0c0) != 0xfa2ff080)) {
20757                                 UnpredictableT32(instr);
20758                               }
20759                               break;
20760                             }
20761                             default: {
20762                               if (((instr & 0xf0000) == 0xf0000)) {
20763                                 UnallocatedT32(instr);
20764                                 return;
20765                               }
20766                               unsigned rd = (instr >> 8) & 0xf;
20767                               unsigned rn = (instr >> 16) & 0xf;
20768                               unsigned rm = instr & 0xf;
20769                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20770                               // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20771                               sxtab16(CurrentCond(),
20772                                       Register(rd),
20773                                       Register(rn),
20774                                       Operand(Register(rm), ROR, amount));
20775                               if (((instr & 0xfff0f0c0) != 0xfa20f080)) {
20776                                 UnpredictableT32(instr);
20777                               }
20778                               break;
20779                             }
20780                           }
20781                           break;
20782                         }
20783                         case 0x00400000: {
20784                           // 0xfa40f080
20785                           switch (instr & 0x000f0000) {
20786                             case 0x000f0000: {
20787                               // 0xfa4ff080
20788                               unsigned rd = (instr >> 8) & 0xf;
20789                               unsigned rm = instr & 0xf;
20790                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20791                               if ((amount == 0) &&
20792                                   ((rd < kNumberOfT32LowRegisters) &&
20793                                    (rm < kNumberOfT32LowRegisters))) {
20794                                 // SXTB{<c>}.W {<Rd>}, <Rm> ; T2
20795                                 sxtb(CurrentCond(),
20796                                      Wide,
20797                                      Register(rd),
20798                                      Register(rm));
20799                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
20800                                   UnpredictableT32(instr);
20801                                 }
20802                               } else {
20803                                 // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20804                                 sxtb(CurrentCond(),
20805                                      Best,
20806                                      Register(rd),
20807                                      Operand(Register(rm), ROR, amount));
20808                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
20809                                   UnpredictableT32(instr);
20810                                 }
20811                               }
20812                               break;
20813                             }
20814                             default: {
20815                               if (((instr & 0xf0000) == 0xf0000)) {
20816                                 UnallocatedT32(instr);
20817                                 return;
20818                               }
20819                               unsigned rd = (instr >> 8) & 0xf;
20820                               unsigned rn = (instr >> 16) & 0xf;
20821                               unsigned rm = instr & 0xf;
20822                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20823                               // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20824                               sxtab(CurrentCond(),
20825                                     Register(rd),
20826                                     Register(rn),
20827                                     Operand(Register(rm), ROR, amount));
20828                               if (((instr & 0xfff0f0c0) != 0xfa40f080)) {
20829                                 UnpredictableT32(instr);
20830                               }
20831                               break;
20832                             }
20833                           }
20834                           break;
20835                         }
20836                         default:
20837                           UnallocatedT32(instr);
20838                           break;
20839                       }
20840                       break;
20841                     }
20842                     default:
20843                       UnallocatedT32(instr);
20844                       break;
20845                   }
20846                   break;
20847                 }
20848                 case 0x10100000: {
20849                   // 0xfa100000
20850                   switch (instr & 0x0000f080) {
20851                     case 0x0000f000: {
20852                       // 0xfa10f000
20853                       if ((instr & 0x00000070) == 0x00000000) {
20854                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20855                              Uint32(0x2))) {
20856                           unsigned rd = (instr >> 8) & 0xf;
20857                           unsigned rm = (instr >> 16) & 0xf;
20858                           unsigned rs = instr & 0xf;
20859                           if (OutsideITBlock() &&
20860                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20861                                (rs < kNumberOfT32LowRegisters))) {
20862                             // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2
20863                             asrs(Condition::None(),
20864                                  Wide,
20865                                  Register(rd),
20866                                  Register(rm),
20867                                  Register(rs));
20868                           } else {
20869                             // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20870                             asrs(CurrentCond(),
20871                                  Best,
20872                                  Register(rd),
20873                                  Register(rm),
20874                                  Register(rs));
20875                           }
20876                           return;
20877                         }
20878                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20879                              Uint32(0x0))) {
20880                           unsigned rd = (instr >> 8) & 0xf;
20881                           unsigned rm = (instr >> 16) & 0xf;
20882                           unsigned rs = instr & 0xf;
20883                           if (OutsideITBlock() &&
20884                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20885                                (rs < kNumberOfT32LowRegisters))) {
20886                             // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2
20887                             lsls(Condition::None(),
20888                                  Wide,
20889                                  Register(rd),
20890                                  Register(rm),
20891                                  Register(rs));
20892                           } else {
20893                             // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20894                             lsls(CurrentCond(),
20895                                  Best,
20896                                  Register(rd),
20897                                  Register(rm),
20898                                  Register(rs));
20899                           }
20900                           return;
20901                         }
20902                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20903                              Uint32(0x1))) {
20904                           unsigned rd = (instr >> 8) & 0xf;
20905                           unsigned rm = (instr >> 16) & 0xf;
20906                           unsigned rs = instr & 0xf;
20907                           if (OutsideITBlock() &&
20908                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20909                                (rs < kNumberOfT32LowRegisters))) {
20910                             // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2
20911                             lsrs(Condition::None(),
20912                                  Wide,
20913                                  Register(rd),
20914                                  Register(rm),
20915                                  Register(rs));
20916                           } else {
20917                             // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20918                             lsrs(CurrentCond(),
20919                                  Best,
20920                                  Register(rd),
20921                                  Register(rm),
20922                                  Register(rs));
20923                           }
20924                           return;
20925                         }
20926                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20927                              Uint32(0x3))) {
20928                           unsigned rd = (instr >> 8) & 0xf;
20929                           unsigned rm = (instr >> 16) & 0xf;
20930                           unsigned rs = instr & 0xf;
20931                           if (OutsideITBlock() &&
20932                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20933                                (rs < kNumberOfT32LowRegisters))) {
20934                             // RORS.W {<Rd>}, <Rm>, <Rs> ; T2
20935                             rors(Condition::None(),
20936                                  Wide,
20937                                  Register(rd),
20938                                  Register(rm),
20939                                  Register(rs));
20940                           } else {
20941                             // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20942                             rors(CurrentCond(),
20943                                  Best,
20944                                  Register(rd),
20945                                  Register(rm),
20946                                  Register(rs));
20947                           }
20948                           return;
20949                         }
20950                         unsigned rd = (instr >> 8) & 0xf;
20951                         unsigned rm = (instr >> 16) & 0xf;
20952                         Shift shift((instr >> 21) & 0x3);
20953                         unsigned rs = instr & 0xf;
20954                         if (OutsideITBlock() &&
20955                             (instr & 0x00100000) == 0x00100000 &&
20956                             ((rd < kNumberOfT32LowRegisters) &&
20957                              (rm < kNumberOfT32LowRegisters) &&
20958                              (rs < kNumberOfT32LowRegisters))) {
20959                           // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2
20960                           movs(Condition::None(),
20961                                Wide,
20962                                Register(rd),
20963                                Operand(Register(rm),
20964                                        shift.GetType(),
20965                                        Register(rs)));
20966                         } else if ((instr & 0x00100000) == 0x00100000) {
20967                           // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
20968                           movs(CurrentCond(),
20969                                Best,
20970                                Register(rd),
20971                                Operand(Register(rm),
20972                                        shift.GetType(),
20973                                        Register(rs)));
20974                         } else {
20975                           UnallocatedT32(instr);
20976                         }
20977                       } else {
20978                         UnallocatedT32(instr);
20979                       }
20980                       break;
20981                     }
20982                     case 0x0000f080: {
20983                       // 0xfa10f080
20984                       switch (instr & 0x00600000) {
20985                         case 0x00000000: {
20986                           // 0xfa10f080
20987                           switch (instr & 0x000f0000) {
20988                             case 0x000f0000: {
20989                               // 0xfa1ff080
20990                               unsigned rd = (instr >> 8) & 0xf;
20991                               unsigned rm = instr & 0xf;
20992                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20993                               if ((amount == 0) &&
20994                                   ((rd < kNumberOfT32LowRegisters) &&
20995                                    (rm < kNumberOfT32LowRegisters))) {
20996                                 // UXTH{<c>}.W {<Rd>}, <Rm> ; T2
20997                                 uxth(CurrentCond(),
20998                                      Wide,
20999                                      Register(rd),
21000                                      Register(rm));
21001                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
21002                                   UnpredictableT32(instr);
21003                                 }
21004                               } else {
21005                                 // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
21006                                 uxth(CurrentCond(),
21007                                      Best,
21008                                      Register(rd),
21009                                      Operand(Register(rm), ROR, amount));
21010                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
21011                                   UnpredictableT32(instr);
21012                                 }
21013                               }
21014                               break;
21015                             }
21016                             default: {
21017                               if (((instr & 0xf0000) == 0xf0000)) {
21018                                 UnallocatedT32(instr);
21019                                 return;
21020                               }
21021                               unsigned rd = (instr >> 8) & 0xf;
21022                               unsigned rn = (instr >> 16) & 0xf;
21023                               unsigned rm = instr & 0xf;
21024                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
21025                               // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21026                               uxtah(CurrentCond(),
21027                                     Register(rd),
21028                                     Register(rn),
21029                                     Operand(Register(rm), ROR, amount));
21030                               if (((instr & 0xfff0f0c0) != 0xfa10f080)) {
21031                                 UnpredictableT32(instr);
21032                               }
21033                               break;
21034                             }
21035                           }
21036                           break;
21037                         }
21038                         case 0x00200000: {
21039                           // 0xfa30f080
21040                           switch (instr & 0x000f0000) {
21041                             case 0x000f0000: {
21042                               // 0xfa3ff080
21043                               unsigned rd = (instr >> 8) & 0xf;
21044                               unsigned rm = instr & 0xf;
21045                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
21046                               // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21047                               uxtb16(CurrentCond(),
21048                                      Register(rd),
21049                                      Operand(Register(rm), ROR, amount));
21050                               if (((instr & 0xfffff0c0) != 0xfa3ff080)) {
21051                                 UnpredictableT32(instr);
21052                               }
21053                               break;
21054                             }
21055                             default: {
21056                               if (((instr & 0xf0000) == 0xf0000)) {
21057                                 UnallocatedT32(instr);
21058                                 return;
21059                               }
21060                               unsigned rd = (instr >> 8) & 0xf;
21061                               unsigned rn = (instr >> 16) & 0xf;
21062                               unsigned rm = instr & 0xf;
21063                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
21064                               // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21065                               uxtab16(CurrentCond(),
21066                                       Register(rd),
21067                                       Register(rn),
21068                                       Operand(Register(rm), ROR, amount));
21069                               if (((instr & 0xfff0f0c0) != 0xfa30f080)) {
21070                                 UnpredictableT32(instr);
21071                               }
21072                               break;
21073                             }
21074                           }
21075                           break;
21076                         }
21077                         case 0x00400000: {
21078                           // 0xfa50f080
21079                           switch (instr & 0x000f0000) {
21080                             case 0x000f0000: {
21081                               // 0xfa5ff080
21082                               unsigned rd = (instr >> 8) & 0xf;
21083                               unsigned rm = instr & 0xf;
21084                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
21085                               if ((amount == 0) &&
21086                                   ((rd < kNumberOfT32LowRegisters) &&
21087                                    (rm < kNumberOfT32LowRegisters))) {
21088                                 // UXTB{<c>}.W {<Rd>}, <Rm> ; T2
21089                                 uxtb(CurrentCond(),
21090                                      Wide,
21091                                      Register(rd),
21092                                      Register(rm));
21093                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
21094                                   UnpredictableT32(instr);
21095                                 }
21096                               } else {
21097                                 // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
21098                                 uxtb(CurrentCond(),
21099                                      Best,
21100                                      Register(rd),
21101                                      Operand(Register(rm), ROR, amount));
21102                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
21103                                   UnpredictableT32(instr);
21104                                 }
21105                               }
21106                               break;
21107                             }
21108                             default: {
21109                               if (((instr & 0xf0000) == 0xf0000)) {
21110                                 UnallocatedT32(instr);
21111                                 return;
21112                               }
21113                               unsigned rd = (instr >> 8) & 0xf;
21114                               unsigned rn = (instr >> 16) & 0xf;
21115                               unsigned rm = instr & 0xf;
21116                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
21117                               // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21118                               uxtab(CurrentCond(),
21119                                     Register(rd),
21120                                     Register(rn),
21121                                     Operand(Register(rm), ROR, amount));
21122                               if (((instr & 0xfff0f0c0) != 0xfa50f080)) {
21123                                 UnpredictableT32(instr);
21124                               }
21125                               break;
21126                             }
21127                           }
21128                           break;
21129                         }
21130                         default:
21131                           UnallocatedT32(instr);
21132                           break;
21133                       }
21134                       break;
21135                     }
21136                     default:
21137                       UnallocatedT32(instr);
21138                       break;
21139                   }
21140                   break;
21141                 }
21142                 case 0x10800000: {
21143                   // 0xfa800000
21144                   switch (instr & 0x0060f0f0) {
21145                     case 0x0000f000: {
21146                       // 0xfa80f000
21147                       unsigned rd = (instr >> 8) & 0xf;
21148                       unsigned rn = (instr >> 16) & 0xf;
21149                       unsigned rm = instr & 0xf;
21150                       // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21151                       sadd8(CurrentCond(),
21152                             Register(rd),
21153                             Register(rn),
21154                             Register(rm));
21155                       break;
21156                     }
21157                     case 0x0000f010: {
21158                       // 0xfa80f010
21159                       unsigned rd = (instr >> 8) & 0xf;
21160                       unsigned rn = (instr >> 16) & 0xf;
21161                       unsigned rm = instr & 0xf;
21162                       // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21163                       qadd8(CurrentCond(),
21164                             Register(rd),
21165                             Register(rn),
21166                             Register(rm));
21167                       break;
21168                     }
21169                     case 0x0000f020: {
21170                       // 0xfa80f020
21171                       unsigned rd = (instr >> 8) & 0xf;
21172                       unsigned rn = (instr >> 16) & 0xf;
21173                       unsigned rm = instr & 0xf;
21174                       // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21175                       shadd8(CurrentCond(),
21176                              Register(rd),
21177                              Register(rn),
21178                              Register(rm));
21179                       break;
21180                     }
21181                     case 0x0000f040: {
21182                       // 0xfa80f040
21183                       unsigned rd = (instr >> 8) & 0xf;
21184                       unsigned rn = (instr >> 16) & 0xf;
21185                       unsigned rm = instr & 0xf;
21186                       // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21187                       uadd8(CurrentCond(),
21188                             Register(rd),
21189                             Register(rn),
21190                             Register(rm));
21191                       break;
21192                     }
21193                     case 0x0000f050: {
21194                       // 0xfa80f050
21195                       unsigned rd = (instr >> 8) & 0xf;
21196                       unsigned rn = (instr >> 16) & 0xf;
21197                       unsigned rm = instr & 0xf;
21198                       // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21199                       uqadd8(CurrentCond(),
21200                              Register(rd),
21201                              Register(rn),
21202                              Register(rm));
21203                       break;
21204                     }
21205                     case 0x0000f060: {
21206                       // 0xfa80f060
21207                       unsigned rd = (instr >> 8) & 0xf;
21208                       unsigned rn = (instr >> 16) & 0xf;
21209                       unsigned rm = instr & 0xf;
21210                       // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21211                       uhadd8(CurrentCond(),
21212                              Register(rd),
21213                              Register(rn),
21214                              Register(rm));
21215                       break;
21216                     }
21217                     case 0x0000f080: {
21218                       // 0xfa80f080
21219                       unsigned rd = (instr >> 8) & 0xf;
21220                       unsigned rm = instr & 0xf;
21221                       unsigned rn = (instr >> 16) & 0xf;
21222                       // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21223                       qadd(CurrentCond(),
21224                            Register(rd),
21225                            Register(rm),
21226                            Register(rn));
21227                       break;
21228                     }
21229                     case 0x0000f090: {
21230                       // 0xfa80f090
21231                       unsigned rd = (instr >> 8) & 0xf;
21232                       unsigned rm = instr & 0xf;
21233                       unsigned rn = (instr >> 16) & 0xf;
21234                       // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21235                       qdadd(CurrentCond(),
21236                             Register(rd),
21237                             Register(rm),
21238                             Register(rn));
21239                       break;
21240                     }
21241                     case 0x0000f0a0: {
21242                       // 0xfa80f0a0
21243                       unsigned rd = (instr >> 8) & 0xf;
21244                       unsigned rm = instr & 0xf;
21245                       unsigned rn = (instr >> 16) & 0xf;
21246                       // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21247                       qsub(CurrentCond(),
21248                            Register(rd),
21249                            Register(rm),
21250                            Register(rn));
21251                       break;
21252                     }
21253                     case 0x0000f0b0: {
21254                       // 0xfa80f0b0
21255                       unsigned rd = (instr >> 8) & 0xf;
21256                       unsigned rm = instr & 0xf;
21257                       unsigned rn = (instr >> 16) & 0xf;
21258                       // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21259                       qdsub(CurrentCond(),
21260                             Register(rd),
21261                             Register(rm),
21262                             Register(rn));
21263                       break;
21264                     }
21265                     case 0x0020f000: {
21266                       // 0xfaa0f000
21267                       unsigned rd = (instr >> 8) & 0xf;
21268                       unsigned rn = (instr >> 16) & 0xf;
21269                       unsigned rm = instr & 0xf;
21270                       // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21271                       sasx(CurrentCond(),
21272                            Register(rd),
21273                            Register(rn),
21274                            Register(rm));
21275                       break;
21276                     }
21277                     case 0x0020f010: {
21278                       // 0xfaa0f010
21279                       unsigned rd = (instr >> 8) & 0xf;
21280                       unsigned rn = (instr >> 16) & 0xf;
21281                       unsigned rm = instr & 0xf;
21282                       // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21283                       qasx(CurrentCond(),
21284                            Register(rd),
21285                            Register(rn),
21286                            Register(rm));
21287                       break;
21288                     }
21289                     case 0x0020f020: {
21290                       // 0xfaa0f020
21291                       unsigned rd = (instr >> 8) & 0xf;
21292                       unsigned rn = (instr >> 16) & 0xf;
21293                       unsigned rm = instr & 0xf;
21294                       // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21295                       shasx(CurrentCond(),
21296                             Register(rd),
21297                             Register(rn),
21298                             Register(rm));
21299                       break;
21300                     }
21301                     case 0x0020f040: {
21302                       // 0xfaa0f040
21303                       unsigned rd = (instr >> 8) & 0xf;
21304                       unsigned rn = (instr >> 16) & 0xf;
21305                       unsigned rm = instr & 0xf;
21306                       // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21307                       uasx(CurrentCond(),
21308                            Register(rd),
21309                            Register(rn),
21310                            Register(rm));
21311                       break;
21312                     }
21313                     case 0x0020f050: {
21314                       // 0xfaa0f050
21315                       unsigned rd = (instr >> 8) & 0xf;
21316                       unsigned rn = (instr >> 16) & 0xf;
21317                       unsigned rm = instr & 0xf;
21318                       // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21319                       uqasx(CurrentCond(),
21320                             Register(rd),
21321                             Register(rn),
21322                             Register(rm));
21323                       break;
21324                     }
21325                     case 0x0020f060: {
21326                       // 0xfaa0f060
21327                       unsigned rd = (instr >> 8) & 0xf;
21328                       unsigned rn = (instr >> 16) & 0xf;
21329                       unsigned rm = instr & 0xf;
21330                       // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21331                       uhasx(CurrentCond(),
21332                             Register(rd),
21333                             Register(rn),
21334                             Register(rm));
21335                       break;
21336                     }
21337                     case 0x0020f080: {
21338                       // 0xfaa0f080
21339                       unsigned rd = (instr >> 8) & 0xf;
21340                       unsigned rn = (instr >> 16) & 0xf;
21341                       unsigned rm = instr & 0xf;
21342                       // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21343                       sel(CurrentCond(),
21344                           Register(rd),
21345                           Register(rn),
21346                           Register(rm));
21347                       break;
21348                     }
21349                     case 0x0040f000: {
21350                       // 0xfac0f000
21351                       unsigned rd = (instr >> 8) & 0xf;
21352                       unsigned rn = (instr >> 16) & 0xf;
21353                       unsigned rm = instr & 0xf;
21354                       // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21355                       ssub8(CurrentCond(),
21356                             Register(rd),
21357                             Register(rn),
21358                             Register(rm));
21359                       break;
21360                     }
21361                     case 0x0040f010: {
21362                       // 0xfac0f010
21363                       unsigned rd = (instr >> 8) & 0xf;
21364                       unsigned rn = (instr >> 16) & 0xf;
21365                       unsigned rm = instr & 0xf;
21366                       // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21367                       qsub8(CurrentCond(),
21368                             Register(rd),
21369                             Register(rn),
21370                             Register(rm));
21371                       break;
21372                     }
21373                     case 0x0040f020: {
21374                       // 0xfac0f020
21375                       unsigned rd = (instr >> 8) & 0xf;
21376                       unsigned rn = (instr >> 16) & 0xf;
21377                       unsigned rm = instr & 0xf;
21378                       // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21379                       shsub8(CurrentCond(),
21380                              Register(rd),
21381                              Register(rn),
21382                              Register(rm));
21383                       break;
21384                     }
21385                     case 0x0040f040: {
21386                       // 0xfac0f040
21387                       unsigned rd = (instr >> 8) & 0xf;
21388                       unsigned rn = (instr >> 16) & 0xf;
21389                       unsigned rm = instr & 0xf;
21390                       // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21391                       usub8(CurrentCond(),
21392                             Register(rd),
21393                             Register(rn),
21394                             Register(rm));
21395                       break;
21396                     }
21397                     case 0x0040f050: {
21398                       // 0xfac0f050
21399                       unsigned rd = (instr >> 8) & 0xf;
21400                       unsigned rn = (instr >> 16) & 0xf;
21401                       unsigned rm = instr & 0xf;
21402                       // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21403                       uqsub8(CurrentCond(),
21404                              Register(rd),
21405                              Register(rn),
21406                              Register(rm));
21407                       break;
21408                     }
21409                     case 0x0040f060: {
21410                       // 0xfac0f060
21411                       unsigned rd = (instr >> 8) & 0xf;
21412                       unsigned rn = (instr >> 16) & 0xf;
21413                       unsigned rm = instr & 0xf;
21414                       // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21415                       uhsub8(CurrentCond(),
21416                              Register(rd),
21417                              Register(rn),
21418                              Register(rm));
21419                       break;
21420                     }
21421                     case 0x0040f080: {
21422                       // 0xfac0f080
21423                       unsigned rd = (instr >> 8) & 0xf;
21424                       unsigned rn = (instr >> 16) & 0xf;
21425                       unsigned rm = instr & 0xf;
21426                       // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1
21427                       crc32b(Condition::None(),
21428                              Register(rd),
21429                              Register(rn),
21430                              Register(rm));
21431                       break;
21432                     }
21433                     case 0x0040f090: {
21434                       // 0xfac0f090
21435                       unsigned rd = (instr >> 8) & 0xf;
21436                       unsigned rn = (instr >> 16) & 0xf;
21437                       unsigned rm = instr & 0xf;
21438                       // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1
21439                       crc32h(Condition::None(),
21440                              Register(rd),
21441                              Register(rn),
21442                              Register(rm));
21443                       break;
21444                     }
21445                     case 0x0040f0a0: {
21446                       // 0xfac0f0a0
21447                       unsigned rd = (instr >> 8) & 0xf;
21448                       unsigned rn = (instr >> 16) & 0xf;
21449                       unsigned rm = instr & 0xf;
21450                       // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1
21451                       crc32w(Condition::None(),
21452                              Register(rd),
21453                              Register(rn),
21454                              Register(rm));
21455                       break;
21456                     }
21457                     case 0x0060f000: {
21458                       // 0xfae0f000
21459                       unsigned rd = (instr >> 8) & 0xf;
21460                       unsigned rn = (instr >> 16) & 0xf;
21461                       unsigned rm = instr & 0xf;
21462                       // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21463                       ssax(CurrentCond(),
21464                            Register(rd),
21465                            Register(rn),
21466                            Register(rm));
21467                       break;
21468                     }
21469                     case 0x0060f010: {
21470                       // 0xfae0f010
21471                       unsigned rd = (instr >> 8) & 0xf;
21472                       unsigned rn = (instr >> 16) & 0xf;
21473                       unsigned rm = instr & 0xf;
21474                       // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21475                       qsax(CurrentCond(),
21476                            Register(rd),
21477                            Register(rn),
21478                            Register(rm));
21479                       break;
21480                     }
21481                     case 0x0060f020: {
21482                       // 0xfae0f020
21483                       unsigned rd = (instr >> 8) & 0xf;
21484                       unsigned rn = (instr >> 16) & 0xf;
21485                       unsigned rm = instr & 0xf;
21486                       // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21487                       shsax(CurrentCond(),
21488                             Register(rd),
21489                             Register(rn),
21490                             Register(rm));
21491                       break;
21492                     }
21493                     case 0x0060f040: {
21494                       // 0xfae0f040
21495                       unsigned rd = (instr >> 8) & 0xf;
21496                       unsigned rn = (instr >> 16) & 0xf;
21497                       unsigned rm = instr & 0xf;
21498                       // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21499                       usax(CurrentCond(),
21500                            Register(rd),
21501                            Register(rn),
21502                            Register(rm));
21503                       break;
21504                     }
21505                     case 0x0060f050: {
21506                       // 0xfae0f050
21507                       unsigned rd = (instr >> 8) & 0xf;
21508                       unsigned rn = (instr >> 16) & 0xf;
21509                       unsigned rm = instr & 0xf;
21510                       // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21511                       uqsax(CurrentCond(),
21512                             Register(rd),
21513                             Register(rn),
21514                             Register(rm));
21515                       break;
21516                     }
21517                     case 0x0060f060: {
21518                       // 0xfae0f060
21519                       unsigned rd = (instr >> 8) & 0xf;
21520                       unsigned rn = (instr >> 16) & 0xf;
21521                       unsigned rm = instr & 0xf;
21522                       // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21523                       uhsax(CurrentCond(),
21524                             Register(rd),
21525                             Register(rn),
21526                             Register(rm));
21527                       break;
21528                     }
21529                     default:
21530                       UnallocatedT32(instr);
21531                       break;
21532                   }
21533                   break;
21534                 }
21535                 case 0x10900000: {
21536                   // 0xfa900000
21537                   switch (instr & 0x0060f0f0) {
21538                     case 0x0000f000: {
21539                       // 0xfa90f000
21540                       unsigned rd = (instr >> 8) & 0xf;
21541                       unsigned rn = (instr >> 16) & 0xf;
21542                       unsigned rm = instr & 0xf;
21543                       // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21544                       sadd16(CurrentCond(),
21545                              Register(rd),
21546                              Register(rn),
21547                              Register(rm));
21548                       break;
21549                     }
21550                     case 0x0000f010: {
21551                       // 0xfa90f010
21552                       unsigned rd = (instr >> 8) & 0xf;
21553                       unsigned rn = (instr >> 16) & 0xf;
21554                       unsigned rm = instr & 0xf;
21555                       // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21556                       qadd16(CurrentCond(),
21557                              Register(rd),
21558                              Register(rn),
21559                              Register(rm));
21560                       break;
21561                     }
21562                     case 0x0000f020: {
21563                       // 0xfa90f020
21564                       unsigned rd = (instr >> 8) & 0xf;
21565                       unsigned rn = (instr >> 16) & 0xf;
21566                       unsigned rm = instr & 0xf;
21567                       // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21568                       shadd16(CurrentCond(),
21569                               Register(rd),
21570                               Register(rn),
21571                               Register(rm));
21572                       break;
21573                     }
21574                     case 0x0000f040: {
21575                       // 0xfa90f040
21576                       unsigned rd = (instr >> 8) & 0xf;
21577                       unsigned rn = (instr >> 16) & 0xf;
21578                       unsigned rm = instr & 0xf;
21579                       // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21580                       uadd16(CurrentCond(),
21581                              Register(rd),
21582                              Register(rn),
21583                              Register(rm));
21584                       break;
21585                     }
21586                     case 0x0000f050: {
21587                       // 0xfa90f050
21588                       unsigned rd = (instr >> 8) & 0xf;
21589                       unsigned rn = (instr >> 16) & 0xf;
21590                       unsigned rm = instr & 0xf;
21591                       // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21592                       uqadd16(CurrentCond(),
21593                               Register(rd),
21594                               Register(rn),
21595                               Register(rm));
21596                       break;
21597                     }
21598                     case 0x0000f060: {
21599                       // 0xfa90f060
21600                       unsigned rd = (instr >> 8) & 0xf;
21601                       unsigned rn = (instr >> 16) & 0xf;
21602                       unsigned rm = instr & 0xf;
21603                       // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21604                       uhadd16(CurrentCond(),
21605                               Register(rd),
21606                               Register(rn),
21607                               Register(rm));
21608                       break;
21609                     }
21610                     case 0x0000f080: {
21611                       // 0xfa90f080
21612                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21613                         unsigned rd = (instr >> 8) & 0xf;
21614                         unsigned rm = instr & 0xf;
21615                         if ((rd < kNumberOfT32LowRegisters) &&
21616                             (rm < kNumberOfT32LowRegisters)) {
21617                           // REV{<c>}.W <Rd>, <Rm> ; T2
21618                           rev(CurrentCond(), Wide, Register(rd), Register(rm));
21619                         } else {
21620                           // REV{<c>}{<q>} <Rd>, <Rm> ; T2
21621                           rev(CurrentCond(), Best, Register(rd), Register(rm));
21622                         }
21623                       } else {
21624                         UnallocatedT32(instr);
21625                       }
21626                       break;
21627                     }
21628                     case 0x0000f090: {
21629                       // 0xfa90f090
21630                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21631                         unsigned rd = (instr >> 8) & 0xf;
21632                         unsigned rm = instr & 0xf;
21633                         if ((rd < kNumberOfT32LowRegisters) &&
21634                             (rm < kNumberOfT32LowRegisters)) {
21635                           // REV16{<c>}.W <Rd>, <Rm> ; T2
21636                           rev16(CurrentCond(),
21637                                 Wide,
21638                                 Register(rd),
21639                                 Register(rm));
21640                         } else {
21641                           // REV16{<c>}{<q>} <Rd>, <Rm> ; T2
21642                           rev16(CurrentCond(),
21643                                 Best,
21644                                 Register(rd),
21645                                 Register(rm));
21646                         }
21647                       } else {
21648                         UnallocatedT32(instr);
21649                       }
21650                       break;
21651                     }
21652                     case 0x0000f0a0: {
21653                       // 0xfa90f0a0
21654                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21655                         unsigned rd = (instr >> 8) & 0xf;
21656                         unsigned rm = instr & 0xf;
21657                         // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1
21658                         rbit(CurrentCond(), Register(rd), Register(rm));
21659                       } else {
21660                         UnallocatedT32(instr);
21661                       }
21662                       break;
21663                     }
21664                     case 0x0000f0b0: {
21665                       // 0xfa90f0b0
21666                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21667                         unsigned rd = (instr >> 8) & 0xf;
21668                         unsigned rm = instr & 0xf;
21669                         if ((rd < kNumberOfT32LowRegisters) &&
21670                             (rm < kNumberOfT32LowRegisters)) {
21671                           // REVSH{<c>}.W <Rd>, <Rm> ; T2
21672                           revsh(CurrentCond(),
21673                                 Wide,
21674                                 Register(rd),
21675                                 Register(rm));
21676                         } else {
21677                           // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2
21678                           revsh(CurrentCond(),
21679                                 Best,
21680                                 Register(rd),
21681                                 Register(rm));
21682                         }
21683                       } else {
21684                         UnallocatedT32(instr);
21685                       }
21686                       break;
21687                     }
21688                     case 0x0020f080: {
21689                       // 0xfab0f080
21690                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21691                         unsigned rd = (instr >> 8) & 0xf;
21692                         unsigned rm = instr & 0xf;
21693                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1
21694                         clz(CurrentCond(), Register(rd), Register(rm));
21695                       } else {
21696                         UnallocatedT32(instr);
21697                       }
21698                       break;
21699                     }
21700                     case 0x0040f000: {
21701                       // 0xfad0f000
21702                       unsigned rd = (instr >> 8) & 0xf;
21703                       unsigned rn = (instr >> 16) & 0xf;
21704                       unsigned rm = instr & 0xf;
21705                       // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21706                       ssub16(CurrentCond(),
21707                              Register(rd),
21708                              Register(rn),
21709                              Register(rm));
21710                       break;
21711                     }
21712                     case 0x0040f010: {
21713                       // 0xfad0f010
21714                       unsigned rd = (instr >> 8) & 0xf;
21715                       unsigned rn = (instr >> 16) & 0xf;
21716                       unsigned rm = instr & 0xf;
21717                       // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21718                       qsub16(CurrentCond(),
21719                              Register(rd),
21720                              Register(rn),
21721                              Register(rm));
21722                       break;
21723                     }
21724                     case 0x0040f020: {
21725                       // 0xfad0f020
21726                       unsigned rd = (instr >> 8) & 0xf;
21727                       unsigned rn = (instr >> 16) & 0xf;
21728                       unsigned rm = instr & 0xf;
21729                       // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21730                       shsub16(CurrentCond(),
21731                               Register(rd),
21732                               Register(rn),
21733                               Register(rm));
21734                       break;
21735                     }
21736                     case 0x0040f040: {
21737                       // 0xfad0f040
21738                       unsigned rd = (instr >> 8) & 0xf;
21739                       unsigned rn = (instr >> 16) & 0xf;
21740                       unsigned rm = instr & 0xf;
21741                       // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21742                       usub16(CurrentCond(),
21743                              Register(rd),
21744                              Register(rn),
21745                              Register(rm));
21746                       break;
21747                     }
21748                     case 0x0040f050: {
21749                       // 0xfad0f050
21750                       unsigned rd = (instr >> 8) & 0xf;
21751                       unsigned rn = (instr >> 16) & 0xf;
21752                       unsigned rm = instr & 0xf;
21753                       // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21754                       uqsub16(CurrentCond(),
21755                               Register(rd),
21756                               Register(rn),
21757                               Register(rm));
21758                       break;
21759                     }
21760                     case 0x0040f060: {
21761                       // 0xfad0f060
21762                       unsigned rd = (instr >> 8) & 0xf;
21763                       unsigned rn = (instr >> 16) & 0xf;
21764                       unsigned rm = instr & 0xf;
21765                       // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21766                       uhsub16(CurrentCond(),
21767                               Register(rd),
21768                               Register(rn),
21769                               Register(rm));
21770                       break;
21771                     }
21772                     case 0x0040f080: {
21773                       // 0xfad0f080
21774                       unsigned rd = (instr >> 8) & 0xf;
21775                       unsigned rn = (instr >> 16) & 0xf;
21776                       unsigned rm = instr & 0xf;
21777                       // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1
21778                       crc32cb(Condition::None(),
21779                               Register(rd),
21780                               Register(rn),
21781                               Register(rm));
21782                       break;
21783                     }
21784                     case 0x0040f090: {
21785                       // 0xfad0f090
21786                       unsigned rd = (instr >> 8) & 0xf;
21787                       unsigned rn = (instr >> 16) & 0xf;
21788                       unsigned rm = instr & 0xf;
21789                       // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1
21790                       crc32ch(Condition::None(),
21791                               Register(rd),
21792                               Register(rn),
21793                               Register(rm));
21794                       break;
21795                     }
21796                     case 0x0040f0a0: {
21797                       // 0xfad0f0a0
21798                       unsigned rd = (instr >> 8) & 0xf;
21799                       unsigned rn = (instr >> 16) & 0xf;
21800                       unsigned rm = instr & 0xf;
21801                       // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1
21802                       crc32cw(Condition::None(),
21803                               Register(rd),
21804                               Register(rn),
21805                               Register(rm));
21806                       break;
21807                     }
21808                     default:
21809                       UnallocatedT32(instr);
21810                       break;
21811                   }
21812                   break;
21813                 }
21814                 case 0x11000000: {
21815                   // 0xfb000000
21816                   switch (instr & 0x006000f0) {
21817                     case 0x00000000: {
21818                       // 0xfb000000
21819                       switch (instr & 0x0000f000) {
21820                         case 0x0000f000: {
21821                           // 0xfb00f000
21822                           unsigned rd = (instr >> 8) & 0xf;
21823                           unsigned rn = (instr >> 16) & 0xf;
21824                           unsigned rm = instr & 0xf;
21825                           if (InITBlock() &&
21826                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
21827                                (rn < kNumberOfT32LowRegisters))) {
21828                             // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2
21829                             mul(CurrentCond(),
21830                                 Wide,
21831                                 Register(rd),
21832                                 Register(rn),
21833                                 Register(rm));
21834                           } else {
21835                             // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2
21836                             mul(CurrentCond(),
21837                                 Best,
21838                                 Register(rd),
21839                                 Register(rn),
21840                                 Register(rm));
21841                           }
21842                           break;
21843                         }
21844                         default: {
21845                           if (((instr & 0xf000) == 0xf000)) {
21846                             UnallocatedT32(instr);
21847                             return;
21848                           }
21849                           unsigned rd = (instr >> 8) & 0xf;
21850                           unsigned rn = (instr >> 16) & 0xf;
21851                           unsigned rm = instr & 0xf;
21852                           unsigned ra = (instr >> 12) & 0xf;
21853                           // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21854                           mla(CurrentCond(),
21855                               Register(rd),
21856                               Register(rn),
21857                               Register(rm),
21858                               Register(ra));
21859                           break;
21860                         }
21861                       }
21862                       break;
21863                     }
21864                     case 0x00000010: {
21865                       // 0xfb000010
21866                       unsigned rd = (instr >> 8) & 0xf;
21867                       unsigned rn = (instr >> 16) & 0xf;
21868                       unsigned rm = instr & 0xf;
21869                       unsigned ra = (instr >> 12) & 0xf;
21870                       // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21871                       mls(CurrentCond(),
21872                           Register(rd),
21873                           Register(rn),
21874                           Register(rm),
21875                           Register(ra));
21876                       break;
21877                     }
21878                     case 0x00200000: {
21879                       // 0xfb200000
21880                       switch (instr & 0x0000f000) {
21881                         case 0x0000f000: {
21882                           // 0xfb20f000
21883                           unsigned rd = (instr >> 8) & 0xf;
21884                           unsigned rn = (instr >> 16) & 0xf;
21885                           unsigned rm = instr & 0xf;
21886                           // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21887                           smuad(CurrentCond(),
21888                                 Register(rd),
21889                                 Register(rn),
21890                                 Register(rm));
21891                           break;
21892                         }
21893                         default: {
21894                           if (((instr & 0xf000) == 0xf000)) {
21895                             UnallocatedT32(instr);
21896                             return;
21897                           }
21898                           unsigned rd = (instr >> 8) & 0xf;
21899                           unsigned rn = (instr >> 16) & 0xf;
21900                           unsigned rm = instr & 0xf;
21901                           unsigned ra = (instr >> 12) & 0xf;
21902                           // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21903                           smlad(CurrentCond(),
21904                                 Register(rd),
21905                                 Register(rn),
21906                                 Register(rm),
21907                                 Register(ra));
21908                           break;
21909                         }
21910                       }
21911                       break;
21912                     }
21913                     case 0x00200010: {
21914                       // 0xfb200010
21915                       switch (instr & 0x0000f000) {
21916                         case 0x0000f000: {
21917                           // 0xfb20f010
21918                           unsigned rd = (instr >> 8) & 0xf;
21919                           unsigned rn = (instr >> 16) & 0xf;
21920                           unsigned rm = instr & 0xf;
21921                           // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21922                           smuadx(CurrentCond(),
21923                                  Register(rd),
21924                                  Register(rn),
21925                                  Register(rm));
21926                           break;
21927                         }
21928                         default: {
21929                           if (((instr & 0xf000) == 0xf000)) {
21930                             UnallocatedT32(instr);
21931                             return;
21932                           }
21933                           unsigned rd = (instr >> 8) & 0xf;
21934                           unsigned rn = (instr >> 16) & 0xf;
21935                           unsigned rm = instr & 0xf;
21936                           unsigned ra = (instr >> 12) & 0xf;
21937                           // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21938                           smladx(CurrentCond(),
21939                                  Register(rd),
21940                                  Register(rn),
21941                                  Register(rm),
21942                                  Register(ra));
21943                           break;
21944                         }
21945                       }
21946                       break;
21947                     }
21948                     case 0x00400000: {
21949                       // 0xfb400000
21950                       switch (instr & 0x0000f000) {
21951                         case 0x0000f000: {
21952                           // 0xfb40f000
21953                           unsigned rd = (instr >> 8) & 0xf;
21954                           unsigned rn = (instr >> 16) & 0xf;
21955                           unsigned rm = instr & 0xf;
21956                           // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21957                           smusd(CurrentCond(),
21958                                 Register(rd),
21959                                 Register(rn),
21960                                 Register(rm));
21961                           break;
21962                         }
21963                         default: {
21964                           if (((instr & 0xf000) == 0xf000)) {
21965                             UnallocatedT32(instr);
21966                             return;
21967                           }
21968                           unsigned rd = (instr >> 8) & 0xf;
21969                           unsigned rn = (instr >> 16) & 0xf;
21970                           unsigned rm = instr & 0xf;
21971                           unsigned ra = (instr >> 12) & 0xf;
21972                           // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21973                           smlsd(CurrentCond(),
21974                                 Register(rd),
21975                                 Register(rn),
21976                                 Register(rm),
21977                                 Register(ra));
21978                           break;
21979                         }
21980                       }
21981                       break;
21982                     }
21983                     case 0x00400010: {
21984                       // 0xfb400010
21985                       switch (instr & 0x0000f000) {
21986                         case 0x0000f000: {
21987                           // 0xfb40f010
21988                           unsigned rd = (instr >> 8) & 0xf;
21989                           unsigned rn = (instr >> 16) & 0xf;
21990                           unsigned rm = instr & 0xf;
21991                           // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21992                           smusdx(CurrentCond(),
21993                                  Register(rd),
21994                                  Register(rn),
21995                                  Register(rm));
21996                           break;
21997                         }
21998                         default: {
21999                           if (((instr & 0xf000) == 0xf000)) {
22000                             UnallocatedT32(instr);
22001                             return;
22002                           }
22003                           unsigned rd = (instr >> 8) & 0xf;
22004                           unsigned rn = (instr >> 16) & 0xf;
22005                           unsigned rm = instr & 0xf;
22006                           unsigned ra = (instr >> 12) & 0xf;
22007                           // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22008                           smlsdx(CurrentCond(),
22009                                  Register(rd),
22010                                  Register(rn),
22011                                  Register(rm),
22012                                  Register(ra));
22013                           break;
22014                         }
22015                       }
22016                       break;
22017                     }
22018                     case 0x00600000: {
22019                       // 0xfb600000
22020                       unsigned rd = (instr >> 8) & 0xf;
22021                       unsigned rn = (instr >> 16) & 0xf;
22022                       unsigned rm = instr & 0xf;
22023                       unsigned ra = (instr >> 12) & 0xf;
22024                       // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22025                       smmls(CurrentCond(),
22026                             Register(rd),
22027                             Register(rn),
22028                             Register(rm),
22029                             Register(ra));
22030                       break;
22031                     }
22032                     case 0x00600010: {
22033                       // 0xfb600010
22034                       unsigned rd = (instr >> 8) & 0xf;
22035                       unsigned rn = (instr >> 16) & 0xf;
22036                       unsigned rm = instr & 0xf;
22037                       unsigned ra = (instr >> 12) & 0xf;
22038                       // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22039                       smmlsr(CurrentCond(),
22040                              Register(rd),
22041                              Register(rn),
22042                              Register(rm),
22043                              Register(ra));
22044                       break;
22045                     }
22046                     default:
22047                       UnallocatedT32(instr);
22048                       break;
22049                   }
22050                   break;
22051                 }
22052                 case 0x11100000: {
22053                   // 0xfb100000
22054                   switch (instr & 0x006000f0) {
22055                     case 0x00000000: {
22056                       // 0xfb100000
22057                       switch (instr & 0x0000f000) {
22058                         case 0x0000f000: {
22059                           // 0xfb10f000
22060                           unsigned rd = (instr >> 8) & 0xf;
22061                           unsigned rn = (instr >> 16) & 0xf;
22062                           unsigned rm = instr & 0xf;
22063                           // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22064                           smulbb(CurrentCond(),
22065                                  Register(rd),
22066                                  Register(rn),
22067                                  Register(rm));
22068                           break;
22069                         }
22070                         default: {
22071                           if (((instr & 0xf000) == 0xf000)) {
22072                             UnallocatedT32(instr);
22073                             return;
22074                           }
22075                           unsigned rd = (instr >> 8) & 0xf;
22076                           unsigned rn = (instr >> 16) & 0xf;
22077                           unsigned rm = instr & 0xf;
22078                           unsigned ra = (instr >> 12) & 0xf;
22079                           // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22080                           smlabb(CurrentCond(),
22081                                  Register(rd),
22082                                  Register(rn),
22083                                  Register(rm),
22084                                  Register(ra));
22085                           break;
22086                         }
22087                       }
22088                       break;
22089                     }
22090                     case 0x00000010: {
22091                       // 0xfb100010
22092                       switch (instr & 0x0000f000) {
22093                         case 0x0000f000: {
22094                           // 0xfb10f010
22095                           unsigned rd = (instr >> 8) & 0xf;
22096                           unsigned rn = (instr >> 16) & 0xf;
22097                           unsigned rm = instr & 0xf;
22098                           // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22099                           smulbt(CurrentCond(),
22100                                  Register(rd),
22101                                  Register(rn),
22102                                  Register(rm));
22103                           break;
22104                         }
22105                         default: {
22106                           if (((instr & 0xf000) == 0xf000)) {
22107                             UnallocatedT32(instr);
22108                             return;
22109                           }
22110                           unsigned rd = (instr >> 8) & 0xf;
22111                           unsigned rn = (instr >> 16) & 0xf;
22112                           unsigned rm = instr & 0xf;
22113                           unsigned ra = (instr >> 12) & 0xf;
22114                           // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22115                           smlabt(CurrentCond(),
22116                                  Register(rd),
22117                                  Register(rn),
22118                                  Register(rm),
22119                                  Register(ra));
22120                           break;
22121                         }
22122                       }
22123                       break;
22124                     }
22125                     case 0x00000020: {
22126                       // 0xfb100020
22127                       switch (instr & 0x0000f000) {
22128                         case 0x0000f000: {
22129                           // 0xfb10f020
22130                           unsigned rd = (instr >> 8) & 0xf;
22131                           unsigned rn = (instr >> 16) & 0xf;
22132                           unsigned rm = instr & 0xf;
22133                           // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22134                           smultb(CurrentCond(),
22135                                  Register(rd),
22136                                  Register(rn),
22137                                  Register(rm));
22138                           break;
22139                         }
22140                         default: {
22141                           if (((instr & 0xf000) == 0xf000)) {
22142                             UnallocatedT32(instr);
22143                             return;
22144                           }
22145                           unsigned rd = (instr >> 8) & 0xf;
22146                           unsigned rn = (instr >> 16) & 0xf;
22147                           unsigned rm = instr & 0xf;
22148                           unsigned ra = (instr >> 12) & 0xf;
22149                           // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22150                           smlatb(CurrentCond(),
22151                                  Register(rd),
22152                                  Register(rn),
22153                                  Register(rm),
22154                                  Register(ra));
22155                           break;
22156                         }
22157                       }
22158                       break;
22159                     }
22160                     case 0x00000030: {
22161                       // 0xfb100030
22162                       switch (instr & 0x0000f000) {
22163                         case 0x0000f000: {
22164                           // 0xfb10f030
22165                           unsigned rd = (instr >> 8) & 0xf;
22166                           unsigned rn = (instr >> 16) & 0xf;
22167                           unsigned rm = instr & 0xf;
22168                           // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22169                           smultt(CurrentCond(),
22170                                  Register(rd),
22171                                  Register(rn),
22172                                  Register(rm));
22173                           break;
22174                         }
22175                         default: {
22176                           if (((instr & 0xf000) == 0xf000)) {
22177                             UnallocatedT32(instr);
22178                             return;
22179                           }
22180                           unsigned rd = (instr >> 8) & 0xf;
22181                           unsigned rn = (instr >> 16) & 0xf;
22182                           unsigned rm = instr & 0xf;
22183                           unsigned ra = (instr >> 12) & 0xf;
22184                           // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22185                           smlatt(CurrentCond(),
22186                                  Register(rd),
22187                                  Register(rn),
22188                                  Register(rm),
22189                                  Register(ra));
22190                           break;
22191                         }
22192                       }
22193                       break;
22194                     }
22195                     case 0x00200000: {
22196                       // 0xfb300000
22197                       switch (instr & 0x0000f000) {
22198                         case 0x0000f000: {
22199                           // 0xfb30f000
22200                           unsigned rd = (instr >> 8) & 0xf;
22201                           unsigned rn = (instr >> 16) & 0xf;
22202                           unsigned rm = instr & 0xf;
22203                           // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22204                           smulwb(CurrentCond(),
22205                                  Register(rd),
22206                                  Register(rn),
22207                                  Register(rm));
22208                           break;
22209                         }
22210                         default: {
22211                           if (((instr & 0xf000) == 0xf000)) {
22212                             UnallocatedT32(instr);
22213                             return;
22214                           }
22215                           unsigned rd = (instr >> 8) & 0xf;
22216                           unsigned rn = (instr >> 16) & 0xf;
22217                           unsigned rm = instr & 0xf;
22218                           unsigned ra = (instr >> 12) & 0xf;
22219                           // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22220                           smlawb(CurrentCond(),
22221                                  Register(rd),
22222                                  Register(rn),
22223                                  Register(rm),
22224                                  Register(ra));
22225                           break;
22226                         }
22227                       }
22228                       break;
22229                     }
22230                     case 0x00200010: {
22231                       // 0xfb300010
22232                       switch (instr & 0x0000f000) {
22233                         case 0x0000f000: {
22234                           // 0xfb30f010
22235                           unsigned rd = (instr >> 8) & 0xf;
22236                           unsigned rn = (instr >> 16) & 0xf;
22237                           unsigned rm = instr & 0xf;
22238                           // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22239                           smulwt(CurrentCond(),
22240                                  Register(rd),
22241                                  Register(rn),
22242                                  Register(rm));
22243                           break;
22244                         }
22245                         default: {
22246                           if (((instr & 0xf000) == 0xf000)) {
22247                             UnallocatedT32(instr);
22248                             return;
22249                           }
22250                           unsigned rd = (instr >> 8) & 0xf;
22251                           unsigned rn = (instr >> 16) & 0xf;
22252                           unsigned rm = instr & 0xf;
22253                           unsigned ra = (instr >> 12) & 0xf;
22254                           // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22255                           smlawt(CurrentCond(),
22256                                  Register(rd),
22257                                  Register(rn),
22258                                  Register(rm),
22259                                  Register(ra));
22260                           break;
22261                         }
22262                       }
22263                       break;
22264                     }
22265                     case 0x00400000: {
22266                       // 0xfb500000
22267                       switch (instr & 0x0000f000) {
22268                         case 0x0000f000: {
22269                           // 0xfb50f000
22270                           unsigned rd = (instr >> 8) & 0xf;
22271                           unsigned rn = (instr >> 16) & 0xf;
22272                           unsigned rm = instr & 0xf;
22273                           // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22274                           smmul(CurrentCond(),
22275                                 Register(rd),
22276                                 Register(rn),
22277                                 Register(rm));
22278                           break;
22279                         }
22280                         default: {
22281                           if (((instr & 0xf000) == 0xf000)) {
22282                             UnallocatedT32(instr);
22283                             return;
22284                           }
22285                           unsigned rd = (instr >> 8) & 0xf;
22286                           unsigned rn = (instr >> 16) & 0xf;
22287                           unsigned rm = instr & 0xf;
22288                           unsigned ra = (instr >> 12) & 0xf;
22289                           // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22290                           smmla(CurrentCond(),
22291                                 Register(rd),
22292                                 Register(rn),
22293                                 Register(rm),
22294                                 Register(ra));
22295                           break;
22296                         }
22297                       }
22298                       break;
22299                     }
22300                     case 0x00400010: {
22301                       // 0xfb500010
22302                       switch (instr & 0x0000f000) {
22303                         case 0x0000f000: {
22304                           // 0xfb50f010
22305                           unsigned rd = (instr >> 8) & 0xf;
22306                           unsigned rn = (instr >> 16) & 0xf;
22307                           unsigned rm = instr & 0xf;
22308                           // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22309                           smmulr(CurrentCond(),
22310                                  Register(rd),
22311                                  Register(rn),
22312                                  Register(rm));
22313                           break;
22314                         }
22315                         default: {
22316                           if (((instr & 0xf000) == 0xf000)) {
22317                             UnallocatedT32(instr);
22318                             return;
22319                           }
22320                           unsigned rd = (instr >> 8) & 0xf;
22321                           unsigned rn = (instr >> 16) & 0xf;
22322                           unsigned rm = instr & 0xf;
22323                           unsigned ra = (instr >> 12) & 0xf;
22324                           // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22325                           smmlar(CurrentCond(),
22326                                  Register(rd),
22327                                  Register(rn),
22328                                  Register(rm),
22329                                  Register(ra));
22330                           break;
22331                         }
22332                       }
22333                       break;
22334                     }
22335                     case 0x00600000: {
22336                       // 0xfb700000
22337                       switch (instr & 0x0000f000) {
22338                         case 0x0000f000: {
22339                           // 0xfb70f000
22340                           unsigned rd = (instr >> 8) & 0xf;
22341                           unsigned rn = (instr >> 16) & 0xf;
22342                           unsigned rm = instr & 0xf;
22343                           // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22344                           usad8(CurrentCond(),
22345                                 Register(rd),
22346                                 Register(rn),
22347                                 Register(rm));
22348                           break;
22349                         }
22350                         default: {
22351                           if (((instr & 0xf000) == 0xf000)) {
22352                             UnallocatedT32(instr);
22353                             return;
22354                           }
22355                           unsigned rd = (instr >> 8) & 0xf;
22356                           unsigned rn = (instr >> 16) & 0xf;
22357                           unsigned rm = instr & 0xf;
22358                           unsigned ra = (instr >> 12) & 0xf;
22359                           // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22360                           usada8(CurrentCond(),
22361                                  Register(rd),
22362                                  Register(rn),
22363                                  Register(rm),
22364                                  Register(ra));
22365                           break;
22366                         }
22367                       }
22368                       break;
22369                     }
22370                     default:
22371                       UnallocatedT32(instr);
22372                       break;
22373                   }
22374                   break;
22375                 }
22376                 case 0x11800000: {
22377                   // 0xfb800000
22378                   switch (instr & 0x006000f0) {
22379                     case 0x00000000: {
22380                       // 0xfb800000
22381                       unsigned rdlo = (instr >> 12) & 0xf;
22382                       unsigned rdhi = (instr >> 8) & 0xf;
22383                       unsigned rn = (instr >> 16) & 0xf;
22384                       unsigned rm = instr & 0xf;
22385                       // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22386                       smull(CurrentCond(),
22387                             Register(rdlo),
22388                             Register(rdhi),
22389                             Register(rn),
22390                             Register(rm));
22391                       break;
22392                     }
22393                     case 0x00200000: {
22394                       // 0xfba00000
22395                       unsigned rdlo = (instr >> 12) & 0xf;
22396                       unsigned rdhi = (instr >> 8) & 0xf;
22397                       unsigned rn = (instr >> 16) & 0xf;
22398                       unsigned rm = instr & 0xf;
22399                       // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22400                       umull(CurrentCond(),
22401                             Register(rdlo),
22402                             Register(rdhi),
22403                             Register(rn),
22404                             Register(rm));
22405                       break;
22406                     }
22407                     case 0x00400000: {
22408                       // 0xfbc00000
22409                       unsigned rdlo = (instr >> 12) & 0xf;
22410                       unsigned rdhi = (instr >> 8) & 0xf;
22411                       unsigned rn = (instr >> 16) & 0xf;
22412                       unsigned rm = instr & 0xf;
22413                       // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22414                       smlal(CurrentCond(),
22415                             Register(rdlo),
22416                             Register(rdhi),
22417                             Register(rn),
22418                             Register(rm));
22419                       break;
22420                     }
22421                     case 0x00400080: {
22422                       // 0xfbc00080
22423                       unsigned rdlo = (instr >> 12) & 0xf;
22424                       unsigned rdhi = (instr >> 8) & 0xf;
22425                       unsigned rn = (instr >> 16) & 0xf;
22426                       unsigned rm = instr & 0xf;
22427                       // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22428                       smlalbb(CurrentCond(),
22429                               Register(rdlo),
22430                               Register(rdhi),
22431                               Register(rn),
22432                               Register(rm));
22433                       break;
22434                     }
22435                     case 0x00400090: {
22436                       // 0xfbc00090
22437                       unsigned rdlo = (instr >> 12) & 0xf;
22438                       unsigned rdhi = (instr >> 8) & 0xf;
22439                       unsigned rn = (instr >> 16) & 0xf;
22440                       unsigned rm = instr & 0xf;
22441                       // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22442                       smlalbt(CurrentCond(),
22443                               Register(rdlo),
22444                               Register(rdhi),
22445                               Register(rn),
22446                               Register(rm));
22447                       break;
22448                     }
22449                     case 0x004000a0: {
22450                       // 0xfbc000a0
22451                       unsigned rdlo = (instr >> 12) & 0xf;
22452                       unsigned rdhi = (instr >> 8) & 0xf;
22453                       unsigned rn = (instr >> 16) & 0xf;
22454                       unsigned rm = instr & 0xf;
22455                       // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22456                       smlaltb(CurrentCond(),
22457                               Register(rdlo),
22458                               Register(rdhi),
22459                               Register(rn),
22460                               Register(rm));
22461                       break;
22462                     }
22463                     case 0x004000b0: {
22464                       // 0xfbc000b0
22465                       unsigned rdlo = (instr >> 12) & 0xf;
22466                       unsigned rdhi = (instr >> 8) & 0xf;
22467                       unsigned rn = (instr >> 16) & 0xf;
22468                       unsigned rm = instr & 0xf;
22469                       // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22470                       smlaltt(CurrentCond(),
22471                               Register(rdlo),
22472                               Register(rdhi),
22473                               Register(rn),
22474                               Register(rm));
22475                       break;
22476                     }
22477                     case 0x004000c0: {
22478                       // 0xfbc000c0
22479                       unsigned rdlo = (instr >> 12) & 0xf;
22480                       unsigned rdhi = (instr >> 8) & 0xf;
22481                       unsigned rn = (instr >> 16) & 0xf;
22482                       unsigned rm = instr & 0xf;
22483                       // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22484                       smlald(CurrentCond(),
22485                              Register(rdlo),
22486                              Register(rdhi),
22487                              Register(rn),
22488                              Register(rm));
22489                       break;
22490                     }
22491                     case 0x004000d0: {
22492                       // 0xfbc000d0
22493                       unsigned rdlo = (instr >> 12) & 0xf;
22494                       unsigned rdhi = (instr >> 8) & 0xf;
22495                       unsigned rn = (instr >> 16) & 0xf;
22496                       unsigned rm = instr & 0xf;
22497                       // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22498                       smlaldx(CurrentCond(),
22499                               Register(rdlo),
22500                               Register(rdhi),
22501                               Register(rn),
22502                               Register(rm));
22503                       break;
22504                     }
22505                     case 0x00600000: {
22506                       // 0xfbe00000
22507                       unsigned rdlo = (instr >> 12) & 0xf;
22508                       unsigned rdhi = (instr >> 8) & 0xf;
22509                       unsigned rn = (instr >> 16) & 0xf;
22510                       unsigned rm = instr & 0xf;
22511                       // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22512                       umlal(CurrentCond(),
22513                             Register(rdlo),
22514                             Register(rdhi),
22515                             Register(rn),
22516                             Register(rm));
22517                       break;
22518                     }
22519                     case 0x00600060: {
22520                       // 0xfbe00060
22521                       unsigned rdlo = (instr >> 12) & 0xf;
22522                       unsigned rdhi = (instr >> 8) & 0xf;
22523                       unsigned rn = (instr >> 16) & 0xf;
22524                       unsigned rm = instr & 0xf;
22525                       // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22526                       umaal(CurrentCond(),
22527                             Register(rdlo),
22528                             Register(rdhi),
22529                             Register(rn),
22530                             Register(rm));
22531                       break;
22532                     }
22533                     default:
22534                       UnallocatedT32(instr);
22535                       break;
22536                   }
22537                   break;
22538                 }
22539                 case 0x11900000: {
22540                   // 0xfb900000
22541                   switch (instr & 0x006000f0) {
22542                     case 0x000000f0: {
22543                       // 0xfb9000f0
22544                       unsigned rd = (instr >> 8) & 0xf;
22545                       unsigned rn = (instr >> 16) & 0xf;
22546                       unsigned rm = instr & 0xf;
22547                       // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22548                       sdiv(CurrentCond(),
22549                            Register(rd),
22550                            Register(rn),
22551                            Register(rm));
22552                       if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) {
22553                         UnpredictableT32(instr);
22554                       }
22555                       break;
22556                     }
22557                     case 0x002000f0: {
22558                       // 0xfbb000f0
22559                       unsigned rd = (instr >> 8) & 0xf;
22560                       unsigned rn = (instr >> 16) & 0xf;
22561                       unsigned rm = instr & 0xf;
22562                       // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22563                       udiv(CurrentCond(),
22564                            Register(rd),
22565                            Register(rn),
22566                            Register(rm));
22567                       if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) {
22568                         UnpredictableT32(instr);
22569                       }
22570                       break;
22571                     }
22572                     case 0x004000c0: {
22573                       // 0xfbd000c0
22574                       unsigned rdlo = (instr >> 12) & 0xf;
22575                       unsigned rdhi = (instr >> 8) & 0xf;
22576                       unsigned rn = (instr >> 16) & 0xf;
22577                       unsigned rm = instr & 0xf;
22578                       // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22579                       smlsld(CurrentCond(),
22580                              Register(rdlo),
22581                              Register(rdhi),
22582                              Register(rn),
22583                              Register(rm));
22584                       break;
22585                     }
22586                     case 0x004000d0: {
22587                       // 0xfbd000d0
22588                       unsigned rdlo = (instr >> 12) & 0xf;
22589                       unsigned rdhi = (instr >> 8) & 0xf;
22590                       unsigned rn = (instr >> 16) & 0xf;
22591                       unsigned rm = instr & 0xf;
22592                       // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22593                       smlsldx(CurrentCond(),
22594                               Register(rdlo),
22595                               Register(rdhi),
22596                               Register(rn),
22597                               Register(rm));
22598                       break;
22599                     }
22600                     default:
22601                       UnallocatedT32(instr);
22602                       break;
22603                   }
22604                   break;
22605                 }
22606               }
22607               break;
22608             }
22609             case 0x04000000: {
22610               // 0xec000000
22611               switch (instr & 0x11100e00) {
22612                 case 0x00000a00: {
22613                   // 0xec000a00
22614                   switch (instr & 0x00800100) {
22615                     case 0x00000000: {
22616                       // 0xec000a00
22617                       if ((instr & 0x006000d0) == 0x00400010) {
22618                         unsigned rm = ExtractSRegister(instr, 5, 0);
22619                         unsigned rt = (instr >> 12) & 0xf;
22620                         unsigned rt2 = (instr >> 16) & 0xf;
22621                         // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1
22622                         vmov(CurrentCond(),
22623                              SRegister(rm),
22624                              SRegister(rm + 1),
22625                              Register(rt),
22626                              Register(rt2));
22627                       } else {
22628                         UnallocatedT32(instr);
22629                       }
22630                       break;
22631                     }
22632                     case 0x00000100: {
22633                       // 0xec000b00
22634                       if ((instr & 0x006000d0) == 0x00400010) {
22635                         unsigned rm = ExtractDRegister(instr, 5, 0);
22636                         unsigned rt = (instr >> 12) & 0xf;
22637                         unsigned rt2 = (instr >> 16) & 0xf;
22638                         // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1
22639                         vmov(CurrentCond(),
22640                              DRegister(rm),
22641                              Register(rt),
22642                              Register(rt2));
22643                       } else {
22644                         UnallocatedT32(instr);
22645                       }
22646                       break;
22647                     }
22648                     case 0x00800000: {
22649                       // 0xec800a00
22650                       unsigned rn = (instr >> 16) & 0xf;
22651                       WriteBack write_back((instr >> 21) & 0x1);
22652                       unsigned first = ExtractSRegister(instr, 22, 12);
22653                       unsigned len = instr & 0xff;
22654                       // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
22655                       vstm(CurrentCond(),
22656                            kDataTypeValueNone,
22657                            Register(rn),
22658                            write_back,
22659                            SRegisterList(SRegister(first), len));
22660                       if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
22661                         UnpredictableT32(instr);
22662                       }
22663                       break;
22664                     }
22665                     case 0x00800100: {
22666                       // 0xec800b00
22667                       switch (instr & 0x00000001) {
22668                         case 0x00000000: {
22669                           // 0xec800b00
22670                           unsigned rn = (instr >> 16) & 0xf;
22671                           WriteBack write_back((instr >> 21) & 0x1);
22672                           unsigned first = ExtractDRegister(instr, 22, 12);
22673                           unsigned imm8 = (instr & 0xff);
22674                           unsigned len = imm8 / 2;
22675                           unsigned end = first + len;
22676                           // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1
22677                           vstm(CurrentCond(),
22678                                kDataTypeValueNone,
22679                                Register(rn),
22680                                write_back,
22681                                DRegisterList(DRegister(first), len));
22682                           if ((len == 0) || (len > 16) ||
22683                               (end > kMaxNumberOfDRegisters)) {
22684                             UnpredictableT32(instr);
22685                           }
22686                           break;
22687                         }
22688                         case 0x00000001: {
22689                           // 0xec800b01
22690                           unsigned rn = (instr >> 16) & 0xf;
22691                           WriteBack write_back((instr >> 21) & 0x1);
22692                           unsigned first = ExtractDRegister(instr, 22, 12);
22693                           unsigned imm8 = (instr & 0xff);
22694                           unsigned len = imm8 / 2;
22695                           unsigned end = first + len;
22696                           // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
22697                           fstmiax(CurrentCond(),
22698                                   Register(rn),
22699                                   write_back,
22700                                   DRegisterList(DRegister(first), len));
22701                           if ((len == 0) || (len > 16) || (end > 16)) {
22702                             UnpredictableT32(instr);
22703                           }
22704                           break;
22705                         }
22706                       }
22707                       break;
22708                     }
22709                   }
22710                   break;
22711                 }
22712                 case 0x00000e00: {
22713                   // 0xec000e00
22714                   switch (instr & 0x00600000) {
22715                     case 0x00000000: {
22716                       // 0xec000e00
22717                       if ((instr & 0x0080f100) == 0x00805000) {
22718                         UnimplementedT32_32("STC", instr);
22719                       } else {
22720                         UnallocatedT32(instr);
22721                       }
22722                       break;
22723                     }
22724                     case 0x00200000: {
22725                       // 0xec200e00
22726                       if ((instr & 0x0000f100) == 0x00005000) {
22727                         UnimplementedT32_32("STC", instr);
22728                       } else {
22729                         UnallocatedT32(instr);
22730                       }
22731                       break;
22732                     }
22733                     case 0x00400000: {
22734                       // 0xec400e00
22735                       if ((instr & 0x00800000) == 0x00000000) {
22736                         UnimplementedT32_32("MCRR", instr);
22737                       } else {
22738                         UnallocatedT32(instr);
22739                       }
22740                       break;
22741                     }
22742                     default:
22743                       UnallocatedT32(instr);
22744                       break;
22745                   }
22746                   break;
22747                 }
22748                 case 0x00100a00: {
22749                   // 0xec100a00
22750                   switch (instr & 0x00800100) {
22751                     case 0x00000000: {
22752                       // 0xec100a00
22753                       if ((instr & 0x006000d0) == 0x00400010) {
22754                         unsigned rt = (instr >> 12) & 0xf;
22755                         unsigned rt2 = (instr >> 16) & 0xf;
22756                         unsigned rm = ExtractSRegister(instr, 5, 0);
22757                         // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1
22758                         vmov(CurrentCond(),
22759                              Register(rt),
22760                              Register(rt2),
22761                              SRegister(rm),
22762                              SRegister(rm + 1));
22763                       } else {
22764                         UnallocatedT32(instr);
22765                       }
22766                       break;
22767                     }
22768                     case 0x00000100: {
22769                       // 0xec100b00
22770                       if ((instr & 0x006000d0) == 0x00400010) {
22771                         unsigned rt = (instr >> 12) & 0xf;
22772                         unsigned rt2 = (instr >> 16) & 0xf;
22773                         unsigned rm = ExtractDRegister(instr, 5, 0);
22774                         // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1
22775                         vmov(CurrentCond(),
22776                              Register(rt),
22777                              Register(rt2),
22778                              DRegister(rm));
22779                       } else {
22780                         UnallocatedT32(instr);
22781                       }
22782                       break;
22783                     }
22784                     case 0x00800000: {
22785                       // 0xec900a00
22786                       if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
22787                            Uint32(0x1)) &&
22788                           ((Uint32((instr >> 16)) & Uint32(0xf)) ==
22789                            Uint32(0xd))) {
22790                         unsigned first = ExtractSRegister(instr, 22, 12);
22791                         unsigned len = instr & 0xff;
22792                         // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2
22793                         vpop(CurrentCond(),
22794                              kDataTypeValueNone,
22795                              SRegisterList(SRegister(first), len));
22796                         if ((len == 0) ||
22797                             ((first + len) > kNumberOfSRegisters)) {
22798                           UnpredictableT32(instr);
22799                         }
22800                         return;
22801                       }
22802                       unsigned rn = (instr >> 16) & 0xf;
22803                       WriteBack write_back((instr >> 21) & 0x1);
22804                       unsigned first = ExtractSRegister(instr, 22, 12);
22805                       unsigned len = instr & 0xff;
22806                       // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
22807                       vldm(CurrentCond(),
22808                            kDataTypeValueNone,
22809                            Register(rn),
22810                            write_back,
22811                            SRegisterList(SRegister(first), len));
22812                       if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
22813                         UnpredictableT32(instr);
22814                       }
22815                       break;
22816                     }
22817                     case 0x00800100: {
22818                       // 0xec900b00
22819                       switch (instr & 0x00000001) {
22820                         case 0x00000000: {
22821                           // 0xec900b00
22822                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
22823                                Uint32(0x1)) &&
22824                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
22825                                Uint32(0xd))) {
22826                             unsigned first = ExtractDRegister(instr, 22, 12);
22827                             unsigned imm8 = (instr & 0xff);
22828                             unsigned len = imm8 / 2;
22829                             unsigned end = first + len;
22830                             // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1
22831                             vpop(CurrentCond(),
22832                                  kDataTypeValueNone,
22833                                  DRegisterList(DRegister(first), len));
22834                             if ((len == 0) || (len > 16) ||
22835                                 (end > kMaxNumberOfDRegisters)) {
22836                               UnpredictableT32(instr);
22837                             }
22838                             return;
22839                           }
22840                           unsigned rn = (instr >> 16) & 0xf;
22841                           WriteBack write_back((instr >> 21) & 0x1);
22842                           unsigned first = ExtractDRegister(instr, 22, 12);
22843                           unsigned imm8 = (instr & 0xff);
22844                           unsigned len = imm8 / 2;
22845                           unsigned end = first + len;
22846                           // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1
22847                           vldm(CurrentCond(),
22848                                kDataTypeValueNone,
22849                                Register(rn),
22850                                write_back,
22851                                DRegisterList(DRegister(first), len));
22852                           if ((len == 0) || (len > 16) ||
22853                               (end > kMaxNumberOfDRegisters)) {
22854                             UnpredictableT32(instr);
22855                           }
22856                           break;
22857                         }
22858                         case 0x00000001: {
22859                           // 0xec900b01
22860                           unsigned rn = (instr >> 16) & 0xf;
22861                           WriteBack write_back((instr >> 21) & 0x1);
22862                           unsigned first = ExtractDRegister(instr, 22, 12);
22863                           unsigned imm8 = (instr & 0xff);
22864                           unsigned len = imm8 / 2;
22865                           unsigned end = first + len;
22866                           // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
22867                           fldmiax(CurrentCond(),
22868                                   Register(rn),
22869                                   write_back,
22870                                   DRegisterList(DRegister(first), len));
22871                           if ((len == 0) || (len > 16) || (end > 16)) {
22872                             UnpredictableT32(instr);
22873                           }
22874                           break;
22875                         }
22876                       }
22877                       break;
22878                     }
22879                   }
22880                   break;
22881                 }
22882                 case 0x00100e00: {
22883                   // 0xec100e00
22884                   switch (instr & 0x00600000) {
22885                     case 0x00000000: {
22886                       // 0xec100e00
22887                       if ((instr & 0x0080f100) == 0x00805000) {
22888                         if (((instr & 0xf0000) == 0xf0000)) {
22889                           UnallocatedT32(instr);
22890                           return;
22891                         }
22892                         UnimplementedT32_32("LDC", instr);
22893                       } else {
22894                         UnallocatedT32(instr);
22895                       }
22896                       break;
22897                     }
22898                     case 0x00200000: {
22899                       // 0xec300e00
22900                       if ((instr & 0x0000f100) == 0x00005000) {
22901                         if (((instr & 0xf0000) == 0xf0000)) {
22902                           UnallocatedT32(instr);
22903                           return;
22904                         }
22905                         UnimplementedT32_32("LDC", instr);
22906                       } else {
22907                         UnallocatedT32(instr);
22908                       }
22909                       break;
22910                     }
22911                     case 0x00400000: {
22912                       // 0xec500e00
22913                       if ((instr & 0x00800000) == 0x00000000) {
22914                         UnimplementedT32_32("MRRC", instr);
22915                       } else {
22916                         UnallocatedT32(instr);
22917                       }
22918                       break;
22919                     }
22920                     default:
22921                       UnallocatedT32(instr);
22922                       break;
22923                   }
22924                   break;
22925                 }
22926                 case 0x01000a00: {
22927                   // 0xed000a00
22928                   switch (instr & 0x00200100) {
22929                     case 0x00000000: {
22930                       // 0xed000a00
22931                       unsigned rd = ExtractSRegister(instr, 22, 12);
22932                       unsigned rn = (instr >> 16) & 0xf;
22933                       Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
22934                       int32_t offset = (instr & 0xff) << 2;
22935                       // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2
22936                       vstr(CurrentCond(),
22937                            Untyped32,
22938                            SRegister(rd),
22939                            MemOperand(Register(rn), sign, offset, Offset));
22940                       break;
22941                     }
22942                     case 0x00000100: {
22943                       // 0xed000b00
22944                       unsigned rd = ExtractDRegister(instr, 22, 12);
22945                       unsigned rn = (instr >> 16) & 0xf;
22946                       Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
22947                       int32_t offset = (instr & 0xff) << 2;
22948                       // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1
22949                       vstr(CurrentCond(),
22950                            Untyped64,
22951                            DRegister(rd),
22952                            MemOperand(Register(rn), sign, offset, Offset));
22953                       break;
22954                     }
22955                     case 0x00200000: {
22956                       // 0xed200a00
22957                       if ((instr & 0x00800000) == 0x00000000) {
22958                         if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
22959                              Uint32(0xd))) {
22960                           unsigned first = ExtractSRegister(instr, 22, 12);
22961                           unsigned len = instr & 0xff;
22962                           // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2
22963                           vpush(CurrentCond(),
22964                                 kDataTypeValueNone,
22965                                 SRegisterList(SRegister(first), len));
22966                           if ((len == 0) ||
22967                               ((first + len) > kNumberOfSRegisters)) {
22968                             UnpredictableT32(instr);
22969                           }
22970                           return;
22971                         }
22972                         unsigned rn = (instr >> 16) & 0xf;
22973                         unsigned first = ExtractSRegister(instr, 22, 12);
22974                         unsigned len = instr & 0xff;
22975                         // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2
22976                         vstmdb(CurrentCond(),
22977                                kDataTypeValueNone,
22978                                Register(rn),
22979                                WriteBack(WRITE_BACK),
22980                                SRegisterList(SRegister(first), len));
22981                         if ((len == 0) ||
22982                             ((first + len) > kNumberOfSRegisters)) {
22983                           UnpredictableT32(instr);
22984                         }
22985                       } else {
22986                         UnallocatedT32(instr);
22987                       }
22988                       break;
22989                     }
22990                     case 0x00200100: {
22991                       // 0xed200b00
22992                       switch (instr & 0x00800001) {
22993                         case 0x00000000: {
22994                           // 0xed200b00
22995                           if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
22996                                Uint32(0xd))) {
22997                             unsigned first = ExtractDRegister(instr, 22, 12);
22998                             unsigned imm8 = (instr & 0xff);
22999                             unsigned len = imm8 / 2;
23000                             unsigned end = first + len;
23001                             // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1
23002                             vpush(CurrentCond(),
23003                                   kDataTypeValueNone,
23004                                   DRegisterList(DRegister(first), len));
23005                             if ((len == 0) || (len > 16) ||
23006                                 (end > kMaxNumberOfDRegisters)) {
23007                               UnpredictableT32(instr);
23008                             }
23009                             return;
23010                           }
23011                           unsigned rn = (instr >> 16) & 0xf;
23012                           unsigned first = ExtractDRegister(instr, 22, 12);
23013                           unsigned imm8 = (instr & 0xff);
23014                           unsigned len = imm8 / 2;
23015                           unsigned end = first + len;
23016                           // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1
23017                           vstmdb(CurrentCond(),
23018                                  kDataTypeValueNone,
23019                                  Register(rn),
23020                                  WriteBack(WRITE_BACK),
23021                                  DRegisterList(DRegister(first), len));
23022                           if ((len == 0) || (len > 16) ||
23023                               (end > kMaxNumberOfDRegisters)) {
23024                             UnpredictableT32(instr);
23025                           }
23026                           break;
23027                         }
23028                         case 0x00000001: {
23029                           // 0xed200b01
23030                           unsigned rn = (instr >> 16) & 0xf;
23031                           unsigned first = ExtractDRegister(instr, 22, 12);
23032                           unsigned imm8 = (instr & 0xff);
23033                           unsigned len = imm8 / 2;
23034                           unsigned end = first + len;
23035                           // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
23036                           fstmdbx(CurrentCond(),
23037                                   Register(rn),
23038                                   WriteBack(WRITE_BACK),
23039                                   DRegisterList(DRegister(first), len));
23040                           if ((len == 0) || (len > 16) || (end > 16)) {
23041                             UnpredictableT32(instr);
23042                           }
23043                           break;
23044                         }
23045                         default:
23046                           UnallocatedT32(instr);
23047                           break;
23048                       }
23049                       break;
23050                     }
23051                   }
23052                   break;
23053                 }
23054                 case 0x01000e00: {
23055                   // 0xed000e00
23056                   switch (instr & 0x0060f100) {
23057                     case 0x00005000: {
23058                       // 0xed005e00
23059                       UnimplementedT32_32("STC", instr);
23060                       break;
23061                     }
23062                     case 0x00205000: {
23063                       // 0xed205e00
23064                       UnimplementedT32_32("STC", instr);
23065                       break;
23066                     }
23067                     default:
23068                       UnallocatedT32(instr);
23069                       break;
23070                   }
23071                   break;
23072                 }
23073                 case 0x01100a00: {
23074                   // 0xed100a00
23075                   switch (instr & 0x00200100) {
23076                     case 0x00000000: {
23077                       // 0xed100a00
23078                       switch (instr & 0x000f0000) {
23079                         case 0x000f0000: {
23080                           // 0xed1f0a00
23081                           unsigned rd = ExtractSRegister(instr, 22, 12);
23082                           uint32_t U = (instr >> 23) & 0x1;
23083                           int32_t imm = instr & 0xff;
23084                           imm <<= 2;
23085                           if (U == 0) imm = -imm;
23086                           bool minus_zero = (imm == 0) && (U == 0);
23087                           Location location(imm, kT32PcDelta);
23088                           // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2
23089                           if (minus_zero) {
23090                             vldr(CurrentCond(),
23091                                  Untyped32,
23092                                  SRegister(rd),
23093                                  MemOperand(pc, minus, 0));
23094                           } else {
23095                             vldr(CurrentCond(),
23096                                  Untyped32,
23097                                  SRegister(rd),
23098                                  &location);
23099                           }
23100                           break;
23101                         }
23102                         default: {
23103                           if (((instr & 0xf0000) == 0xf0000)) {
23104                             UnallocatedT32(instr);
23105                             return;
23106                           }
23107                           unsigned rd = ExtractSRegister(instr, 22, 12);
23108                           unsigned rn = (instr >> 16) & 0xf;
23109                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
23110                                                                  : plus);
23111                           int32_t offset = (instr & 0xff) << 2;
23112                           // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
23113                           vldr(CurrentCond(),
23114                                Untyped32,
23115                                SRegister(rd),
23116                                MemOperand(Register(rn), sign, offset, Offset));
23117                           break;
23118                         }
23119                       }
23120                       break;
23121                     }
23122                     case 0x00000100: {
23123                       // 0xed100b00
23124                       switch (instr & 0x000f0000) {
23125                         case 0x000f0000: {
23126                           // 0xed1f0b00
23127                           unsigned rd = ExtractDRegister(instr, 22, 12);
23128                           uint32_t U = (instr >> 23) & 0x1;
23129                           int32_t imm = instr & 0xff;
23130                           imm <<= 2;
23131                           if (U == 0) imm = -imm;
23132                           bool minus_zero = (imm == 0) && (U == 0);
23133                           Location location(imm, kT32PcDelta);
23134                           // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1
23135                           if (minus_zero) {
23136                             vldr(CurrentCond(),
23137                                  Untyped64,
23138                                  DRegister(rd),
23139                                  MemOperand(pc, minus, 0));
23140                           } else {
23141                             vldr(CurrentCond(),
23142                                  Untyped64,
23143                                  DRegister(rd),
23144                                  &location);
23145                           }
23146                           break;
23147                         }
23148                         default: {
23149                           if (((instr & 0xf0000) == 0xf0000)) {
23150                             UnallocatedT32(instr);
23151                             return;
23152                           }
23153                           unsigned rd = ExtractDRegister(instr, 22, 12);
23154                           unsigned rn = (instr >> 16) & 0xf;
23155                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
23156                                                                  : plus);
23157                           int32_t offset = (instr & 0xff) << 2;
23158                           // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
23159                           vldr(CurrentCond(),
23160                                Untyped64,
23161                                DRegister(rd),
23162                                MemOperand(Register(rn), sign, offset, Offset));
23163                           break;
23164                         }
23165                       }
23166                       break;
23167                     }
23168                     case 0x00200000: {
23169                       // 0xed300a00
23170                       if ((instr & 0x00800000) == 0x00000000) {
23171                         unsigned rn = (instr >> 16) & 0xf;
23172                         unsigned first = ExtractSRegister(instr, 22, 12);
23173                         unsigned len = instr & 0xff;
23174                         // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2
23175                         vldmdb(CurrentCond(),
23176                                kDataTypeValueNone,
23177                                Register(rn),
23178                                WriteBack(WRITE_BACK),
23179                                SRegisterList(SRegister(first), len));
23180                         if ((len == 0) ||
23181                             ((first + len) > kNumberOfSRegisters)) {
23182                           UnpredictableT32(instr);
23183                         }
23184                       } else {
23185                         UnallocatedT32(instr);
23186                       }
23187                       break;
23188                     }
23189                     case 0x00200100: {
23190                       // 0xed300b00
23191                       switch (instr & 0x00800001) {
23192                         case 0x00000000: {
23193                           // 0xed300b00
23194                           unsigned rn = (instr >> 16) & 0xf;
23195                           unsigned first = ExtractDRegister(instr, 22, 12);
23196                           unsigned imm8 = (instr & 0xff);
23197                           unsigned len = imm8 / 2;
23198                           unsigned end = first + len;
23199                           // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1
23200                           vldmdb(CurrentCond(),
23201                                  kDataTypeValueNone,
23202                                  Register(rn),
23203                                  WriteBack(WRITE_BACK),
23204                                  DRegisterList(DRegister(first), len));
23205                           if ((len == 0) || (len > 16) ||
23206                               (end > kMaxNumberOfDRegisters)) {
23207                             UnpredictableT32(instr);
23208                           }
23209                           break;
23210                         }
23211                         case 0x00000001: {
23212                           // 0xed300b01
23213                           unsigned rn = (instr >> 16) & 0xf;
23214                           unsigned first = ExtractDRegister(instr, 22, 12);
23215                           unsigned imm8 = (instr & 0xff);
23216                           unsigned len = imm8 / 2;
23217                           unsigned end = first + len;
23218                           // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
23219                           fldmdbx(CurrentCond(),
23220                                   Register(rn),
23221                                   WriteBack(WRITE_BACK),
23222                                   DRegisterList(DRegister(first), len));
23223                           if ((len == 0) || (len > 16) || (end > 16)) {
23224                             UnpredictableT32(instr);
23225                           }
23226                           break;
23227                         }
23228                         default:
23229                           UnallocatedT32(instr);
23230                           break;
23231                       }
23232                       break;
23233                     }
23234                   }
23235                   break;
23236                 }
23237                 case 0x01100e00: {
23238                   // 0xed100e00
23239                   switch (instr & 0x0060f100) {
23240                     case 0x00005000: {
23241                       // 0xed105e00
23242                       switch (instr & 0x000f0000) {
23243                         case 0x000f0000: {
23244                           // 0xed1f5e00
23245                           UnimplementedT32_32("LDC", instr);
23246                           break;
23247                         }
23248                         default: {
23249                           if (((instr & 0xf0000) == 0xf0000)) {
23250                             UnallocatedT32(instr);
23251                             return;
23252                           }
23253                           UnimplementedT32_32("LDC", instr);
23254                           break;
23255                         }
23256                       }
23257                       break;
23258                     }
23259                     case 0x00205000: {
23260                       // 0xed305e00
23261                       if (((instr & 0xf0000) == 0xf0000)) {
23262                         UnallocatedT32(instr);
23263                         return;
23264                       }
23265                       UnimplementedT32_32("LDC", instr);
23266                       break;
23267                     }
23268                     default:
23269                       UnallocatedT32(instr);
23270                       break;
23271                   }
23272                   break;
23273                 }
23274                 default:
23275                   UnallocatedT32(instr);
23276                   break;
23277               }
23278               break;
23279             }
23280             case 0x06000000: {
23281               // 0xee000000
23282               switch (instr & 0x01000010) {
23283                 case 0x00000000: {
23284                   // 0xee000000
23285                   switch (instr & 0x10b00f40) {
23286                     case 0x00000a00: {
23287                       // 0xee000a00
23288                       unsigned rd = ExtractSRegister(instr, 22, 12);
23289                       unsigned rn = ExtractSRegister(instr, 7, 16);
23290                       unsigned rm = ExtractSRegister(instr, 5, 0);
23291                       // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23292                       vmla(CurrentCond(),
23293                            F32,
23294                            SRegister(rd),
23295                            SRegister(rn),
23296                            SRegister(rm));
23297                       break;
23298                     }
23299                     case 0x00000a40: {
23300                       // 0xee000a40
23301                       unsigned rd = ExtractSRegister(instr, 22, 12);
23302                       unsigned rn = ExtractSRegister(instr, 7, 16);
23303                       unsigned rm = ExtractSRegister(instr, 5, 0);
23304                       // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23305                       vmls(CurrentCond(),
23306                            F32,
23307                            SRegister(rd),
23308                            SRegister(rn),
23309                            SRegister(rm));
23310                       break;
23311                     }
23312                     case 0x00000b00: {
23313                       // 0xee000b00
23314                       unsigned rd = ExtractDRegister(instr, 22, 12);
23315                       unsigned rn = ExtractDRegister(instr, 7, 16);
23316                       unsigned rm = ExtractDRegister(instr, 5, 0);
23317                       // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23318                       vmla(CurrentCond(),
23319                            F64,
23320                            DRegister(rd),
23321                            DRegister(rn),
23322                            DRegister(rm));
23323                       break;
23324                     }
23325                     case 0x00000b40: {
23326                       // 0xee000b40
23327                       unsigned rd = ExtractDRegister(instr, 22, 12);
23328                       unsigned rn = ExtractDRegister(instr, 7, 16);
23329                       unsigned rm = ExtractDRegister(instr, 5, 0);
23330                       // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23331                       vmls(CurrentCond(),
23332                            F64,
23333                            DRegister(rd),
23334                            DRegister(rn),
23335                            DRegister(rm));
23336                       break;
23337                     }
23338                     case 0x00100a00: {
23339                       // 0xee100a00
23340                       unsigned rd = ExtractSRegister(instr, 22, 12);
23341                       unsigned rn = ExtractSRegister(instr, 7, 16);
23342                       unsigned rm = ExtractSRegister(instr, 5, 0);
23343                       // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23344                       vnmls(CurrentCond(),
23345                             F32,
23346                             SRegister(rd),
23347                             SRegister(rn),
23348                             SRegister(rm));
23349                       break;
23350                     }
23351                     case 0x00100a40: {
23352                       // 0xee100a40
23353                       unsigned rd = ExtractSRegister(instr, 22, 12);
23354                       unsigned rn = ExtractSRegister(instr, 7, 16);
23355                       unsigned rm = ExtractSRegister(instr, 5, 0);
23356                       // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23357                       vnmla(CurrentCond(),
23358                             F32,
23359                             SRegister(rd),
23360                             SRegister(rn),
23361                             SRegister(rm));
23362                       break;
23363                     }
23364                     case 0x00100b00: {
23365                       // 0xee100b00
23366                       unsigned rd = ExtractDRegister(instr, 22, 12);
23367                       unsigned rn = ExtractDRegister(instr, 7, 16);
23368                       unsigned rm = ExtractDRegister(instr, 5, 0);
23369                       // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23370                       vnmls(CurrentCond(),
23371                             F64,
23372                             DRegister(rd),
23373                             DRegister(rn),
23374                             DRegister(rm));
23375                       break;
23376                     }
23377                     case 0x00100b40: {
23378                       // 0xee100b40
23379                       unsigned rd = ExtractDRegister(instr, 22, 12);
23380                       unsigned rn = ExtractDRegister(instr, 7, 16);
23381                       unsigned rm = ExtractDRegister(instr, 5, 0);
23382                       // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23383                       vnmla(CurrentCond(),
23384                             F64,
23385                             DRegister(rd),
23386                             DRegister(rn),
23387                             DRegister(rm));
23388                       break;
23389                     }
23390                     case 0x00200a00: {
23391                       // 0xee200a00
23392                       unsigned rd = ExtractSRegister(instr, 22, 12);
23393                       unsigned rn = ExtractSRegister(instr, 7, 16);
23394                       unsigned rm = ExtractSRegister(instr, 5, 0);
23395                       // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23396                       vmul(CurrentCond(),
23397                            F32,
23398                            SRegister(rd),
23399                            SRegister(rn),
23400                            SRegister(rm));
23401                       break;
23402                     }
23403                     case 0x00200a40: {
23404                       // 0xee200a40
23405                       unsigned rd = ExtractSRegister(instr, 22, 12);
23406                       unsigned rn = ExtractSRegister(instr, 7, 16);
23407                       unsigned rm = ExtractSRegister(instr, 5, 0);
23408                       // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
23409                       vnmul(CurrentCond(),
23410                             F32,
23411                             SRegister(rd),
23412                             SRegister(rn),
23413                             SRegister(rm));
23414                       break;
23415                     }
23416                     case 0x00200b00: {
23417                       // 0xee200b00
23418                       unsigned rd = ExtractDRegister(instr, 22, 12);
23419                       unsigned rn = ExtractDRegister(instr, 7, 16);
23420                       unsigned rm = ExtractDRegister(instr, 5, 0);
23421                       // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23422                       vmul(CurrentCond(),
23423                            F64,
23424                            DRegister(rd),
23425                            DRegister(rn),
23426                            DRegister(rm));
23427                       break;
23428                     }
23429                     case 0x00200b40: {
23430                       // 0xee200b40
23431                       unsigned rd = ExtractDRegister(instr, 22, 12);
23432                       unsigned rn = ExtractDRegister(instr, 7, 16);
23433                       unsigned rm = ExtractDRegister(instr, 5, 0);
23434                       // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
23435                       vnmul(CurrentCond(),
23436                             F64,
23437                             DRegister(rd),
23438                             DRegister(rn),
23439                             DRegister(rm));
23440                       break;
23441                     }
23442                     case 0x00300a00: {
23443                       // 0xee300a00
23444                       unsigned rd = ExtractSRegister(instr, 22, 12);
23445                       unsigned rn = ExtractSRegister(instr, 7, 16);
23446                       unsigned rm = ExtractSRegister(instr, 5, 0);
23447                       // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23448                       vadd(CurrentCond(),
23449                            F32,
23450                            SRegister(rd),
23451                            SRegister(rn),
23452                            SRegister(rm));
23453                       break;
23454                     }
23455                     case 0x00300a40: {
23456                       // 0xee300a40
23457                       unsigned rd = ExtractSRegister(instr, 22, 12);
23458                       unsigned rn = ExtractSRegister(instr, 7, 16);
23459                       unsigned rm = ExtractSRegister(instr, 5, 0);
23460                       // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23461                       vsub(CurrentCond(),
23462                            F32,
23463                            SRegister(rd),
23464                            SRegister(rn),
23465                            SRegister(rm));
23466                       break;
23467                     }
23468                     case 0x00300b00: {
23469                       // 0xee300b00
23470                       unsigned rd = ExtractDRegister(instr, 22, 12);
23471                       unsigned rn = ExtractDRegister(instr, 7, 16);
23472                       unsigned rm = ExtractDRegister(instr, 5, 0);
23473                       // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23474                       vadd(CurrentCond(),
23475                            F64,
23476                            DRegister(rd),
23477                            DRegister(rn),
23478                            DRegister(rm));
23479                       break;
23480                     }
23481                     case 0x00300b40: {
23482                       // 0xee300b40
23483                       unsigned rd = ExtractDRegister(instr, 22, 12);
23484                       unsigned rn = ExtractDRegister(instr, 7, 16);
23485                       unsigned rm = ExtractDRegister(instr, 5, 0);
23486                       // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23487                       vsub(CurrentCond(),
23488                            F64,
23489                            DRegister(rd),
23490                            DRegister(rn),
23491                            DRegister(rm));
23492                       break;
23493                     }
23494                     case 0x00800a00: {
23495                       // 0xee800a00
23496                       unsigned rd = ExtractSRegister(instr, 22, 12);
23497                       unsigned rn = ExtractSRegister(instr, 7, 16);
23498                       unsigned rm = ExtractSRegister(instr, 5, 0);
23499                       // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
23500                       vdiv(CurrentCond(),
23501                            F32,
23502                            SRegister(rd),
23503                            SRegister(rn),
23504                            SRegister(rm));
23505                       break;
23506                     }
23507                     case 0x00800b00: {
23508                       // 0xee800b00
23509                       unsigned rd = ExtractDRegister(instr, 22, 12);
23510                       unsigned rn = ExtractDRegister(instr, 7, 16);
23511                       unsigned rm = ExtractDRegister(instr, 5, 0);
23512                       // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
23513                       vdiv(CurrentCond(),
23514                            F64,
23515                            DRegister(rd),
23516                            DRegister(rn),
23517                            DRegister(rm));
23518                       break;
23519                     }
23520                     case 0x00900a00: {
23521                       // 0xee900a00
23522                       unsigned rd = ExtractSRegister(instr, 22, 12);
23523                       unsigned rn = ExtractSRegister(instr, 7, 16);
23524                       unsigned rm = ExtractSRegister(instr, 5, 0);
23525                       // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23526                       vfnms(CurrentCond(),
23527                             F32,
23528                             SRegister(rd),
23529                             SRegister(rn),
23530                             SRegister(rm));
23531                       break;
23532                     }
23533                     case 0x00900a40: {
23534                       // 0xee900a40
23535                       unsigned rd = ExtractSRegister(instr, 22, 12);
23536                       unsigned rn = ExtractSRegister(instr, 7, 16);
23537                       unsigned rm = ExtractSRegister(instr, 5, 0);
23538                       // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23539                       vfnma(CurrentCond(),
23540                             F32,
23541                             SRegister(rd),
23542                             SRegister(rn),
23543                             SRegister(rm));
23544                       break;
23545                     }
23546                     case 0x00900b00: {
23547                       // 0xee900b00
23548                       unsigned rd = ExtractDRegister(instr, 22, 12);
23549                       unsigned rn = ExtractDRegister(instr, 7, 16);
23550                       unsigned rm = ExtractDRegister(instr, 5, 0);
23551                       // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23552                       vfnms(CurrentCond(),
23553                             F64,
23554                             DRegister(rd),
23555                             DRegister(rn),
23556                             DRegister(rm));
23557                       break;
23558                     }
23559                     case 0x00900b40: {
23560                       // 0xee900b40
23561                       unsigned rd = ExtractDRegister(instr, 22, 12);
23562                       unsigned rn = ExtractDRegister(instr, 7, 16);
23563                       unsigned rm = ExtractDRegister(instr, 5, 0);
23564                       // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23565                       vfnma(CurrentCond(),
23566                             F64,
23567                             DRegister(rd),
23568                             DRegister(rn),
23569                             DRegister(rm));
23570                       break;
23571                     }
23572                     case 0x00a00a00: {
23573                       // 0xeea00a00
23574                       unsigned rd = ExtractSRegister(instr, 22, 12);
23575                       unsigned rn = ExtractSRegister(instr, 7, 16);
23576                       unsigned rm = ExtractSRegister(instr, 5, 0);
23577                       // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23578                       vfma(CurrentCond(),
23579                            F32,
23580                            SRegister(rd),
23581                            SRegister(rn),
23582                            SRegister(rm));
23583                       break;
23584                     }
23585                     case 0x00a00a40: {
23586                       // 0xeea00a40
23587                       unsigned rd = ExtractSRegister(instr, 22, 12);
23588                       unsigned rn = ExtractSRegister(instr, 7, 16);
23589                       unsigned rm = ExtractSRegister(instr, 5, 0);
23590                       // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23591                       vfms(CurrentCond(),
23592                            F32,
23593                            SRegister(rd),
23594                            SRegister(rn),
23595                            SRegister(rm));
23596                       break;
23597                     }
23598                     case 0x00a00b00: {
23599                       // 0xeea00b00
23600                       unsigned rd = ExtractDRegister(instr, 22, 12);
23601                       unsigned rn = ExtractDRegister(instr, 7, 16);
23602                       unsigned rm = ExtractDRegister(instr, 5, 0);
23603                       // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23604                       vfma(CurrentCond(),
23605                            F64,
23606                            DRegister(rd),
23607                            DRegister(rn),
23608                            DRegister(rm));
23609                       break;
23610                     }
23611                     case 0x00a00b40: {
23612                       // 0xeea00b40
23613                       unsigned rd = ExtractDRegister(instr, 22, 12);
23614                       unsigned rn = ExtractDRegister(instr, 7, 16);
23615                       unsigned rm = ExtractDRegister(instr, 5, 0);
23616                       // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23617                       vfms(CurrentCond(),
23618                            F64,
23619                            DRegister(rd),
23620                            DRegister(rn),
23621                            DRegister(rm));
23622                       break;
23623                     }
23624                     case 0x00b00a00: {
23625                       // 0xeeb00a00
23626                       unsigned rd = ExtractSRegister(instr, 22, 12);
23627                       uint32_t encoded_imm =
23628                           (instr & 0xf) | ((instr >> 12) & 0xf0);
23629                       NeonImmediate imm =
23630                           ImmediateVFP::Decode<float>(encoded_imm);
23631                       // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2
23632                       vmov(CurrentCond(), F32, SRegister(rd), imm);
23633                       if (((instr & 0xffb00ff0) != 0xeeb00a00)) {
23634                         UnpredictableT32(instr);
23635                       }
23636                       break;
23637                     }
23638                     case 0x00b00a40: {
23639                       // 0xeeb00a40
23640                       switch (instr & 0x000e0000) {
23641                         case 0x00000000: {
23642                           // 0xeeb00a40
23643                           switch (instr & 0x00010080) {
23644                             case 0x00000000: {
23645                               // 0xeeb00a40
23646                               unsigned rd = ExtractSRegister(instr, 22, 12);
23647                               unsigned rm = ExtractSRegister(instr, 5, 0);
23648                               // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23649                               vmov(CurrentCond(),
23650                                    F32,
23651                                    SRegister(rd),
23652                                    SRegister(rm));
23653                               break;
23654                             }
23655                             case 0x00000080: {
23656                               // 0xeeb00ac0
23657                               unsigned rd = ExtractSRegister(instr, 22, 12);
23658                               unsigned rm = ExtractSRegister(instr, 5, 0);
23659                               // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23660                               vabs(CurrentCond(),
23661                                    F32,
23662                                    SRegister(rd),
23663                                    SRegister(rm));
23664                               break;
23665                             }
23666                             case 0x00010000: {
23667                               // 0xeeb10a40
23668                               unsigned rd = ExtractSRegister(instr, 22, 12);
23669                               unsigned rm = ExtractSRegister(instr, 5, 0);
23670                               // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23671                               vneg(CurrentCond(),
23672                                    F32,
23673                                    SRegister(rd),
23674                                    SRegister(rm));
23675                               break;
23676                             }
23677                             case 0x00010080: {
23678                               // 0xeeb10ac0
23679                               unsigned rd = ExtractSRegister(instr, 22, 12);
23680                               unsigned rm = ExtractSRegister(instr, 5, 0);
23681                               // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23682                               vsqrt(CurrentCond(),
23683                                     F32,
23684                                     SRegister(rd),
23685                                     SRegister(rm));
23686                               break;
23687                             }
23688                           }
23689                           break;
23690                         }
23691                         case 0x00020000: {
23692                           // 0xeeb20a40
23693                           switch (instr & 0x00010080) {
23694                             case 0x00000000: {
23695                               // 0xeeb20a40
23696                               unsigned rd = ExtractSRegister(instr, 22, 12);
23697                               unsigned rm = ExtractSRegister(instr, 5, 0);
23698                               // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
23699                               vcvtb(CurrentCond(),
23700                                     F32,
23701                                     F16,
23702                                     SRegister(rd),
23703                                     SRegister(rm));
23704                               break;
23705                             }
23706                             case 0x00000080: {
23707                               // 0xeeb20ac0
23708                               unsigned rd = ExtractSRegister(instr, 22, 12);
23709                               unsigned rm = ExtractSRegister(instr, 5, 0);
23710                               // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
23711                               vcvtt(CurrentCond(),
23712                                     F32,
23713                                     F16,
23714                                     SRegister(rd),
23715                                     SRegister(rm));
23716                               break;
23717                             }
23718                             case 0x00010000: {
23719                               // 0xeeb30a40
23720                               unsigned rd = ExtractSRegister(instr, 22, 12);
23721                               unsigned rm = ExtractSRegister(instr, 5, 0);
23722                               // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
23723                               vcvtb(CurrentCond(),
23724                                     F16,
23725                                     F32,
23726                                     SRegister(rd),
23727                                     SRegister(rm));
23728                               break;
23729                             }
23730                             case 0x00010080: {
23731                               // 0xeeb30ac0
23732                               unsigned rd = ExtractSRegister(instr, 22, 12);
23733                               unsigned rm = ExtractSRegister(instr, 5, 0);
23734                               // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
23735                               vcvtt(CurrentCond(),
23736                                     F16,
23737                                     F32,
23738                                     SRegister(rd),
23739                                     SRegister(rm));
23740                               break;
23741                             }
23742                           }
23743                           break;
23744                         }
23745                         case 0x00040000: {
23746                           // 0xeeb40a40
23747                           switch (instr & 0x00010080) {
23748                             case 0x00000000: {
23749                               // 0xeeb40a40
23750                               unsigned rd = ExtractSRegister(instr, 22, 12);
23751                               unsigned rm = ExtractSRegister(instr, 5, 0);
23752                               // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23753                               vcmp(CurrentCond(),
23754                                    F32,
23755                                    SRegister(rd),
23756                                    SRegister(rm));
23757                               break;
23758                             }
23759                             case 0x00000080: {
23760                               // 0xeeb40ac0
23761                               unsigned rd = ExtractSRegister(instr, 22, 12);
23762                               unsigned rm = ExtractSRegister(instr, 5, 0);
23763                               // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23764                               vcmpe(CurrentCond(),
23765                                     F32,
23766                                     SRegister(rd),
23767                                     SRegister(rm));
23768                               break;
23769                             }
23770                             case 0x00010000: {
23771                               // 0xeeb50a40
23772                               unsigned rd = ExtractSRegister(instr, 22, 12);
23773                               // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
23774                               vcmp(CurrentCond(), F32, SRegister(rd), 0.0);
23775                               if (((instr & 0xffbf0fff) != 0xeeb50a40)) {
23776                                 UnpredictableT32(instr);
23777                               }
23778                               break;
23779                             }
23780                             case 0x00010080: {
23781                               // 0xeeb50ac0
23782                               unsigned rd = ExtractSRegister(instr, 22, 12);
23783                               // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
23784                               vcmpe(CurrentCond(), F32, SRegister(rd), 0.0);
23785                               if (((instr & 0xffbf0fff) != 0xeeb50ac0)) {
23786                                 UnpredictableT32(instr);
23787                               }
23788                               break;
23789                             }
23790                           }
23791                           break;
23792                         }
23793                         case 0x00060000: {
23794                           // 0xeeb60a40
23795                           switch (instr & 0x00010080) {
23796                             case 0x00000000: {
23797                               // 0xeeb60a40
23798                               unsigned rd = ExtractSRegister(instr, 22, 12);
23799                               unsigned rm = ExtractSRegister(instr, 5, 0);
23800                               // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23801                               vrintr(CurrentCond(),
23802                                      F32,
23803                                      SRegister(rd),
23804                                      SRegister(rm));
23805                               break;
23806                             }
23807                             case 0x00000080: {
23808                               // 0xeeb60ac0
23809                               unsigned rd = ExtractSRegister(instr, 22, 12);
23810                               unsigned rm = ExtractSRegister(instr, 5, 0);
23811                               // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23812                               vrintz(CurrentCond(),
23813                                      F32,
23814                                      SRegister(rd),
23815                                      SRegister(rm));
23816                               break;
23817                             }
23818                             case 0x00010000: {
23819                               // 0xeeb70a40
23820                               unsigned rd = ExtractSRegister(instr, 22, 12);
23821                               unsigned rm = ExtractSRegister(instr, 5, 0);
23822                               // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23823                               vrintx(CurrentCond(),
23824                                      F32,
23825                                      SRegister(rd),
23826                                      SRegister(rm));
23827                               break;
23828                             }
23829                             case 0x00010080: {
23830                               // 0xeeb70ac0
23831                               unsigned rd = ExtractDRegister(instr, 22, 12);
23832                               unsigned rm = ExtractSRegister(instr, 5, 0);
23833                               // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1
23834                               vcvt(CurrentCond(),
23835                                    F64,
23836                                    F32,
23837                                    DRegister(rd),
23838                                    SRegister(rm));
23839                               break;
23840                             }
23841                           }
23842                           break;
23843                         }
23844                         case 0x00080000: {
23845                           // 0xeeb80a40
23846                           if ((instr & 0x00010000) == 0x00000000) {
23847                             DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
23848                             if (dt.Is(kDataTypeValueInvalid)) {
23849                               UnallocatedT32(instr);
23850                               return;
23851                             }
23852                             unsigned rd = ExtractSRegister(instr, 22, 12);
23853                             unsigned rm = ExtractSRegister(instr, 5, 0);
23854                             // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1
23855                             vcvt(CurrentCond(),
23856                                  F32,
23857                                  dt,
23858                                  SRegister(rd),
23859                                  SRegister(rm));
23860                           } else {
23861                             UnallocatedT32(instr);
23862                           }
23863                           break;
23864                         }
23865                         case 0x000a0000: {
23866                           // 0xeeba0a40
23867                           DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
23868                                                          ((instr >> 15) & 0x2));
23869                           if (dt.Is(kDataTypeValueInvalid)) {
23870                             UnallocatedT32(instr);
23871                             return;
23872                           }
23873                           unsigned rd = ExtractSRegister(instr, 22, 12);
23874                           unsigned offset = 32;
23875                           if (dt.Is(S16) || dt.Is(U16)) {
23876                             offset = 16;
23877                           }
23878                           uint32_t fbits = offset - (((instr >> 5) & 0x1) |
23879                                                      ((instr << 1) & 0x1e));
23880                           // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1
23881                           vcvt(CurrentCond(),
23882                                F32,
23883                                dt,
23884                                SRegister(rd),
23885                                SRegister(rd),
23886                                fbits);
23887                           break;
23888                         }
23889                         case 0x000c0000: {
23890                           // 0xeebc0a40
23891                           switch (instr & 0x00010080) {
23892                             case 0x00000000: {
23893                               // 0xeebc0a40
23894                               unsigned rd = ExtractSRegister(instr, 22, 12);
23895                               unsigned rm = ExtractSRegister(instr, 5, 0);
23896                               // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
23897                               vcvtr(CurrentCond(),
23898                                     U32,
23899                                     F32,
23900                                     SRegister(rd),
23901                                     SRegister(rm));
23902                               break;
23903                             }
23904                             case 0x00000080: {
23905                               // 0xeebc0ac0
23906                               unsigned rd = ExtractSRegister(instr, 22, 12);
23907                               unsigned rm = ExtractSRegister(instr, 5, 0);
23908                               // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
23909                               vcvt(CurrentCond(),
23910                                    U32,
23911                                    F32,
23912                                    SRegister(rd),
23913                                    SRegister(rm));
23914                               break;
23915                             }
23916                             case 0x00010000: {
23917                               // 0xeebd0a40
23918                               unsigned rd = ExtractSRegister(instr, 22, 12);
23919                               unsigned rm = ExtractSRegister(instr, 5, 0);
23920                               // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
23921                               vcvtr(CurrentCond(),
23922                                     S32,
23923                                     F32,
23924                                     SRegister(rd),
23925                                     SRegister(rm));
23926                               break;
23927                             }
23928                             case 0x00010080: {
23929                               // 0xeebd0ac0
23930                               unsigned rd = ExtractSRegister(instr, 22, 12);
23931                               unsigned rm = ExtractSRegister(instr, 5, 0);
23932                               // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
23933                               vcvt(CurrentCond(),
23934                                    S32,
23935                                    F32,
23936                                    SRegister(rd),
23937                                    SRegister(rm));
23938                               break;
23939                             }
23940                           }
23941                           break;
23942                         }
23943                         case 0x000e0000: {
23944                           // 0xeebe0a40
23945                           DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
23946                                                          ((instr >> 15) & 0x2));
23947                           if (dt.Is(kDataTypeValueInvalid)) {
23948                             UnallocatedT32(instr);
23949                             return;
23950                           }
23951                           unsigned rd = ExtractSRegister(instr, 22, 12);
23952                           unsigned offset = 32;
23953                           if (dt.Is(S16) || dt.Is(U16)) {
23954                             offset = 16;
23955                           }
23956                           uint32_t fbits = offset - (((instr >> 5) & 0x1) |
23957                                                      ((instr << 1) & 0x1e));
23958                           // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1
23959                           vcvt(CurrentCond(),
23960                                dt,
23961                                F32,
23962                                SRegister(rd),
23963                                SRegister(rd),
23964                                fbits);
23965                           break;
23966                         }
23967                       }
23968                       break;
23969                     }
23970                     case 0x00b00b00: {
23971                       // 0xeeb00b00
23972                       unsigned rd = ExtractDRegister(instr, 22, 12);
23973                       uint32_t encoded_imm =
23974                           (instr & 0xf) | ((instr >> 12) & 0xf0);
23975                       NeonImmediate imm =
23976                           ImmediateVFP::Decode<double>(encoded_imm);
23977                       // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2
23978                       vmov(CurrentCond(), F64, DRegister(rd), imm);
23979                       if (((instr & 0xffb00ff0) != 0xeeb00b00)) {
23980                         UnpredictableT32(instr);
23981                       }
23982                       break;
23983                     }
23984                     case 0x00b00b40: {
23985                       // 0xeeb00b40
23986                       switch (instr & 0x000e0000) {
23987                         case 0x00000000: {
23988                           // 0xeeb00b40
23989                           switch (instr & 0x00010080) {
23990                             case 0x00000000: {
23991                               // 0xeeb00b40
23992                               unsigned rd = ExtractDRegister(instr, 22, 12);
23993                               unsigned rm = ExtractDRegister(instr, 5, 0);
23994                               // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
23995                               vmov(CurrentCond(),
23996                                    F64,
23997                                    DRegister(rd),
23998                                    DRegister(rm));
23999                               break;
24000                             }
24001                             case 0x00000080: {
24002                               // 0xeeb00bc0
24003                               unsigned rd = ExtractDRegister(instr, 22, 12);
24004                               unsigned rm = ExtractDRegister(instr, 5, 0);
24005                               // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24006                               vabs(CurrentCond(),
24007                                    F64,
24008                                    DRegister(rd),
24009                                    DRegister(rm));
24010                               break;
24011                             }
24012                             case 0x00010000: {
24013                               // 0xeeb10b40
24014                               unsigned rd = ExtractDRegister(instr, 22, 12);
24015                               unsigned rm = ExtractDRegister(instr, 5, 0);
24016                               // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24017                               vneg(CurrentCond(),
24018                                    F64,
24019                                    DRegister(rd),
24020                                    DRegister(rm));
24021                               break;
24022                             }
24023                             case 0x00010080: {
24024                               // 0xeeb10bc0
24025                               unsigned rd = ExtractDRegister(instr, 22, 12);
24026                               unsigned rm = ExtractDRegister(instr, 5, 0);
24027                               // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24028                               vsqrt(CurrentCond(),
24029                                     F64,
24030                                     DRegister(rd),
24031                                     DRegister(rm));
24032                               break;
24033                             }
24034                           }
24035                           break;
24036                         }
24037                         case 0x00020000: {
24038                           // 0xeeb20b40
24039                           switch (instr & 0x00010080) {
24040                             case 0x00000000: {
24041                               // 0xeeb20b40
24042                               unsigned rd = ExtractDRegister(instr, 22, 12);
24043                               unsigned rm = ExtractSRegister(instr, 5, 0);
24044                               // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
24045                               vcvtb(CurrentCond(),
24046                                     F64,
24047                                     F16,
24048                                     DRegister(rd),
24049                                     SRegister(rm));
24050                               break;
24051                             }
24052                             case 0x00000080: {
24053                               // 0xeeb20bc0
24054                               unsigned rd = ExtractDRegister(instr, 22, 12);
24055                               unsigned rm = ExtractSRegister(instr, 5, 0);
24056                               // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
24057                               vcvtt(CurrentCond(),
24058                                     F64,
24059                                     F16,
24060                                     DRegister(rd),
24061                                     SRegister(rm));
24062                               break;
24063                             }
24064                             case 0x00010000: {
24065                               // 0xeeb30b40
24066                               unsigned rd = ExtractSRegister(instr, 22, 12);
24067                               unsigned rm = ExtractDRegister(instr, 5, 0);
24068                               // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
24069                               vcvtb(CurrentCond(),
24070                                     F16,
24071                                     F64,
24072                                     SRegister(rd),
24073                                     DRegister(rm));
24074                               break;
24075                             }
24076                             case 0x00010080: {
24077                               // 0xeeb30bc0
24078                               unsigned rd = ExtractSRegister(instr, 22, 12);
24079                               unsigned rm = ExtractDRegister(instr, 5, 0);
24080                               // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
24081                               vcvtt(CurrentCond(),
24082                                     F16,
24083                                     F64,
24084                                     SRegister(rd),
24085                                     DRegister(rm));
24086                               break;
24087                             }
24088                           }
24089                           break;
24090                         }
24091                         case 0x00040000: {
24092                           // 0xeeb40b40
24093                           switch (instr & 0x00010080) {
24094                             case 0x00000000: {
24095                               // 0xeeb40b40
24096                               unsigned rd = ExtractDRegister(instr, 22, 12);
24097                               unsigned rm = ExtractDRegister(instr, 5, 0);
24098                               // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24099                               vcmp(CurrentCond(),
24100                                    F64,
24101                                    DRegister(rd),
24102                                    DRegister(rm));
24103                               break;
24104                             }
24105                             case 0x00000080: {
24106                               // 0xeeb40bc0
24107                               unsigned rd = ExtractDRegister(instr, 22, 12);
24108                               unsigned rm = ExtractDRegister(instr, 5, 0);
24109                               // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24110                               vcmpe(CurrentCond(),
24111                                     F64,
24112                                     DRegister(rd),
24113                                     DRegister(rm));
24114                               break;
24115                             }
24116                             case 0x00010000: {
24117                               // 0xeeb50b40
24118                               unsigned rd = ExtractDRegister(instr, 22, 12);
24119                               // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
24120                               vcmp(CurrentCond(), F64, DRegister(rd), 0.0);
24121                               if (((instr & 0xffbf0fff) != 0xeeb50b40)) {
24122                                 UnpredictableT32(instr);
24123                               }
24124                               break;
24125                             }
24126                             case 0x00010080: {
24127                               // 0xeeb50bc0
24128                               unsigned rd = ExtractDRegister(instr, 22, 12);
24129                               // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
24130                               vcmpe(CurrentCond(), F64, DRegister(rd), 0.0);
24131                               if (((instr & 0xffbf0fff) != 0xeeb50bc0)) {
24132                                 UnpredictableT32(instr);
24133                               }
24134                               break;
24135                             }
24136                           }
24137                           break;
24138                         }
24139                         case 0x00060000: {
24140                           // 0xeeb60b40
24141                           switch (instr & 0x00010080) {
24142                             case 0x00000000: {
24143                               // 0xeeb60b40
24144                               unsigned rd = ExtractDRegister(instr, 22, 12);
24145                               unsigned rm = ExtractDRegister(instr, 5, 0);
24146                               // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24147                               vrintr(CurrentCond(),
24148                                      F64,
24149                                      DRegister(rd),
24150                                      DRegister(rm));
24151                               break;
24152                             }
24153                             case 0x00000080: {
24154                               // 0xeeb60bc0
24155                               unsigned rd = ExtractDRegister(instr, 22, 12);
24156                               unsigned rm = ExtractDRegister(instr, 5, 0);
24157                               // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24158                               vrintz(CurrentCond(),
24159                                      F64,
24160                                      DRegister(rd),
24161                                      DRegister(rm));
24162                               break;
24163                             }
24164                             case 0x00010000: {
24165                               // 0xeeb70b40
24166                               unsigned rd = ExtractDRegister(instr, 22, 12);
24167                               unsigned rm = ExtractDRegister(instr, 5, 0);
24168                               // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24169                               vrintx(CurrentCond(),
24170                                      F64,
24171                                      DRegister(rd),
24172                                      DRegister(rm));
24173                               break;
24174                             }
24175                             case 0x00010080: {
24176                               // 0xeeb70bc0
24177                               unsigned rd = ExtractSRegister(instr, 22, 12);
24178                               unsigned rm = ExtractDRegister(instr, 5, 0);
24179                               // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1
24180                               vcvt(CurrentCond(),
24181                                    F32,
24182                                    F64,
24183                                    SRegister(rd),
24184                                    DRegister(rm));
24185                               break;
24186                             }
24187                           }
24188                           break;
24189                         }
24190                         case 0x00080000: {
24191                           // 0xeeb80b40
24192                           if ((instr & 0x00010000) == 0x00000000) {
24193                             DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24194                             if (dt.Is(kDataTypeValueInvalid)) {
24195                               UnallocatedT32(instr);
24196                               return;
24197                             }
24198                             unsigned rd = ExtractDRegister(instr, 22, 12);
24199                             unsigned rm = ExtractSRegister(instr, 5, 0);
24200                             // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1
24201                             vcvt(CurrentCond(),
24202                                  F64,
24203                                  dt,
24204                                  DRegister(rd),
24205                                  SRegister(rm));
24206                           } else {
24207                             UnallocatedT32(instr);
24208                           }
24209                           break;
24210                         }
24211                         case 0x000a0000: {
24212                           // 0xeeba0b40
24213                           DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24214                                                          ((instr >> 15) & 0x2));
24215                           if (dt.Is(kDataTypeValueInvalid)) {
24216                             UnallocatedT32(instr);
24217                             return;
24218                           }
24219                           unsigned rd = ExtractDRegister(instr, 22, 12);
24220                           unsigned offset = 32;
24221                           if (dt.Is(S16) || dt.Is(U16)) {
24222                             offset = 16;
24223                           }
24224                           uint32_t fbits = offset - (((instr >> 5) & 0x1) |
24225                                                      ((instr << 1) & 0x1e));
24226                           // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1
24227                           vcvt(CurrentCond(),
24228                                F64,
24229                                dt,
24230                                DRegister(rd),
24231                                DRegister(rd),
24232                                fbits);
24233                           break;
24234                         }
24235                         case 0x000c0000: {
24236                           // 0xeebc0b40
24237                           switch (instr & 0x00010080) {
24238                             case 0x00000000: {
24239                               // 0xeebc0b40
24240                               unsigned rd = ExtractSRegister(instr, 22, 12);
24241                               unsigned rm = ExtractDRegister(instr, 5, 0);
24242                               // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
24243                               vcvtr(CurrentCond(),
24244                                     U32,
24245                                     F64,
24246                                     SRegister(rd),
24247                                     DRegister(rm));
24248                               break;
24249                             }
24250                             case 0x00000080: {
24251                               // 0xeebc0bc0
24252                               unsigned rd = ExtractSRegister(instr, 22, 12);
24253                               unsigned rm = ExtractDRegister(instr, 5, 0);
24254                               // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
24255                               vcvt(CurrentCond(),
24256                                    U32,
24257                                    F64,
24258                                    SRegister(rd),
24259                                    DRegister(rm));
24260                               break;
24261                             }
24262                             case 0x00010000: {
24263                               // 0xeebd0b40
24264                               unsigned rd = ExtractSRegister(instr, 22, 12);
24265                               unsigned rm = ExtractDRegister(instr, 5, 0);
24266                               // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
24267                               vcvtr(CurrentCond(),
24268                                     S32,
24269                                     F64,
24270                                     SRegister(rd),
24271                                     DRegister(rm));
24272                               break;
24273                             }
24274                             case 0x00010080: {
24275                               // 0xeebd0bc0
24276                               unsigned rd = ExtractSRegister(instr, 22, 12);
24277                               unsigned rm = ExtractDRegister(instr, 5, 0);
24278                               // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
24279                               vcvt(CurrentCond(),
24280                                    S32,
24281                                    F64,
24282                                    SRegister(rd),
24283                                    DRegister(rm));
24284                               break;
24285                             }
24286                           }
24287                           break;
24288                         }
24289                         case 0x000e0000: {
24290                           // 0xeebe0b40
24291                           DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24292                                                          ((instr >> 15) & 0x2));
24293                           if (dt.Is(kDataTypeValueInvalid)) {
24294                             UnallocatedT32(instr);
24295                             return;
24296                           }
24297                           unsigned rd = ExtractDRegister(instr, 22, 12);
24298                           unsigned offset = 32;
24299                           if (dt.Is(S16) || dt.Is(U16)) {
24300                             offset = 16;
24301                           }
24302                           uint32_t fbits = offset - (((instr >> 5) & 0x1) |
24303                                                      ((instr << 1) & 0x1e));
24304                           // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1
24305                           vcvt(CurrentCond(),
24306                                dt,
24307                                F64,
24308                                DRegister(rd),
24309                                DRegister(rd),
24310                                fbits);
24311                           break;
24312                         }
24313                       }
24314                       break;
24315                     }
24316                     case 0x10000a00: {
24317                       // 0xfe000a00
24318                       unsigned rd = ExtractSRegister(instr, 22, 12);
24319                       unsigned rn = ExtractSRegister(instr, 7, 16);
24320                       unsigned rm = ExtractSRegister(instr, 5, 0);
24321                       // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1
24322                       vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24323                       if (InITBlock()) {
24324                         UnpredictableT32(instr);
24325                       }
24326                       break;
24327                     }
24328                     case 0x10000b00: {
24329                       // 0xfe000b00
24330                       unsigned rd = ExtractDRegister(instr, 22, 12);
24331                       unsigned rn = ExtractDRegister(instr, 7, 16);
24332                       unsigned rm = ExtractDRegister(instr, 5, 0);
24333                       // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1
24334                       vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24335                       if (InITBlock()) {
24336                         UnpredictableT32(instr);
24337                       }
24338                       break;
24339                     }
24340                     case 0x10100a00: {
24341                       // 0xfe100a00
24342                       unsigned rd = ExtractSRegister(instr, 22, 12);
24343                       unsigned rn = ExtractSRegister(instr, 7, 16);
24344                       unsigned rm = ExtractSRegister(instr, 5, 0);
24345                       // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1
24346                       vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24347                       if (InITBlock()) {
24348                         UnpredictableT32(instr);
24349                       }
24350                       break;
24351                     }
24352                     case 0x10100b00: {
24353                       // 0xfe100b00
24354                       unsigned rd = ExtractDRegister(instr, 22, 12);
24355                       unsigned rn = ExtractDRegister(instr, 7, 16);
24356                       unsigned rm = ExtractDRegister(instr, 5, 0);
24357                       // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1
24358                       vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24359                       if (InITBlock()) {
24360                         UnpredictableT32(instr);
24361                       }
24362                       break;
24363                     }
24364                     case 0x10200a00: {
24365                       // 0xfe200a00
24366                       unsigned rd = ExtractSRegister(instr, 22, 12);
24367                       unsigned rn = ExtractSRegister(instr, 7, 16);
24368                       unsigned rm = ExtractSRegister(instr, 5, 0);
24369                       // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1
24370                       vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24371                       if (InITBlock()) {
24372                         UnpredictableT32(instr);
24373                       }
24374                       break;
24375                     }
24376                     case 0x10200b00: {
24377                       // 0xfe200b00
24378                       unsigned rd = ExtractDRegister(instr, 22, 12);
24379                       unsigned rn = ExtractDRegister(instr, 7, 16);
24380                       unsigned rm = ExtractDRegister(instr, 5, 0);
24381                       // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1
24382                       vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24383                       if (InITBlock()) {
24384                         UnpredictableT32(instr);
24385                       }
24386                       break;
24387                     }
24388                     case 0x10300a00: {
24389                       // 0xfe300a00
24390                       unsigned rd = ExtractSRegister(instr, 22, 12);
24391                       unsigned rn = ExtractSRegister(instr, 7, 16);
24392                       unsigned rm = ExtractSRegister(instr, 5, 0);
24393                       // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1
24394                       vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24395                       if (InITBlock()) {
24396                         UnpredictableT32(instr);
24397                       }
24398                       break;
24399                     }
24400                     case 0x10300b00: {
24401                       // 0xfe300b00
24402                       unsigned rd = ExtractDRegister(instr, 22, 12);
24403                       unsigned rn = ExtractDRegister(instr, 7, 16);
24404                       unsigned rm = ExtractDRegister(instr, 5, 0);
24405                       // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1
24406                       vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24407                       if (InITBlock()) {
24408                         UnpredictableT32(instr);
24409                       }
24410                       break;
24411                     }
24412                     case 0x10800a00: {
24413                       // 0xfe800a00
24414                       unsigned rd = ExtractSRegister(instr, 22, 12);
24415                       unsigned rn = ExtractSRegister(instr, 7, 16);
24416                       unsigned rm = ExtractSRegister(instr, 5, 0);
24417                       // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
24418                       vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24419                       if (InITBlock()) {
24420                         UnpredictableT32(instr);
24421                       }
24422                       break;
24423                     }
24424                     case 0x10800a40: {
24425                       // 0xfe800a40
24426                       unsigned rd = ExtractSRegister(instr, 22, 12);
24427                       unsigned rn = ExtractSRegister(instr, 7, 16);
24428                       unsigned rm = ExtractSRegister(instr, 5, 0);
24429                       // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
24430                       vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24431                       if (InITBlock()) {
24432                         UnpredictableT32(instr);
24433                       }
24434                       break;
24435                     }
24436                     case 0x10800b00: {
24437                       // 0xfe800b00
24438                       unsigned rd = ExtractDRegister(instr, 22, 12);
24439                       unsigned rn = ExtractDRegister(instr, 7, 16);
24440                       unsigned rm = ExtractDRegister(instr, 5, 0);
24441                       // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
24442                       vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24443                       if (InITBlock()) {
24444                         UnpredictableT32(instr);
24445                       }
24446                       break;
24447                     }
24448                     case 0x10800b40: {
24449                       // 0xfe800b40
24450                       unsigned rd = ExtractDRegister(instr, 22, 12);
24451                       unsigned rn = ExtractDRegister(instr, 7, 16);
24452                       unsigned rm = ExtractDRegister(instr, 5, 0);
24453                       // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
24454                       vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24455                       if (InITBlock()) {
24456                         UnpredictableT32(instr);
24457                       }
24458                       break;
24459                     }
24460                     case 0x10b00a40: {
24461                       // 0xfeb00a40
24462                       switch (instr & 0x000f0000) {
24463                         case 0x00080000: {
24464                           // 0xfeb80a40
24465                           if ((instr & 0x00000080) == 0x00000000) {
24466                             unsigned rd = ExtractSRegister(instr, 22, 12);
24467                             unsigned rm = ExtractSRegister(instr, 5, 0);
24468                             // VRINTA{<q>}.F32 <Sd>, <Sm> ; T1
24469                             vrinta(F32, SRegister(rd), SRegister(rm));
24470                           } else {
24471                             UnallocatedT32(instr);
24472                           }
24473                           break;
24474                         }
24475                         case 0x00090000: {
24476                           // 0xfeb90a40
24477                           if ((instr & 0x00000080) == 0x00000000) {
24478                             unsigned rd = ExtractSRegister(instr, 22, 12);
24479                             unsigned rm = ExtractSRegister(instr, 5, 0);
24480                             // VRINTN{<q>}.F32 <Sd>, <Sm> ; T1
24481                             vrintn(F32, SRegister(rd), SRegister(rm));
24482                           } else {
24483                             UnallocatedT32(instr);
24484                           }
24485                           break;
24486                         }
24487                         case 0x000a0000: {
24488                           // 0xfeba0a40
24489                           if ((instr & 0x00000080) == 0x00000000) {
24490                             unsigned rd = ExtractSRegister(instr, 22, 12);
24491                             unsigned rm = ExtractSRegister(instr, 5, 0);
24492                             // VRINTP{<q>}.F32 <Sd>, <Sm> ; T1
24493                             vrintp(F32, SRegister(rd), SRegister(rm));
24494                           } else {
24495                             UnallocatedT32(instr);
24496                           }
24497                           break;
24498                         }
24499                         case 0x000b0000: {
24500                           // 0xfebb0a40
24501                           if ((instr & 0x00000080) == 0x00000000) {
24502                             unsigned rd = ExtractSRegister(instr, 22, 12);
24503                             unsigned rm = ExtractSRegister(instr, 5, 0);
24504                             // VRINTM{<q>}.F32 <Sd>, <Sm> ; T1
24505                             vrintm(F32, SRegister(rd), SRegister(rm));
24506                           } else {
24507                             UnallocatedT32(instr);
24508                           }
24509                           break;
24510                         }
24511                         case 0x000c0000: {
24512                           // 0xfebc0a40
24513                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24514                           if (dt.Is(kDataTypeValueInvalid)) {
24515                             UnallocatedT32(instr);
24516                             return;
24517                           }
24518                           unsigned rd = ExtractSRegister(instr, 22, 12);
24519                           unsigned rm = ExtractSRegister(instr, 5, 0);
24520                           // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24521                           vcvta(dt, F32, SRegister(rd), SRegister(rm));
24522                           break;
24523                         }
24524                         case 0x000d0000: {
24525                           // 0xfebd0a40
24526                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24527                           if (dt.Is(kDataTypeValueInvalid)) {
24528                             UnallocatedT32(instr);
24529                             return;
24530                           }
24531                           unsigned rd = ExtractSRegister(instr, 22, 12);
24532                           unsigned rm = ExtractSRegister(instr, 5, 0);
24533                           // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24534                           vcvtn(dt, F32, SRegister(rd), SRegister(rm));
24535                           break;
24536                         }
24537                         case 0x000e0000: {
24538                           // 0xfebe0a40
24539                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24540                           if (dt.Is(kDataTypeValueInvalid)) {
24541                             UnallocatedT32(instr);
24542                             return;
24543                           }
24544                           unsigned rd = ExtractSRegister(instr, 22, 12);
24545                           unsigned rm = ExtractSRegister(instr, 5, 0);
24546                           // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24547                           vcvtp(dt, F32, SRegister(rd), SRegister(rm));
24548                           break;
24549                         }
24550                         case 0x000f0000: {
24551                           // 0xfebf0a40
24552                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24553                           if (dt.Is(kDataTypeValueInvalid)) {
24554                             UnallocatedT32(instr);
24555                             return;
24556                           }
24557                           unsigned rd = ExtractSRegister(instr, 22, 12);
24558                           unsigned rm = ExtractSRegister(instr, 5, 0);
24559                           // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24560                           vcvtm(dt, F32, SRegister(rd), SRegister(rm));
24561                           break;
24562                         }
24563                         default:
24564                           UnallocatedT32(instr);
24565                           break;
24566                       }
24567                       break;
24568                     }
24569                     case 0x10b00b40: {
24570                       // 0xfeb00b40
24571                       switch (instr & 0x000f0000) {
24572                         case 0x00080000: {
24573                           // 0xfeb80b40
24574                           if ((instr & 0x00000080) == 0x00000000) {
24575                             unsigned rd = ExtractDRegister(instr, 22, 12);
24576                             unsigned rm = ExtractDRegister(instr, 5, 0);
24577                             // VRINTA{<q>}.F64 <Dd>, <Dm> ; T1
24578                             vrinta(F64, DRegister(rd), DRegister(rm));
24579                           } else {
24580                             UnallocatedT32(instr);
24581                           }
24582                           break;
24583                         }
24584                         case 0x00090000: {
24585                           // 0xfeb90b40
24586                           if ((instr & 0x00000080) == 0x00000000) {
24587                             unsigned rd = ExtractDRegister(instr, 22, 12);
24588                             unsigned rm = ExtractDRegister(instr, 5, 0);
24589                             // VRINTN{<q>}.F64 <Dd>, <Dm> ; T1
24590                             vrintn(F64, DRegister(rd), DRegister(rm));
24591                           } else {
24592                             UnallocatedT32(instr);
24593                           }
24594                           break;
24595                         }
24596                         case 0x000a0000: {
24597                           // 0xfeba0b40
24598                           if ((instr & 0x00000080) == 0x00000000) {
24599                             unsigned rd = ExtractDRegister(instr, 22, 12);
24600                             unsigned rm = ExtractDRegister(instr, 5, 0);
24601                             // VRINTP{<q>}.F64 <Dd>, <Dm> ; T1
24602                             vrintp(F64, DRegister(rd), DRegister(rm));
24603                           } else {
24604                             UnallocatedT32(instr);
24605                           }
24606                           break;
24607                         }
24608                         case 0x000b0000: {
24609                           // 0xfebb0b40
24610                           if ((instr & 0x00000080) == 0x00000000) {
24611                             unsigned rd = ExtractDRegister(instr, 22, 12);
24612                             unsigned rm = ExtractDRegister(instr, 5, 0);
24613                             // VRINTM{<q>}.F64 <Dd>, <Dm> ; T1
24614                             vrintm(F64, DRegister(rd), DRegister(rm));
24615                           } else {
24616                             UnallocatedT32(instr);
24617                           }
24618                           break;
24619                         }
24620                         case 0x000c0000: {
24621                           // 0xfebc0b40
24622                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24623                           if (dt.Is(kDataTypeValueInvalid)) {
24624                             UnallocatedT32(instr);
24625                             return;
24626                           }
24627                           unsigned rd = ExtractSRegister(instr, 22, 12);
24628                           unsigned rm = ExtractDRegister(instr, 5, 0);
24629                           // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24630                           vcvta(dt, F64, SRegister(rd), DRegister(rm));
24631                           break;
24632                         }
24633                         case 0x000d0000: {
24634                           // 0xfebd0b40
24635                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24636                           if (dt.Is(kDataTypeValueInvalid)) {
24637                             UnallocatedT32(instr);
24638                             return;
24639                           }
24640                           unsigned rd = ExtractSRegister(instr, 22, 12);
24641                           unsigned rm = ExtractDRegister(instr, 5, 0);
24642                           // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24643                           vcvtn(dt, F64, SRegister(rd), DRegister(rm));
24644                           break;
24645                         }
24646                         case 0x000e0000: {
24647                           // 0xfebe0b40
24648                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24649                           if (dt.Is(kDataTypeValueInvalid)) {
24650                             UnallocatedT32(instr);
24651                             return;
24652                           }
24653                           unsigned rd = ExtractSRegister(instr, 22, 12);
24654                           unsigned rm = ExtractDRegister(instr, 5, 0);
24655                           // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24656                           vcvtp(dt, F64, SRegister(rd), DRegister(rm));
24657                           break;
24658                         }
24659                         case 0x000f0000: {
24660                           // 0xfebf0b40
24661                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24662                           if (dt.Is(kDataTypeValueInvalid)) {
24663                             UnallocatedT32(instr);
24664                             return;
24665                           }
24666                           unsigned rd = ExtractSRegister(instr, 22, 12);
24667                           unsigned rm = ExtractDRegister(instr, 5, 0);
24668                           // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24669                           vcvtm(dt, F64, SRegister(rd), DRegister(rm));
24670                           break;
24671                         }
24672                         default:
24673                           UnallocatedT32(instr);
24674                           break;
24675                       }
24676                       break;
24677                     }
24678                     default:
24679                       UnallocatedT32(instr);
24680                       break;
24681                   }
24682                   break;
24683                 }
24684                 case 0x00000010: {
24685                   // 0xee000010
24686                   switch (instr & 0x10100e00) {
24687                     case 0x00000a00: {
24688                       // 0xee000a10
24689                       switch (instr & 0x00800100) {
24690                         case 0x00000000: {
24691                           // 0xee000a10
24692                           if ((instr & 0x00600000) == 0x00000000) {
24693                             unsigned rn = ExtractSRegister(instr, 7, 16);
24694                             unsigned rt = (instr >> 12) & 0xf;
24695                             // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1
24696                             vmov(CurrentCond(), SRegister(rn), Register(rt));
24697                             if (((instr & 0xfff00f7f) != 0xee000a10)) {
24698                               UnpredictableT32(instr);
24699                             }
24700                           } else {
24701                             UnallocatedT32(instr);
24702                           }
24703                           break;
24704                         }
24705                         case 0x00000100: {
24706                           // 0xee000b10
24707                           unsigned lane;
24708                           DataType dt =
24709                               Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
24710                                                         ((instr >> 19) & 0xc),
24711                                                     &lane);
24712                           if (dt.Is(kDataTypeValueInvalid)) {
24713                             UnallocatedT32(instr);
24714                             return;
24715                           }
24716                           unsigned rd = ExtractDRegister(instr, 7, 16);
24717                           unsigned rt = (instr >> 12) & 0xf;
24718                           // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1
24719                           vmov(CurrentCond(),
24720                                dt,
24721                                DRegisterLane(rd, lane),
24722                                Register(rt));
24723                           if (((instr & 0xff900f1f) != 0xee000b10)) {
24724                             UnpredictableT32(instr);
24725                           }
24726                           break;
24727                         }
24728                         case 0x00800000: {
24729                           // 0xee800a10
24730                           if ((instr & 0x00600000) == 0x00600000) {
24731                             unsigned spec_reg = (instr >> 16) & 0xf;
24732                             unsigned rt = (instr >> 12) & 0xf;
24733                             switch (spec_reg) {
24734                               case 0x0:
24735                               case 0x1:
24736                               case 0x8: {
24737                                 // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1
24738                                 vmsr(CurrentCond(),
24739                                      SpecialFPRegister(spec_reg),
24740                                      Register(rt));
24741                                 if (((instr & 0xfff00fff) != 0xeee00a10)) {
24742                                   UnpredictableT32(instr);
24743                                 }
24744                                 break;
24745                               }
24746                               default:
24747                                 UnallocatedT32(instr);
24748                                 break;
24749                             }
24750                           } else {
24751                             UnallocatedT32(instr);
24752                           }
24753                           break;
24754                         }
24755                         case 0x00800100: {
24756                           // 0xee800b10
24757                           switch (instr & 0x00200040) {
24758                             case 0x00000000: {
24759                               // 0xee800b10
24760                               DataType dt = Dt_B_E_1_Decode(
24761                                   ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2));
24762                               if (dt.Is(kDataTypeValueInvalid)) {
24763                                 UnallocatedT32(instr);
24764                                 return;
24765                               }
24766                               unsigned rd = ExtractDRegister(instr, 7, 16);
24767                               unsigned rt = (instr >> 12) & 0xf;
24768                               // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1
24769                               vdup(CurrentCond(),
24770                                    dt,
24771                                    DRegister(rd),
24772                                    Register(rt));
24773                               if (((instr & 0xffb00f5f) != 0xee800b10)) {
24774                                 UnpredictableT32(instr);
24775                               }
24776                               break;
24777                             }
24778                             case 0x00200000: {
24779                               // 0xeea00b10
24780                               DataType dt = Dt_B_E_1_Decode(
24781                                   ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2));
24782                               if (dt.Is(kDataTypeValueInvalid)) {
24783                                 UnallocatedT32(instr);
24784                                 return;
24785                               }
24786                               if (((instr >> 16) & 1) != 0) {
24787                                 UnallocatedT32(instr);
24788                                 return;
24789                               }
24790                               unsigned rd = ExtractQRegister(instr, 7, 16);
24791                               unsigned rt = (instr >> 12) & 0xf;
24792                               // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1
24793                               vdup(CurrentCond(),
24794                                    dt,
24795                                    QRegister(rd),
24796                                    Register(rt));
24797                               if (((instr & 0xffb00f5f) != 0xeea00b10)) {
24798                                 UnpredictableT32(instr);
24799                               }
24800                               break;
24801                             }
24802                             default:
24803                               UnallocatedT32(instr);
24804                               break;
24805                           }
24806                           break;
24807                         }
24808                       }
24809                       break;
24810                     }
24811                     case 0x00000e00: {
24812                       // 0xee000e10
24813                       UnimplementedT32_32("MCR", instr);
24814                       break;
24815                     }
24816                     case 0x00100a00: {
24817                       // 0xee100a10
24818                       switch (instr & 0x00000100) {
24819                         case 0x00000000: {
24820                           // 0xee100a10
24821                           switch (instr & 0x00e00000) {
24822                             case 0x00000000: {
24823                               // 0xee100a10
24824                               unsigned rt = (instr >> 12) & 0xf;
24825                               unsigned rn = ExtractSRegister(instr, 7, 16);
24826                               // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1
24827                               vmov(CurrentCond(), Register(rt), SRegister(rn));
24828                               if (((instr & 0xfff00f7f) != 0xee100a10)) {
24829                                 UnpredictableT32(instr);
24830                               }
24831                               break;
24832                             }
24833                             case 0x00e00000: {
24834                               // 0xeef00a10
24835                               unsigned rt = (instr >> 12) & 0xf;
24836                               unsigned spec_reg = (instr >> 16) & 0xf;
24837                               switch (spec_reg) {
24838                                 case 0x0:
24839                                 case 0x1:
24840                                 case 0x5:
24841                                 case 0x6:
24842                                 case 0x7:
24843                                 case 0x8: {
24844                                   // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1
24845                                   vmrs(CurrentCond(),
24846                                        RegisterOrAPSR_nzcv(rt),
24847                                        SpecialFPRegister(spec_reg));
24848                                   if (((instr & 0xfff00fff) != 0xeef00a10)) {
24849                                     UnpredictableT32(instr);
24850                                   }
24851                                   break;
24852                                 }
24853                                 default:
24854                                   UnallocatedT32(instr);
24855                                   break;
24856                               }
24857                               break;
24858                             }
24859                             default:
24860                               UnallocatedT32(instr);
24861                               break;
24862                           }
24863                           break;
24864                         }
24865                         case 0x00000100: {
24866                           // 0xee100b10
24867                           unsigned lane;
24868                           DataType dt =
24869                               Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
24870                                                           ((instr >> 19) &
24871                                                            0xc) |
24872                                                           ((instr >> 19) &
24873                                                            0x10),
24874                                                       &lane);
24875                           if (dt.Is(kDataTypeValueInvalid)) {
24876                             UnallocatedT32(instr);
24877                             return;
24878                           }
24879                           unsigned rt = (instr >> 12) & 0xf;
24880                           unsigned rn = ExtractDRegister(instr, 7, 16);
24881                           // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1
24882                           vmov(CurrentCond(),
24883                                dt,
24884                                Register(rt),
24885                                DRegisterLane(rn, lane));
24886                           if (((instr & 0xff100f1f) != 0xee100b10)) {
24887                             UnpredictableT32(instr);
24888                           }
24889                           break;
24890                         }
24891                       }
24892                       break;
24893                     }
24894                     case 0x00100e00: {
24895                       // 0xee100e10
24896                       UnimplementedT32_32("MRC", instr);
24897                       break;
24898                     }
24899                     default:
24900                       UnallocatedT32(instr);
24901                       break;
24902                   }
24903                   break;
24904                 }
24905                 case 0x01000000: {
24906                   // 0xef000000
24907                   switch (instr & 0x00800000) {
24908                     case 0x00000000: {
24909                       // 0xef000000
24910                       switch (instr & 0x00000f40) {
24911                         case 0x00000000: {
24912                           // 0xef000000
24913                           DataType dt = Dt_U_size_1_Decode(
24914                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
24915                           if (dt.Is(kDataTypeValueInvalid)) {
24916                             UnallocatedT32(instr);
24917                             return;
24918                           }
24919                           unsigned rd = ExtractDRegister(instr, 22, 12);
24920                           unsigned rn = ExtractDRegister(instr, 7, 16);
24921                           unsigned rm = ExtractDRegister(instr, 5, 0);
24922                           // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
24923                           vhadd(CurrentCond(),
24924                                 dt,
24925                                 DRegister(rd),
24926                                 DRegister(rn),
24927                                 DRegister(rm));
24928                           break;
24929                         }
24930                         case 0x00000040: {
24931                           // 0xef000040
24932                           DataType dt = Dt_U_size_1_Decode(
24933                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
24934                           if (dt.Is(kDataTypeValueInvalid)) {
24935                             UnallocatedT32(instr);
24936                             return;
24937                           }
24938                           if (((instr >> 12) & 1) != 0) {
24939                             UnallocatedT32(instr);
24940                             return;
24941                           }
24942                           unsigned rd = ExtractQRegister(instr, 22, 12);
24943                           if (((instr >> 16) & 1) != 0) {
24944                             UnallocatedT32(instr);
24945                             return;
24946                           }
24947                           unsigned rn = ExtractQRegister(instr, 7, 16);
24948                           if ((instr & 1) != 0) {
24949                             UnallocatedT32(instr);
24950                             return;
24951                           }
24952                           unsigned rm = ExtractQRegister(instr, 5, 0);
24953                           // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
24954                           vhadd(CurrentCond(),
24955                                 dt,
24956                                 QRegister(rd),
24957                                 QRegister(rn),
24958                                 QRegister(rm));
24959                           break;
24960                         }
24961                         case 0x00000100: {
24962                           // 0xef000100
24963                           DataType dt = Dt_U_size_1_Decode(
24964                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
24965                           if (dt.Is(kDataTypeValueInvalid)) {
24966                             UnallocatedT32(instr);
24967                             return;
24968                           }
24969                           unsigned rd = ExtractDRegister(instr, 22, 12);
24970                           unsigned rn = ExtractDRegister(instr, 7, 16);
24971                           unsigned rm = ExtractDRegister(instr, 5, 0);
24972                           // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
24973                           vrhadd(CurrentCond(),
24974                                  dt,
24975                                  DRegister(rd),
24976                                  DRegister(rn),
24977                                  DRegister(rm));
24978                           break;
24979                         }
24980                         case 0x00000140: {
24981                           // 0xef000140
24982                           DataType dt = Dt_U_size_1_Decode(
24983                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
24984                           if (dt.Is(kDataTypeValueInvalid)) {
24985                             UnallocatedT32(instr);
24986                             return;
24987                           }
24988                           if (((instr >> 12) & 1) != 0) {
24989                             UnallocatedT32(instr);
24990                             return;
24991                           }
24992                           unsigned rd = ExtractQRegister(instr, 22, 12);
24993                           if (((instr >> 16) & 1) != 0) {
24994                             UnallocatedT32(instr);
24995                             return;
24996                           }
24997                           unsigned rn = ExtractQRegister(instr, 7, 16);
24998                           if ((instr & 1) != 0) {
24999                             UnallocatedT32(instr);
25000                             return;
25001                           }
25002                           unsigned rm = ExtractQRegister(instr, 5, 0);
25003                           // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25004                           vrhadd(CurrentCond(),
25005                                  dt,
25006                                  QRegister(rd),
25007                                  QRegister(rn),
25008                                  QRegister(rm));
25009                           break;
25010                         }
25011                         case 0x00000200: {
25012                           // 0xef000200
25013                           DataType dt = Dt_U_size_1_Decode(
25014                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25015                           if (dt.Is(kDataTypeValueInvalid)) {
25016                             UnallocatedT32(instr);
25017                             return;
25018                           }
25019                           unsigned rd = ExtractDRegister(instr, 22, 12);
25020                           unsigned rn = ExtractDRegister(instr, 7, 16);
25021                           unsigned rm = ExtractDRegister(instr, 5, 0);
25022                           // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25023                           vhsub(CurrentCond(),
25024                                 dt,
25025                                 DRegister(rd),
25026                                 DRegister(rn),
25027                                 DRegister(rm));
25028                           break;
25029                         }
25030                         case 0x00000240: {
25031                           // 0xef000240
25032                           DataType dt = Dt_U_size_1_Decode(
25033                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25034                           if (dt.Is(kDataTypeValueInvalid)) {
25035                             UnallocatedT32(instr);
25036                             return;
25037                           }
25038                           if (((instr >> 12) & 1) != 0) {
25039                             UnallocatedT32(instr);
25040                             return;
25041                           }
25042                           unsigned rd = ExtractQRegister(instr, 22, 12);
25043                           if (((instr >> 16) & 1) != 0) {
25044                             UnallocatedT32(instr);
25045                             return;
25046                           }
25047                           unsigned rn = ExtractQRegister(instr, 7, 16);
25048                           if ((instr & 1) != 0) {
25049                             UnallocatedT32(instr);
25050                             return;
25051                           }
25052                           unsigned rm = ExtractQRegister(instr, 5, 0);
25053                           // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25054                           vhsub(CurrentCond(),
25055                                 dt,
25056                                 QRegister(rd),
25057                                 QRegister(rn),
25058                                 QRegister(rm));
25059                           break;
25060                         }
25061                         case 0x00000300: {
25062                           // 0xef000300
25063                           DataType dt = Dt_U_size_1_Decode(
25064                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25065                           if (dt.Is(kDataTypeValueInvalid)) {
25066                             UnallocatedT32(instr);
25067                             return;
25068                           }
25069                           unsigned rd = ExtractDRegister(instr, 22, 12);
25070                           unsigned rn = ExtractDRegister(instr, 7, 16);
25071                           unsigned rm = ExtractDRegister(instr, 5, 0);
25072                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25073                           vcgt(CurrentCond(),
25074                                dt,
25075                                DRegister(rd),
25076                                DRegister(rn),
25077                                DRegister(rm));
25078                           break;
25079                         }
25080                         case 0x00000340: {
25081                           // 0xef000340
25082                           DataType dt = Dt_U_size_1_Decode(
25083                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25084                           if (dt.Is(kDataTypeValueInvalid)) {
25085                             UnallocatedT32(instr);
25086                             return;
25087                           }
25088                           if (((instr >> 12) & 1) != 0) {
25089                             UnallocatedT32(instr);
25090                             return;
25091                           }
25092                           unsigned rd = ExtractQRegister(instr, 22, 12);
25093                           if (((instr >> 16) & 1) != 0) {
25094                             UnallocatedT32(instr);
25095                             return;
25096                           }
25097                           unsigned rn = ExtractQRegister(instr, 7, 16);
25098                           if ((instr & 1) != 0) {
25099                             UnallocatedT32(instr);
25100                             return;
25101                           }
25102                           unsigned rm = ExtractQRegister(instr, 5, 0);
25103                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25104                           vcgt(CurrentCond(),
25105                                dt,
25106                                QRegister(rd),
25107                                QRegister(rn),
25108                                QRegister(rm));
25109                           break;
25110                         }
25111                         case 0x00000400: {
25112                           // 0xef000400
25113                           DataType dt = Dt_U_size_3_Decode(
25114                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25115                           if (dt.Is(kDataTypeValueInvalid)) {
25116                             UnallocatedT32(instr);
25117                             return;
25118                           }
25119                           unsigned rd = ExtractDRegister(instr, 22, 12);
25120                           unsigned rm = ExtractDRegister(instr, 5, 0);
25121                           unsigned rn = ExtractDRegister(instr, 7, 16);
25122                           // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
25123                           vshl(CurrentCond(),
25124                                dt,
25125                                DRegister(rd),
25126                                DRegister(rm),
25127                                DRegister(rn));
25128                           break;
25129                         }
25130                         case 0x00000440: {
25131                           // 0xef000440
25132                           DataType dt = Dt_U_size_3_Decode(
25133                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25134                           if (dt.Is(kDataTypeValueInvalid)) {
25135                             UnallocatedT32(instr);
25136                             return;
25137                           }
25138                           if (((instr >> 12) & 1) != 0) {
25139                             UnallocatedT32(instr);
25140                             return;
25141                           }
25142                           unsigned rd = ExtractQRegister(instr, 22, 12);
25143                           if ((instr & 1) != 0) {
25144                             UnallocatedT32(instr);
25145                             return;
25146                           }
25147                           unsigned rm = ExtractQRegister(instr, 5, 0);
25148                           if (((instr >> 16) & 1) != 0) {
25149                             UnallocatedT32(instr);
25150                             return;
25151                           }
25152                           unsigned rn = ExtractQRegister(instr, 7, 16);
25153                           // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
25154                           vshl(CurrentCond(),
25155                                dt,
25156                                QRegister(rd),
25157                                QRegister(rm),
25158                                QRegister(rn));
25159                           break;
25160                         }
25161                         case 0x00000500: {
25162                           // 0xef000500
25163                           DataType dt = Dt_U_size_3_Decode(
25164                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25165                           if (dt.Is(kDataTypeValueInvalid)) {
25166                             UnallocatedT32(instr);
25167                             return;
25168                           }
25169                           unsigned rd = ExtractDRegister(instr, 22, 12);
25170                           unsigned rm = ExtractDRegister(instr, 5, 0);
25171                           unsigned rn = ExtractDRegister(instr, 7, 16);
25172                           // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
25173                           vrshl(CurrentCond(),
25174                                 dt,
25175                                 DRegister(rd),
25176                                 DRegister(rm),
25177                                 DRegister(rn));
25178                           break;
25179                         }
25180                         case 0x00000540: {
25181                           // 0xef000540
25182                           DataType dt = Dt_U_size_3_Decode(
25183                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25184                           if (dt.Is(kDataTypeValueInvalid)) {
25185                             UnallocatedT32(instr);
25186                             return;
25187                           }
25188                           if (((instr >> 12) & 1) != 0) {
25189                             UnallocatedT32(instr);
25190                             return;
25191                           }
25192                           unsigned rd = ExtractQRegister(instr, 22, 12);
25193                           if ((instr & 1) != 0) {
25194                             UnallocatedT32(instr);
25195                             return;
25196                           }
25197                           unsigned rm = ExtractQRegister(instr, 5, 0);
25198                           if (((instr >> 16) & 1) != 0) {
25199                             UnallocatedT32(instr);
25200                             return;
25201                           }
25202                           unsigned rn = ExtractQRegister(instr, 7, 16);
25203                           // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
25204                           vrshl(CurrentCond(),
25205                                 dt,
25206                                 QRegister(rd),
25207                                 QRegister(rm),
25208                                 QRegister(rn));
25209                           break;
25210                         }
25211                         case 0x00000600: {
25212                           // 0xef000600
25213                           DataType dt = Dt_U_size_1_Decode(
25214                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25215                           if (dt.Is(kDataTypeValueInvalid)) {
25216                             UnallocatedT32(instr);
25217                             return;
25218                           }
25219                           unsigned rd = ExtractDRegister(instr, 22, 12);
25220                           unsigned rn = ExtractDRegister(instr, 7, 16);
25221                           unsigned rm = ExtractDRegister(instr, 5, 0);
25222                           // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25223                           vmax(CurrentCond(),
25224                                dt,
25225                                DRegister(rd),
25226                                DRegister(rn),
25227                                DRegister(rm));
25228                           break;
25229                         }
25230                         case 0x00000640: {
25231                           // 0xef000640
25232                           DataType dt = Dt_U_size_1_Decode(
25233                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25234                           if (dt.Is(kDataTypeValueInvalid)) {
25235                             UnallocatedT32(instr);
25236                             return;
25237                           }
25238                           if (((instr >> 12) & 1) != 0) {
25239                             UnallocatedT32(instr);
25240                             return;
25241                           }
25242                           unsigned rd = ExtractQRegister(instr, 22, 12);
25243                           if (((instr >> 16) & 1) != 0) {
25244                             UnallocatedT32(instr);
25245                             return;
25246                           }
25247                           unsigned rn = ExtractQRegister(instr, 7, 16);
25248                           if ((instr & 1) != 0) {
25249                             UnallocatedT32(instr);
25250                             return;
25251                           }
25252                           unsigned rm = ExtractQRegister(instr, 5, 0);
25253                           // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25254                           vmax(CurrentCond(),
25255                                dt,
25256                                QRegister(rd),
25257                                QRegister(rn),
25258                                QRegister(rm));
25259                           break;
25260                         }
25261                         case 0x00000700: {
25262                           // 0xef000700
25263                           DataType dt = Dt_U_size_1_Decode(
25264                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25265                           if (dt.Is(kDataTypeValueInvalid)) {
25266                             UnallocatedT32(instr);
25267                             return;
25268                           }
25269                           unsigned rd = ExtractDRegister(instr, 22, 12);
25270                           unsigned rn = ExtractDRegister(instr, 7, 16);
25271                           unsigned rm = ExtractDRegister(instr, 5, 0);
25272                           // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25273                           vabd(CurrentCond(),
25274                                dt,
25275                                DRegister(rd),
25276                                DRegister(rn),
25277                                DRegister(rm));
25278                           break;
25279                         }
25280                         case 0x00000740: {
25281                           // 0xef000740
25282                           DataType dt = Dt_U_size_1_Decode(
25283                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25284                           if (dt.Is(kDataTypeValueInvalid)) {
25285                             UnallocatedT32(instr);
25286                             return;
25287                           }
25288                           if (((instr >> 12) & 1) != 0) {
25289                             UnallocatedT32(instr);
25290                             return;
25291                           }
25292                           unsigned rd = ExtractQRegister(instr, 22, 12);
25293                           if (((instr >> 16) & 1) != 0) {
25294                             UnallocatedT32(instr);
25295                             return;
25296                           }
25297                           unsigned rn = ExtractQRegister(instr, 7, 16);
25298                           if ((instr & 1) != 0) {
25299                             UnallocatedT32(instr);
25300                             return;
25301                           }
25302                           unsigned rm = ExtractQRegister(instr, 5, 0);
25303                           // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25304                           vabd(CurrentCond(),
25305                                dt,
25306                                QRegister(rd),
25307                                QRegister(rn),
25308                                QRegister(rm));
25309                           break;
25310                         }
25311                         case 0x00000800: {
25312                           // 0xef000800
25313                           switch (instr & 0x10000000) {
25314                             case 0x00000000: {
25315                               // 0xef000800
25316                               DataType dt =
25317                                   Dt_size_2_Decode((instr >> 20) & 0x3);
25318                               if (dt.Is(kDataTypeValueInvalid)) {
25319                                 UnallocatedT32(instr);
25320                                 return;
25321                               }
25322                               unsigned rd = ExtractDRegister(instr, 22, 12);
25323                               unsigned rn = ExtractDRegister(instr, 7, 16);
25324                               unsigned rm = ExtractDRegister(instr, 5, 0);
25325                               // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25326                               vadd(CurrentCond(),
25327                                    dt,
25328                                    DRegister(rd),
25329                                    DRegister(rn),
25330                                    DRegister(rm));
25331                               break;
25332                             }
25333                             case 0x10000000: {
25334                               // 0xff000800
25335                               DataType dt =
25336                                   Dt_size_2_Decode((instr >> 20) & 0x3);
25337                               if (dt.Is(kDataTypeValueInvalid)) {
25338                                 UnallocatedT32(instr);
25339                                 return;
25340                               }
25341                               unsigned rd = ExtractDRegister(instr, 22, 12);
25342                               unsigned rn = ExtractDRegister(instr, 7, 16);
25343                               unsigned rm = ExtractDRegister(instr, 5, 0);
25344                               // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25345                               vsub(CurrentCond(),
25346                                    dt,
25347                                    DRegister(rd),
25348                                    DRegister(rn),
25349                                    DRegister(rm));
25350                               break;
25351                             }
25352                           }
25353                           break;
25354                         }
25355                         case 0x00000840: {
25356                           // 0xef000840
25357                           switch (instr & 0x10000000) {
25358                             case 0x00000000: {
25359                               // 0xef000840
25360                               DataType dt =
25361                                   Dt_size_2_Decode((instr >> 20) & 0x3);
25362                               if (dt.Is(kDataTypeValueInvalid)) {
25363                                 UnallocatedT32(instr);
25364                                 return;
25365                               }
25366                               if (((instr >> 12) & 1) != 0) {
25367                                 UnallocatedT32(instr);
25368                                 return;
25369                               }
25370                               unsigned rd = ExtractQRegister(instr, 22, 12);
25371                               if (((instr >> 16) & 1) != 0) {
25372                                 UnallocatedT32(instr);
25373                                 return;
25374                               }
25375                               unsigned rn = ExtractQRegister(instr, 7, 16);
25376                               if ((instr & 1) != 0) {
25377                                 UnallocatedT32(instr);
25378                                 return;
25379                               }
25380                               unsigned rm = ExtractQRegister(instr, 5, 0);
25381                               // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25382                               vadd(CurrentCond(),
25383                                    dt,
25384                                    QRegister(rd),
25385                                    QRegister(rn),
25386                                    QRegister(rm));
25387                               break;
25388                             }
25389                             case 0x10000000: {
25390                               // 0xff000840
25391                               DataType dt =
25392                                   Dt_size_2_Decode((instr >> 20) & 0x3);
25393                               if (dt.Is(kDataTypeValueInvalid)) {
25394                                 UnallocatedT32(instr);
25395                                 return;
25396                               }
25397                               if (((instr >> 12) & 1) != 0) {
25398                                 UnallocatedT32(instr);
25399                                 return;
25400                               }
25401                               unsigned rd = ExtractQRegister(instr, 22, 12);
25402                               if (((instr >> 16) & 1) != 0) {
25403                                 UnallocatedT32(instr);
25404                                 return;
25405                               }
25406                               unsigned rn = ExtractQRegister(instr, 7, 16);
25407                               if ((instr & 1) != 0) {
25408                                 UnallocatedT32(instr);
25409                                 return;
25410                               }
25411                               unsigned rm = ExtractQRegister(instr, 5, 0);
25412                               // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25413                               vsub(CurrentCond(),
25414                                    dt,
25415                                    QRegister(rd),
25416                                    QRegister(rn),
25417                                    QRegister(rm));
25418                               break;
25419                             }
25420                           }
25421                           break;
25422                         }
25423                         case 0x00000900: {
25424                           // 0xef000900
25425                           switch (instr & 0x10000000) {
25426                             case 0x00000000: {
25427                               // 0xef000900
25428                               DataType dt =
25429                                   Dt_size_10_Decode((instr >> 20) & 0x3);
25430                               if (dt.Is(kDataTypeValueInvalid)) {
25431                                 UnallocatedT32(instr);
25432                                 return;
25433                               }
25434                               unsigned rd = ExtractDRegister(instr, 22, 12);
25435                               unsigned rn = ExtractDRegister(instr, 7, 16);
25436                               unsigned rm = ExtractDRegister(instr, 5, 0);
25437                               // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
25438                               vmla(CurrentCond(),
25439                                    dt,
25440                                    DRegister(rd),
25441                                    DRegister(rn),
25442                                    DRegister(rm));
25443                               break;
25444                             }
25445                             case 0x10000000: {
25446                               // 0xff000900
25447                               DataType dt =
25448                                   Dt_size_10_Decode((instr >> 20) & 0x3);
25449                               if (dt.Is(kDataTypeValueInvalid)) {
25450                                 UnallocatedT32(instr);
25451                                 return;
25452                               }
25453                               unsigned rd = ExtractDRegister(instr, 22, 12);
25454                               unsigned rn = ExtractDRegister(instr, 7, 16);
25455                               unsigned rm = ExtractDRegister(instr, 5, 0);
25456                               // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
25457                               vmls(CurrentCond(),
25458                                    dt,
25459                                    DRegister(rd),
25460                                    DRegister(rn),
25461                                    DRegister(rm));
25462                               break;
25463                             }
25464                           }
25465                           break;
25466                         }
25467                         case 0x00000940: {
25468                           // 0xef000940
25469                           switch (instr & 0x10000000) {
25470                             case 0x00000000: {
25471                               // 0xef000940
25472                               DataType dt =
25473                                   Dt_size_10_Decode((instr >> 20) & 0x3);
25474                               if (dt.Is(kDataTypeValueInvalid)) {
25475                                 UnallocatedT32(instr);
25476                                 return;
25477                               }
25478                               if (((instr >> 12) & 1) != 0) {
25479                                 UnallocatedT32(instr);
25480                                 return;
25481                               }
25482                               unsigned rd = ExtractQRegister(instr, 22, 12);
25483                               if (((instr >> 16) & 1) != 0) {
25484                                 UnallocatedT32(instr);
25485                                 return;
25486                               }
25487                               unsigned rn = ExtractQRegister(instr, 7, 16);
25488                               if ((instr & 1) != 0) {
25489                                 UnallocatedT32(instr);
25490                                 return;
25491                               }
25492                               unsigned rm = ExtractQRegister(instr, 5, 0);
25493                               // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
25494                               vmla(CurrentCond(),
25495                                    dt,
25496                                    QRegister(rd),
25497                                    QRegister(rn),
25498                                    QRegister(rm));
25499                               break;
25500                             }
25501                             case 0x10000000: {
25502                               // 0xff000940
25503                               DataType dt =
25504                                   Dt_size_10_Decode((instr >> 20) & 0x3);
25505                               if (dt.Is(kDataTypeValueInvalid)) {
25506                                 UnallocatedT32(instr);
25507                                 return;
25508                               }
25509                               if (((instr >> 12) & 1) != 0) {
25510                                 UnallocatedT32(instr);
25511                                 return;
25512                               }
25513                               unsigned rd = ExtractQRegister(instr, 22, 12);
25514                               if (((instr >> 16) & 1) != 0) {
25515                                 UnallocatedT32(instr);
25516                                 return;
25517                               }
25518                               unsigned rn = ExtractQRegister(instr, 7, 16);
25519                               if ((instr & 1) != 0) {
25520                                 UnallocatedT32(instr);
25521                                 return;
25522                               }
25523                               unsigned rm = ExtractQRegister(instr, 5, 0);
25524                               // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
25525                               vmls(CurrentCond(),
25526                                    dt,
25527                                    QRegister(rd),
25528                                    QRegister(rn),
25529                                    QRegister(rm));
25530                               break;
25531                             }
25532                           }
25533                           break;
25534                         }
25535                         case 0x00000a00: {
25536                           // 0xef000a00
25537                           DataType dt = Dt_U_size_1_Decode(
25538                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25539                           if (dt.Is(kDataTypeValueInvalid)) {
25540                             UnallocatedT32(instr);
25541                             return;
25542                           }
25543                           unsigned rd = ExtractDRegister(instr, 22, 12);
25544                           unsigned rn = ExtractDRegister(instr, 7, 16);
25545                           unsigned rm = ExtractDRegister(instr, 5, 0);
25546                           // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25547                           vpmax(CurrentCond(),
25548                                 dt,
25549                                 DRegister(rd),
25550                                 DRegister(rn),
25551                                 DRegister(rm));
25552                           break;
25553                         }
25554                         case 0x00000b00: {
25555                           // 0xef000b00
25556                           switch (instr & 0x10000000) {
25557                             case 0x00000000: {
25558                               // 0xef000b00
25559                               DataType dt =
25560                                   Dt_size_13_Decode((instr >> 20) & 0x3);
25561                               if (dt.Is(kDataTypeValueInvalid)) {
25562                                 UnallocatedT32(instr);
25563                                 return;
25564                               }
25565                               unsigned rd = ExtractDRegister(instr, 22, 12);
25566                               unsigned rn = ExtractDRegister(instr, 7, 16);
25567                               unsigned rm = ExtractDRegister(instr, 5, 0);
25568                               // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25569                               vqdmulh(CurrentCond(),
25570                                       dt,
25571                                       DRegister(rd),
25572                                       DRegister(rn),
25573                                       DRegister(rm));
25574                               break;
25575                             }
25576                             case 0x10000000: {
25577                               // 0xff000b00
25578                               DataType dt =
25579                                   Dt_size_13_Decode((instr >> 20) & 0x3);
25580                               if (dt.Is(kDataTypeValueInvalid)) {
25581                                 UnallocatedT32(instr);
25582                                 return;
25583                               }
25584                               unsigned rd = ExtractDRegister(instr, 22, 12);
25585                               unsigned rn = ExtractDRegister(instr, 7, 16);
25586                               unsigned rm = ExtractDRegister(instr, 5, 0);
25587                               // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25588                               vqrdmulh(CurrentCond(),
25589                                        dt,
25590                                        DRegister(rd),
25591                                        DRegister(rn),
25592                                        DRegister(rm));
25593                               break;
25594                             }
25595                           }
25596                           break;
25597                         }
25598                         case 0x00000b40: {
25599                           // 0xef000b40
25600                           switch (instr & 0x10000000) {
25601                             case 0x00000000: {
25602                               // 0xef000b40
25603                               DataType dt =
25604                                   Dt_size_13_Decode((instr >> 20) & 0x3);
25605                               if (dt.Is(kDataTypeValueInvalid)) {
25606                                 UnallocatedT32(instr);
25607                                 return;
25608                               }
25609                               if (((instr >> 12) & 1) != 0) {
25610                                 UnallocatedT32(instr);
25611                                 return;
25612                               }
25613                               unsigned rd = ExtractQRegister(instr, 22, 12);
25614                               if (((instr >> 16) & 1) != 0) {
25615                                 UnallocatedT32(instr);
25616                                 return;
25617                               }
25618                               unsigned rn = ExtractQRegister(instr, 7, 16);
25619                               if ((instr & 1) != 0) {
25620                                 UnallocatedT32(instr);
25621                                 return;
25622                               }
25623                               unsigned rm = ExtractQRegister(instr, 5, 0);
25624                               // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25625                               vqdmulh(CurrentCond(),
25626                                       dt,
25627                                       QRegister(rd),
25628                                       QRegister(rn),
25629                                       QRegister(rm));
25630                               break;
25631                             }
25632                             case 0x10000000: {
25633                               // 0xff000b40
25634                               DataType dt =
25635                                   Dt_size_13_Decode((instr >> 20) & 0x3);
25636                               if (dt.Is(kDataTypeValueInvalid)) {
25637                                 UnallocatedT32(instr);
25638                                 return;
25639                               }
25640                               if (((instr >> 12) & 1) != 0) {
25641                                 UnallocatedT32(instr);
25642                                 return;
25643                               }
25644                               unsigned rd = ExtractQRegister(instr, 22, 12);
25645                               if (((instr >> 16) & 1) != 0) {
25646                                 UnallocatedT32(instr);
25647                                 return;
25648                               }
25649                               unsigned rn = ExtractQRegister(instr, 7, 16);
25650                               if ((instr & 1) != 0) {
25651                                 UnallocatedT32(instr);
25652                                 return;
25653                               }
25654                               unsigned rm = ExtractQRegister(instr, 5, 0);
25655                               // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25656                               vqrdmulh(CurrentCond(),
25657                                        dt,
25658                                        QRegister(rd),
25659                                        QRegister(rn),
25660                                        QRegister(rm));
25661                               break;
25662                             }
25663                           }
25664                           break;
25665                         }
25666                         case 0x00000c40: {
25667                           // 0xef000c40
25668                           switch (instr & 0x10300000) {
25669                             case 0x00000000: {
25670                               // 0xef000c40
25671                               UnimplementedT32_32("SHA1C", instr);
25672                               break;
25673                             }
25674                             case 0x00100000: {
25675                               // 0xef100c40
25676                               UnimplementedT32_32("SHA1P", instr);
25677                               break;
25678                             }
25679                             case 0x00200000: {
25680                               // 0xef200c40
25681                               UnimplementedT32_32("SHA1M", instr);
25682                               break;
25683                             }
25684                             case 0x00300000: {
25685                               // 0xef300c40
25686                               UnimplementedT32_32("SHA1SU0", instr);
25687                               break;
25688                             }
25689                             case 0x10000000: {
25690                               // 0xff000c40
25691                               UnimplementedT32_32("SHA256H", instr);
25692                               break;
25693                             }
25694                             case 0x10100000: {
25695                               // 0xff100c40
25696                               UnimplementedT32_32("SHA256H2", instr);
25697                               break;
25698                             }
25699                             case 0x10200000: {
25700                               // 0xff200c40
25701                               UnimplementedT32_32("SHA256SU1", instr);
25702                               break;
25703                             }
25704                             default:
25705                               UnallocatedT32(instr);
25706                               break;
25707                           }
25708                           break;
25709                         }
25710                         case 0x00000d00: {
25711                           // 0xef000d00
25712                           switch (instr & 0x10300000) {
25713                             case 0x00000000: {
25714                               // 0xef000d00
25715                               unsigned rd = ExtractDRegister(instr, 22, 12);
25716                               unsigned rn = ExtractDRegister(instr, 7, 16);
25717                               unsigned rm = ExtractDRegister(instr, 5, 0);
25718                               // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
25719                               vadd(CurrentCond(),
25720                                    F32,
25721                                    DRegister(rd),
25722                                    DRegister(rn),
25723                                    DRegister(rm));
25724                               break;
25725                             }
25726                             case 0x00200000: {
25727                               // 0xef200d00
25728                               unsigned rd = ExtractDRegister(instr, 22, 12);
25729                               unsigned rn = ExtractDRegister(instr, 7, 16);
25730                               unsigned rm = ExtractDRegister(instr, 5, 0);
25731                               // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
25732                               vsub(CurrentCond(),
25733                                    F32,
25734                                    DRegister(rd),
25735                                    DRegister(rn),
25736                                    DRegister(rm));
25737                               break;
25738                             }
25739                             case 0x10000000: {
25740                               // 0xff000d00
25741                               unsigned rd = ExtractDRegister(instr, 22, 12);
25742                               unsigned rn = ExtractDRegister(instr, 7, 16);
25743                               unsigned rm = ExtractDRegister(instr, 5, 0);
25744                               // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
25745                               vpadd(CurrentCond(),
25746                                     F32,
25747                                     DRegister(rd),
25748                                     DRegister(rn),
25749                                     DRegister(rm));
25750                               break;
25751                             }
25752                             case 0x10200000: {
25753                               // 0xff200d00
25754                               unsigned rd = ExtractDRegister(instr, 22, 12);
25755                               unsigned rn = ExtractDRegister(instr, 7, 16);
25756                               unsigned rm = ExtractDRegister(instr, 5, 0);
25757                               // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
25758                               vabd(CurrentCond(),
25759                                    F32,
25760                                    DRegister(rd),
25761                                    DRegister(rn),
25762                                    DRegister(rm));
25763                               break;
25764                             }
25765                             default:
25766                               UnallocatedT32(instr);
25767                               break;
25768                           }
25769                           break;
25770                         }
25771                         case 0x00000d40: {
25772                           // 0xef000d40
25773                           switch (instr & 0x10300000) {
25774                             case 0x00000000: {
25775                               // 0xef000d40
25776                               if (((instr >> 12) & 1) != 0) {
25777                                 UnallocatedT32(instr);
25778                                 return;
25779                               }
25780                               unsigned rd = ExtractQRegister(instr, 22, 12);
25781                               if (((instr >> 16) & 1) != 0) {
25782                                 UnallocatedT32(instr);
25783                                 return;
25784                               }
25785                               unsigned rn = ExtractQRegister(instr, 7, 16);
25786                               if ((instr & 1) != 0) {
25787                                 UnallocatedT32(instr);
25788                                 return;
25789                               }
25790                               unsigned rm = ExtractQRegister(instr, 5, 0);
25791                               // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
25792                               vadd(CurrentCond(),
25793                                    F32,
25794                                    QRegister(rd),
25795                                    QRegister(rn),
25796                                    QRegister(rm));
25797                               break;
25798                             }
25799                             case 0x00200000: {
25800                               // 0xef200d40
25801                               if (((instr >> 12) & 1) != 0) {
25802                                 UnallocatedT32(instr);
25803                                 return;
25804                               }
25805                               unsigned rd = ExtractQRegister(instr, 22, 12);
25806                               if (((instr >> 16) & 1) != 0) {
25807                                 UnallocatedT32(instr);
25808                                 return;
25809                               }
25810                               unsigned rn = ExtractQRegister(instr, 7, 16);
25811                               if ((instr & 1) != 0) {
25812                                 UnallocatedT32(instr);
25813                                 return;
25814                               }
25815                               unsigned rm = ExtractQRegister(instr, 5, 0);
25816                               // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
25817                               vsub(CurrentCond(),
25818                                    F32,
25819                                    QRegister(rd),
25820                                    QRegister(rn),
25821                                    QRegister(rm));
25822                               break;
25823                             }
25824                             case 0x10200000: {
25825                               // 0xff200d40
25826                               if (((instr >> 12) & 1) != 0) {
25827                                 UnallocatedT32(instr);
25828                                 return;
25829                               }
25830                               unsigned rd = ExtractQRegister(instr, 22, 12);
25831                               if (((instr >> 16) & 1) != 0) {
25832                                 UnallocatedT32(instr);
25833                                 return;
25834                               }
25835                               unsigned rn = ExtractQRegister(instr, 7, 16);
25836                               if ((instr & 1) != 0) {
25837                                 UnallocatedT32(instr);
25838                                 return;
25839                               }
25840                               unsigned rm = ExtractQRegister(instr, 5, 0);
25841                               // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
25842                               vabd(CurrentCond(),
25843                                    F32,
25844                                    QRegister(rd),
25845                                    QRegister(rn),
25846                                    QRegister(rm));
25847                               break;
25848                             }
25849                             default:
25850                               UnallocatedT32(instr);
25851                               break;
25852                           }
25853                           break;
25854                         }
25855                         case 0x00000e00: {
25856                           // 0xef000e00
25857                           switch (instr & 0x10200000) {
25858                             case 0x00000000: {
25859                               // 0xef000e00
25860                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
25861                               if (dt.Is(kDataTypeValueInvalid)) {
25862                                 UnallocatedT32(instr);
25863                                 return;
25864                               }
25865                               unsigned rd = ExtractDRegister(instr, 22, 12);
25866                               unsigned rn = ExtractDRegister(instr, 7, 16);
25867                               unsigned rm = ExtractDRegister(instr, 5, 0);
25868                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2
25869                               vceq(CurrentCond(),
25870                                    dt,
25871                                    DRegister(rd),
25872                                    DRegister(rn),
25873                                    DRegister(rm));
25874                               break;
25875                             }
25876                             case 0x10000000: {
25877                               // 0xff000e00
25878                               if ((instr & 0x00100000) == 0x00000000) {
25879                                 unsigned rd = ExtractDRegister(instr, 22, 12);
25880                                 unsigned rn = ExtractDRegister(instr, 7, 16);
25881                                 unsigned rm = ExtractDRegister(instr, 5, 0);
25882                                 // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
25883                                 vcge(CurrentCond(),
25884                                      F32,
25885                                      DRegister(rd),
25886                                      DRegister(rn),
25887                                      DRegister(rm));
25888                               } else {
25889                                 UnallocatedT32(instr);
25890                               }
25891                               break;
25892                             }
25893                             case 0x10200000: {
25894                               // 0xff200e00
25895                               if ((instr & 0x00100000) == 0x00000000) {
25896                                 unsigned rd = ExtractDRegister(instr, 22, 12);
25897                                 unsigned rn = ExtractDRegister(instr, 7, 16);
25898                                 unsigned rm = ExtractDRegister(instr, 5, 0);
25899                                 // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
25900                                 vcgt(CurrentCond(),
25901                                      F32,
25902                                      DRegister(rd),
25903                                      DRegister(rn),
25904                                      DRegister(rm));
25905                               } else {
25906                                 UnallocatedT32(instr);
25907                               }
25908                               break;
25909                             }
25910                             default:
25911                               UnallocatedT32(instr);
25912                               break;
25913                           }
25914                           break;
25915                         }
25916                         case 0x00000e40: {
25917                           // 0xef000e40
25918                           switch (instr & 0x10200000) {
25919                             case 0x00000000: {
25920                               // 0xef000e40
25921                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
25922                               if (dt.Is(kDataTypeValueInvalid)) {
25923                                 UnallocatedT32(instr);
25924                                 return;
25925                               }
25926                               if (((instr >> 12) & 1) != 0) {
25927                                 UnallocatedT32(instr);
25928                                 return;
25929                               }
25930                               unsigned rd = ExtractQRegister(instr, 22, 12);
25931                               if (((instr >> 16) & 1) != 0) {
25932                                 UnallocatedT32(instr);
25933                                 return;
25934                               }
25935                               unsigned rn = ExtractQRegister(instr, 7, 16);
25936                               if ((instr & 1) != 0) {
25937                                 UnallocatedT32(instr);
25938                                 return;
25939                               }
25940                               unsigned rm = ExtractQRegister(instr, 5, 0);
25941                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2
25942                               vceq(CurrentCond(),
25943                                    dt,
25944                                    QRegister(rd),
25945                                    QRegister(rn),
25946                                    QRegister(rm));
25947                               break;
25948                             }
25949                             case 0x10000000: {
25950                               // 0xff000e40
25951                               if ((instr & 0x00100000) == 0x00000000) {
25952                                 if (((instr >> 12) & 1) != 0) {
25953                                   UnallocatedT32(instr);
25954                                   return;
25955                                 }
25956                                 unsigned rd = ExtractQRegister(instr, 22, 12);
25957                                 if (((instr >> 16) & 1) != 0) {
25958                                   UnallocatedT32(instr);
25959                                   return;
25960                                 }
25961                                 unsigned rn = ExtractQRegister(instr, 7, 16);
25962                                 if ((instr & 1) != 0) {
25963                                   UnallocatedT32(instr);
25964                                   return;
25965                                 }
25966                                 unsigned rm = ExtractQRegister(instr, 5, 0);
25967                                 // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
25968                                 vcge(CurrentCond(),
25969                                      F32,
25970                                      QRegister(rd),
25971                                      QRegister(rn),
25972                                      QRegister(rm));
25973                               } else {
25974                                 UnallocatedT32(instr);
25975                               }
25976                               break;
25977                             }
25978                             case 0x10200000: {
25979                               // 0xff200e40
25980                               if ((instr & 0x00100000) == 0x00000000) {
25981                                 if (((instr >> 12) & 1) != 0) {
25982                                   UnallocatedT32(instr);
25983                                   return;
25984                                 }
25985                                 unsigned rd = ExtractQRegister(instr, 22, 12);
25986                                 if (((instr >> 16) & 1) != 0) {
25987                                   UnallocatedT32(instr);
25988                                   return;
25989                                 }
25990                                 unsigned rn = ExtractQRegister(instr, 7, 16);
25991                                 if ((instr & 1) != 0) {
25992                                   UnallocatedT32(instr);
25993                                   return;
25994                                 }
25995                                 unsigned rm = ExtractQRegister(instr, 5, 0);
25996                                 // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
25997                                 vcgt(CurrentCond(),
25998                                      F32,
25999                                      QRegister(rd),
26000                                      QRegister(rn),
26001                                      QRegister(rm));
26002                               } else {
26003                                 UnallocatedT32(instr);
26004                               }
26005                               break;
26006                             }
26007                             default:
26008                               UnallocatedT32(instr);
26009                               break;
26010                           }
26011                           break;
26012                         }
26013                         case 0x00000f00: {
26014                           // 0xef000f00
26015                           switch (instr & 0x10300000) {
26016                             case 0x00000000: {
26017                               // 0xef000f00
26018                               unsigned rd = ExtractDRegister(instr, 22, 12);
26019                               unsigned rn = ExtractDRegister(instr, 7, 16);
26020                               unsigned rm = ExtractDRegister(instr, 5, 0);
26021                               // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26022                               vmax(CurrentCond(),
26023                                    F32,
26024                                    DRegister(rd),
26025                                    DRegister(rn),
26026                                    DRegister(rm));
26027                               break;
26028                             }
26029                             case 0x00200000: {
26030                               // 0xef200f00
26031                               unsigned rd = ExtractDRegister(instr, 22, 12);
26032                               unsigned rn = ExtractDRegister(instr, 7, 16);
26033                               unsigned rm = ExtractDRegister(instr, 5, 0);
26034                               // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26035                               vmin(CurrentCond(),
26036                                    F32,
26037                                    DRegister(rd),
26038                                    DRegister(rn),
26039                                    DRegister(rm));
26040                               break;
26041                             }
26042                             case 0x10000000: {
26043                               // 0xff000f00
26044                               unsigned rd = ExtractDRegister(instr, 22, 12);
26045                               unsigned rn = ExtractDRegister(instr, 7, 16);
26046                               unsigned rm = ExtractDRegister(instr, 5, 0);
26047                               // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26048                               vpmax(CurrentCond(),
26049                                     F32,
26050                                     DRegister(rd),
26051                                     DRegister(rn),
26052                                     DRegister(rm));
26053                               break;
26054                             }
26055                             case 0x10200000: {
26056                               // 0xff200f00
26057                               unsigned rd = ExtractDRegister(instr, 22, 12);
26058                               unsigned rn = ExtractDRegister(instr, 7, 16);
26059                               unsigned rm = ExtractDRegister(instr, 5, 0);
26060                               // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26061                               vpmin(CurrentCond(),
26062                                     F32,
26063                                     DRegister(rd),
26064                                     DRegister(rn),
26065                                     DRegister(rm));
26066                               break;
26067                             }
26068                             default:
26069                               UnallocatedT32(instr);
26070                               break;
26071                           }
26072                           break;
26073                         }
26074                         case 0x00000f40: {
26075                           // 0xef000f40
26076                           switch (instr & 0x10300000) {
26077                             case 0x00000000: {
26078                               // 0xef000f40
26079                               if (((instr >> 12) & 1) != 0) {
26080                                 UnallocatedT32(instr);
26081                                 return;
26082                               }
26083                               unsigned rd = ExtractQRegister(instr, 22, 12);
26084                               if (((instr >> 16) & 1) != 0) {
26085                                 UnallocatedT32(instr);
26086                                 return;
26087                               }
26088                               unsigned rn = ExtractQRegister(instr, 7, 16);
26089                               if ((instr & 1) != 0) {
26090                                 UnallocatedT32(instr);
26091                                 return;
26092                               }
26093                               unsigned rm = ExtractQRegister(instr, 5, 0);
26094                               // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26095                               vmax(CurrentCond(),
26096                                    F32,
26097                                    QRegister(rd),
26098                                    QRegister(rn),
26099                                    QRegister(rm));
26100                               break;
26101                             }
26102                             case 0x00200000: {
26103                               // 0xef200f40
26104                               if (((instr >> 12) & 1) != 0) {
26105                                 UnallocatedT32(instr);
26106                                 return;
26107                               }
26108                               unsigned rd = ExtractQRegister(instr, 22, 12);
26109                               if (((instr >> 16) & 1) != 0) {
26110                                 UnallocatedT32(instr);
26111                                 return;
26112                               }
26113                               unsigned rn = ExtractQRegister(instr, 7, 16);
26114                               if ((instr & 1) != 0) {
26115                                 UnallocatedT32(instr);
26116                                 return;
26117                               }
26118                               unsigned rm = ExtractQRegister(instr, 5, 0);
26119                               // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26120                               vmin(CurrentCond(),
26121                                    F32,
26122                                    QRegister(rd),
26123                                    QRegister(rn),
26124                                    QRegister(rm));
26125                               break;
26126                             }
26127                             default:
26128                               UnallocatedT32(instr);
26129                               break;
26130                           }
26131                           break;
26132                         }
26133                         default:
26134                           UnallocatedT32(instr);
26135                           break;
26136                       }
26137                       break;
26138                     }
26139                     case 0x00800000: {
26140                       // 0xef800000
26141                       switch (instr & 0x00300000) {
26142                         case 0x00300000: {
26143                           // 0xefb00000
26144                           switch (instr & 0x10000000) {
26145                             case 0x00000000: {
26146                               // 0xefb00000
26147                               switch (instr & 0x00000040) {
26148                                 case 0x00000000: {
26149                                   // 0xefb00000
26150                                   if (((instr & 0x800) == 0x800)) {
26151                                     UnallocatedT32(instr);
26152                                     return;
26153                                   }
26154                                   unsigned rd = ExtractDRegister(instr, 22, 12);
26155                                   unsigned rn = ExtractDRegister(instr, 7, 16);
26156                                   unsigned rm = ExtractDRegister(instr, 5, 0);
26157                                   uint32_t imm = (instr >> 8) & 0xf;
26158                                   // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
26159                                   vext(CurrentCond(),
26160                                        Untyped8,
26161                                        DRegister(rd),
26162                                        DRegister(rn),
26163                                        DRegister(rm),
26164                                        imm);
26165                                   break;
26166                                 }
26167                                 case 0x00000040: {
26168                                   // 0xefb00040
26169                                   if (((instr >> 12) & 1) != 0) {
26170                                     UnallocatedT32(instr);
26171                                     return;
26172                                   }
26173                                   unsigned rd = ExtractQRegister(instr, 22, 12);
26174                                   if (((instr >> 16) & 1) != 0) {
26175                                     UnallocatedT32(instr);
26176                                     return;
26177                                   }
26178                                   unsigned rn = ExtractQRegister(instr, 7, 16);
26179                                   if ((instr & 1) != 0) {
26180                                     UnallocatedT32(instr);
26181                                     return;
26182                                   }
26183                                   unsigned rm = ExtractQRegister(instr, 5, 0);
26184                                   uint32_t imm = (instr >> 8) & 0xf;
26185                                   // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
26186                                   vext(CurrentCond(),
26187                                        Untyped8,
26188                                        QRegister(rd),
26189                                        QRegister(rn),
26190                                        QRegister(rm),
26191                                        imm);
26192                                   break;
26193                                 }
26194                               }
26195                               break;
26196                             }
26197                             case 0x10000000: {
26198                               // 0xffb00000
26199                               switch (instr & 0x00000800) {
26200                                 case 0x00000000: {
26201                                   // 0xffb00000
26202                                   switch (instr & 0x00030200) {
26203                                     case 0x00000000: {
26204                                       // 0xffb00000
26205                                       switch (instr & 0x000005c0) {
26206                                         case 0x00000000: {
26207                                           // 0xffb00000
26208                                           DataType dt = Dt_size_7_Decode(
26209                                               (instr >> 18) & 0x3);
26210                                           if (dt.Is(kDataTypeValueInvalid)) {
26211                                             UnallocatedT32(instr);
26212                                             return;
26213                                           }
26214                                           unsigned rd =
26215                                               ExtractDRegister(instr, 22, 12);
26216                                           unsigned rm =
26217                                               ExtractDRegister(instr, 5, 0);
26218                                           // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26219                                           vrev64(CurrentCond(),
26220                                                  dt,
26221                                                  DRegister(rd),
26222                                                  DRegister(rm));
26223                                           break;
26224                                         }
26225                                         case 0x00000040: {
26226                                           // 0xffb00040
26227                                           DataType dt = Dt_size_7_Decode(
26228                                               (instr >> 18) & 0x3);
26229                                           if (dt.Is(kDataTypeValueInvalid)) {
26230                                             UnallocatedT32(instr);
26231                                             return;
26232                                           }
26233                                           if (((instr >> 12) & 1) != 0) {
26234                                             UnallocatedT32(instr);
26235                                             return;
26236                                           }
26237                                           unsigned rd =
26238                                               ExtractQRegister(instr, 22, 12);
26239                                           if ((instr & 1) != 0) {
26240                                             UnallocatedT32(instr);
26241                                             return;
26242                                           }
26243                                           unsigned rm =
26244                                               ExtractQRegister(instr, 5, 0);
26245                                           // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26246                                           vrev64(CurrentCond(),
26247                                                  dt,
26248                                                  QRegister(rd),
26249                                                  QRegister(rm));
26250                                           break;
26251                                         }
26252                                         case 0x00000080: {
26253                                           // 0xffb00080
26254                                           DataType dt = Dt_size_15_Decode(
26255                                               (instr >> 18) & 0x3);
26256                                           if (dt.Is(kDataTypeValueInvalid)) {
26257                                             UnallocatedT32(instr);
26258                                             return;
26259                                           }
26260                                           unsigned rd =
26261                                               ExtractDRegister(instr, 22, 12);
26262                                           unsigned rm =
26263                                               ExtractDRegister(instr, 5, 0);
26264                                           // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26265                                           vrev32(CurrentCond(),
26266                                                  dt,
26267                                                  DRegister(rd),
26268                                                  DRegister(rm));
26269                                           break;
26270                                         }
26271                                         case 0x000000c0: {
26272                                           // 0xffb000c0
26273                                           DataType dt = Dt_size_15_Decode(
26274                                               (instr >> 18) & 0x3);
26275                                           if (dt.Is(kDataTypeValueInvalid)) {
26276                                             UnallocatedT32(instr);
26277                                             return;
26278                                           }
26279                                           if (((instr >> 12) & 1) != 0) {
26280                                             UnallocatedT32(instr);
26281                                             return;
26282                                           }
26283                                           unsigned rd =
26284                                               ExtractQRegister(instr, 22, 12);
26285                                           if ((instr & 1) != 0) {
26286                                             UnallocatedT32(instr);
26287                                             return;
26288                                           }
26289                                           unsigned rm =
26290                                               ExtractQRegister(instr, 5, 0);
26291                                           // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26292                                           vrev32(CurrentCond(),
26293                                                  dt,
26294                                                  QRegister(rd),
26295                                                  QRegister(rm));
26296                                           break;
26297                                         }
26298                                         case 0x00000100: {
26299                                           // 0xffb00100
26300                                           DataType dt = Dt_size_1_Decode(
26301                                               (instr >> 18) & 0x3);
26302                                           if (dt.Is(kDataTypeValueInvalid)) {
26303                                             UnallocatedT32(instr);
26304                                             return;
26305                                           }
26306                                           unsigned rd =
26307                                               ExtractDRegister(instr, 22, 12);
26308                                           unsigned rm =
26309                                               ExtractDRegister(instr, 5, 0);
26310                                           // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26311                                           vrev16(CurrentCond(),
26312                                                  dt,
26313                                                  DRegister(rd),
26314                                                  DRegister(rm));
26315                                           break;
26316                                         }
26317                                         case 0x00000140: {
26318                                           // 0xffb00140
26319                                           DataType dt = Dt_size_1_Decode(
26320                                               (instr >> 18) & 0x3);
26321                                           if (dt.Is(kDataTypeValueInvalid)) {
26322                                             UnallocatedT32(instr);
26323                                             return;
26324                                           }
26325                                           if (((instr >> 12) & 1) != 0) {
26326                                             UnallocatedT32(instr);
26327                                             return;
26328                                           }
26329                                           unsigned rd =
26330                                               ExtractQRegister(instr, 22, 12);
26331                                           if ((instr & 1) != 0) {
26332                                             UnallocatedT32(instr);
26333                                             return;
26334                                           }
26335                                           unsigned rm =
26336                                               ExtractQRegister(instr, 5, 0);
26337                                           // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26338                                           vrev16(CurrentCond(),
26339                                                  dt,
26340                                                  QRegister(rd),
26341                                                  QRegister(rm));
26342                                           break;
26343                                         }
26344                                         case 0x00000400: {
26345                                           // 0xffb00400
26346                                           DataType dt = Dt_size_5_Decode(
26347                                               (instr >> 18) & 0x3);
26348                                           if (dt.Is(kDataTypeValueInvalid)) {
26349                                             UnallocatedT32(instr);
26350                                             return;
26351                                           }
26352                                           unsigned rd =
26353                                               ExtractDRegister(instr, 22, 12);
26354                                           unsigned rm =
26355                                               ExtractDRegister(instr, 5, 0);
26356                                           // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
26357                                           vcls(CurrentCond(),
26358                                                dt,
26359                                                DRegister(rd),
26360                                                DRegister(rm));
26361                                           break;
26362                                         }
26363                                         case 0x00000440: {
26364                                           // 0xffb00440
26365                                           DataType dt = Dt_size_5_Decode(
26366                                               (instr >> 18) & 0x3);
26367                                           if (dt.Is(kDataTypeValueInvalid)) {
26368                                             UnallocatedT32(instr);
26369                                             return;
26370                                           }
26371                                           if (((instr >> 12) & 1) != 0) {
26372                                             UnallocatedT32(instr);
26373                                             return;
26374                                           }
26375                                           unsigned rd =
26376                                               ExtractQRegister(instr, 22, 12);
26377                                           if ((instr & 1) != 0) {
26378                                             UnallocatedT32(instr);
26379                                             return;
26380                                           }
26381                                           unsigned rm =
26382                                               ExtractQRegister(instr, 5, 0);
26383                                           // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
26384                                           vcls(CurrentCond(),
26385                                                dt,
26386                                                QRegister(rd),
26387                                                QRegister(rm));
26388                                           break;
26389                                         }
26390                                         case 0x00000480: {
26391                                           // 0xffb00480
26392                                           DataType dt = Dt_size_4_Decode(
26393                                               (instr >> 18) & 0x3);
26394                                           if (dt.Is(kDataTypeValueInvalid)) {
26395                                             UnallocatedT32(instr);
26396                                             return;
26397                                           }
26398                                           unsigned rd =
26399                                               ExtractDRegister(instr, 22, 12);
26400                                           unsigned rm =
26401                                               ExtractDRegister(instr, 5, 0);
26402                                           // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
26403                                           vclz(CurrentCond(),
26404                                                dt,
26405                                                DRegister(rd),
26406                                                DRegister(rm));
26407                                           break;
26408                                         }
26409                                         case 0x000004c0: {
26410                                           // 0xffb004c0
26411                                           DataType dt = Dt_size_4_Decode(
26412                                               (instr >> 18) & 0x3);
26413                                           if (dt.Is(kDataTypeValueInvalid)) {
26414                                             UnallocatedT32(instr);
26415                                             return;
26416                                           }
26417                                           if (((instr >> 12) & 1) != 0) {
26418                                             UnallocatedT32(instr);
26419                                             return;
26420                                           }
26421                                           unsigned rd =
26422                                               ExtractQRegister(instr, 22, 12);
26423                                           if ((instr & 1) != 0) {
26424                                             UnallocatedT32(instr);
26425                                             return;
26426                                           }
26427                                           unsigned rm =
26428                                               ExtractQRegister(instr, 5, 0);
26429                                           // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
26430                                           vclz(CurrentCond(),
26431                                                dt,
26432                                                QRegister(rd),
26433                                                QRegister(rm));
26434                                           break;
26435                                         }
26436                                         case 0x00000500: {
26437                                           // 0xffb00500
26438                                           if ((instr & 0x000c0000) ==
26439                                               0x00000000) {
26440                                             unsigned rd =
26441                                                 ExtractDRegister(instr, 22, 12);
26442                                             unsigned rm =
26443                                                 ExtractDRegister(instr, 5, 0);
26444                                             // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1
26445                                             vcnt(CurrentCond(),
26446                                                  Untyped8,
26447                                                  DRegister(rd),
26448                                                  DRegister(rm));
26449                                           } else {
26450                                             UnallocatedT32(instr);
26451                                           }
26452                                           break;
26453                                         }
26454                                         case 0x00000540: {
26455                                           // 0xffb00540
26456                                           if ((instr & 0x000c0000) ==
26457                                               0x00000000) {
26458                                             if (((instr >> 12) & 1) != 0) {
26459                                               UnallocatedT32(instr);
26460                                               return;
26461                                             }
26462                                             unsigned rd =
26463                                                 ExtractQRegister(instr, 22, 12);
26464                                             if ((instr & 1) != 0) {
26465                                               UnallocatedT32(instr);
26466                                               return;
26467                                             }
26468                                             unsigned rm =
26469                                                 ExtractQRegister(instr, 5, 0);
26470                                             // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1
26471                                             vcnt(CurrentCond(),
26472                                                  Untyped8,
26473                                                  QRegister(rd),
26474                                                  QRegister(rm));
26475                                           } else {
26476                                             UnallocatedT32(instr);
26477                                           }
26478                                           break;
26479                                         }
26480                                         case 0x00000580: {
26481                                           // 0xffb00580
26482                                           if ((instr & 0x000c0000) ==
26483                                               0x00000000) {
26484                                             unsigned rd =
26485                                                 ExtractDRegister(instr, 22, 12);
26486                                             unsigned rm =
26487                                                 ExtractDRegister(instr, 5, 0);
26488                                             // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26489                                             vmvn(CurrentCond(),
26490                                                  kDataTypeValueNone,
26491                                                  DRegister(rd),
26492                                                  DRegister(rm));
26493                                           } else {
26494                                             UnallocatedT32(instr);
26495                                           }
26496                                           break;
26497                                         }
26498                                         case 0x000005c0: {
26499                                           // 0xffb005c0
26500                                           if ((instr & 0x000c0000) ==
26501                                               0x00000000) {
26502                                             if (((instr >> 12) & 1) != 0) {
26503                                               UnallocatedT32(instr);
26504                                               return;
26505                                             }
26506                                             unsigned rd =
26507                                                 ExtractQRegister(instr, 22, 12);
26508                                             if ((instr & 1) != 0) {
26509                                               UnallocatedT32(instr);
26510                                               return;
26511                                             }
26512                                             unsigned rm =
26513                                                 ExtractQRegister(instr, 5, 0);
26514                                             // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26515                                             vmvn(CurrentCond(),
26516                                                  kDataTypeValueNone,
26517                                                  QRegister(rd),
26518                                                  QRegister(rm));
26519                                           } else {
26520                                             UnallocatedT32(instr);
26521                                           }
26522                                           break;
26523                                         }
26524                                         default:
26525                                           UnallocatedT32(instr);
26526                                           break;
26527                                       }
26528                                       break;
26529                                     }
26530                                     case 0x00000200: {
26531                                       // 0xffb00200
26532                                       switch (instr & 0x00000540) {
26533                                         case 0x00000000: {
26534                                           // 0xffb00200
26535                                           DataType dt = Dt_op_size_2_Decode(
26536                                               ((instr >> 18) & 0x3) |
26537                                               ((instr >> 5) & 0x4));
26538                                           if (dt.Is(kDataTypeValueInvalid)) {
26539                                             UnallocatedT32(instr);
26540                                             return;
26541                                           }
26542                                           unsigned rd =
26543                                               ExtractDRegister(instr, 22, 12);
26544                                           unsigned rm =
26545                                               ExtractDRegister(instr, 5, 0);
26546                                           // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26547                                           vpaddl(CurrentCond(),
26548                                                  dt,
26549                                                  DRegister(rd),
26550                                                  DRegister(rm));
26551                                           break;
26552                                         }
26553                                         case 0x00000040: {
26554                                           // 0xffb00240
26555                                           DataType dt = Dt_op_size_2_Decode(
26556                                               ((instr >> 18) & 0x3) |
26557                                               ((instr >> 5) & 0x4));
26558                                           if (dt.Is(kDataTypeValueInvalid)) {
26559                                             UnallocatedT32(instr);
26560                                             return;
26561                                           }
26562                                           if (((instr >> 12) & 1) != 0) {
26563                                             UnallocatedT32(instr);
26564                                             return;
26565                                           }
26566                                           unsigned rd =
26567                                               ExtractQRegister(instr, 22, 12);
26568                                           if ((instr & 1) != 0) {
26569                                             UnallocatedT32(instr);
26570                                             return;
26571                                           }
26572                                           unsigned rm =
26573                                               ExtractQRegister(instr, 5, 0);
26574                                           // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26575                                           vpaddl(CurrentCond(),
26576                                                  dt,
26577                                                  QRegister(rd),
26578                                                  QRegister(rm));
26579                                           break;
26580                                         }
26581                                         case 0x00000100: {
26582                                           // 0xffb00300
26583                                           switch (instr & 0x00000080) {
26584                                             case 0x00000000: {
26585                                               // 0xffb00300
26586                                               UnimplementedT32_32("AESE",
26587                                                                   instr);
26588                                               break;
26589                                             }
26590                                             case 0x00000080: {
26591                                               // 0xffb00380
26592                                               UnimplementedT32_32("AESMC",
26593                                                                   instr);
26594                                               break;
26595                                             }
26596                                           }
26597                                           break;
26598                                         }
26599                                         case 0x00000140: {
26600                                           // 0xffb00340
26601                                           switch (instr & 0x00000080) {
26602                                             case 0x00000000: {
26603                                               // 0xffb00340
26604                                               UnimplementedT32_32("AESD",
26605                                                                   instr);
26606                                               break;
26607                                             }
26608                                             case 0x00000080: {
26609                                               // 0xffb003c0
26610                                               UnimplementedT32_32("AESIMC",
26611                                                                   instr);
26612                                               break;
26613                                             }
26614                                           }
26615                                           break;
26616                                         }
26617                                         case 0x00000400: {
26618                                           // 0xffb00600
26619                                           DataType dt = Dt_op_size_2_Decode(
26620                                               ((instr >> 18) & 0x3) |
26621                                               ((instr >> 5) & 0x4));
26622                                           if (dt.Is(kDataTypeValueInvalid)) {
26623                                             UnallocatedT32(instr);
26624                                             return;
26625                                           }
26626                                           unsigned rd =
26627                                               ExtractDRegister(instr, 22, 12);
26628                                           unsigned rm =
26629                                               ExtractDRegister(instr, 5, 0);
26630                                           // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26631                                           vpadal(CurrentCond(),
26632                                                  dt,
26633                                                  DRegister(rd),
26634                                                  DRegister(rm));
26635                                           break;
26636                                         }
26637                                         case 0x00000440: {
26638                                           // 0xffb00640
26639                                           DataType dt = Dt_op_size_2_Decode(
26640                                               ((instr >> 18) & 0x3) |
26641                                               ((instr >> 5) & 0x4));
26642                                           if (dt.Is(kDataTypeValueInvalid)) {
26643                                             UnallocatedT32(instr);
26644                                             return;
26645                                           }
26646                                           if (((instr >> 12) & 1) != 0) {
26647                                             UnallocatedT32(instr);
26648                                             return;
26649                                           }
26650                                           unsigned rd =
26651                                               ExtractQRegister(instr, 22, 12);
26652                                           if ((instr & 1) != 0) {
26653                                             UnallocatedT32(instr);
26654                                             return;
26655                                           }
26656                                           unsigned rm =
26657                                               ExtractQRegister(instr, 5, 0);
26658                                           // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26659                                           vpadal(CurrentCond(),
26660                                                  dt,
26661                                                  QRegister(rd),
26662                                                  QRegister(rm));
26663                                           break;
26664                                         }
26665                                         case 0x00000500: {
26666                                           // 0xffb00700
26667                                           switch (instr & 0x00000080) {
26668                                             case 0x00000000: {
26669                                               // 0xffb00700
26670                                               DataType dt = Dt_size_5_Decode(
26671                                                   (instr >> 18) & 0x3);
26672                                               if (dt.Is(
26673                                                       kDataTypeValueInvalid)) {
26674                                                 UnallocatedT32(instr);
26675                                                 return;
26676                                               }
26677                                               unsigned rd =
26678                                                   ExtractDRegister(instr,
26679                                                                    22,
26680                                                                    12);
26681                                               unsigned rm =
26682                                                   ExtractDRegister(instr, 5, 0);
26683                                               // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26684                                               vqabs(CurrentCond(),
26685                                                     dt,
26686                                                     DRegister(rd),
26687                                                     DRegister(rm));
26688                                               break;
26689                                             }
26690                                             case 0x00000080: {
26691                                               // 0xffb00780
26692                                               DataType dt = Dt_size_5_Decode(
26693                                                   (instr >> 18) & 0x3);
26694                                               if (dt.Is(
26695                                                       kDataTypeValueInvalid)) {
26696                                                 UnallocatedT32(instr);
26697                                                 return;
26698                                               }
26699                                               unsigned rd =
26700                                                   ExtractDRegister(instr,
26701                                                                    22,
26702                                                                    12);
26703                                               unsigned rm =
26704                                                   ExtractDRegister(instr, 5, 0);
26705                                               // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26706                                               vqneg(CurrentCond(),
26707                                                     dt,
26708                                                     DRegister(rd),
26709                                                     DRegister(rm));
26710                                               break;
26711                                             }
26712                                           }
26713                                           break;
26714                                         }
26715                                         case 0x00000540: {
26716                                           // 0xffb00740
26717                                           switch (instr & 0x00000080) {
26718                                             case 0x00000000: {
26719                                               // 0xffb00740
26720                                               DataType dt = Dt_size_5_Decode(
26721                                                   (instr >> 18) & 0x3);
26722                                               if (dt.Is(
26723                                                       kDataTypeValueInvalid)) {
26724                                                 UnallocatedT32(instr);
26725                                                 return;
26726                                               }
26727                                               if (((instr >> 12) & 1) != 0) {
26728                                                 UnallocatedT32(instr);
26729                                                 return;
26730                                               }
26731                                               unsigned rd =
26732                                                   ExtractQRegister(instr,
26733                                                                    22,
26734                                                                    12);
26735                                               if ((instr & 1) != 0) {
26736                                                 UnallocatedT32(instr);
26737                                                 return;
26738                                               }
26739                                               unsigned rm =
26740                                                   ExtractQRegister(instr, 5, 0);
26741                                               // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26742                                               vqabs(CurrentCond(),
26743                                                     dt,
26744                                                     QRegister(rd),
26745                                                     QRegister(rm));
26746                                               break;
26747                                             }
26748                                             case 0x00000080: {
26749                                               // 0xffb007c0
26750                                               DataType dt = Dt_size_5_Decode(
26751                                                   (instr >> 18) & 0x3);
26752                                               if (dt.Is(
26753                                                       kDataTypeValueInvalid)) {
26754                                                 UnallocatedT32(instr);
26755                                                 return;
26756                                               }
26757                                               if (((instr >> 12) & 1) != 0) {
26758                                                 UnallocatedT32(instr);
26759                                                 return;
26760                                               }
26761                                               unsigned rd =
26762                                                   ExtractQRegister(instr,
26763                                                                    22,
26764                                                                    12);
26765                                               if ((instr & 1) != 0) {
26766                                                 UnallocatedT32(instr);
26767                                                 return;
26768                                               }
26769                                               unsigned rm =
26770                                                   ExtractQRegister(instr, 5, 0);
26771                                               // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26772                                               vqneg(CurrentCond(),
26773                                                     dt,
26774                                                     QRegister(rd),
26775                                                     QRegister(rm));
26776                                               break;
26777                                             }
26778                                           }
26779                                           break;
26780                                         }
26781                                       }
26782                                       break;
26783                                     }
26784                                     case 0x00010000: {
26785                                       // 0xffb10000
26786                                       switch (instr & 0x000001c0) {
26787                                         case 0x00000000: {
26788                                           // 0xffb10000
26789                                           DataType dt = Dt_F_size_1_Decode(
26790                                               ((instr >> 18) & 0x3) |
26791                                               ((instr >> 8) & 0x4));
26792                                           if (dt.Is(kDataTypeValueInvalid)) {
26793                                             UnallocatedT32(instr);
26794                                             return;
26795                                           }
26796                                           unsigned rd =
26797                                               ExtractDRegister(instr, 22, 12);
26798                                           unsigned rm =
26799                                               ExtractDRegister(instr, 5, 0);
26800                                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
26801                                           vcgt(CurrentCond(),
26802                                                dt,
26803                                                DRegister(rd),
26804                                                DRegister(rm),
26805                                                UINT32_C(0));
26806                                           break;
26807                                         }
26808                                         case 0x00000040: {
26809                                           // 0xffb10040
26810                                           DataType dt = Dt_F_size_1_Decode(
26811                                               ((instr >> 18) & 0x3) |
26812                                               ((instr >> 8) & 0x4));
26813                                           if (dt.Is(kDataTypeValueInvalid)) {
26814                                             UnallocatedT32(instr);
26815                                             return;
26816                                           }
26817                                           if (((instr >> 12) & 1) != 0) {
26818                                             UnallocatedT32(instr);
26819                                             return;
26820                                           }
26821                                           unsigned rd =
26822                                               ExtractQRegister(instr, 22, 12);
26823                                           if ((instr & 1) != 0) {
26824                                             UnallocatedT32(instr);
26825                                             return;
26826                                           }
26827                                           unsigned rm =
26828                                               ExtractQRegister(instr, 5, 0);
26829                                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
26830                                           vcgt(CurrentCond(),
26831                                                dt,
26832                                                QRegister(rd),
26833                                                QRegister(rm),
26834                                                UINT32_C(0));
26835                                           break;
26836                                         }
26837                                         case 0x00000080: {
26838                                           // 0xffb10080
26839                                           DataType dt = Dt_F_size_1_Decode(
26840                                               ((instr >> 18) & 0x3) |
26841                                               ((instr >> 8) & 0x4));
26842                                           if (dt.Is(kDataTypeValueInvalid)) {
26843                                             UnallocatedT32(instr);
26844                                             return;
26845                                           }
26846                                           unsigned rd =
26847                                               ExtractDRegister(instr, 22, 12);
26848                                           unsigned rm =
26849                                               ExtractDRegister(instr, 5, 0);
26850                                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
26851                                           vcge(CurrentCond(),
26852                                                dt,
26853                                                DRegister(rd),
26854                                                DRegister(rm),
26855                                                UINT32_C(0));
26856                                           break;
26857                                         }
26858                                         case 0x000000c0: {
26859                                           // 0xffb100c0
26860                                           DataType dt = Dt_F_size_1_Decode(
26861                                               ((instr >> 18) & 0x3) |
26862                                               ((instr >> 8) & 0x4));
26863                                           if (dt.Is(kDataTypeValueInvalid)) {
26864                                             UnallocatedT32(instr);
26865                                             return;
26866                                           }
26867                                           if (((instr >> 12) & 1) != 0) {
26868                                             UnallocatedT32(instr);
26869                                             return;
26870                                           }
26871                                           unsigned rd =
26872                                               ExtractQRegister(instr, 22, 12);
26873                                           if ((instr & 1) != 0) {
26874                                             UnallocatedT32(instr);
26875                                             return;
26876                                           }
26877                                           unsigned rm =
26878                                               ExtractQRegister(instr, 5, 0);
26879                                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
26880                                           vcge(CurrentCond(),
26881                                                dt,
26882                                                QRegister(rd),
26883                                                QRegister(rm),
26884                                                UINT32_C(0));
26885                                           break;
26886                                         }
26887                                         case 0x00000100: {
26888                                           // 0xffb10100
26889                                           DataType dt = Dt_F_size_2_Decode(
26890                                               ((instr >> 18) & 0x3) |
26891                                               ((instr >> 8) & 0x4));
26892                                           if (dt.Is(kDataTypeValueInvalid)) {
26893                                             UnallocatedT32(instr);
26894                                             return;
26895                                           }
26896                                           unsigned rd =
26897                                               ExtractDRegister(instr, 22, 12);
26898                                           unsigned rm =
26899                                               ExtractDRegister(instr, 5, 0);
26900                                           // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
26901                                           vceq(CurrentCond(),
26902                                                dt,
26903                                                DRegister(rd),
26904                                                DRegister(rm),
26905                                                UINT32_C(0));
26906                                           break;
26907                                         }
26908                                         case 0x00000140: {
26909                                           // 0xffb10140
26910                                           DataType dt = Dt_F_size_2_Decode(
26911                                               ((instr >> 18) & 0x3) |
26912                                               ((instr >> 8) & 0x4));
26913                                           if (dt.Is(kDataTypeValueInvalid)) {
26914                                             UnallocatedT32(instr);
26915                                             return;
26916                                           }
26917                                           if (((instr >> 12) & 1) != 0) {
26918                                             UnallocatedT32(instr);
26919                                             return;
26920                                           }
26921                                           unsigned rd =
26922                                               ExtractQRegister(instr, 22, 12);
26923                                           if ((instr & 1) != 0) {
26924                                             UnallocatedT32(instr);
26925                                             return;
26926                                           }
26927                                           unsigned rm =
26928                                               ExtractQRegister(instr, 5, 0);
26929                                           // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
26930                                           vceq(CurrentCond(),
26931                                                dt,
26932                                                QRegister(rd),
26933                                                QRegister(rm),
26934                                                UINT32_C(0));
26935                                           break;
26936                                         }
26937                                         case 0x00000180: {
26938                                           // 0xffb10180
26939                                           DataType dt = Dt_F_size_1_Decode(
26940                                               ((instr >> 18) & 0x3) |
26941                                               ((instr >> 8) & 0x4));
26942                                           if (dt.Is(kDataTypeValueInvalid)) {
26943                                             UnallocatedT32(instr);
26944                                             return;
26945                                           }
26946                                           unsigned rd =
26947                                               ExtractDRegister(instr, 22, 12);
26948                                           unsigned rm =
26949                                               ExtractDRegister(instr, 5, 0);
26950                                           // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
26951                                           vcle(CurrentCond(),
26952                                                dt,
26953                                                DRegister(rd),
26954                                                DRegister(rm),
26955                                                UINT32_C(0));
26956                                           break;
26957                                         }
26958                                         case 0x000001c0: {
26959                                           // 0xffb101c0
26960                                           DataType dt = Dt_F_size_1_Decode(
26961                                               ((instr >> 18) & 0x3) |
26962                                               ((instr >> 8) & 0x4));
26963                                           if (dt.Is(kDataTypeValueInvalid)) {
26964                                             UnallocatedT32(instr);
26965                                             return;
26966                                           }
26967                                           if (((instr >> 12) & 1) != 0) {
26968                                             UnallocatedT32(instr);
26969                                             return;
26970                                           }
26971                                           unsigned rd =
26972                                               ExtractQRegister(instr, 22, 12);
26973                                           if ((instr & 1) != 0) {
26974                                             UnallocatedT32(instr);
26975                                             return;
26976                                           }
26977                                           unsigned rm =
26978                                               ExtractQRegister(instr, 5, 0);
26979                                           // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
26980                                           vcle(CurrentCond(),
26981                                                dt,
26982                                                QRegister(rd),
26983                                                QRegister(rm),
26984                                                UINT32_C(0));
26985                                           break;
26986                                         }
26987                                       }
26988                                       break;
26989                                     }
26990                                     case 0x00010200: {
26991                                       // 0xffb10200
26992                                       switch (instr & 0x000001c0) {
26993                                         case 0x00000000: {
26994                                           // 0xffb10200
26995                                           DataType dt = Dt_F_size_1_Decode(
26996                                               ((instr >> 18) & 0x3) |
26997                                               ((instr >> 8) & 0x4));
26998                                           if (dt.Is(kDataTypeValueInvalid)) {
26999                                             UnallocatedT32(instr);
27000                                             return;
27001                                           }
27002                                           unsigned rd =
27003                                               ExtractDRegister(instr, 22, 12);
27004                                           unsigned rm =
27005                                               ExtractDRegister(instr, 5, 0);
27006                                           // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27007                                           vclt(CurrentCond(),
27008                                                dt,
27009                                                DRegister(rd),
27010                                                DRegister(rm),
27011                                                UINT32_C(0));
27012                                           break;
27013                                         }
27014                                         case 0x00000040: {
27015                                           // 0xffb10240
27016                                           DataType dt = Dt_F_size_1_Decode(
27017                                               ((instr >> 18) & 0x3) |
27018                                               ((instr >> 8) & 0x4));
27019                                           if (dt.Is(kDataTypeValueInvalid)) {
27020                                             UnallocatedT32(instr);
27021                                             return;
27022                                           }
27023                                           if (((instr >> 12) & 1) != 0) {
27024                                             UnallocatedT32(instr);
27025                                             return;
27026                                           }
27027                                           unsigned rd =
27028                                               ExtractQRegister(instr, 22, 12);
27029                                           if ((instr & 1) != 0) {
27030                                             UnallocatedT32(instr);
27031                                             return;
27032                                           }
27033                                           unsigned rm =
27034                                               ExtractQRegister(instr, 5, 0);
27035                                           // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27036                                           vclt(CurrentCond(),
27037                                                dt,
27038                                                QRegister(rd),
27039                                                QRegister(rm),
27040                                                UINT32_C(0));
27041                                           break;
27042                                         }
27043                                         case 0x000000c0: {
27044                                           // 0xffb102c0
27045                                           if ((instr & 0x000c0400) ==
27046                                               0x00080000) {
27047                                             UnimplementedT32_32("SHA1H", instr);
27048                                           } else {
27049                                             UnallocatedT32(instr);
27050                                           }
27051                                           break;
27052                                         }
27053                                         case 0x00000100: {
27054                                           // 0xffb10300
27055                                           DataType dt = Dt_F_size_1_Decode(
27056                                               ((instr >> 18) & 0x3) |
27057                                               ((instr >> 8) & 0x4));
27058                                           if (dt.Is(kDataTypeValueInvalid)) {
27059                                             UnallocatedT32(instr);
27060                                             return;
27061                                           }
27062                                           unsigned rd =
27063                                               ExtractDRegister(instr, 22, 12);
27064                                           unsigned rm =
27065                                               ExtractDRegister(instr, 5, 0);
27066                                           // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27067                                           vabs(CurrentCond(),
27068                                                dt,
27069                                                DRegister(rd),
27070                                                DRegister(rm));
27071                                           break;
27072                                         }
27073                                         case 0x00000140: {
27074                                           // 0xffb10340
27075                                           DataType dt = Dt_F_size_1_Decode(
27076                                               ((instr >> 18) & 0x3) |
27077                                               ((instr >> 8) & 0x4));
27078                                           if (dt.Is(kDataTypeValueInvalid)) {
27079                                             UnallocatedT32(instr);
27080                                             return;
27081                                           }
27082                                           if (((instr >> 12) & 1) != 0) {
27083                                             UnallocatedT32(instr);
27084                                             return;
27085                                           }
27086                                           unsigned rd =
27087                                               ExtractQRegister(instr, 22, 12);
27088                                           if ((instr & 1) != 0) {
27089                                             UnallocatedT32(instr);
27090                                             return;
27091                                           }
27092                                           unsigned rm =
27093                                               ExtractQRegister(instr, 5, 0);
27094                                           // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27095                                           vabs(CurrentCond(),
27096                                                dt,
27097                                                QRegister(rd),
27098                                                QRegister(rm));
27099                                           break;
27100                                         }
27101                                         case 0x00000180: {
27102                                           // 0xffb10380
27103                                           DataType dt = Dt_F_size_1_Decode(
27104                                               ((instr >> 18) & 0x3) |
27105                                               ((instr >> 8) & 0x4));
27106                                           if (dt.Is(kDataTypeValueInvalid)) {
27107                                             UnallocatedT32(instr);
27108                                             return;
27109                                           }
27110                                           unsigned rd =
27111                                               ExtractDRegister(instr, 22, 12);
27112                                           unsigned rm =
27113                                               ExtractDRegister(instr, 5, 0);
27114                                           // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27115                                           vneg(CurrentCond(),
27116                                                dt,
27117                                                DRegister(rd),
27118                                                DRegister(rm));
27119                                           break;
27120                                         }
27121                                         case 0x000001c0: {
27122                                           // 0xffb103c0
27123                                           DataType dt = Dt_F_size_1_Decode(
27124                                               ((instr >> 18) & 0x3) |
27125                                               ((instr >> 8) & 0x4));
27126                                           if (dt.Is(kDataTypeValueInvalid)) {
27127                                             UnallocatedT32(instr);
27128                                             return;
27129                                           }
27130                                           if (((instr >> 12) & 1) != 0) {
27131                                             UnallocatedT32(instr);
27132                                             return;
27133                                           }
27134                                           unsigned rd =
27135                                               ExtractQRegister(instr, 22, 12);
27136                                           if ((instr & 1) != 0) {
27137                                             UnallocatedT32(instr);
27138                                             return;
27139                                           }
27140                                           unsigned rm =
27141                                               ExtractQRegister(instr, 5, 0);
27142                                           // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27143                                           vneg(CurrentCond(),
27144                                                dt,
27145                                                QRegister(rd),
27146                                                QRegister(rm));
27147                                           break;
27148                                         }
27149                                         default:
27150                                           UnallocatedT32(instr);
27151                                           break;
27152                                       }
27153                                       break;
27154                                     }
27155                                     case 0x00020000: {
27156                                       // 0xffb20000
27157                                       switch (instr & 0x000005c0) {
27158                                         case 0x00000000: {
27159                                           // 0xffb20000
27160                                           if ((instr & 0x000c0000) ==
27161                                               0x00000000) {
27162                                             unsigned rd =
27163                                                 ExtractDRegister(instr, 22, 12);
27164                                             unsigned rm =
27165                                                 ExtractDRegister(instr, 5, 0);
27166                                             // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27167                                             vswp(CurrentCond(),
27168                                                  kDataTypeValueNone,
27169                                                  DRegister(rd),
27170                                                  DRegister(rm));
27171                                           } else {
27172                                             UnallocatedT32(instr);
27173                                           }
27174                                           break;
27175                                         }
27176                                         case 0x00000040: {
27177                                           // 0xffb20040
27178                                           if ((instr & 0x000c0000) ==
27179                                               0x00000000) {
27180                                             if (((instr >> 12) & 1) != 0) {
27181                                               UnallocatedT32(instr);
27182                                               return;
27183                                             }
27184                                             unsigned rd =
27185                                                 ExtractQRegister(instr, 22, 12);
27186                                             if ((instr & 1) != 0) {
27187                                               UnallocatedT32(instr);
27188                                               return;
27189                                             }
27190                                             unsigned rm =
27191                                                 ExtractQRegister(instr, 5, 0);
27192                                             // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27193                                             vswp(CurrentCond(),
27194                                                  kDataTypeValueNone,
27195                                                  QRegister(rd),
27196                                                  QRegister(rm));
27197                                           } else {
27198                                             UnallocatedT32(instr);
27199                                           }
27200                                           break;
27201                                         }
27202                                         case 0x00000080: {
27203                                           // 0xffb20080
27204                                           DataType dt = Dt_size_7_Decode(
27205                                               (instr >> 18) & 0x3);
27206                                           if (dt.Is(kDataTypeValueInvalid)) {
27207                                             UnallocatedT32(instr);
27208                                             return;
27209                                           }
27210                                           unsigned rd =
27211                                               ExtractDRegister(instr, 22, 12);
27212                                           unsigned rm =
27213                                               ExtractDRegister(instr, 5, 0);
27214                                           // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27215                                           vtrn(CurrentCond(),
27216                                                dt,
27217                                                DRegister(rd),
27218                                                DRegister(rm));
27219                                           break;
27220                                         }
27221                                         case 0x000000c0: {
27222                                           // 0xffb200c0
27223                                           DataType dt = Dt_size_7_Decode(
27224                                               (instr >> 18) & 0x3);
27225                                           if (dt.Is(kDataTypeValueInvalid)) {
27226                                             UnallocatedT32(instr);
27227                                             return;
27228                                           }
27229                                           if (((instr >> 12) & 1) != 0) {
27230                                             UnallocatedT32(instr);
27231                                             return;
27232                                           }
27233                                           unsigned rd =
27234                                               ExtractQRegister(instr, 22, 12);
27235                                           if ((instr & 1) != 0) {
27236                                             UnallocatedT32(instr);
27237                                             return;
27238                                           }
27239                                           unsigned rm =
27240                                               ExtractQRegister(instr, 5, 0);
27241                                           // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27242                                           vtrn(CurrentCond(),
27243                                                dt,
27244                                                QRegister(rd),
27245                                                QRegister(rm));
27246                                           break;
27247                                         }
27248                                         case 0x00000100: {
27249                                           // 0xffb20100
27250                                           DataType dt = Dt_size_15_Decode(
27251                                               (instr >> 18) & 0x3);
27252                                           if (dt.Is(kDataTypeValueInvalid)) {
27253                                             UnallocatedT32(instr);
27254                                             return;
27255                                           }
27256                                           unsigned rd =
27257                                               ExtractDRegister(instr, 22, 12);
27258                                           unsigned rm =
27259                                               ExtractDRegister(instr, 5, 0);
27260                                           // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27261                                           vuzp(CurrentCond(),
27262                                                dt,
27263                                                DRegister(rd),
27264                                                DRegister(rm));
27265                                           break;
27266                                         }
27267                                         case 0x00000140: {
27268                                           // 0xffb20140
27269                                           DataType dt = Dt_size_7_Decode(
27270                                               (instr >> 18) & 0x3);
27271                                           if (dt.Is(kDataTypeValueInvalid)) {
27272                                             UnallocatedT32(instr);
27273                                             return;
27274                                           }
27275                                           if (((instr >> 12) & 1) != 0) {
27276                                             UnallocatedT32(instr);
27277                                             return;
27278                                           }
27279                                           unsigned rd =
27280                                               ExtractQRegister(instr, 22, 12);
27281                                           if ((instr & 1) != 0) {
27282                                             UnallocatedT32(instr);
27283                                             return;
27284                                           }
27285                                           unsigned rm =
27286                                               ExtractQRegister(instr, 5, 0);
27287                                           // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27288                                           vuzp(CurrentCond(),
27289                                                dt,
27290                                                QRegister(rd),
27291                                                QRegister(rm));
27292                                           break;
27293                                         }
27294                                         case 0x00000180: {
27295                                           // 0xffb20180
27296                                           DataType dt = Dt_size_15_Decode(
27297                                               (instr >> 18) & 0x3);
27298                                           if (dt.Is(kDataTypeValueInvalid)) {
27299                                             UnallocatedT32(instr);
27300                                             return;
27301                                           }
27302                                           unsigned rd =
27303                                               ExtractDRegister(instr, 22, 12);
27304                                           unsigned rm =
27305                                               ExtractDRegister(instr, 5, 0);
27306                                           // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27307                                           vzip(CurrentCond(),
27308                                                dt,
27309                                                DRegister(rd),
27310                                                DRegister(rm));
27311                                           break;
27312                                         }
27313                                         case 0x000001c0: {
27314                                           // 0xffb201c0
27315                                           DataType dt = Dt_size_7_Decode(
27316                                               (instr >> 18) & 0x3);
27317                                           if (dt.Is(kDataTypeValueInvalid)) {
27318                                             UnallocatedT32(instr);
27319                                             return;
27320                                           }
27321                                           if (((instr >> 12) & 1) != 0) {
27322                                             UnallocatedT32(instr);
27323                                             return;
27324                                           }
27325                                           unsigned rd =
27326                                               ExtractQRegister(instr, 22, 12);
27327                                           if ((instr & 1) != 0) {
27328                                             UnallocatedT32(instr);
27329                                             return;
27330                                           }
27331                                           unsigned rm =
27332                                               ExtractQRegister(instr, 5, 0);
27333                                           // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27334                                           vzip(CurrentCond(),
27335                                                dt,
27336                                                QRegister(rd),
27337                                                QRegister(rm));
27338                                           break;
27339                                         }
27340                                         case 0x00000400: {
27341                                           // 0xffb20400
27342                                           DataType dt = Dt_size_16_Decode(
27343                                               (instr >> 18) & 0x3);
27344                                           if (dt.Is(kDataTypeValueInvalid)) {
27345                                             UnallocatedT32(instr);
27346                                             return;
27347                                           }
27348                                           unsigned rd =
27349                                               ExtractDRegister(instr, 22, 12);
27350                                           unsigned rm =
27351                                               ExtractDRegister(instr, 5, 0);
27352                                           // VRINTN{<q>}.<dt> <Dd>, <Dm> ; T1
27353                                           vrintn(dt,
27354                                                  DRegister(rd),
27355                                                  DRegister(rm));
27356                                           break;
27357                                         }
27358                                         case 0x00000440: {
27359                                           // 0xffb20440
27360                                           DataType dt = Dt_size_16_Decode(
27361                                               (instr >> 18) & 0x3);
27362                                           if (dt.Is(kDataTypeValueInvalid)) {
27363                                             UnallocatedT32(instr);
27364                                             return;
27365                                           }
27366                                           if (((instr >> 12) & 1) != 0) {
27367                                             UnallocatedT32(instr);
27368                                             return;
27369                                           }
27370                                           unsigned rd =
27371                                               ExtractQRegister(instr, 22, 12);
27372                                           if ((instr & 1) != 0) {
27373                                             UnallocatedT32(instr);
27374                                             return;
27375                                           }
27376                                           unsigned rm =
27377                                               ExtractQRegister(instr, 5, 0);
27378                                           // VRINTN{<q>}.<dt> <Qd>, <Qm> ; T1
27379                                           vrintn(dt,
27380                                                  QRegister(rd),
27381                                                  QRegister(rm));
27382                                           break;
27383                                         }
27384                                         case 0x00000480: {
27385                                           // 0xffb20480
27386                                           DataType dt = Dt_size_16_Decode(
27387                                               (instr >> 18) & 0x3);
27388                                           if (dt.Is(kDataTypeValueInvalid)) {
27389                                             UnallocatedT32(instr);
27390                                             return;
27391                                           }
27392                                           unsigned rd =
27393                                               ExtractDRegister(instr, 22, 12);
27394                                           unsigned rm =
27395                                               ExtractDRegister(instr, 5, 0);
27396                                           // VRINTX{<q>}.<dt> <Dd>, <Dm> ; T1
27397                                           vrintx(Condition::None(),
27398                                                  dt,
27399                                                  DRegister(rd),
27400                                                  DRegister(rm));
27401                                           break;
27402                                         }
27403                                         case 0x000004c0: {
27404                                           // 0xffb204c0
27405                                           DataType dt = Dt_size_16_Decode(
27406                                               (instr >> 18) & 0x3);
27407                                           if (dt.Is(kDataTypeValueInvalid)) {
27408                                             UnallocatedT32(instr);
27409                                             return;
27410                                           }
27411                                           if (((instr >> 12) & 1) != 0) {
27412                                             UnallocatedT32(instr);
27413                                             return;
27414                                           }
27415                                           unsigned rd =
27416                                               ExtractQRegister(instr, 22, 12);
27417                                           if ((instr & 1) != 0) {
27418                                             UnallocatedT32(instr);
27419                                             return;
27420                                           }
27421                                           unsigned rm =
27422                                               ExtractQRegister(instr, 5, 0);
27423                                           // VRINTX{<q>}.<dt> <Qd>, <Qm> ; T1
27424                                           vrintx(dt,
27425                                                  QRegister(rd),
27426                                                  QRegister(rm));
27427                                           break;
27428                                         }
27429                                         case 0x00000500: {
27430                                           // 0xffb20500
27431                                           DataType dt = Dt_size_16_Decode(
27432                                               (instr >> 18) & 0x3);
27433                                           if (dt.Is(kDataTypeValueInvalid)) {
27434                                             UnallocatedT32(instr);
27435                                             return;
27436                                           }
27437                                           unsigned rd =
27438                                               ExtractDRegister(instr, 22, 12);
27439                                           unsigned rm =
27440                                               ExtractDRegister(instr, 5, 0);
27441                                           // VRINTA{<q>}.<dt> <Dd>, <Dm> ; T1
27442                                           vrinta(dt,
27443                                                  DRegister(rd),
27444                                                  DRegister(rm));
27445                                           break;
27446                                         }
27447                                         case 0x00000540: {
27448                                           // 0xffb20540
27449                                           DataType dt = Dt_size_16_Decode(
27450                                               (instr >> 18) & 0x3);
27451                                           if (dt.Is(kDataTypeValueInvalid)) {
27452                                             UnallocatedT32(instr);
27453                                             return;
27454                                           }
27455                                           if (((instr >> 12) & 1) != 0) {
27456                                             UnallocatedT32(instr);
27457                                             return;
27458                                           }
27459                                           unsigned rd =
27460                                               ExtractQRegister(instr, 22, 12);
27461                                           if ((instr & 1) != 0) {
27462                                             UnallocatedT32(instr);
27463                                             return;
27464                                           }
27465                                           unsigned rm =
27466                                               ExtractQRegister(instr, 5, 0);
27467                                           // VRINTA{<q>}.<dt> <Qd>, <Qm> ; T1
27468                                           vrinta(dt,
27469                                                  QRegister(rd),
27470                                                  QRegister(rm));
27471                                           break;
27472                                         }
27473                                         case 0x00000580: {
27474                                           // 0xffb20580
27475                                           DataType dt = Dt_size_16_Decode(
27476                                               (instr >> 18) & 0x3);
27477                                           if (dt.Is(kDataTypeValueInvalid)) {
27478                                             UnallocatedT32(instr);
27479                                             return;
27480                                           }
27481                                           unsigned rd =
27482                                               ExtractDRegister(instr, 22, 12);
27483                                           unsigned rm =
27484                                               ExtractDRegister(instr, 5, 0);
27485                                           // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; T1
27486                                           vrintz(Condition::None(),
27487                                                  dt,
27488                                                  DRegister(rd),
27489                                                  DRegister(rm));
27490                                           break;
27491                                         }
27492                                         case 0x000005c0: {
27493                                           // 0xffb205c0
27494                                           DataType dt = Dt_size_16_Decode(
27495                                               (instr >> 18) & 0x3);
27496                                           if (dt.Is(kDataTypeValueInvalid)) {
27497                                             UnallocatedT32(instr);
27498                                             return;
27499                                           }
27500                                           if (((instr >> 12) & 1) != 0) {
27501                                             UnallocatedT32(instr);
27502                                             return;
27503                                           }
27504                                           unsigned rd =
27505                                               ExtractQRegister(instr, 22, 12);
27506                                           if ((instr & 1) != 0) {
27507                                             UnallocatedT32(instr);
27508                                             return;
27509                                           }
27510                                           unsigned rm =
27511                                               ExtractQRegister(instr, 5, 0);
27512                                           // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; T1
27513                                           vrintz(dt,
27514                                                  QRegister(rd),
27515                                                  QRegister(rm));
27516                                           break;
27517                                         }
27518                                       }
27519                                       break;
27520                                     }
27521                                     case 0x00020200: {
27522                                       // 0xffb20200
27523                                       switch (instr & 0x00000580) {
27524                                         case 0x00000000: {
27525                                           // 0xffb20200
27526                                           switch (instr & 0x00000040) {
27527                                             case 0x00000000: {
27528                                               // 0xffb20200
27529                                               DataType dt = Dt_size_3_Decode(
27530                                                   (instr >> 18) & 0x3);
27531                                               if (dt.Is(
27532                                                       kDataTypeValueInvalid)) {
27533                                                 UnallocatedT32(instr);
27534                                                 return;
27535                                               }
27536                                               unsigned rd =
27537                                                   ExtractDRegister(instr,
27538                                                                    22,
27539                                                                    12);
27540                                               if ((instr & 1) != 0) {
27541                                                 UnallocatedT32(instr);
27542                                                 return;
27543                                               }
27544                                               unsigned rm =
27545                                                   ExtractQRegister(instr, 5, 0);
27546                                               // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27547                                               vmovn(CurrentCond(),
27548                                                     dt,
27549                                                     DRegister(rd),
27550                                                     QRegister(rm));
27551                                               break;
27552                                             }
27553                                             case 0x00000040: {
27554                                               // 0xffb20240
27555                                               DataType dt = Dt_size_14_Decode(
27556                                                   (instr >> 18) & 0x3);
27557                                               if (dt.Is(
27558                                                       kDataTypeValueInvalid)) {
27559                                                 UnallocatedT32(instr);
27560                                                 return;
27561                                               }
27562                                               unsigned rd =
27563                                                   ExtractDRegister(instr,
27564                                                                    22,
27565                                                                    12);
27566                                               if ((instr & 1) != 0) {
27567                                                 UnallocatedT32(instr);
27568                                                 return;
27569                                               }
27570                                               unsigned rm =
27571                                                   ExtractQRegister(instr, 5, 0);
27572                                               // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27573                                               vqmovun(CurrentCond(),
27574                                                       dt,
27575                                                       DRegister(rd),
27576                                                       QRegister(rm));
27577                                               break;
27578                                             }
27579                                           }
27580                                           break;
27581                                         }
27582                                         case 0x00000080: {
27583                                           // 0xffb20280
27584                                           DataType dt = Dt_op_size_3_Decode(
27585                                               ((instr >> 18) & 0x3) |
27586                                               ((instr >> 4) & 0x4));
27587                                           if (dt.Is(kDataTypeValueInvalid)) {
27588                                             UnallocatedT32(instr);
27589                                             return;
27590                                           }
27591                                           unsigned rd =
27592                                               ExtractDRegister(instr, 22, 12);
27593                                           if ((instr & 1) != 0) {
27594                                             UnallocatedT32(instr);
27595                                             return;
27596                                           }
27597                                           unsigned rm =
27598                                               ExtractQRegister(instr, 5, 0);
27599                                           // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27600                                           vqmovn(CurrentCond(),
27601                                                  dt,
27602                                                  DRegister(rd),
27603                                                  QRegister(rm));
27604                                           break;
27605                                         }
27606                                         case 0x00000100: {
27607                                           // 0xffb20300
27608                                           if ((instr & 0x00000040) ==
27609                                               0x00000000) {
27610                                             DataType dt = Dt_size_17_Decode(
27611                                                 (instr >> 18) & 0x3);
27612                                             if (dt.Is(kDataTypeValueInvalid)) {
27613                                               UnallocatedT32(instr);
27614                                               return;
27615                                             }
27616                                             if (((instr >> 12) & 1) != 0) {
27617                                               UnallocatedT32(instr);
27618                                               return;
27619                                             }
27620                                             unsigned rd =
27621                                                 ExtractQRegister(instr, 22, 12);
27622                                             unsigned rm =
27623                                                 ExtractDRegister(instr, 5, 0);
27624                                             uint32_t imm = dt.GetSize();
27625                                             // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length)
27626                                             vshll(CurrentCond(),
27627                                                   dt,
27628                                                   QRegister(rd),
27629                                                   DRegister(rm),
27630                                                   imm);
27631                                           } else {
27632                                             UnallocatedT32(instr);
27633                                           }
27634                                           break;
27635                                         }
27636                                         case 0x00000180: {
27637                                           // 0xffb20380
27638                                           switch (instr & 0x000c0040) {
27639                                             case 0x00080000: {
27640                                               // 0xffba0380
27641                                               UnimplementedT32_32("SHA1SU1",
27642                                                                   instr);
27643                                               break;
27644                                             }
27645                                             case 0x00080040: {
27646                                               // 0xffba03c0
27647                                               UnimplementedT32_32("SHA256SU0",
27648                                                                   instr);
27649                                               break;
27650                                             }
27651                                             default:
27652                                               UnallocatedT32(instr);
27653                                               break;
27654                                           }
27655                                           break;
27656                                         }
27657                                         case 0x00000400: {
27658                                           // 0xffb20600
27659                                           if ((instr & 0x000c0040) ==
27660                                               0x00040000) {
27661                                             unsigned rd =
27662                                                 ExtractDRegister(instr, 22, 12);
27663                                             if ((instr & 1) != 0) {
27664                                               UnallocatedT32(instr);
27665                                               return;
27666                                             }
27667                                             unsigned rm =
27668                                                 ExtractQRegister(instr, 5, 0);
27669                                             // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27670                                             vcvt(CurrentCond(),
27671                                                  F16,
27672                                                  F32,
27673                                                  DRegister(rd),
27674                                                  QRegister(rm));
27675                                           } else {
27676                                             UnallocatedT32(instr);
27677                                           }
27678                                           break;
27679                                         }
27680                                         case 0x00000480: {
27681                                           // 0xffb20680
27682                                           switch (instr & 0x00000040) {
27683                                             case 0x00000000: {
27684                                               // 0xffb20680
27685                                               DataType dt = Dt_size_16_Decode(
27686                                                   (instr >> 18) & 0x3);
27687                                               if (dt.Is(
27688                                                       kDataTypeValueInvalid)) {
27689                                                 UnallocatedT32(instr);
27690                                                 return;
27691                                               }
27692                                               unsigned rd =
27693                                                   ExtractDRegister(instr,
27694                                                                    22,
27695                                                                    12);
27696                                               unsigned rm =
27697                                                   ExtractDRegister(instr, 5, 0);
27698                                               // VRINTM{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27699                                               vrintm(dt,
27700                                                      DRegister(rd),
27701                                                      DRegister(rm));
27702                                               break;
27703                                             }
27704                                             case 0x00000040: {
27705                                               // 0xffb206c0
27706                                               DataType dt = Dt_size_16_Decode(
27707                                                   (instr >> 18) & 0x3);
27708                                               if (dt.Is(
27709                                                       kDataTypeValueInvalid)) {
27710                                                 UnallocatedT32(instr);
27711                                                 return;
27712                                               }
27713                                               if (((instr >> 12) & 1) != 0) {
27714                                                 UnallocatedT32(instr);
27715                                                 return;
27716                                               }
27717                                               unsigned rd =
27718                                                   ExtractQRegister(instr,
27719                                                                    22,
27720                                                                    12);
27721                                               if ((instr & 1) != 0) {
27722                                                 UnallocatedT32(instr);
27723                                                 return;
27724                                               }
27725                                               unsigned rm =
27726                                                   ExtractQRegister(instr, 5, 0);
27727                                               // VRINTM{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27728                                               vrintm(dt,
27729                                                      QRegister(rd),
27730                                                      QRegister(rm));
27731                                               break;
27732                                             }
27733                                           }
27734                                           break;
27735                                         }
27736                                         case 0x00000500: {
27737                                           // 0xffb20700
27738                                           if ((instr & 0x000c0040) ==
27739                                               0x00040000) {
27740                                             if (((instr >> 12) & 1) != 0) {
27741                                               UnallocatedT32(instr);
27742                                               return;
27743                                             }
27744                                             unsigned rd =
27745                                                 ExtractQRegister(instr, 22, 12);
27746                                             unsigned rm =
27747                                                 ExtractDRegister(instr, 5, 0);
27748                                             // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27749                                             vcvt(CurrentCond(),
27750                                                  F32,
27751                                                  F16,
27752                                                  QRegister(rd),
27753                                                  DRegister(rm));
27754                                           } else {
27755                                             UnallocatedT32(instr);
27756                                           }
27757                                           break;
27758                                         }
27759                                         case 0x00000580: {
27760                                           // 0xffb20780
27761                                           switch (instr & 0x00000040) {
27762                                             case 0x00000000: {
27763                                               // 0xffb20780
27764                                               DataType dt = Dt_size_16_Decode(
27765                                                   (instr >> 18) & 0x3);
27766                                               if (dt.Is(
27767                                                       kDataTypeValueInvalid)) {
27768                                                 UnallocatedT32(instr);
27769                                                 return;
27770                                               }
27771                                               unsigned rd =
27772                                                   ExtractDRegister(instr,
27773                                                                    22,
27774                                                                    12);
27775                                               unsigned rm =
27776                                                   ExtractDRegister(instr, 5, 0);
27777                                               // VRINTP{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27778                                               vrintp(dt,
27779                                                      DRegister(rd),
27780                                                      DRegister(rm));
27781                                               break;
27782                                             }
27783                                             case 0x00000040: {
27784                                               // 0xffb207c0
27785                                               DataType dt = Dt_size_16_Decode(
27786                                                   (instr >> 18) & 0x3);
27787                                               if (dt.Is(
27788                                                       kDataTypeValueInvalid)) {
27789                                                 UnallocatedT32(instr);
27790                                                 return;
27791                                               }
27792                                               if (((instr >> 12) & 1) != 0) {
27793                                                 UnallocatedT32(instr);
27794                                                 return;
27795                                               }
27796                                               unsigned rd =
27797                                                   ExtractQRegister(instr,
27798                                                                    22,
27799                                                                    12);
27800                                               if ((instr & 1) != 0) {
27801                                                 UnallocatedT32(instr);
27802                                                 return;
27803                                               }
27804                                               unsigned rm =
27805                                                   ExtractQRegister(instr, 5, 0);
27806                                               // VRINTP{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27807                                               vrintp(dt,
27808                                                      QRegister(rd),
27809                                                      QRegister(rm));
27810                                               break;
27811                                             }
27812                                           }
27813                                           break;
27814                                         }
27815                                       }
27816                                       break;
27817                                     }
27818                                     case 0x00030000: {
27819                                       // 0xffb30000
27820                                       switch (instr & 0x00000440) {
27821                                         case 0x00000000: {
27822                                           // 0xffb30000
27823                                           switch (instr & 0x000c0100) {
27824                                             case 0x00080000: {
27825                                               // 0xffbb0000
27826                                               DataType dt = Dt_op_3_Decode(
27827                                                   (instr >> 7) & 0x1);
27828                                               if (dt.Is(
27829                                                       kDataTypeValueInvalid)) {
27830                                                 UnallocatedT32(instr);
27831                                                 return;
27832                                               }
27833                                               unsigned rd =
27834                                                   ExtractDRegister(instr,
27835                                                                    22,
27836                                                                    12);
27837                                               unsigned rm =
27838                                                   ExtractDRegister(instr, 5, 0);
27839                                               // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27840                                               vcvta(dt,
27841                                                     F32,
27842                                                     DRegister(rd),
27843                                                     DRegister(rm));
27844                                               break;
27845                                             }
27846                                             case 0x00080100: {
27847                                               // 0xffbb0100
27848                                               DataType dt = Dt_op_3_Decode(
27849                                                   (instr >> 7) & 0x1);
27850                                               if (dt.Is(
27851                                                       kDataTypeValueInvalid)) {
27852                                                 UnallocatedT32(instr);
27853                                                 return;
27854                                               }
27855                                               unsigned rd =
27856                                                   ExtractDRegister(instr,
27857                                                                    22,
27858                                                                    12);
27859                                               unsigned rm =
27860                                                   ExtractDRegister(instr, 5, 0);
27861                                               // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27862                                               vcvtn(dt,
27863                                                     F32,
27864                                                     DRegister(rd),
27865                                                     DRegister(rm));
27866                                               break;
27867                                             }
27868                                             default:
27869                                               UnallocatedT32(instr);
27870                                               break;
27871                                           }
27872                                           break;
27873                                         }
27874                                         case 0x00000040: {
27875                                           // 0xffb30040
27876                                           switch (instr & 0x000c0100) {
27877                                             case 0x00080000: {
27878                                               // 0xffbb0040
27879                                               DataType dt = Dt_op_3_Decode(
27880                                                   (instr >> 7) & 0x1);
27881                                               if (dt.Is(
27882                                                       kDataTypeValueInvalid)) {
27883                                                 UnallocatedT32(instr);
27884                                                 return;
27885                                               }
27886                                               if (((instr >> 12) & 1) != 0) {
27887                                                 UnallocatedT32(instr);
27888                                                 return;
27889                                               }
27890                                               unsigned rd =
27891                                                   ExtractQRegister(instr,
27892                                                                    22,
27893                                                                    12);
27894                                               if ((instr & 1) != 0) {
27895                                                 UnallocatedT32(instr);
27896                                                 return;
27897                                               }
27898                                               unsigned rm =
27899                                                   ExtractQRegister(instr, 5, 0);
27900                                               // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27901                                               vcvta(dt,
27902                                                     F32,
27903                                                     QRegister(rd),
27904                                                     QRegister(rm));
27905                                               break;
27906                                             }
27907                                             case 0x00080100: {
27908                                               // 0xffbb0140
27909                                               DataType dt = Dt_op_3_Decode(
27910                                                   (instr >> 7) & 0x1);
27911                                               if (dt.Is(
27912                                                       kDataTypeValueInvalid)) {
27913                                                 UnallocatedT32(instr);
27914                                                 return;
27915                                               }
27916                                               if (((instr >> 12) & 1) != 0) {
27917                                                 UnallocatedT32(instr);
27918                                                 return;
27919                                               }
27920                                               unsigned rd =
27921                                                   ExtractQRegister(instr,
27922                                                                    22,
27923                                                                    12);
27924                                               if ((instr & 1) != 0) {
27925                                                 UnallocatedT32(instr);
27926                                                 return;
27927                                               }
27928                                               unsigned rm =
27929                                                   ExtractQRegister(instr, 5, 0);
27930                                               // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27931                                               vcvtn(dt,
27932                                                     F32,
27933                                                     QRegister(rd),
27934                                                     QRegister(rm));
27935                                               break;
27936                                             }
27937                                             default:
27938                                               UnallocatedT32(instr);
27939                                               break;
27940                                           }
27941                                           break;
27942                                         }
27943                                         case 0x00000400: {
27944                                           // 0xffb30400
27945                                           switch (instr & 0x00000080) {
27946                                             case 0x00000000: {
27947                                               // 0xffb30400
27948                                               DataType dt = Dt_F_size_4_Decode(
27949                                                   ((instr >> 18) & 0x3) |
27950                                                   ((instr >> 6) & 0x4));
27951                                               if (dt.Is(
27952                                                       kDataTypeValueInvalid)) {
27953                                                 UnallocatedT32(instr);
27954                                                 return;
27955                                               }
27956                                               unsigned rd =
27957                                                   ExtractDRegister(instr,
27958                                                                    22,
27959                                                                    12);
27960                                               unsigned rm =
27961                                                   ExtractDRegister(instr, 5, 0);
27962                                               // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27963                                               vrecpe(CurrentCond(),
27964                                                      dt,
27965                                                      DRegister(rd),
27966                                                      DRegister(rm));
27967                                               break;
27968                                             }
27969                                             case 0x00000080: {
27970                                               // 0xffb30480
27971                                               DataType dt = Dt_F_size_4_Decode(
27972                                                   ((instr >> 18) & 0x3) |
27973                                                   ((instr >> 6) & 0x4));
27974                                               if (dt.Is(
27975                                                       kDataTypeValueInvalid)) {
27976                                                 UnallocatedT32(instr);
27977                                                 return;
27978                                               }
27979                                               unsigned rd =
27980                                                   ExtractDRegister(instr,
27981                                                                    22,
27982                                                                    12);
27983                                               unsigned rm =
27984                                                   ExtractDRegister(instr, 5, 0);
27985                                               // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27986                                               vrsqrte(CurrentCond(),
27987                                                       dt,
27988                                                       DRegister(rd),
27989                                                       DRegister(rm));
27990                                               break;
27991                                             }
27992                                           }
27993                                           break;
27994                                         }
27995                                         case 0x00000440: {
27996                                           // 0xffb30440
27997                                           switch (instr & 0x00000080) {
27998                                             case 0x00000000: {
27999                                               // 0xffb30440
28000                                               DataType dt = Dt_F_size_4_Decode(
28001                                                   ((instr >> 18) & 0x3) |
28002                                                   ((instr >> 6) & 0x4));
28003                                               if (dt.Is(
28004                                                       kDataTypeValueInvalid)) {
28005                                                 UnallocatedT32(instr);
28006                                                 return;
28007                                               }
28008                                               if (((instr >> 12) & 1) != 0) {
28009                                                 UnallocatedT32(instr);
28010                                                 return;
28011                                               }
28012                                               unsigned rd =
28013                                                   ExtractQRegister(instr,
28014                                                                    22,
28015                                                                    12);
28016                                               if ((instr & 1) != 0) {
28017                                                 UnallocatedT32(instr);
28018                                                 return;
28019                                               }
28020                                               unsigned rm =
28021                                                   ExtractQRegister(instr, 5, 0);
28022                                               // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28023                                               vrecpe(CurrentCond(),
28024                                                      dt,
28025                                                      QRegister(rd),
28026                                                      QRegister(rm));
28027                                               break;
28028                                             }
28029                                             case 0x00000080: {
28030                                               // 0xffb304c0
28031                                               DataType dt = Dt_F_size_4_Decode(
28032                                                   ((instr >> 18) & 0x3) |
28033                                                   ((instr >> 6) & 0x4));
28034                                               if (dt.Is(
28035                                                       kDataTypeValueInvalid)) {
28036                                                 UnallocatedT32(instr);
28037                                                 return;
28038                                               }
28039                                               if (((instr >> 12) & 1) != 0) {
28040                                                 UnallocatedT32(instr);
28041                                                 return;
28042                                               }
28043                                               unsigned rd =
28044                                                   ExtractQRegister(instr,
28045                                                                    22,
28046                                                                    12);
28047                                               if ((instr & 1) != 0) {
28048                                                 UnallocatedT32(instr);
28049                                                 return;
28050                                               }
28051                                               unsigned rm =
28052                                                   ExtractQRegister(instr, 5, 0);
28053                                               // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28054                                               vrsqrte(CurrentCond(),
28055                                                       dt,
28056                                                       QRegister(rd),
28057                                                       QRegister(rm));
28058                                               break;
28059                                             }
28060                                           }
28061                                           break;
28062                                         }
28063                                       }
28064                                       break;
28065                                     }
28066                                     case 0x00030200: {
28067                                       // 0xffb30200
28068                                       switch (instr & 0x000c0440) {
28069                                         case 0x00080000: {
28070                                           // 0xffbb0200
28071                                           switch (instr & 0x00000100) {
28072                                             case 0x00000000: {
28073                                               // 0xffbb0200
28074                                               DataType dt = Dt_op_3_Decode(
28075                                                   (instr >> 7) & 0x1);
28076                                               if (dt.Is(
28077                                                       kDataTypeValueInvalid)) {
28078                                                 UnallocatedT32(instr);
28079                                                 return;
28080                                               }
28081                                               unsigned rd =
28082                                                   ExtractDRegister(instr,
28083                                                                    22,
28084                                                                    12);
28085                                               unsigned rm =
28086                                                   ExtractDRegister(instr, 5, 0);
28087                                               // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28088                                               vcvtp(dt,
28089                                                     F32,
28090                                                     DRegister(rd),
28091                                                     DRegister(rm));
28092                                               break;
28093                                             }
28094                                             case 0x00000100: {
28095                                               // 0xffbb0300
28096                                               DataType dt = Dt_op_3_Decode(
28097                                                   (instr >> 7) & 0x1);
28098                                               if (dt.Is(
28099                                                       kDataTypeValueInvalid)) {
28100                                                 UnallocatedT32(instr);
28101                                                 return;
28102                                               }
28103                                               unsigned rd =
28104                                                   ExtractDRegister(instr,
28105                                                                    22,
28106                                                                    12);
28107                                               unsigned rm =
28108                                                   ExtractDRegister(instr, 5, 0);
28109                                               // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28110                                               vcvtm(dt,
28111                                                     F32,
28112                                                     DRegister(rd),
28113                                                     DRegister(rm));
28114                                               break;
28115                                             }
28116                                           }
28117                                           break;
28118                                         }
28119                                         case 0x00080040: {
28120                                           // 0xffbb0240
28121                                           switch (instr & 0x00000100) {
28122                                             case 0x00000000: {
28123                                               // 0xffbb0240
28124                                               DataType dt = Dt_op_3_Decode(
28125                                                   (instr >> 7) & 0x1);
28126                                               if (dt.Is(
28127                                                       kDataTypeValueInvalid)) {
28128                                                 UnallocatedT32(instr);
28129                                                 return;
28130                                               }
28131                                               if (((instr >> 12) & 1) != 0) {
28132                                                 UnallocatedT32(instr);
28133                                                 return;
28134                                               }
28135                                               unsigned rd =
28136                                                   ExtractQRegister(instr,
28137                                                                    22,
28138                                                                    12);
28139                                               if ((instr & 1) != 0) {
28140                                                 UnallocatedT32(instr);
28141                                                 return;
28142                                               }
28143                                               unsigned rm =
28144                                                   ExtractQRegister(instr, 5, 0);
28145                                               // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28146                                               vcvtp(dt,
28147                                                     F32,
28148                                                     QRegister(rd),
28149                                                     QRegister(rm));
28150                                               break;
28151                                             }
28152                                             case 0x00000100: {
28153                                               // 0xffbb0340
28154                                               DataType dt = Dt_op_3_Decode(
28155                                                   (instr >> 7) & 0x1);
28156                                               if (dt.Is(
28157                                                       kDataTypeValueInvalid)) {
28158                                                 UnallocatedT32(instr);
28159                                                 return;
28160                                               }
28161                                               if (((instr >> 12) & 1) != 0) {
28162                                                 UnallocatedT32(instr);
28163                                                 return;
28164                                               }
28165                                               unsigned rd =
28166                                                   ExtractQRegister(instr,
28167                                                                    22,
28168                                                                    12);
28169                                               if ((instr & 1) != 0) {
28170                                                 UnallocatedT32(instr);
28171                                                 return;
28172                                               }
28173                                               unsigned rm =
28174                                                   ExtractQRegister(instr, 5, 0);
28175                                               // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28176                                               vcvtm(dt,
28177                                                     F32,
28178                                                     QRegister(rd),
28179                                                     QRegister(rm));
28180                                               break;
28181                                             }
28182                                           }
28183                                           break;
28184                                         }
28185                                         case 0x00080400: {
28186                                           // 0xffbb0600
28187                                           DataType dt1 = Dt_op_1_Decode1(
28188                                               (instr >> 7) & 0x3);
28189                                           if (dt1.Is(kDataTypeValueInvalid)) {
28190                                             UnallocatedT32(instr);
28191                                             return;
28192                                           }
28193                                           DataType dt2 = Dt_op_1_Decode2(
28194                                               (instr >> 7) & 0x3);
28195                                           if (dt2.Is(kDataTypeValueInvalid)) {
28196                                             UnallocatedT32(instr);
28197                                             return;
28198                                           }
28199                                           unsigned rd =
28200                                               ExtractDRegister(instr, 22, 12);
28201                                           unsigned rm =
28202                                               ExtractDRegister(instr, 5, 0);
28203                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28204                                           vcvt(CurrentCond(),
28205                                                dt1,
28206                                                dt2,
28207                                                DRegister(rd),
28208                                                DRegister(rm));
28209                                           break;
28210                                         }
28211                                         case 0x00080440: {
28212                                           // 0xffbb0640
28213                                           DataType dt1 = Dt_op_1_Decode1(
28214                                               (instr >> 7) & 0x3);
28215                                           if (dt1.Is(kDataTypeValueInvalid)) {
28216                                             UnallocatedT32(instr);
28217                                             return;
28218                                           }
28219                                           DataType dt2 = Dt_op_1_Decode2(
28220                                               (instr >> 7) & 0x3);
28221                                           if (dt2.Is(kDataTypeValueInvalid)) {
28222                                             UnallocatedT32(instr);
28223                                             return;
28224                                           }
28225                                           if (((instr >> 12) & 1) != 0) {
28226                                             UnallocatedT32(instr);
28227                                             return;
28228                                           }
28229                                           unsigned rd =
28230                                               ExtractQRegister(instr, 22, 12);
28231                                           if ((instr & 1) != 0) {
28232                                             UnallocatedT32(instr);
28233                                             return;
28234                                           }
28235                                           unsigned rm =
28236                                               ExtractQRegister(instr, 5, 0);
28237                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28238                                           vcvt(CurrentCond(),
28239                                                dt1,
28240                                                dt2,
28241                                                QRegister(rd),
28242                                                QRegister(rm));
28243                                           break;
28244                                         }
28245                                         default:
28246                                           UnallocatedT32(instr);
28247                                           break;
28248                                       }
28249                                       break;
28250                                     }
28251                                   }
28252                                   break;
28253                                 }
28254                                 case 0x00000800: {
28255                                   // 0xffb00800
28256                                   switch (instr & 0x00000440) {
28257                                     case 0x00000000: {
28258                                       // 0xffb00800
28259                                       unsigned rd =
28260                                           ExtractDRegister(instr, 22, 12);
28261                                       unsigned first =
28262                                           ExtractDRegister(instr, 7, 16);
28263                                       unsigned length;
28264                                       SpacingType spacing = kSingle;
28265                                       switch ((instr >> 8) & 0x3) {
28266                                         default:
28267                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
28268                                         case 0x0:
28269                                           length = 1;
28270                                           break;
28271                                         case 0x1:
28272                                           length = 2;
28273                                           break;
28274                                         case 0x2:
28275                                           length = 3;
28276                                           break;
28277                                         case 0x3:
28278                                           length = 4;
28279                                           break;
28280                                       }
28281                                       unsigned last = first + length - 1;
28282                                       TransferType transfer = kMultipleLanes;
28283                                       unsigned rm =
28284                                           ExtractDRegister(instr, 5, 0);
28285                                       // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
28286                                       vtbl(CurrentCond(),
28287                                            Untyped8,
28288                                            DRegister(rd),
28289                                            NeonRegisterList(DRegister(first),
28290                                                             DRegister(last),
28291                                                             spacing,
28292                                                             transfer),
28293                                            DRegister(rm));
28294                                       break;
28295                                     }
28296                                     case 0x00000040: {
28297                                       // 0xffb00840
28298                                       unsigned rd =
28299                                           ExtractDRegister(instr, 22, 12);
28300                                       unsigned first =
28301                                           ExtractDRegister(instr, 7, 16);
28302                                       unsigned length;
28303                                       SpacingType spacing = kSingle;
28304                                       switch ((instr >> 8) & 0x3) {
28305                                         default:
28306                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
28307                                         case 0x0:
28308                                           length = 1;
28309                                           break;
28310                                         case 0x1:
28311                                           length = 2;
28312                                           break;
28313                                         case 0x2:
28314                                           length = 3;
28315                                           break;
28316                                         case 0x3:
28317                                           length = 4;
28318                                           break;
28319                                       }
28320                                       unsigned last = first + length - 1;
28321                                       TransferType transfer = kMultipleLanes;
28322                                       unsigned rm =
28323                                           ExtractDRegister(instr, 5, 0);
28324                                       // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
28325                                       vtbx(CurrentCond(),
28326                                            Untyped8,
28327                                            DRegister(rd),
28328                                            NeonRegisterList(DRegister(first),
28329                                                             DRegister(last),
28330                                                             spacing,
28331                                                             transfer),
28332                                            DRegister(rm));
28333                                       break;
28334                                     }
28335                                     case 0x00000400: {
28336                                       // 0xffb00c00
28337                                       if ((instr & 0x00000380) == 0x00000000) {
28338                                         unsigned lane;
28339                                         DataType dt =
28340                                             Dt_imm4_1_Decode((instr >> 16) &
28341                                                                  0xf,
28342                                                              &lane);
28343                                         if (dt.Is(kDataTypeValueInvalid)) {
28344                                           UnallocatedT32(instr);
28345                                           return;
28346                                         }
28347                                         unsigned rd =
28348                                             ExtractDRegister(instr, 22, 12);
28349                                         unsigned rm =
28350                                             ExtractDRegister(instr, 5, 0);
28351                                         // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28352                                         vdup(CurrentCond(),
28353                                              dt,
28354                                              DRegister(rd),
28355                                              DRegisterLane(rm, lane));
28356                                       } else {
28357                                         UnallocatedT32(instr);
28358                                       }
28359                                       break;
28360                                     }
28361                                     case 0x00000440: {
28362                                       // 0xffb00c40
28363                                       if ((instr & 0x00000380) == 0x00000000) {
28364                                         unsigned lane;
28365                                         DataType dt =
28366                                             Dt_imm4_1_Decode((instr >> 16) &
28367                                                                  0xf,
28368                                                              &lane);
28369                                         if (dt.Is(kDataTypeValueInvalid)) {
28370                                           UnallocatedT32(instr);
28371                                           return;
28372                                         }
28373                                         if (((instr >> 12) & 1) != 0) {
28374                                           UnallocatedT32(instr);
28375                                           return;
28376                                         }
28377                                         unsigned rd =
28378                                             ExtractQRegister(instr, 22, 12);
28379                                         unsigned rm =
28380                                             ExtractDRegister(instr, 5, 0);
28381                                         // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28382                                         vdup(CurrentCond(),
28383                                              dt,
28384                                              QRegister(rd),
28385                                              DRegisterLane(rm, lane));
28386                                       } else {
28387                                         UnallocatedT32(instr);
28388                                       }
28389                                       break;
28390                                     }
28391                                   }
28392                                   break;
28393                                 }
28394                               }
28395                               break;
28396                             }
28397                           }
28398                           break;
28399                         }
28400                         default: {
28401                           switch (instr & 0x00000c40) {
28402                             case 0x00000000: {
28403                               // 0xef800000
28404                               switch (instr & 0x00000300) {
28405                                 case 0x00000000: {
28406                                   // 0xef800000
28407                                   if (((instr & 0x300000) == 0x300000)) {
28408                                     UnallocatedT32(instr);
28409                                     return;
28410                                   }
28411                                   DataType dt =
28412                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28413                                                          ((instr >> 26) & 0x4));
28414                                   if (dt.Is(kDataTypeValueInvalid)) {
28415                                     UnallocatedT32(instr);
28416                                     return;
28417                                   }
28418                                   if (((instr >> 12) & 1) != 0) {
28419                                     UnallocatedT32(instr);
28420                                     return;
28421                                   }
28422                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28423                                   unsigned rn = ExtractDRegister(instr, 7, 16);
28424                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28425                                   // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28426                                   vaddl(CurrentCond(),
28427                                         dt,
28428                                         QRegister(rd),
28429                                         DRegister(rn),
28430                                         DRegister(rm));
28431                                   break;
28432                                 }
28433                                 case 0x00000100: {
28434                                   // 0xef800100
28435                                   if (((instr & 0x300000) == 0x300000)) {
28436                                     UnallocatedT32(instr);
28437                                     return;
28438                                   }
28439                                   DataType dt =
28440                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28441                                                          ((instr >> 26) & 0x4));
28442                                   if (dt.Is(kDataTypeValueInvalid)) {
28443                                     UnallocatedT32(instr);
28444                                     return;
28445                                   }
28446                                   if (((instr >> 12) & 1) != 0) {
28447                                     UnallocatedT32(instr);
28448                                     return;
28449                                   }
28450                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28451                                   if (((instr >> 16) & 1) != 0) {
28452                                     UnallocatedT32(instr);
28453                                     return;
28454                                   }
28455                                   unsigned rn = ExtractQRegister(instr, 7, 16);
28456                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28457                                   // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
28458                                   vaddw(CurrentCond(),
28459                                         dt,
28460                                         QRegister(rd),
28461                                         QRegister(rn),
28462                                         DRegister(rm));
28463                                   break;
28464                                 }
28465                                 case 0x00000200: {
28466                                   // 0xef800200
28467                                   if (((instr & 0x300000) == 0x300000)) {
28468                                     UnallocatedT32(instr);
28469                                     return;
28470                                   }
28471                                   DataType dt =
28472                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28473                                                          ((instr >> 26) & 0x4));
28474                                   if (dt.Is(kDataTypeValueInvalid)) {
28475                                     UnallocatedT32(instr);
28476                                     return;
28477                                   }
28478                                   if (((instr >> 12) & 1) != 0) {
28479                                     UnallocatedT32(instr);
28480                                     return;
28481                                   }
28482                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28483                                   unsigned rn = ExtractDRegister(instr, 7, 16);
28484                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28485                                   // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28486                                   vsubl(CurrentCond(),
28487                                         dt,
28488                                         QRegister(rd),
28489                                         DRegister(rn),
28490                                         DRegister(rm));
28491                                   break;
28492                                 }
28493                                 case 0x00000300: {
28494                                   // 0xef800300
28495                                   if (((instr & 0x300000) == 0x300000)) {
28496                                     UnallocatedT32(instr);
28497                                     return;
28498                                   }
28499                                   DataType dt =
28500                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28501                                                          ((instr >> 26) & 0x4));
28502                                   if (dt.Is(kDataTypeValueInvalid)) {
28503                                     UnallocatedT32(instr);
28504                                     return;
28505                                   }
28506                                   if (((instr >> 12) & 1) != 0) {
28507                                     UnallocatedT32(instr);
28508                                     return;
28509                                   }
28510                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28511                                   if (((instr >> 16) & 1) != 0) {
28512                                     UnallocatedT32(instr);
28513                                     return;
28514                                   }
28515                                   unsigned rn = ExtractQRegister(instr, 7, 16);
28516                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28517                                   // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
28518                                   vsubw(CurrentCond(),
28519                                         dt,
28520                                         QRegister(rd),
28521                                         QRegister(rn),
28522                                         DRegister(rm));
28523                                   break;
28524                                 }
28525                               }
28526                               break;
28527                             }
28528                             case 0x00000040: {
28529                               // 0xef800040
28530                               switch (instr & 0x00000200) {
28531                                 case 0x00000000: {
28532                                   // 0xef800040
28533                                   switch (instr & 0x10000000) {
28534                                     case 0x00000000: {
28535                                       // 0xef800040
28536                                       if (((instr & 0x300000) == 0x300000)) {
28537                                         UnallocatedT32(instr);
28538                                         return;
28539                                       }
28540                                       DataType dt =
28541                                           Dt_size_9_Decode((instr >> 20) & 0x3,
28542                                                            (instr >> 8) & 0x1);
28543                                       if (dt.Is(kDataTypeValueInvalid)) {
28544                                         UnallocatedT32(instr);
28545                                         return;
28546                                       }
28547                                       unsigned rd =
28548                                           ExtractDRegister(instr, 22, 12);
28549                                       unsigned rn =
28550                                           ExtractDRegister(instr, 7, 16);
28551                                       int lane;
28552                                       unsigned rm =
28553                                           ExtractDRegisterAndLane(instr,
28554                                                                   dt,
28555                                                                   5,
28556                                                                   0,
28557                                                                   &lane);
28558                                       // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28559                                       vmla(CurrentCond(),
28560                                            dt,
28561                                            DRegister(rd),
28562                                            DRegister(rn),
28563                                            DRegisterLane(rm, lane));
28564                                       break;
28565                                     }
28566                                     case 0x10000000: {
28567                                       // 0xff800040
28568                                       if (((instr & 0x300000) == 0x300000)) {
28569                                         UnallocatedT32(instr);
28570                                         return;
28571                                       }
28572                                       DataType dt =
28573                                           Dt_size_9_Decode((instr >> 20) & 0x3,
28574                                                            (instr >> 8) & 0x1);
28575                                       if (dt.Is(kDataTypeValueInvalid)) {
28576                                         UnallocatedT32(instr);
28577                                         return;
28578                                       }
28579                                       if (((instr >> 12) & 1) != 0) {
28580                                         UnallocatedT32(instr);
28581                                         return;
28582                                       }
28583                                       unsigned rd =
28584                                           ExtractQRegister(instr, 22, 12);
28585                                       if (((instr >> 16) & 1) != 0) {
28586                                         UnallocatedT32(instr);
28587                                         return;
28588                                       }
28589                                       unsigned rn =
28590                                           ExtractQRegister(instr, 7, 16);
28591                                       int lane;
28592                                       unsigned rm =
28593                                           ExtractDRegisterAndLane(instr,
28594                                                                   dt,
28595                                                                   5,
28596                                                                   0,
28597                                                                   &lane);
28598                                       // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28599                                       vmla(CurrentCond(),
28600                                            dt,
28601                                            QRegister(rd),
28602                                            QRegister(rn),
28603                                            DRegisterLane(rm, lane));
28604                                       break;
28605                                     }
28606                                   }
28607                                   break;
28608                                 }
28609                                 case 0x00000200: {
28610                                   // 0xef800240
28611                                   switch (instr & 0x00000100) {
28612                                     case 0x00000000: {
28613                                       // 0xef800240
28614                                       if (((instr & 0x300000) == 0x300000)) {
28615                                         UnallocatedT32(instr);
28616                                         return;
28617                                       }
28618                                       DataType dt =
28619                                           Dt_size_11_Decode((instr >> 20) & 0x3,
28620                                                             (instr >> 28) &
28621                                                                 0x1);
28622                                       if (dt.Is(kDataTypeValueInvalid)) {
28623                                         UnallocatedT32(instr);
28624                                         return;
28625                                       }
28626                                       if (((instr >> 12) & 1) != 0) {
28627                                         UnallocatedT32(instr);
28628                                         return;
28629                                       }
28630                                       unsigned rd =
28631                                           ExtractQRegister(instr, 22, 12);
28632                                       unsigned rn =
28633                                           ExtractDRegister(instr, 7, 16);
28634                                       int lane;
28635                                       unsigned rm =
28636                                           ExtractDRegisterAndLane(instr,
28637                                                                   dt,
28638                                                                   5,
28639                                                                   0,
28640                                                                   &lane);
28641                                       // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28642                                       vmlal(CurrentCond(),
28643                                             dt,
28644                                             QRegister(rd),
28645                                             DRegister(rn),
28646                                             DRegisterLane(rm, lane));
28647                                       break;
28648                                     }
28649                                     case 0x00000100: {
28650                                       // 0xef800340
28651                                       if ((instr & 0x10000000) == 0x00000000) {
28652                                         if (((instr & 0x300000) == 0x300000)) {
28653                                           UnallocatedT32(instr);
28654                                           return;
28655                                         }
28656                                         DataType dt = Dt_size_13_Decode(
28657                                             (instr >> 20) & 0x3);
28658                                         if (dt.Is(kDataTypeValueInvalid)) {
28659                                           UnallocatedT32(instr);
28660                                           return;
28661                                         }
28662                                         if (((instr >> 12) & 1) != 0) {
28663                                           UnallocatedT32(instr);
28664                                           return;
28665                                         }
28666                                         unsigned rd =
28667                                             ExtractQRegister(instr, 22, 12);
28668                                         unsigned rn =
28669                                             ExtractDRegister(instr, 7, 16);
28670                                         uint32_t mvm = (instr & 0xf) |
28671                                                        ((instr >> 1) & 0x10);
28672                                         uint32_t shift = 4;
28673                                         if (dt.Is(S16)) {
28674                                           shift = 3;
28675                                         }
28676                                         uint32_t vm = mvm & ((1 << shift) - 1);
28677                                         uint32_t index = mvm >> shift;
28678                                         // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
28679                                         vqdmlal(CurrentCond(),
28680                                                 dt,
28681                                                 QRegister(rd),
28682                                                 DRegister(rn),
28683                                                 DRegister(vm),
28684                                                 index);
28685                                       } else {
28686                                         UnallocatedT32(instr);
28687                                       }
28688                                       break;
28689                                     }
28690                                   }
28691                                   break;
28692                                 }
28693                               }
28694                               break;
28695                             }
28696                             case 0x00000400: {
28697                               // 0xef800400
28698                               switch (instr & 0x00000300) {
28699                                 case 0x00000000: {
28700                                   // 0xef800400
28701                                   switch (instr & 0x10000000) {
28702                                     case 0x00000000: {
28703                                       // 0xef800400
28704                                       if (((instr & 0x300000) == 0x300000)) {
28705                                         UnallocatedT32(instr);
28706                                         return;
28707                                       }
28708                                       DataType dt =
28709                                           Dt_size_3_Decode((instr >> 20) & 0x3);
28710                                       if (dt.Is(kDataTypeValueInvalid)) {
28711                                         UnallocatedT32(instr);
28712                                         return;
28713                                       }
28714                                       unsigned rd =
28715                                           ExtractDRegister(instr, 22, 12);
28716                                       if (((instr >> 16) & 1) != 0) {
28717                                         UnallocatedT32(instr);
28718                                         return;
28719                                       }
28720                                       unsigned rn =
28721                                           ExtractQRegister(instr, 7, 16);
28722                                       if ((instr & 1) != 0) {
28723                                         UnallocatedT32(instr);
28724                                         return;
28725                                       }
28726                                       unsigned rm =
28727                                           ExtractQRegister(instr, 5, 0);
28728                                       // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
28729                                       vaddhn(CurrentCond(),
28730                                              dt,
28731                                              DRegister(rd),
28732                                              QRegister(rn),
28733                                              QRegister(rm));
28734                                       break;
28735                                     }
28736                                     case 0x10000000: {
28737                                       // 0xff800400
28738                                       if (((instr & 0x300000) == 0x300000)) {
28739                                         UnallocatedT32(instr);
28740                                         return;
28741                                       }
28742                                       DataType dt =
28743                                           Dt_size_3_Decode((instr >> 20) & 0x3);
28744                                       if (dt.Is(kDataTypeValueInvalid)) {
28745                                         UnallocatedT32(instr);
28746                                         return;
28747                                       }
28748                                       unsigned rd =
28749                                           ExtractDRegister(instr, 22, 12);
28750                                       if (((instr >> 16) & 1) != 0) {
28751                                         UnallocatedT32(instr);
28752                                         return;
28753                                       }
28754                                       unsigned rn =
28755                                           ExtractQRegister(instr, 7, 16);
28756                                       if ((instr & 1) != 0) {
28757                                         UnallocatedT32(instr);
28758                                         return;
28759                                       }
28760                                       unsigned rm =
28761                                           ExtractQRegister(instr, 5, 0);
28762                                       // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
28763                                       vraddhn(CurrentCond(),
28764                                               dt,
28765                                               DRegister(rd),
28766                                               QRegister(rn),
28767                                               QRegister(rm));
28768                                       break;
28769                                     }
28770                                   }
28771                                   break;
28772                                 }
28773                                 case 0x00000100: {
28774                                   // 0xef800500
28775                                   if (((instr & 0x300000) == 0x300000)) {
28776                                     UnallocatedT32(instr);
28777                                     return;
28778                                   }
28779                                   DataType dt =
28780                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28781                                                          ((instr >> 26) & 0x4));
28782                                   if (dt.Is(kDataTypeValueInvalid)) {
28783                                     UnallocatedT32(instr);
28784                                     return;
28785                                   }
28786                                   if (((instr >> 12) & 1) != 0) {
28787                                     UnallocatedT32(instr);
28788                                     return;
28789                                   }
28790                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28791                                   unsigned rn = ExtractDRegister(instr, 7, 16);
28792                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28793                                   // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28794                                   vabal(CurrentCond(),
28795                                         dt,
28796                                         QRegister(rd),
28797                                         DRegister(rn),
28798                                         DRegister(rm));
28799                                   break;
28800                                 }
28801                                 case 0x00000200: {
28802                                   // 0xef800600
28803                                   switch (instr & 0x10000000) {
28804                                     case 0x00000000: {
28805                                       // 0xef800600
28806                                       if (((instr & 0x300000) == 0x300000)) {
28807                                         UnallocatedT32(instr);
28808                                         return;
28809                                       }
28810                                       DataType dt =
28811                                           Dt_size_3_Decode((instr >> 20) & 0x3);
28812                                       if (dt.Is(kDataTypeValueInvalid)) {
28813                                         UnallocatedT32(instr);
28814                                         return;
28815                                       }
28816                                       unsigned rd =
28817                                           ExtractDRegister(instr, 22, 12);
28818                                       if (((instr >> 16) & 1) != 0) {
28819                                         UnallocatedT32(instr);
28820                                         return;
28821                                       }
28822                                       unsigned rn =
28823                                           ExtractQRegister(instr, 7, 16);
28824                                       if ((instr & 1) != 0) {
28825                                         UnallocatedT32(instr);
28826                                         return;
28827                                       }
28828                                       unsigned rm =
28829                                           ExtractQRegister(instr, 5, 0);
28830                                       // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
28831                                       vsubhn(CurrentCond(),
28832                                              dt,
28833                                              DRegister(rd),
28834                                              QRegister(rn),
28835                                              QRegister(rm));
28836                                       break;
28837                                     }
28838                                     case 0x10000000: {
28839                                       // 0xff800600
28840                                       if (((instr & 0x300000) == 0x300000)) {
28841                                         UnallocatedT32(instr);
28842                                         return;
28843                                       }
28844                                       DataType dt =
28845                                           Dt_size_3_Decode((instr >> 20) & 0x3);
28846                                       if (dt.Is(kDataTypeValueInvalid)) {
28847                                         UnallocatedT32(instr);
28848                                         return;
28849                                       }
28850                                       unsigned rd =
28851                                           ExtractDRegister(instr, 22, 12);
28852                                       if (((instr >> 16) & 1) != 0) {
28853                                         UnallocatedT32(instr);
28854                                         return;
28855                                       }
28856                                       unsigned rn =
28857                                           ExtractQRegister(instr, 7, 16);
28858                                       if ((instr & 1) != 0) {
28859                                         UnallocatedT32(instr);
28860                                         return;
28861                                       }
28862                                       unsigned rm =
28863                                           ExtractQRegister(instr, 5, 0);
28864                                       // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
28865                                       vrsubhn(CurrentCond(),
28866                                               dt,
28867                                               DRegister(rd),
28868                                               QRegister(rn),
28869                                               QRegister(rm));
28870                                       break;
28871                                     }
28872                                   }
28873                                   break;
28874                                 }
28875                                 case 0x00000300: {
28876                                   // 0xef800700
28877                                   if (((instr & 0x300000) == 0x300000)) {
28878                                     UnallocatedT32(instr);
28879                                     return;
28880                                   }
28881                                   DataType dt =
28882                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28883                                                          ((instr >> 26) & 0x4));
28884                                   if (dt.Is(kDataTypeValueInvalid)) {
28885                                     UnallocatedT32(instr);
28886                                     return;
28887                                   }
28888                                   if (((instr >> 12) & 1) != 0) {
28889                                     UnallocatedT32(instr);
28890                                     return;
28891                                   }
28892                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28893                                   unsigned rn = ExtractDRegister(instr, 7, 16);
28894                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28895                                   // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28896                                   vabdl(CurrentCond(),
28897                                         dt,
28898                                         QRegister(rd),
28899                                         DRegister(rn),
28900                                         DRegister(rm));
28901                                   break;
28902                                 }
28903                               }
28904                               break;
28905                             }
28906                             case 0x00000440: {
28907                               // 0xef800440
28908                               switch (instr & 0x00000200) {
28909                                 case 0x00000000: {
28910                                   // 0xef800440
28911                                   switch (instr & 0x10000000) {
28912                                     case 0x00000000: {
28913                                       // 0xef800440
28914                                       if (((instr & 0x300000) == 0x300000)) {
28915                                         UnallocatedT32(instr);
28916                                         return;
28917                                       }
28918                                       DataType dt =
28919                                           Dt_size_9_Decode((instr >> 20) & 0x3,
28920                                                            (instr >> 8) & 0x1);
28921                                       if (dt.Is(kDataTypeValueInvalid)) {
28922                                         UnallocatedT32(instr);
28923                                         return;
28924                                       }
28925                                       unsigned rd =
28926                                           ExtractDRegister(instr, 22, 12);
28927                                       unsigned rn =
28928                                           ExtractDRegister(instr, 7, 16);
28929                                       int lane;
28930                                       unsigned rm =
28931                                           ExtractDRegisterAndLane(instr,
28932                                                                   dt,
28933                                                                   5,
28934                                                                   0,
28935                                                                   &lane);
28936                                       // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28937                                       vmls(CurrentCond(),
28938                                            dt,
28939                                            DRegister(rd),
28940                                            DRegister(rn),
28941                                            DRegisterLane(rm, lane));
28942                                       break;
28943                                     }
28944                                     case 0x10000000: {
28945                                       // 0xff800440
28946                                       if (((instr & 0x300000) == 0x300000)) {
28947                                         UnallocatedT32(instr);
28948                                         return;
28949                                       }
28950                                       DataType dt =
28951                                           Dt_size_9_Decode((instr >> 20) & 0x3,
28952                                                            (instr >> 8) & 0x1);
28953                                       if (dt.Is(kDataTypeValueInvalid)) {
28954                                         UnallocatedT32(instr);
28955                                         return;
28956                                       }
28957                                       if (((instr >> 12) & 1) != 0) {
28958                                         UnallocatedT32(instr);
28959                                         return;
28960                                       }
28961                                       unsigned rd =
28962                                           ExtractQRegister(instr, 22, 12);
28963                                       if (((instr >> 16) & 1) != 0) {
28964                                         UnallocatedT32(instr);
28965                                         return;
28966                                       }
28967                                       unsigned rn =
28968                                           ExtractQRegister(instr, 7, 16);
28969                                       int lane;
28970                                       unsigned rm =
28971                                           ExtractDRegisterAndLane(instr,
28972                                                                   dt,
28973                                                                   5,
28974                                                                   0,
28975                                                                   &lane);
28976                                       // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28977                                       vmls(CurrentCond(),
28978                                            dt,
28979                                            QRegister(rd),
28980                                            QRegister(rn),
28981                                            DRegisterLane(rm, lane));
28982                                       break;
28983                                     }
28984                                   }
28985                                   break;
28986                                 }
28987                                 case 0x00000200: {
28988                                   // 0xef800640
28989                                   switch (instr & 0x00000100) {
28990                                     case 0x00000000: {
28991                                       // 0xef800640
28992                                       if (((instr & 0x300000) == 0x300000)) {
28993                                         UnallocatedT32(instr);
28994                                         return;
28995                                       }
28996                                       DataType dt =
28997                                           Dt_size_11_Decode((instr >> 20) & 0x3,
28998                                                             (instr >> 28) &
28999                                                                 0x1);
29000                                       if (dt.Is(kDataTypeValueInvalid)) {
29001                                         UnallocatedT32(instr);
29002                                         return;
29003                                       }
29004                                       if (((instr >> 12) & 1) != 0) {
29005                                         UnallocatedT32(instr);
29006                                         return;
29007                                       }
29008                                       unsigned rd =
29009                                           ExtractQRegister(instr, 22, 12);
29010                                       unsigned rn =
29011                                           ExtractDRegister(instr, 7, 16);
29012                                       int lane;
29013                                       unsigned rm =
29014                                           ExtractDRegisterAndLane(instr,
29015                                                                   dt,
29016                                                                   5,
29017                                                                   0,
29018                                                                   &lane);
29019                                       // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29020                                       vmlsl(CurrentCond(),
29021                                             dt,
29022                                             QRegister(rd),
29023                                             DRegister(rn),
29024                                             DRegisterLane(rm, lane));
29025                                       break;
29026                                     }
29027                                     case 0x00000100: {
29028                                       // 0xef800740
29029                                       if ((instr & 0x10000000) == 0x00000000) {
29030                                         if (((instr & 0x300000) == 0x300000)) {
29031                                           UnallocatedT32(instr);
29032                                           return;
29033                                         }
29034                                         DataType dt = Dt_size_13_Decode(
29035                                             (instr >> 20) & 0x3);
29036                                         if (dt.Is(kDataTypeValueInvalid)) {
29037                                           UnallocatedT32(instr);
29038                                           return;
29039                                         }
29040                                         if (((instr >> 12) & 1) != 0) {
29041                                           UnallocatedT32(instr);
29042                                           return;
29043                                         }
29044                                         unsigned rd =
29045                                             ExtractQRegister(instr, 22, 12);
29046                                         unsigned rn =
29047                                             ExtractDRegister(instr, 7, 16);
29048                                         uint32_t mvm = (instr & 0xf) |
29049                                                        ((instr >> 1) & 0x10);
29050                                         uint32_t shift = 4;
29051                                         if (dt.Is(S16)) {
29052                                           shift = 3;
29053                                         }
29054                                         uint32_t vm = mvm & ((1 << shift) - 1);
29055                                         uint32_t index = mvm >> shift;
29056                                         // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
29057                                         vqdmlsl(CurrentCond(),
29058                                                 dt,
29059                                                 QRegister(rd),
29060                                                 DRegister(rn),
29061                                                 DRegister(vm),
29062                                                 index);
29063                                       } else {
29064                                         UnallocatedT32(instr);
29065                                       }
29066                                       break;
29067                                     }
29068                                   }
29069                                   break;
29070                                 }
29071                               }
29072                               break;
29073                             }
29074                             case 0x00000800: {
29075                               // 0xef800800
29076                               switch (instr & 0x00000300) {
29077                                 case 0x00000000: {
29078                                   // 0xef800800
29079                                   if (((instr & 0x300000) == 0x300000)) {
29080                                     UnallocatedT32(instr);
29081                                     return;
29082                                   }
29083                                   DataType dt =
29084                                       Dt_size_12_Decode((instr >> 20) & 0x3,
29085                                                         (instr >> 28) & 0x1);
29086                                   if (dt.Is(kDataTypeValueInvalid)) {
29087                                     UnallocatedT32(instr);
29088                                     return;
29089                                   }
29090                                   if (((instr >> 12) & 1) != 0) {
29091                                     UnallocatedT32(instr);
29092                                     return;
29093                                   }
29094                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29095                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29096                                   unsigned rm = ExtractDRegister(instr, 5, 0);
29097                                   // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29098                                   vmlal(CurrentCond(),
29099                                         dt,
29100                                         QRegister(rd),
29101                                         DRegister(rn),
29102                                         DRegister(rm));
29103                                   break;
29104                                 }
29105                                 case 0x00000100: {
29106                                   // 0xef800900
29107                                   if ((instr & 0x10000000) == 0x00000000) {
29108                                     if (((instr & 0x300000) == 0x300000)) {
29109                                       UnallocatedT32(instr);
29110                                       return;
29111                                     }
29112                                     DataType dt =
29113                                         Dt_size_13_Decode((instr >> 20) & 0x3);
29114                                     if (dt.Is(kDataTypeValueInvalid)) {
29115                                       UnallocatedT32(instr);
29116                                       return;
29117                                     }
29118                                     if (((instr >> 12) & 1) != 0) {
29119                                       UnallocatedT32(instr);
29120                                       return;
29121                                     }
29122                                     unsigned rd =
29123                                         ExtractQRegister(instr, 22, 12);
29124                                     unsigned rn =
29125                                         ExtractDRegister(instr, 7, 16);
29126                                     unsigned rm = ExtractDRegister(instr, 5, 0);
29127                                     // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29128                                     vqdmlal(CurrentCond(),
29129                                             dt,
29130                                             QRegister(rd),
29131                                             DRegister(rn),
29132                                             DRegister(rm));
29133                                   } else {
29134                                     UnallocatedT32(instr);
29135                                   }
29136                                   break;
29137                                 }
29138                                 case 0x00000200: {
29139                                   // 0xef800a00
29140                                   if (((instr & 0x300000) == 0x300000)) {
29141                                     UnallocatedT32(instr);
29142                                     return;
29143                                   }
29144                                   DataType dt =
29145                                       Dt_size_12_Decode((instr >> 20) & 0x3,
29146                                                         (instr >> 28) & 0x1);
29147                                   if (dt.Is(kDataTypeValueInvalid)) {
29148                                     UnallocatedT32(instr);
29149                                     return;
29150                                   }
29151                                   if (((instr >> 12) & 1) != 0) {
29152                                     UnallocatedT32(instr);
29153                                     return;
29154                                   }
29155                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29156                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29157                                   unsigned rm = ExtractDRegister(instr, 5, 0);
29158                                   // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29159                                   vmlsl(CurrentCond(),
29160                                         dt,
29161                                         QRegister(rd),
29162                                         DRegister(rn),
29163                                         DRegister(rm));
29164                                   break;
29165                                 }
29166                                 case 0x00000300: {
29167                                   // 0xef800b00
29168                                   if ((instr & 0x10000000) == 0x00000000) {
29169                                     if (((instr & 0x300000) == 0x300000)) {
29170                                       UnallocatedT32(instr);
29171                                       return;
29172                                     }
29173                                     DataType dt =
29174                                         Dt_size_13_Decode((instr >> 20) & 0x3);
29175                                     if (dt.Is(kDataTypeValueInvalid)) {
29176                                       UnallocatedT32(instr);
29177                                       return;
29178                                     }
29179                                     if (((instr >> 12) & 1) != 0) {
29180                                       UnallocatedT32(instr);
29181                                       return;
29182                                     }
29183                                     unsigned rd =
29184                                         ExtractQRegister(instr, 22, 12);
29185                                     unsigned rn =
29186                                         ExtractDRegister(instr, 7, 16);
29187                                     unsigned rm = ExtractDRegister(instr, 5, 0);
29188                                     // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29189                                     vqdmlsl(CurrentCond(),
29190                                             dt,
29191                                             QRegister(rd),
29192                                             DRegister(rn),
29193                                             DRegister(rm));
29194                                   } else {
29195                                     UnallocatedT32(instr);
29196                                   }
29197                                   break;
29198                                 }
29199                               }
29200                               break;
29201                             }
29202                             case 0x00000840: {
29203                               // 0xef800840
29204                               switch (instr & 0x00000200) {
29205                                 case 0x00000000: {
29206                                   // 0xef800840
29207                                   switch (instr & 0x10000000) {
29208                                     case 0x00000000: {
29209                                       // 0xef800840
29210                                       if (((instr & 0x300000) == 0x300000)) {
29211                                         UnallocatedT32(instr);
29212                                         return;
29213                                       }
29214                                       DataType dt = Dt_F_size_3_Decode(
29215                                           ((instr >> 20) & 0x3) |
29216                                           ((instr >> 6) & 0x4));
29217                                       if (dt.Is(kDataTypeValueInvalid)) {
29218                                         UnallocatedT32(instr);
29219                                         return;
29220                                       }
29221                                       unsigned rd =
29222                                           ExtractDRegister(instr, 22, 12);
29223                                       unsigned rn =
29224                                           ExtractDRegister(instr, 7, 16);
29225                                       uint32_t mvm =
29226                                           (instr & 0xf) | ((instr >> 1) & 0x10);
29227                                       uint32_t shift = 4;
29228                                       if (dt.Is(I16)) {
29229                                         shift = 3;
29230                                       }
29231                                       uint32_t vm = mvm & ((1 << shift) - 1);
29232                                       uint32_t index = mvm >> shift;
29233                                       // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29234                                       vmul(CurrentCond(),
29235                                            dt,
29236                                            DRegister(rd),
29237                                            DRegister(rn),
29238                                            DRegister(vm),
29239                                            index);
29240                                       break;
29241                                     }
29242                                     case 0x10000000: {
29243                                       // 0xff800840
29244                                       if (((instr & 0x300000) == 0x300000)) {
29245                                         UnallocatedT32(instr);
29246                                         return;
29247                                       }
29248                                       DataType dt = Dt_F_size_3_Decode(
29249                                           ((instr >> 20) & 0x3) |
29250                                           ((instr >> 6) & 0x4));
29251                                       if (dt.Is(kDataTypeValueInvalid)) {
29252                                         UnallocatedT32(instr);
29253                                         return;
29254                                       }
29255                                       if (((instr >> 12) & 1) != 0) {
29256                                         UnallocatedT32(instr);
29257                                         return;
29258                                       }
29259                                       unsigned rd =
29260                                           ExtractQRegister(instr, 22, 12);
29261                                       if (((instr >> 16) & 1) != 0) {
29262                                         UnallocatedT32(instr);
29263                                         return;
29264                                       }
29265                                       unsigned rn =
29266                                           ExtractQRegister(instr, 7, 16);
29267                                       uint32_t mvm =
29268                                           (instr & 0xf) | ((instr >> 1) & 0x10);
29269                                       uint32_t shift = 4;
29270                                       if (dt.Is(I16)) {
29271                                         shift = 3;
29272                                       }
29273                                       uint32_t vm = mvm & ((1 << shift) - 1);
29274                                       uint32_t index = mvm >> shift;
29275                                       // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29276                                       vmul(CurrentCond(),
29277                                            dt,
29278                                            QRegister(rd),
29279                                            QRegister(rn),
29280                                            DRegister(vm),
29281                                            index);
29282                                       break;
29283                                     }
29284                                   }
29285                                   break;
29286                                 }
29287                                 case 0x00000200: {
29288                                   // 0xef800a40
29289                                   switch (instr & 0x00000100) {
29290                                     case 0x00000000: {
29291                                       // 0xef800a40
29292                                       if (((instr & 0x300000) == 0x300000)) {
29293                                         UnallocatedT32(instr);
29294                                         return;
29295                                       }
29296                                       DataType dt = Dt_U_size_2_Decode(
29297                                           ((instr >> 20) & 0x3) |
29298                                           ((instr >> 26) & 0x4));
29299                                       if (dt.Is(kDataTypeValueInvalid)) {
29300                                         UnallocatedT32(instr);
29301                                         return;
29302                                       }
29303                                       if (((instr >> 12) & 1) != 0) {
29304                                         UnallocatedT32(instr);
29305                                         return;
29306                                       }
29307                                       unsigned rd =
29308                                           ExtractQRegister(instr, 22, 12);
29309                                       unsigned rn =
29310                                           ExtractDRegister(instr, 7, 16);
29311                                       uint32_t mvm =
29312                                           (instr & 0xf) | ((instr >> 1) & 0x10);
29313                                       uint32_t shift = 4;
29314                                       if (dt.Is(S16) || dt.Is(U16)) {
29315                                         shift = 3;
29316                                       }
29317                                       uint32_t vm = mvm & ((1 << shift) - 1);
29318                                       uint32_t index = mvm >> shift;
29319                                       // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29320                                       vmull(CurrentCond(),
29321                                             dt,
29322                                             QRegister(rd),
29323                                             DRegister(rn),
29324                                             DRegister(vm),
29325                                             index);
29326                                       break;
29327                                     }
29328                                     case 0x00000100: {
29329                                       // 0xef800b40
29330                                       if ((instr & 0x10000000) == 0x00000000) {
29331                                         if (((instr & 0x300000) == 0x300000)) {
29332                                           UnallocatedT32(instr);
29333                                           return;
29334                                         }
29335                                         DataType dt = Dt_size_13_Decode(
29336                                             (instr >> 20) & 0x3);
29337                                         if (dt.Is(kDataTypeValueInvalid)) {
29338                                           UnallocatedT32(instr);
29339                                           return;
29340                                         }
29341                                         if (((instr >> 12) & 1) != 0) {
29342                                           UnallocatedT32(instr);
29343                                           return;
29344                                         }
29345                                         unsigned rd =
29346                                             ExtractQRegister(instr, 22, 12);
29347                                         unsigned rn =
29348                                             ExtractDRegister(instr, 7, 16);
29349                                         int lane;
29350                                         unsigned rm =
29351                                             ExtractDRegisterAndLane(instr,
29352                                                                     dt,
29353                                                                     5,
29354                                                                     0,
29355                                                                     &lane);
29356                                         // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29357                                         vqdmull(CurrentCond(),
29358                                                 dt,
29359                                                 QRegister(rd),
29360                                                 DRegister(rn),
29361                                                 DRegisterLane(rm, lane));
29362                                       } else {
29363                                         UnallocatedT32(instr);
29364                                       }
29365                                       break;
29366                                     }
29367                                   }
29368                                   break;
29369                                 }
29370                               }
29371                               break;
29372                             }
29373                             case 0x00000c00: {
29374                               // 0xef800c00
29375                               switch (instr & 0x00000100) {
29376                                 case 0x00000000: {
29377                                   // 0xef800c00
29378                                   if (((instr & 0x300000) == 0x300000)) {
29379                                     UnallocatedT32(instr);
29380                                     return;
29381                                   }
29382                                   DataType dt = Dt_op_U_size_1_Decode(
29383                                       ((instr >> 20) & 0x3) |
29384                                       ((instr >> 26) & 0x4) |
29385                                       ((instr >> 6) & 0x8));
29386                                   if (dt.Is(kDataTypeValueInvalid)) {
29387                                     UnallocatedT32(instr);
29388                                     return;
29389                                   }
29390                                   if (((instr >> 12) & 1) != 0) {
29391                                     UnallocatedT32(instr);
29392                                     return;
29393                                   }
29394                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29395                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29396                                   unsigned rm = ExtractDRegister(instr, 5, 0);
29397                                   // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
29398                                   vmull(CurrentCond(),
29399                                         dt,
29400                                         QRegister(rd),
29401                                         DRegister(rn),
29402                                         DRegister(rm));
29403                                   break;
29404                                 }
29405                                 case 0x00000100: {
29406                                   // 0xef800d00
29407                                   if ((instr & 0x10000200) == 0x00000000) {
29408                                     if (((instr & 0x300000) == 0x300000)) {
29409                                       UnallocatedT32(instr);
29410                                       return;
29411                                     }
29412                                     DataType dt =
29413                                         Dt_size_13_Decode((instr >> 20) & 0x3);
29414                                     if (dt.Is(kDataTypeValueInvalid)) {
29415                                       UnallocatedT32(instr);
29416                                       return;
29417                                     }
29418                                     if (((instr >> 12) & 1) != 0) {
29419                                       UnallocatedT32(instr);
29420                                       return;
29421                                     }
29422                                     unsigned rd =
29423                                         ExtractQRegister(instr, 22, 12);
29424                                     unsigned rn =
29425                                         ExtractDRegister(instr, 7, 16);
29426                                     unsigned rm = ExtractDRegister(instr, 5, 0);
29427                                     // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29428                                     vqdmull(CurrentCond(),
29429                                             dt,
29430                                             QRegister(rd),
29431                                             DRegister(rn),
29432                                             DRegister(rm));
29433                                   } else {
29434                                     UnallocatedT32(instr);
29435                                   }
29436                                   break;
29437                                 }
29438                               }
29439                               break;
29440                             }
29441                             case 0x00000c40: {
29442                               // 0xef800c40
29443                               switch (instr & 0x10000300) {
29444                                 case 0x00000000: {
29445                                   // 0xef800c40
29446                                   if (((instr & 0x300000) == 0x300000)) {
29447                                     UnallocatedT32(instr);
29448                                     return;
29449                                   }
29450                                   DataType dt =
29451                                       Dt_size_13_Decode((instr >> 20) & 0x3);
29452                                   if (dt.Is(kDataTypeValueInvalid)) {
29453                                     UnallocatedT32(instr);
29454                                     return;
29455                                   }
29456                                   unsigned rd = ExtractDRegister(instr, 22, 12);
29457                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29458                                   int lane;
29459                                   unsigned rm = ExtractDRegisterAndLane(instr,
29460                                                                         dt,
29461                                                                         5,
29462                                                                         0,
29463                                                                         &lane);
29464                                   // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29465                                   vqdmulh(CurrentCond(),
29466                                           dt,
29467                                           DRegister(rd),
29468                                           DRegister(rn),
29469                                           DRegisterLane(rm, lane));
29470                                   break;
29471                                 }
29472                                 case 0x00000100: {
29473                                   // 0xef800d40
29474                                   if (((instr & 0x300000) == 0x300000)) {
29475                                     UnallocatedT32(instr);
29476                                     return;
29477                                   }
29478                                   DataType dt =
29479                                       Dt_size_13_Decode((instr >> 20) & 0x3);
29480                                   if (dt.Is(kDataTypeValueInvalid)) {
29481                                     UnallocatedT32(instr);
29482                                     return;
29483                                   }
29484                                   unsigned rd = ExtractDRegister(instr, 22, 12);
29485                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29486                                   int lane;
29487                                   unsigned rm = ExtractDRegisterAndLane(instr,
29488                                                                         dt,
29489                                                                         5,
29490                                                                         0,
29491                                                                         &lane);
29492                                   // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29493                                   vqrdmulh(CurrentCond(),
29494                                            dt,
29495                                            DRegister(rd),
29496                                            DRegister(rn),
29497                                            DRegisterLane(rm, lane));
29498                                   break;
29499                                 }
29500                                 case 0x10000000: {
29501                                   // 0xff800c40
29502                                   if (((instr & 0x300000) == 0x300000)) {
29503                                     UnallocatedT32(instr);
29504                                     return;
29505                                   }
29506                                   DataType dt =
29507                                       Dt_size_13_Decode((instr >> 20) & 0x3);
29508                                   if (dt.Is(kDataTypeValueInvalid)) {
29509                                     UnallocatedT32(instr);
29510                                     return;
29511                                   }
29512                                   if (((instr >> 12) & 1) != 0) {
29513                                     UnallocatedT32(instr);
29514                                     return;
29515                                   }
29516                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29517                                   if (((instr >> 16) & 1) != 0) {
29518                                     UnallocatedT32(instr);
29519                                     return;
29520                                   }
29521                                   unsigned rn = ExtractQRegister(instr, 7, 16);
29522                                   int lane;
29523                                   unsigned rm = ExtractDRegisterAndLane(instr,
29524                                                                         dt,
29525                                                                         5,
29526                                                                         0,
29527                                                                         &lane);
29528                                   // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29529                                   vqdmulh(CurrentCond(),
29530                                           dt,
29531                                           QRegister(rd),
29532                                           QRegister(rn),
29533                                           DRegisterLane(rm, lane));
29534                                   break;
29535                                 }
29536                                 case 0x10000100: {
29537                                   // 0xff800d40
29538                                   if (((instr & 0x300000) == 0x300000)) {
29539                                     UnallocatedT32(instr);
29540                                     return;
29541                                   }
29542                                   DataType dt =
29543                                       Dt_size_13_Decode((instr >> 20) & 0x3);
29544                                   if (dt.Is(kDataTypeValueInvalid)) {
29545                                     UnallocatedT32(instr);
29546                                     return;
29547                                   }
29548                                   if (((instr >> 12) & 1) != 0) {
29549                                     UnallocatedT32(instr);
29550                                     return;
29551                                   }
29552                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29553                                   if (((instr >> 16) & 1) != 0) {
29554                                     UnallocatedT32(instr);
29555                                     return;
29556                                   }
29557                                   unsigned rn = ExtractQRegister(instr, 7, 16);
29558                                   int lane;
29559                                   unsigned rm = ExtractDRegisterAndLane(instr,
29560                                                                         dt,
29561                                                                         5,
29562                                                                         0,
29563                                                                         &lane);
29564                                   // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29565                                   vqrdmulh(CurrentCond(),
29566                                            dt,
29567                                            QRegister(rd),
29568                                            QRegister(rn),
29569                                            DRegisterLane(rm, lane));
29570                                   break;
29571                                 }
29572                                 default:
29573                                   UnallocatedT32(instr);
29574                                   break;
29575                               }
29576                               break;
29577                             }
29578                           }
29579                           break;
29580                         }
29581                       }
29582                       break;
29583                     }
29584                   }
29585                   break;
29586                 }
29587                 case 0x01000010: {
29588                   // 0xef000010
29589                   switch (instr & 0x00800040) {
29590                     case 0x00000000: {
29591                       // 0xef000010
29592                       switch (instr & 0x00000f00) {
29593                         case 0x00000000: {
29594                           // 0xef000010
29595                           DataType dt = Dt_U_size_3_Decode(
29596                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29597                           if (dt.Is(kDataTypeValueInvalid)) {
29598                             UnallocatedT32(instr);
29599                             return;
29600                           }
29601                           unsigned rd = ExtractDRegister(instr, 22, 12);
29602                           unsigned rn = ExtractDRegister(instr, 7, 16);
29603                           unsigned rm = ExtractDRegister(instr, 5, 0);
29604                           // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29605                           vqadd(CurrentCond(),
29606                                 dt,
29607                                 DRegister(rd),
29608                                 DRegister(rn),
29609                                 DRegister(rm));
29610                           break;
29611                         }
29612                         case 0x00000100: {
29613                           // 0xef000110
29614                           switch (instr & 0x10300000) {
29615                             case 0x00000000: {
29616                               // 0xef000110
29617                               unsigned rd = ExtractDRegister(instr, 22, 12);
29618                               unsigned rn = ExtractDRegister(instr, 7, 16);
29619                               unsigned rm = ExtractDRegister(instr, 5, 0);
29620                               // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29621                               vand(CurrentCond(),
29622                                    kDataTypeValueNone,
29623                                    DRegister(rd),
29624                                    DRegister(rn),
29625                                    DRegister(rm));
29626                               break;
29627                             }
29628                             case 0x00100000: {
29629                               // 0xef100110
29630                               unsigned rd = ExtractDRegister(instr, 22, 12);
29631                               unsigned rn = ExtractDRegister(instr, 7, 16);
29632                               unsigned rm = ExtractDRegister(instr, 5, 0);
29633                               // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29634                               vbic(CurrentCond(),
29635                                    kDataTypeValueNone,
29636                                    DRegister(rd),
29637                                    DRegister(rn),
29638                                    DRegister(rm));
29639                               break;
29640                             }
29641                             case 0x00200000: {
29642                               // 0xef200110
29643                               if (((instr & 0x00000040) == 0x00000000) &&
29644                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
29645                                      << 4) |
29646                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
29647                                    (((Uint32((instr >> 5)) & Uint32(0x1))
29648                                      << 4) |
29649                                     (Uint32(instr) & Uint32(0xf))))) {
29650                                 unsigned rd = ExtractDRegister(instr, 22, 12);
29651                                 unsigned rm = ExtractDRegister(instr, 7, 16);
29652                                 // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1
29653                                 vmov(CurrentCond(),
29654                                      kDataTypeValueNone,
29655                                      DRegister(rd),
29656                                      DRegister(rm));
29657                                 return;
29658                               }
29659                               unsigned rd = ExtractDRegister(instr, 22, 12);
29660                               unsigned rn = ExtractDRegister(instr, 7, 16);
29661                               unsigned rm = ExtractDRegister(instr, 5, 0);
29662                               // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29663                               vorr(CurrentCond(),
29664                                    kDataTypeValueNone,
29665                                    DRegister(rd),
29666                                    DRegister(rn),
29667                                    DRegister(rm));
29668                               break;
29669                             }
29670                             case 0x00300000: {
29671                               // 0xef300110
29672                               unsigned rd = ExtractDRegister(instr, 22, 12);
29673                               unsigned rn = ExtractDRegister(instr, 7, 16);
29674                               unsigned rm = ExtractDRegister(instr, 5, 0);
29675                               // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29676                               vorn(CurrentCond(),
29677                                    kDataTypeValueNone,
29678                                    DRegister(rd),
29679                                    DRegister(rn),
29680                                    DRegister(rm));
29681                               break;
29682                             }
29683                             case 0x10000000: {
29684                               // 0xff000110
29685                               unsigned rd = ExtractDRegister(instr, 22, 12);
29686                               unsigned rn = ExtractDRegister(instr, 7, 16);
29687                               unsigned rm = ExtractDRegister(instr, 5, 0);
29688                               // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29689                               veor(CurrentCond(),
29690                                    kDataTypeValueNone,
29691                                    DRegister(rd),
29692                                    DRegister(rn),
29693                                    DRegister(rm));
29694                               break;
29695                             }
29696                             case 0x10100000: {
29697                               // 0xff100110
29698                               unsigned rd = ExtractDRegister(instr, 22, 12);
29699                               unsigned rn = ExtractDRegister(instr, 7, 16);
29700                               unsigned rm = ExtractDRegister(instr, 5, 0);
29701                               // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29702                               vbsl(CurrentCond(),
29703                                    kDataTypeValueNone,
29704                                    DRegister(rd),
29705                                    DRegister(rn),
29706                                    DRegister(rm));
29707                               break;
29708                             }
29709                             case 0x10200000: {
29710                               // 0xff200110
29711                               unsigned rd = ExtractDRegister(instr, 22, 12);
29712                               unsigned rn = ExtractDRegister(instr, 7, 16);
29713                               unsigned rm = ExtractDRegister(instr, 5, 0);
29714                               // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29715                               vbit(CurrentCond(),
29716                                    kDataTypeValueNone,
29717                                    DRegister(rd),
29718                                    DRegister(rn),
29719                                    DRegister(rm));
29720                               break;
29721                             }
29722                             case 0x10300000: {
29723                               // 0xff300110
29724                               unsigned rd = ExtractDRegister(instr, 22, 12);
29725                               unsigned rn = ExtractDRegister(instr, 7, 16);
29726                               unsigned rm = ExtractDRegister(instr, 5, 0);
29727                               // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29728                               vbif(CurrentCond(),
29729                                    kDataTypeValueNone,
29730                                    DRegister(rd),
29731                                    DRegister(rn),
29732                                    DRegister(rm));
29733                               break;
29734                             }
29735                           }
29736                           break;
29737                         }
29738                         case 0x00000200: {
29739                           // 0xef000210
29740                           DataType dt = Dt_U_size_3_Decode(
29741                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29742                           if (dt.Is(kDataTypeValueInvalid)) {
29743                             UnallocatedT32(instr);
29744                             return;
29745                           }
29746                           unsigned rd = ExtractDRegister(instr, 22, 12);
29747                           unsigned rn = ExtractDRegister(instr, 7, 16);
29748                           unsigned rm = ExtractDRegister(instr, 5, 0);
29749                           // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29750                           vqsub(CurrentCond(),
29751                                 dt,
29752                                 DRegister(rd),
29753                                 DRegister(rn),
29754                                 DRegister(rm));
29755                           break;
29756                         }
29757                         case 0x00000300: {
29758                           // 0xef000310
29759                           DataType dt = Dt_U_size_1_Decode(
29760                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29761                           if (dt.Is(kDataTypeValueInvalid)) {
29762                             UnallocatedT32(instr);
29763                             return;
29764                           }
29765                           unsigned rd = ExtractDRegister(instr, 22, 12);
29766                           unsigned rn = ExtractDRegister(instr, 7, 16);
29767                           unsigned rm = ExtractDRegister(instr, 5, 0);
29768                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29769                           vcge(CurrentCond(),
29770                                dt,
29771                                DRegister(rd),
29772                                DRegister(rn),
29773                                DRegister(rm));
29774                           break;
29775                         }
29776                         case 0x00000400: {
29777                           // 0xef000410
29778                           DataType dt = Dt_U_size_3_Decode(
29779                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29780                           if (dt.Is(kDataTypeValueInvalid)) {
29781                             UnallocatedT32(instr);
29782                             return;
29783                           }
29784                           unsigned rd = ExtractDRegister(instr, 22, 12);
29785                           unsigned rm = ExtractDRegister(instr, 5, 0);
29786                           unsigned rn = ExtractDRegister(instr, 7, 16);
29787                           // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
29788                           vqshl(CurrentCond(),
29789                                 dt,
29790                                 DRegister(rd),
29791                                 DRegister(rm),
29792                                 DRegister(rn));
29793                           break;
29794                         }
29795                         case 0x00000500: {
29796                           // 0xef000510
29797                           DataType dt = Dt_U_size_3_Decode(
29798                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29799                           if (dt.Is(kDataTypeValueInvalid)) {
29800                             UnallocatedT32(instr);
29801                             return;
29802                           }
29803                           unsigned rd = ExtractDRegister(instr, 22, 12);
29804                           unsigned rm = ExtractDRegister(instr, 5, 0);
29805                           unsigned rn = ExtractDRegister(instr, 7, 16);
29806                           // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
29807                           vqrshl(CurrentCond(),
29808                                  dt,
29809                                  DRegister(rd),
29810                                  DRegister(rm),
29811                                  DRegister(rn));
29812                           break;
29813                         }
29814                         case 0x00000600: {
29815                           // 0xef000610
29816                           DataType dt = Dt_U_size_1_Decode(
29817                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29818                           if (dt.Is(kDataTypeValueInvalid)) {
29819                             UnallocatedT32(instr);
29820                             return;
29821                           }
29822                           unsigned rd = ExtractDRegister(instr, 22, 12);
29823                           unsigned rn = ExtractDRegister(instr, 7, 16);
29824                           unsigned rm = ExtractDRegister(instr, 5, 0);
29825                           // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29826                           vmin(CurrentCond(),
29827                                dt,
29828                                DRegister(rd),
29829                                DRegister(rn),
29830                                DRegister(rm));
29831                           break;
29832                         }
29833                         case 0x00000700: {
29834                           // 0xef000710
29835                           DataType dt = Dt_U_size_1_Decode(
29836                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29837                           if (dt.Is(kDataTypeValueInvalid)) {
29838                             UnallocatedT32(instr);
29839                             return;
29840                           }
29841                           unsigned rd = ExtractDRegister(instr, 22, 12);
29842                           unsigned rn = ExtractDRegister(instr, 7, 16);
29843                           unsigned rm = ExtractDRegister(instr, 5, 0);
29844                           // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1
29845                           vaba(CurrentCond(),
29846                                dt,
29847                                DRegister(rd),
29848                                DRegister(rn),
29849                                DRegister(rm));
29850                           break;
29851                         }
29852                         case 0x00000800: {
29853                           // 0xef000810
29854                           switch (instr & 0x10000000) {
29855                             case 0x00000000: {
29856                               // 0xef000810
29857                               DataType dt =
29858                                   Dt_size_7_Decode((instr >> 20) & 0x3);
29859                               if (dt.Is(kDataTypeValueInvalid)) {
29860                                 UnallocatedT32(instr);
29861                                 return;
29862                               }
29863                               unsigned rd = ExtractDRegister(instr, 22, 12);
29864                               unsigned rn = ExtractDRegister(instr, 7, 16);
29865                               unsigned rm = ExtractDRegister(instr, 5, 0);
29866                               // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29867                               vtst(CurrentCond(),
29868                                    dt,
29869                                    DRegister(rd),
29870                                    DRegister(rn),
29871                                    DRegister(rm));
29872                               break;
29873                             }
29874                             case 0x10000000: {
29875                               // 0xff000810
29876                               DataType dt =
29877                                   Dt_size_4_Decode((instr >> 20) & 0x3);
29878                               if (dt.Is(kDataTypeValueInvalid)) {
29879                                 UnallocatedT32(instr);
29880                                 return;
29881                               }
29882                               unsigned rd = ExtractDRegister(instr, 22, 12);
29883                               unsigned rn = ExtractDRegister(instr, 7, 16);
29884                               unsigned rm = ExtractDRegister(instr, 5, 0);
29885                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29886                               vceq(CurrentCond(),
29887                                    dt,
29888                                    DRegister(rd),
29889                                    DRegister(rn),
29890                                    DRegister(rm));
29891                               break;
29892                             }
29893                           }
29894                           break;
29895                         }
29896                         case 0x00000900: {
29897                           // 0xef000910
29898                           DataType dt = Dt_op_size_1_Decode(
29899                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29900                           if (dt.Is(kDataTypeValueInvalid)) {
29901                             UnallocatedT32(instr);
29902                             return;
29903                           }
29904                           unsigned rd = ExtractDRegister(instr, 22, 12);
29905                           unsigned rn = ExtractDRegister(instr, 7, 16);
29906                           unsigned rm = ExtractDRegister(instr, 5, 0);
29907                           // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29908                           vmul(CurrentCond(),
29909                                dt,
29910                                DRegister(rd),
29911                                DRegister(rn),
29912                                DRegister(rm));
29913                           break;
29914                         }
29915                         case 0x00000a00: {
29916                           // 0xef000a10
29917                           DataType dt = Dt_U_size_1_Decode(
29918                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29919                           if (dt.Is(kDataTypeValueInvalid)) {
29920                             UnallocatedT32(instr);
29921                             return;
29922                           }
29923                           unsigned rd = ExtractDRegister(instr, 22, 12);
29924                           unsigned rn = ExtractDRegister(instr, 7, 16);
29925                           unsigned rm = ExtractDRegister(instr, 5, 0);
29926                           // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29927                           vpmin(CurrentCond(),
29928                                 dt,
29929                                 DRegister(rd),
29930                                 DRegister(rn),
29931                                 DRegister(rm));
29932                           break;
29933                         }
29934                         case 0x00000b00: {
29935                           // 0xef000b10
29936                           if ((instr & 0x10000000) == 0x00000000) {
29937                             DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
29938                             if (dt.Is(kDataTypeValueInvalid)) {
29939                               UnallocatedT32(instr);
29940                               return;
29941                             }
29942                             unsigned rd = ExtractDRegister(instr, 22, 12);
29943                             unsigned rn = ExtractDRegister(instr, 7, 16);
29944                             unsigned rm = ExtractDRegister(instr, 5, 0);
29945                             // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29946                             vpadd(CurrentCond(),
29947                                   dt,
29948                                   DRegister(rd),
29949                                   DRegister(rn),
29950                                   DRegister(rm));
29951                           } else {
29952                             UnallocatedT32(instr);
29953                           }
29954                           break;
29955                         }
29956                         case 0x00000c00: {
29957                           // 0xef000c10
29958                           switch (instr & 0x10300000) {
29959                             case 0x00000000: {
29960                               // 0xef000c10
29961                               unsigned rd = ExtractDRegister(instr, 22, 12);
29962                               unsigned rn = ExtractDRegister(instr, 7, 16);
29963                               unsigned rm = ExtractDRegister(instr, 5, 0);
29964                               // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
29965                               vfma(CurrentCond(),
29966                                    F32,
29967                                    DRegister(rd),
29968                                    DRegister(rn),
29969                                    DRegister(rm));
29970                               break;
29971                             }
29972                             case 0x00200000: {
29973                               // 0xef200c10
29974                               unsigned rd = ExtractDRegister(instr, 22, 12);
29975                               unsigned rn = ExtractDRegister(instr, 7, 16);
29976                               unsigned rm = ExtractDRegister(instr, 5, 0);
29977                               // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
29978                               vfms(CurrentCond(),
29979                                    F32,
29980                                    DRegister(rd),
29981                                    DRegister(rn),
29982                                    DRegister(rm));
29983                               break;
29984                             }
29985                             default:
29986                               UnallocatedT32(instr);
29987                               break;
29988                           }
29989                           break;
29990                         }
29991                         case 0x00000d00: {
29992                           // 0xef000d10
29993                           switch (instr & 0x10300000) {
29994                             case 0x00000000: {
29995                               // 0xef000d10
29996                               unsigned rd = ExtractDRegister(instr, 22, 12);
29997                               unsigned rn = ExtractDRegister(instr, 7, 16);
29998                               unsigned rm = ExtractDRegister(instr, 5, 0);
29999                               // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30000                               vmla(CurrentCond(),
30001                                    F32,
30002                                    DRegister(rd),
30003                                    DRegister(rn),
30004                                    DRegister(rm));
30005                               break;
30006                             }
30007                             case 0x00200000: {
30008                               // 0xef200d10
30009                               unsigned rd = ExtractDRegister(instr, 22, 12);
30010                               unsigned rn = ExtractDRegister(instr, 7, 16);
30011                               unsigned rm = ExtractDRegister(instr, 5, 0);
30012                               // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30013                               vmls(CurrentCond(),
30014                                    F32,
30015                                    DRegister(rd),
30016                                    DRegister(rn),
30017                                    DRegister(rm));
30018                               break;
30019                             }
30020                             case 0x10000000: {
30021                               // 0xff000d10
30022                               unsigned rd = ExtractDRegister(instr, 22, 12);
30023                               unsigned rn = ExtractDRegister(instr, 7, 16);
30024                               unsigned rm = ExtractDRegister(instr, 5, 0);
30025                               // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30026                               vmul(CurrentCond(),
30027                                    F32,
30028                                    DRegister(rd),
30029                                    DRegister(rn),
30030                                    DRegister(rm));
30031                               break;
30032                             }
30033                             default:
30034                               UnallocatedT32(instr);
30035                               break;
30036                           }
30037                           break;
30038                         }
30039                         case 0x00000e00: {
30040                           // 0xef000e10
30041                           switch (instr & 0x10300000) {
30042                             case 0x10000000: {
30043                               // 0xff000e10
30044                               unsigned rd = ExtractDRegister(instr, 22, 12);
30045                               unsigned rn = ExtractDRegister(instr, 7, 16);
30046                               unsigned rm = ExtractDRegister(instr, 5, 0);
30047                               // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30048                               vacge(CurrentCond(),
30049                                     F32,
30050                                     DRegister(rd),
30051                                     DRegister(rn),
30052                                     DRegister(rm));
30053                               break;
30054                             }
30055                             case 0x10200000: {
30056                               // 0xff200e10
30057                               unsigned rd = ExtractDRegister(instr, 22, 12);
30058                               unsigned rn = ExtractDRegister(instr, 7, 16);
30059                               unsigned rm = ExtractDRegister(instr, 5, 0);
30060                               // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30061                               vacgt(CurrentCond(),
30062                                     F32,
30063                                     DRegister(rd),
30064                                     DRegister(rn),
30065                                     DRegister(rm));
30066                               break;
30067                             }
30068                             default:
30069                               UnallocatedT32(instr);
30070                               break;
30071                           }
30072                           break;
30073                         }
30074                         case 0x00000f00: {
30075                           // 0xef000f10
30076                           switch (instr & 0x10300000) {
30077                             case 0x00000000: {
30078                               // 0xef000f10
30079                               unsigned rd = ExtractDRegister(instr, 22, 12);
30080                               unsigned rn = ExtractDRegister(instr, 7, 16);
30081                               unsigned rm = ExtractDRegister(instr, 5, 0);
30082                               // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30083                               vrecps(CurrentCond(),
30084                                      F32,
30085                                      DRegister(rd),
30086                                      DRegister(rn),
30087                                      DRegister(rm));
30088                               break;
30089                             }
30090                             case 0x00200000: {
30091                               // 0xef200f10
30092                               unsigned rd = ExtractDRegister(instr, 22, 12);
30093                               unsigned rn = ExtractDRegister(instr, 7, 16);
30094                               unsigned rm = ExtractDRegister(instr, 5, 0);
30095                               // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30096                               vrsqrts(CurrentCond(),
30097                                       F32,
30098                                       DRegister(rd),
30099                                       DRegister(rn),
30100                                       DRegister(rm));
30101                               break;
30102                             }
30103                             case 0x10000000: {
30104                               // 0xff000f10
30105                               unsigned rd = ExtractDRegister(instr, 22, 12);
30106                               unsigned rn = ExtractDRegister(instr, 7, 16);
30107                               unsigned rm = ExtractDRegister(instr, 5, 0);
30108                               // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30109                               vmaxnm(F32,
30110                                      DRegister(rd),
30111                                      DRegister(rn),
30112                                      DRegister(rm));
30113                               if (InITBlock()) {
30114                                 UnpredictableT32(instr);
30115                               }
30116                               break;
30117                             }
30118                             case 0x10200000: {
30119                               // 0xff200f10
30120                               unsigned rd = ExtractDRegister(instr, 22, 12);
30121                               unsigned rn = ExtractDRegister(instr, 7, 16);
30122                               unsigned rm = ExtractDRegister(instr, 5, 0);
30123                               // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30124                               vminnm(F32,
30125                                      DRegister(rd),
30126                                      DRegister(rn),
30127                                      DRegister(rm));
30128                               if (InITBlock()) {
30129                                 UnpredictableT32(instr);
30130                               }
30131                               break;
30132                             }
30133                             default:
30134                               UnallocatedT32(instr);
30135                               break;
30136                           }
30137                           break;
30138                         }
30139                       }
30140                       break;
30141                     }
30142                     case 0x00000040: {
30143                       // 0xef000050
30144                       switch (instr & 0x00000f00) {
30145                         case 0x00000000: {
30146                           // 0xef000050
30147                           DataType dt = Dt_U_size_3_Decode(
30148                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30149                           if (dt.Is(kDataTypeValueInvalid)) {
30150                             UnallocatedT32(instr);
30151                             return;
30152                           }
30153                           if (((instr >> 12) & 1) != 0) {
30154                             UnallocatedT32(instr);
30155                             return;
30156                           }
30157                           unsigned rd = ExtractQRegister(instr, 22, 12);
30158                           if (((instr >> 16) & 1) != 0) {
30159                             UnallocatedT32(instr);
30160                             return;
30161                           }
30162                           unsigned rn = ExtractQRegister(instr, 7, 16);
30163                           if ((instr & 1) != 0) {
30164                             UnallocatedT32(instr);
30165                             return;
30166                           }
30167                           unsigned rm = ExtractQRegister(instr, 5, 0);
30168                           // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30169                           vqadd(CurrentCond(),
30170                                 dt,
30171                                 QRegister(rd),
30172                                 QRegister(rn),
30173                                 QRegister(rm));
30174                           break;
30175                         }
30176                         case 0x00000100: {
30177                           // 0xef000150
30178                           switch (instr & 0x10300000) {
30179                             case 0x00000000: {
30180                               // 0xef000150
30181                               if (((instr >> 12) & 1) != 0) {
30182                                 UnallocatedT32(instr);
30183                                 return;
30184                               }
30185                               unsigned rd = ExtractQRegister(instr, 22, 12);
30186                               if (((instr >> 16) & 1) != 0) {
30187                                 UnallocatedT32(instr);
30188                                 return;
30189                               }
30190                               unsigned rn = ExtractQRegister(instr, 7, 16);
30191                               if ((instr & 1) != 0) {
30192                                 UnallocatedT32(instr);
30193                                 return;
30194                               }
30195                               unsigned rm = ExtractQRegister(instr, 5, 0);
30196                               // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30197                               vand(CurrentCond(),
30198                                    kDataTypeValueNone,
30199                                    QRegister(rd),
30200                                    QRegister(rn),
30201                                    QRegister(rm));
30202                               break;
30203                             }
30204                             case 0x00100000: {
30205                               // 0xef100150
30206                               if (((instr >> 12) & 1) != 0) {
30207                                 UnallocatedT32(instr);
30208                                 return;
30209                               }
30210                               unsigned rd = ExtractQRegister(instr, 22, 12);
30211                               if (((instr >> 16) & 1) != 0) {
30212                                 UnallocatedT32(instr);
30213                                 return;
30214                               }
30215                               unsigned rn = ExtractQRegister(instr, 7, 16);
30216                               if ((instr & 1) != 0) {
30217                                 UnallocatedT32(instr);
30218                                 return;
30219                               }
30220                               unsigned rm = ExtractQRegister(instr, 5, 0);
30221                               // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30222                               vbic(CurrentCond(),
30223                                    kDataTypeValueNone,
30224                                    QRegister(rd),
30225                                    QRegister(rn),
30226                                    QRegister(rm));
30227                               break;
30228                             }
30229                             case 0x00200000: {
30230                               // 0xef200150
30231                               if (((instr & 0x00000040) == 0x00000040) &&
30232                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
30233                                      << 4) |
30234                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
30235                                    (((Uint32((instr >> 5)) & Uint32(0x1))
30236                                      << 4) |
30237                                     (Uint32(instr) & Uint32(0xf))))) {
30238                                 if (((instr >> 12) & 1) != 0) {
30239                                   UnallocatedT32(instr);
30240                                   return;
30241                                 }
30242                                 unsigned rd = ExtractQRegister(instr, 22, 12);
30243                                 if (((instr >> 16) & 1) != 0) {
30244                                   UnallocatedT32(instr);
30245                                   return;
30246                                 }
30247                                 unsigned rm = ExtractQRegister(instr, 7, 16);
30248                                 // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1
30249                                 vmov(CurrentCond(),
30250                                      kDataTypeValueNone,
30251                                      QRegister(rd),
30252                                      QRegister(rm));
30253                                 return;
30254                               }
30255                               if (((instr >> 12) & 1) != 0) {
30256                                 UnallocatedT32(instr);
30257                                 return;
30258                               }
30259                               unsigned rd = ExtractQRegister(instr, 22, 12);
30260                               if (((instr >> 16) & 1) != 0) {
30261                                 UnallocatedT32(instr);
30262                                 return;
30263                               }
30264                               unsigned rn = ExtractQRegister(instr, 7, 16);
30265                               if ((instr & 1) != 0) {
30266                                 UnallocatedT32(instr);
30267                                 return;
30268                               }
30269                               unsigned rm = ExtractQRegister(instr, 5, 0);
30270                               // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30271                               vorr(CurrentCond(),
30272                                    kDataTypeValueNone,
30273                                    QRegister(rd),
30274                                    QRegister(rn),
30275                                    QRegister(rm));
30276                               break;
30277                             }
30278                             case 0x00300000: {
30279                               // 0xef300150
30280                               if (((instr >> 12) & 1) != 0) {
30281                                 UnallocatedT32(instr);
30282                                 return;
30283                               }
30284                               unsigned rd = ExtractQRegister(instr, 22, 12);
30285                               if (((instr >> 16) & 1) != 0) {
30286                                 UnallocatedT32(instr);
30287                                 return;
30288                               }
30289                               unsigned rn = ExtractQRegister(instr, 7, 16);
30290                               if ((instr & 1) != 0) {
30291                                 UnallocatedT32(instr);
30292                                 return;
30293                               }
30294                               unsigned rm = ExtractQRegister(instr, 5, 0);
30295                               // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30296                               vorn(CurrentCond(),
30297                                    kDataTypeValueNone,
30298                                    QRegister(rd),
30299                                    QRegister(rn),
30300                                    QRegister(rm));
30301                               break;
30302                             }
30303                             case 0x10000000: {
30304                               // 0xff000150
30305                               if (((instr >> 12) & 1) != 0) {
30306                                 UnallocatedT32(instr);
30307                                 return;
30308                               }
30309                               unsigned rd = ExtractQRegister(instr, 22, 12);
30310                               if (((instr >> 16) & 1) != 0) {
30311                                 UnallocatedT32(instr);
30312                                 return;
30313                               }
30314                               unsigned rn = ExtractQRegister(instr, 7, 16);
30315                               if ((instr & 1) != 0) {
30316                                 UnallocatedT32(instr);
30317                                 return;
30318                               }
30319                               unsigned rm = ExtractQRegister(instr, 5, 0);
30320                               // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30321                               veor(CurrentCond(),
30322                                    kDataTypeValueNone,
30323                                    QRegister(rd),
30324                                    QRegister(rn),
30325                                    QRegister(rm));
30326                               break;
30327                             }
30328                             case 0x10100000: {
30329                               // 0xff100150
30330                               if (((instr >> 12) & 1) != 0) {
30331                                 UnallocatedT32(instr);
30332                                 return;
30333                               }
30334                               unsigned rd = ExtractQRegister(instr, 22, 12);
30335                               if (((instr >> 16) & 1) != 0) {
30336                                 UnallocatedT32(instr);
30337                                 return;
30338                               }
30339                               unsigned rn = ExtractQRegister(instr, 7, 16);
30340                               if ((instr & 1) != 0) {
30341                                 UnallocatedT32(instr);
30342                                 return;
30343                               }
30344                               unsigned rm = ExtractQRegister(instr, 5, 0);
30345                               // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30346                               vbsl(CurrentCond(),
30347                                    kDataTypeValueNone,
30348                                    QRegister(rd),
30349                                    QRegister(rn),
30350                                    QRegister(rm));
30351                               break;
30352                             }
30353                             case 0x10200000: {
30354                               // 0xff200150
30355                               if (((instr >> 12) & 1) != 0) {
30356                                 UnallocatedT32(instr);
30357                                 return;
30358                               }
30359                               unsigned rd = ExtractQRegister(instr, 22, 12);
30360                               if (((instr >> 16) & 1) != 0) {
30361                                 UnallocatedT32(instr);
30362                                 return;
30363                               }
30364                               unsigned rn = ExtractQRegister(instr, 7, 16);
30365                               if ((instr & 1) != 0) {
30366                                 UnallocatedT32(instr);
30367                                 return;
30368                               }
30369                               unsigned rm = ExtractQRegister(instr, 5, 0);
30370                               // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30371                               vbit(CurrentCond(),
30372                                    kDataTypeValueNone,
30373                                    QRegister(rd),
30374                                    QRegister(rn),
30375                                    QRegister(rm));
30376                               break;
30377                             }
30378                             case 0x10300000: {
30379                               // 0xff300150
30380                               if (((instr >> 12) & 1) != 0) {
30381                                 UnallocatedT32(instr);
30382                                 return;
30383                               }
30384                               unsigned rd = ExtractQRegister(instr, 22, 12);
30385                               if (((instr >> 16) & 1) != 0) {
30386                                 UnallocatedT32(instr);
30387                                 return;
30388                               }
30389                               unsigned rn = ExtractQRegister(instr, 7, 16);
30390                               if ((instr & 1) != 0) {
30391                                 UnallocatedT32(instr);
30392                                 return;
30393                               }
30394                               unsigned rm = ExtractQRegister(instr, 5, 0);
30395                               // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30396                               vbif(CurrentCond(),
30397                                    kDataTypeValueNone,
30398                                    QRegister(rd),
30399                                    QRegister(rn),
30400                                    QRegister(rm));
30401                               break;
30402                             }
30403                           }
30404                           break;
30405                         }
30406                         case 0x00000200: {
30407                           // 0xef000250
30408                           DataType dt = Dt_U_size_3_Decode(
30409                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30410                           if (dt.Is(kDataTypeValueInvalid)) {
30411                             UnallocatedT32(instr);
30412                             return;
30413                           }
30414                           if (((instr >> 12) & 1) != 0) {
30415                             UnallocatedT32(instr);
30416                             return;
30417                           }
30418                           unsigned rd = ExtractQRegister(instr, 22, 12);
30419                           if (((instr >> 16) & 1) != 0) {
30420                             UnallocatedT32(instr);
30421                             return;
30422                           }
30423                           unsigned rn = ExtractQRegister(instr, 7, 16);
30424                           if ((instr & 1) != 0) {
30425                             UnallocatedT32(instr);
30426                             return;
30427                           }
30428                           unsigned rm = ExtractQRegister(instr, 5, 0);
30429                           // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30430                           vqsub(CurrentCond(),
30431                                 dt,
30432                                 QRegister(rd),
30433                                 QRegister(rn),
30434                                 QRegister(rm));
30435                           break;
30436                         }
30437                         case 0x00000300: {
30438                           // 0xef000350
30439                           DataType dt = Dt_U_size_1_Decode(
30440                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30441                           if (dt.Is(kDataTypeValueInvalid)) {
30442                             UnallocatedT32(instr);
30443                             return;
30444                           }
30445                           if (((instr >> 12) & 1) != 0) {
30446                             UnallocatedT32(instr);
30447                             return;
30448                           }
30449                           unsigned rd = ExtractQRegister(instr, 22, 12);
30450                           if (((instr >> 16) & 1) != 0) {
30451                             UnallocatedT32(instr);
30452                             return;
30453                           }
30454                           unsigned rn = ExtractQRegister(instr, 7, 16);
30455                           if ((instr & 1) != 0) {
30456                             UnallocatedT32(instr);
30457                             return;
30458                           }
30459                           unsigned rm = ExtractQRegister(instr, 5, 0);
30460                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30461                           vcge(CurrentCond(),
30462                                dt,
30463                                QRegister(rd),
30464                                QRegister(rn),
30465                                QRegister(rm));
30466                           break;
30467                         }
30468                         case 0x00000400: {
30469                           // 0xef000450
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 & 1) != 0) {
30482                             UnallocatedT32(instr);
30483                             return;
30484                           }
30485                           unsigned rm = ExtractQRegister(instr, 5, 0);
30486                           if (((instr >> 16) & 1) != 0) {
30487                             UnallocatedT32(instr);
30488                             return;
30489                           }
30490                           unsigned rn = ExtractQRegister(instr, 7, 16);
30491                           // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
30492                           vqshl(CurrentCond(),
30493                                 dt,
30494                                 QRegister(rd),
30495                                 QRegister(rm),
30496                                 QRegister(rn));
30497                           break;
30498                         }
30499                         case 0x00000500: {
30500                           // 0xef000550
30501                           DataType dt = Dt_U_size_3_Decode(
30502                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30503                           if (dt.Is(kDataTypeValueInvalid)) {
30504                             UnallocatedT32(instr);
30505                             return;
30506                           }
30507                           if (((instr >> 12) & 1) != 0) {
30508                             UnallocatedT32(instr);
30509                             return;
30510                           }
30511                           unsigned rd = ExtractQRegister(instr, 22, 12);
30512                           if ((instr & 1) != 0) {
30513                             UnallocatedT32(instr);
30514                             return;
30515                           }
30516                           unsigned rm = ExtractQRegister(instr, 5, 0);
30517                           if (((instr >> 16) & 1) != 0) {
30518                             UnallocatedT32(instr);
30519                             return;
30520                           }
30521                           unsigned rn = ExtractQRegister(instr, 7, 16);
30522                           // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
30523                           vqrshl(CurrentCond(),
30524                                  dt,
30525                                  QRegister(rd),
30526                                  QRegister(rm),
30527                                  QRegister(rn));
30528                           break;
30529                         }
30530                         case 0x00000600: {
30531                           // 0xef000650
30532                           DataType dt = Dt_U_size_1_Decode(
30533                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30534                           if (dt.Is(kDataTypeValueInvalid)) {
30535                             UnallocatedT32(instr);
30536                             return;
30537                           }
30538                           if (((instr >> 12) & 1) != 0) {
30539                             UnallocatedT32(instr);
30540                             return;
30541                           }
30542                           unsigned rd = ExtractQRegister(instr, 22, 12);
30543                           if (((instr >> 16) & 1) != 0) {
30544                             UnallocatedT32(instr);
30545                             return;
30546                           }
30547                           unsigned rn = ExtractQRegister(instr, 7, 16);
30548                           if ((instr & 1) != 0) {
30549                             UnallocatedT32(instr);
30550                             return;
30551                           }
30552                           unsigned rm = ExtractQRegister(instr, 5, 0);
30553                           // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30554                           vmin(CurrentCond(),
30555                                dt,
30556                                QRegister(rd),
30557                                QRegister(rn),
30558                                QRegister(rm));
30559                           break;
30560                         }
30561                         case 0x00000700: {
30562                           // 0xef000750
30563                           DataType dt = Dt_U_size_1_Decode(
30564                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30565                           if (dt.Is(kDataTypeValueInvalid)) {
30566                             UnallocatedT32(instr);
30567                             return;
30568                           }
30569                           if (((instr >> 12) & 1) != 0) {
30570                             UnallocatedT32(instr);
30571                             return;
30572                           }
30573                           unsigned rd = ExtractQRegister(instr, 22, 12);
30574                           if (((instr >> 16) & 1) != 0) {
30575                             UnallocatedT32(instr);
30576                             return;
30577                           }
30578                           unsigned rn = ExtractQRegister(instr, 7, 16);
30579                           if ((instr & 1) != 0) {
30580                             UnallocatedT32(instr);
30581                             return;
30582                           }
30583                           unsigned rm = ExtractQRegister(instr, 5, 0);
30584                           // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1
30585                           vaba(CurrentCond(),
30586                                dt,
30587                                QRegister(rd),
30588                                QRegister(rn),
30589                                QRegister(rm));
30590                           break;
30591                         }
30592                         case 0x00000800: {
30593                           // 0xef000850
30594                           switch (instr & 0x10000000) {
30595                             case 0x00000000: {
30596                               // 0xef000850
30597                               DataType dt =
30598                                   Dt_size_7_Decode((instr >> 20) & 0x3);
30599                               if (dt.Is(kDataTypeValueInvalid)) {
30600                                 UnallocatedT32(instr);
30601                                 return;
30602                               }
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                               // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30619                               vtst(CurrentCond(),
30620                                    dt,
30621                                    QRegister(rd),
30622                                    QRegister(rn),
30623                                    QRegister(rm));
30624                               break;
30625                             }
30626                             case 0x10000000: {
30627                               // 0xff000850
30628                               DataType dt =
30629                                   Dt_size_4_Decode((instr >> 20) & 0x3);
30630                               if (dt.Is(kDataTypeValueInvalid)) {
30631                                 UnallocatedT32(instr);
30632                                 return;
30633                               }
30634                               if (((instr >> 12) & 1) != 0) {
30635                                 UnallocatedT32(instr);
30636                                 return;
30637                               }
30638                               unsigned rd = ExtractQRegister(instr, 22, 12);
30639                               if (((instr >> 16) & 1) != 0) {
30640                                 UnallocatedT32(instr);
30641                                 return;
30642                               }
30643                               unsigned rn = ExtractQRegister(instr, 7, 16);
30644                               if ((instr & 1) != 0) {
30645                                 UnallocatedT32(instr);
30646                                 return;
30647                               }
30648                               unsigned rm = ExtractQRegister(instr, 5, 0);
30649                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30650                               vceq(CurrentCond(),
30651                                    dt,
30652                                    QRegister(rd),
30653                                    QRegister(rn),
30654                                    QRegister(rm));
30655                               break;
30656                             }
30657                           }
30658                           break;
30659                         }
30660                         case 0x00000900: {
30661                           // 0xef000950
30662                           DataType dt = Dt_op_size_1_Decode(
30663                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30664                           if (dt.Is(kDataTypeValueInvalid)) {
30665                             UnallocatedT32(instr);
30666                             return;
30667                           }
30668                           if (((instr >> 12) & 1) != 0) {
30669                             UnallocatedT32(instr);
30670                             return;
30671                           }
30672                           unsigned rd = ExtractQRegister(instr, 22, 12);
30673                           if (((instr >> 16) & 1) != 0) {
30674                             UnallocatedT32(instr);
30675                             return;
30676                           }
30677                           unsigned rn = ExtractQRegister(instr, 7, 16);
30678                           if ((instr & 1) != 0) {
30679                             UnallocatedT32(instr);
30680                             return;
30681                           }
30682                           unsigned rm = ExtractQRegister(instr, 5, 0);
30683                           // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30684                           vmul(CurrentCond(),
30685                                dt,
30686                                QRegister(rd),
30687                                QRegister(rn),
30688                                QRegister(rm));
30689                           break;
30690                         }
30691                         case 0x00000c00: {
30692                           // 0xef000c50
30693                           switch (instr & 0x10300000) {
30694                             case 0x00000000: {
30695                               // 0xef000c50
30696                               if (((instr >> 12) & 1) != 0) {
30697                                 UnallocatedT32(instr);
30698                                 return;
30699                               }
30700                               unsigned rd = ExtractQRegister(instr, 22, 12);
30701                               if (((instr >> 16) & 1) != 0) {
30702                                 UnallocatedT32(instr);
30703                                 return;
30704                               }
30705                               unsigned rn = ExtractQRegister(instr, 7, 16);
30706                               if ((instr & 1) != 0) {
30707                                 UnallocatedT32(instr);
30708                                 return;
30709                               }
30710                               unsigned rm = ExtractQRegister(instr, 5, 0);
30711                               // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30712                               vfma(CurrentCond(),
30713                                    F32,
30714                                    QRegister(rd),
30715                                    QRegister(rn),
30716                                    QRegister(rm));
30717                               break;
30718                             }
30719                             case 0x00200000: {
30720                               // 0xef200c50
30721                               if (((instr >> 12) & 1) != 0) {
30722                                 UnallocatedT32(instr);
30723                                 return;
30724                               }
30725                               unsigned rd = ExtractQRegister(instr, 22, 12);
30726                               if (((instr >> 16) & 1) != 0) {
30727                                 UnallocatedT32(instr);
30728                                 return;
30729                               }
30730                               unsigned rn = ExtractQRegister(instr, 7, 16);
30731                               if ((instr & 1) != 0) {
30732                                 UnallocatedT32(instr);
30733                                 return;
30734                               }
30735                               unsigned rm = ExtractQRegister(instr, 5, 0);
30736                               // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30737                               vfms(CurrentCond(),
30738                                    F32,
30739                                    QRegister(rd),
30740                                    QRegister(rn),
30741                                    QRegister(rm));
30742                               break;
30743                             }
30744                             default:
30745                               UnallocatedT32(instr);
30746                               break;
30747                           }
30748                           break;
30749                         }
30750                         case 0x00000d00: {
30751                           // 0xef000d50
30752                           switch (instr & 0x10300000) {
30753                             case 0x00000000: {
30754                               // 0xef000d50
30755                               if (((instr >> 12) & 1) != 0) {
30756                                 UnallocatedT32(instr);
30757                                 return;
30758                               }
30759                               unsigned rd = ExtractQRegister(instr, 22, 12);
30760                               if (((instr >> 16) & 1) != 0) {
30761                                 UnallocatedT32(instr);
30762                                 return;
30763                               }
30764                               unsigned rn = ExtractQRegister(instr, 7, 16);
30765                               if ((instr & 1) != 0) {
30766                                 UnallocatedT32(instr);
30767                                 return;
30768                               }
30769                               unsigned rm = ExtractQRegister(instr, 5, 0);
30770                               // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30771                               vmla(CurrentCond(),
30772                                    F32,
30773                                    QRegister(rd),
30774                                    QRegister(rn),
30775                                    QRegister(rm));
30776                               break;
30777                             }
30778                             case 0x00200000: {
30779                               // 0xef200d50
30780                               if (((instr >> 12) & 1) != 0) {
30781                                 UnallocatedT32(instr);
30782                                 return;
30783                               }
30784                               unsigned rd = ExtractQRegister(instr, 22, 12);
30785                               if (((instr >> 16) & 1) != 0) {
30786                                 UnallocatedT32(instr);
30787                                 return;
30788                               }
30789                               unsigned rn = ExtractQRegister(instr, 7, 16);
30790                               if ((instr & 1) != 0) {
30791                                 UnallocatedT32(instr);
30792                                 return;
30793                               }
30794                               unsigned rm = ExtractQRegister(instr, 5, 0);
30795                               // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30796                               vmls(CurrentCond(),
30797                                    F32,
30798                                    QRegister(rd),
30799                                    QRegister(rn),
30800                                    QRegister(rm));
30801                               break;
30802                             }
30803                             case 0x10000000: {
30804                               // 0xff000d50
30805                               if (((instr >> 12) & 1) != 0) {
30806                                 UnallocatedT32(instr);
30807                                 return;
30808                               }
30809                               unsigned rd = ExtractQRegister(instr, 22, 12);
30810                               if (((instr >> 16) & 1) != 0) {
30811                                 UnallocatedT32(instr);
30812                                 return;
30813                               }
30814                               unsigned rn = ExtractQRegister(instr, 7, 16);
30815                               if ((instr & 1) != 0) {
30816                                 UnallocatedT32(instr);
30817                                 return;
30818                               }
30819                               unsigned rm = ExtractQRegister(instr, 5, 0);
30820                               // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30821                               vmul(CurrentCond(),
30822                                    F32,
30823                                    QRegister(rd),
30824                                    QRegister(rn),
30825                                    QRegister(rm));
30826                               break;
30827                             }
30828                             default:
30829                               UnallocatedT32(instr);
30830                               break;
30831                           }
30832                           break;
30833                         }
30834                         case 0x00000e00: {
30835                           // 0xef000e50
30836                           switch (instr & 0x10300000) {
30837                             case 0x10000000: {
30838                               // 0xff000e50
30839                               if (((instr >> 12) & 1) != 0) {
30840                                 UnallocatedT32(instr);
30841                                 return;
30842                               }
30843                               unsigned rd = ExtractQRegister(instr, 22, 12);
30844                               if (((instr >> 16) & 1) != 0) {
30845                                 UnallocatedT32(instr);
30846                                 return;
30847                               }
30848                               unsigned rn = ExtractQRegister(instr, 7, 16);
30849                               if ((instr & 1) != 0) {
30850                                 UnallocatedT32(instr);
30851                                 return;
30852                               }
30853                               unsigned rm = ExtractQRegister(instr, 5, 0);
30854                               // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30855                               vacge(CurrentCond(),
30856                                     F32,
30857                                     QRegister(rd),
30858                                     QRegister(rn),
30859                                     QRegister(rm));
30860                               break;
30861                             }
30862                             case 0x10200000: {
30863                               // 0xff200e50
30864                               if (((instr >> 12) & 1) != 0) {
30865                                 UnallocatedT32(instr);
30866                                 return;
30867                               }
30868                               unsigned rd = ExtractQRegister(instr, 22, 12);
30869                               if (((instr >> 16) & 1) != 0) {
30870                                 UnallocatedT32(instr);
30871                                 return;
30872                               }
30873                               unsigned rn = ExtractQRegister(instr, 7, 16);
30874                               if ((instr & 1) != 0) {
30875                                 UnallocatedT32(instr);
30876                                 return;
30877                               }
30878                               unsigned rm = ExtractQRegister(instr, 5, 0);
30879                               // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30880                               vacgt(CurrentCond(),
30881                                     F32,
30882                                     QRegister(rd),
30883                                     QRegister(rn),
30884                                     QRegister(rm));
30885                               break;
30886                             }
30887                             default:
30888                               UnallocatedT32(instr);
30889                               break;
30890                           }
30891                           break;
30892                         }
30893                         case 0x00000f00: {
30894                           // 0xef000f50
30895                           switch (instr & 0x10300000) {
30896                             case 0x00000000: {
30897                               // 0xef000f50
30898                               if (((instr >> 12) & 1) != 0) {
30899                                 UnallocatedT32(instr);
30900                                 return;
30901                               }
30902                               unsigned rd = ExtractQRegister(instr, 22, 12);
30903                               if (((instr >> 16) & 1) != 0) {
30904                                 UnallocatedT32(instr);
30905                                 return;
30906                               }
30907                               unsigned rn = ExtractQRegister(instr, 7, 16);
30908                               if ((instr & 1) != 0) {
30909                                 UnallocatedT32(instr);
30910                                 return;
30911                               }
30912                               unsigned rm = ExtractQRegister(instr, 5, 0);
30913                               // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30914                               vrecps(CurrentCond(),
30915                                      F32,
30916                                      QRegister(rd),
30917                                      QRegister(rn),
30918                                      QRegister(rm));
30919                               break;
30920                             }
30921                             case 0x00200000: {
30922                               // 0xef200f50
30923                               if (((instr >> 12) & 1) != 0) {
30924                                 UnallocatedT32(instr);
30925                                 return;
30926                               }
30927                               unsigned rd = ExtractQRegister(instr, 22, 12);
30928                               if (((instr >> 16) & 1) != 0) {
30929                                 UnallocatedT32(instr);
30930                                 return;
30931                               }
30932                               unsigned rn = ExtractQRegister(instr, 7, 16);
30933                               if ((instr & 1) != 0) {
30934                                 UnallocatedT32(instr);
30935                                 return;
30936                               }
30937                               unsigned rm = ExtractQRegister(instr, 5, 0);
30938                               // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30939                               vrsqrts(CurrentCond(),
30940                                       F32,
30941                                       QRegister(rd),
30942                                       QRegister(rn),
30943                                       QRegister(rm));
30944                               break;
30945                             }
30946                             case 0x10000000: {
30947                               // 0xff000f50
30948                               if (((instr >> 12) & 1) != 0) {
30949                                 UnallocatedT32(instr);
30950                                 return;
30951                               }
30952                               unsigned rd = ExtractQRegister(instr, 22, 12);
30953                               if (((instr >> 16) & 1) != 0) {
30954                                 UnallocatedT32(instr);
30955                                 return;
30956                               }
30957                               unsigned rn = ExtractQRegister(instr, 7, 16);
30958                               if ((instr & 1) != 0) {
30959                                 UnallocatedT32(instr);
30960                                 return;
30961                               }
30962                               unsigned rm = ExtractQRegister(instr, 5, 0);
30963                               // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30964                               vmaxnm(F32,
30965                                      QRegister(rd),
30966                                      QRegister(rn),
30967                                      QRegister(rm));
30968                               if (InITBlock()) {
30969                                 UnpredictableT32(instr);
30970                               }
30971                               break;
30972                             }
30973                             case 0x10200000: {
30974                               // 0xff200f50
30975                               if (((instr >> 12) & 1) != 0) {
30976                                 UnallocatedT32(instr);
30977                                 return;
30978                               }
30979                               unsigned rd = ExtractQRegister(instr, 22, 12);
30980                               if (((instr >> 16) & 1) != 0) {
30981                                 UnallocatedT32(instr);
30982                                 return;
30983                               }
30984                               unsigned rn = ExtractQRegister(instr, 7, 16);
30985                               if ((instr & 1) != 0) {
30986                                 UnallocatedT32(instr);
30987                                 return;
30988                               }
30989                               unsigned rm = ExtractQRegister(instr, 5, 0);
30990                               // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30991                               vminnm(F32,
30992                                      QRegister(rd),
30993                                      QRegister(rn),
30994                                      QRegister(rm));
30995                               if (InITBlock()) {
30996                                 UnpredictableT32(instr);
30997                               }
30998                               break;
30999                             }
31000                             default:
31001                               UnallocatedT32(instr);
31002                               break;
31003                           }
31004                           break;
31005                         }
31006                         default:
31007                           UnallocatedT32(instr);
31008                           break;
31009                       }
31010                       break;
31011                     }
31012                     case 0x00800000: {
31013                       // 0xef800010
31014                       switch (instr & 0x00000c00) {
31015                         case 0x00000000: {
31016                           // 0xef800010
31017                           switch (instr & 0x00380080) {
31018                             case 0x00000000: {
31019                               // 0xef800010
31020                               switch (instr & 0x00000100) {
31021                                 case 0x00000000: {
31022                                   // 0xef800010
31023                                   switch (instr & 0x00000200) {
31024                                     default: {
31025                                       switch (instr & 0x00000020) {
31026                                         case 0x00000020: {
31027                                           // 0xef800030
31028                                           if (((instr & 0xd00) == 0x100) ||
31029                                               ((instr & 0xd00) == 0x500) ||
31030                                               ((instr & 0xd00) == 0x900) ||
31031                                               ((instr & 0xe00) == 0xe00)) {
31032                                             UnallocatedT32(instr);
31033                                             return;
31034                                           }
31035                                           unsigned cmode = (instr >> 8) & 0xf;
31036                                           DataType dt =
31037                                               ImmediateVmvn::DecodeDt(cmode);
31038                                           if (dt.Is(kDataTypeValueInvalid)) {
31039                                             UnallocatedT32(instr);
31040                                             return;
31041                                           }
31042                                           unsigned rd =
31043                                               ExtractDRegister(instr, 22, 12);
31044                                           DOperand imm =
31045                                               ImmediateVmvn::DecodeImmediate(
31046                                                   cmode,
31047                                                   (instr & 0xf) |
31048                                                       ((instr >> 12) & 0x70) |
31049                                                       ((instr >> 21) & 0x80));
31050                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31051                                           vmvn(CurrentCond(),
31052                                                dt,
31053                                                DRegister(rd),
31054                                                imm);
31055                                           break;
31056                                         }
31057                                         default: {
31058                                           if (((instr & 0x920) == 0x100) ||
31059                                               ((instr & 0x520) == 0x100) ||
31060                                               ((instr & 0x820) == 0x20) ||
31061                                               ((instr & 0x420) == 0x20) ||
31062                                               ((instr & 0x220) == 0x20) ||
31063                                               ((instr & 0x120) == 0x120)) {
31064                                             UnallocatedT32(instr);
31065                                             return;
31066                                           }
31067                                           unsigned cmode =
31068                                               ((instr >> 8) & 0xf) |
31069                                               ((instr >> 1) & 0x10);
31070                                           DataType dt =
31071                                               ImmediateVmov::DecodeDt(cmode);
31072                                           if (dt.Is(kDataTypeValueInvalid)) {
31073                                             UnallocatedT32(instr);
31074                                             return;
31075                                           }
31076                                           unsigned rd =
31077                                               ExtractDRegister(instr, 22, 12);
31078                                           DOperand imm =
31079                                               ImmediateVmov::DecodeImmediate(
31080                                                   cmode,
31081                                                   (instr & 0xf) |
31082                                                       ((instr >> 12) & 0x70) |
31083                                                       ((instr >> 21) & 0x80));
31084                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31085                                           vmov(CurrentCond(),
31086                                                dt,
31087                                                DRegister(rd),
31088                                                imm);
31089                                           break;
31090                                         }
31091                                       }
31092                                       break;
31093                                     }
31094                                   }
31095                                   break;
31096                                 }
31097                                 case 0x00000100: {
31098                                   // 0xef800110
31099                                   switch (instr & 0x00000020) {
31100                                     case 0x00000000: {
31101                                       // 0xef800110
31102                                       if (((instr & 0x100) == 0x0) ||
31103                                           ((instr & 0xc00) == 0xc00)) {
31104                                         UnallocatedT32(instr);
31105                                         return;
31106                                       }
31107                                       unsigned cmode = (instr >> 8) & 0xf;
31108                                       DataType dt =
31109                                           ImmediateVorr::DecodeDt(cmode);
31110                                       if (dt.Is(kDataTypeValueInvalid)) {
31111                                         UnallocatedT32(instr);
31112                                         return;
31113                                       }
31114                                       unsigned rd =
31115                                           ExtractDRegister(instr, 22, 12);
31116                                       DOperand imm =
31117                                           ImmediateVorr::DecodeImmediate(
31118                                               cmode,
31119                                               (instr & 0xf) |
31120                                                   ((instr >> 12) & 0x70) |
31121                                                   ((instr >> 21) & 0x80));
31122                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31123                                       vorr(CurrentCond(),
31124                                            dt,
31125                                            DRegister(rd),
31126                                            DRegister(rd),
31127                                            imm);
31128                                       break;
31129                                     }
31130                                     case 0x00000020: {
31131                                       // 0xef800130
31132                                       if (((instr & 0x100) == 0x0) ||
31133                                           ((instr & 0xc00) == 0xc00)) {
31134                                         UnallocatedT32(instr);
31135                                         return;
31136                                       }
31137                                       unsigned cmode = (instr >> 8) & 0xf;
31138                                       DataType dt =
31139                                           ImmediateVbic::DecodeDt(cmode);
31140                                       if (dt.Is(kDataTypeValueInvalid)) {
31141                                         UnallocatedT32(instr);
31142                                         return;
31143                                       }
31144                                       unsigned rd =
31145                                           ExtractDRegister(instr, 22, 12);
31146                                       DOperand imm =
31147                                           ImmediateVbic::DecodeImmediate(
31148                                               cmode,
31149                                               (instr & 0xf) |
31150                                                   ((instr >> 12) & 0x70) |
31151                                                   ((instr >> 21) & 0x80));
31152                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31153                                       vbic(CurrentCond(),
31154                                            dt,
31155                                            DRegister(rd),
31156                                            DRegister(rd),
31157                                            imm);
31158                                       break;
31159                                     }
31160                                   }
31161                                   break;
31162                                 }
31163                               }
31164                               break;
31165                             }
31166                             default: {
31167                               switch (instr & 0x00000300) {
31168                                 case 0x00000000: {
31169                                   // 0xef800010
31170                                   if (((instr & 0x380080) == 0x0)) {
31171                                     UnallocatedT32(instr);
31172                                     return;
31173                                   }
31174                                   DataType dt =
31175                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31176                                                              ((instr >> 4) &
31177                                                               0x8),
31178                                                          (instr >> 28) & 0x1);
31179                                   if (dt.Is(kDataTypeValueInvalid)) {
31180                                     UnallocatedT32(instr);
31181                                     return;
31182                                   }
31183                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31184                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31185                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31186                                   uint32_t imm =
31187                                       (dt.IsSize(64) ? 64
31188                                                      : (dt.GetSize() * 2)) -
31189                                       imm6;
31190                                   // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31191                                   vshr(CurrentCond(),
31192                                        dt,
31193                                        DRegister(rd),
31194                                        DRegister(rm),
31195                                        imm);
31196                                   break;
31197                                 }
31198                                 case 0x00000100: {
31199                                   // 0xef800110
31200                                   if (((instr & 0x380080) == 0x0)) {
31201                                     UnallocatedT32(instr);
31202                                     return;
31203                                   }
31204                                   DataType dt =
31205                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31206                                                              ((instr >> 4) &
31207                                                               0x8),
31208                                                          (instr >> 28) & 0x1);
31209                                   if (dt.Is(kDataTypeValueInvalid)) {
31210                                     UnallocatedT32(instr);
31211                                     return;
31212                                   }
31213                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31214                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31215                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31216                                   uint32_t imm =
31217                                       (dt.IsSize(64) ? 64
31218                                                      : (dt.GetSize() * 2)) -
31219                                       imm6;
31220                                   // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31221                                   vsra(CurrentCond(),
31222                                        dt,
31223                                        DRegister(rd),
31224                                        DRegister(rm),
31225                                        imm);
31226                                   break;
31227                                 }
31228                                 case 0x00000200: {
31229                                   // 0xef800210
31230                                   if (((instr & 0x380080) == 0x0)) {
31231                                     UnallocatedT32(instr);
31232                                     return;
31233                                   }
31234                                   DataType dt =
31235                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31236                                                              ((instr >> 4) &
31237                                                               0x8),
31238                                                          (instr >> 28) & 0x1);
31239                                   if (dt.Is(kDataTypeValueInvalid)) {
31240                                     UnallocatedT32(instr);
31241                                     return;
31242                                   }
31243                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31244                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31245                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31246                                   uint32_t imm =
31247                                       (dt.IsSize(64) ? 64
31248                                                      : (dt.GetSize() * 2)) -
31249                                       imm6;
31250                                   // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31251                                   vrshr(CurrentCond(),
31252                                         dt,
31253                                         DRegister(rd),
31254                                         DRegister(rm),
31255                                         imm);
31256                                   break;
31257                                 }
31258                                 case 0x00000300: {
31259                                   // 0xef800310
31260                                   if (((instr & 0x380080) == 0x0)) {
31261                                     UnallocatedT32(instr);
31262                                     return;
31263                                   }
31264                                   DataType dt =
31265                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31266                                                              ((instr >> 4) &
31267                                                               0x8),
31268                                                          (instr >> 28) & 0x1);
31269                                   if (dt.Is(kDataTypeValueInvalid)) {
31270                                     UnallocatedT32(instr);
31271                                     return;
31272                                   }
31273                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31274                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31275                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31276                                   uint32_t imm =
31277                                       (dt.IsSize(64) ? 64
31278                                                      : (dt.GetSize() * 2)) -
31279                                       imm6;
31280                                   // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31281                                   vrsra(CurrentCond(),
31282                                         dt,
31283                                         DRegister(rd),
31284                                         DRegister(rm),
31285                                         imm);
31286                                   break;
31287                                 }
31288                               }
31289                               break;
31290                             }
31291                           }
31292                           break;
31293                         }
31294                         case 0x00000400: {
31295                           // 0xef800410
31296                           switch (instr & 0x00380080) {
31297                             case 0x00000000: {
31298                               // 0xef800410
31299                               switch (instr & 0x00000100) {
31300                                 case 0x00000000: {
31301                                   // 0xef800410
31302                                   switch (instr & 0x00000200) {
31303                                     default: {
31304                                       switch (instr & 0x00000020) {
31305                                         case 0x00000020: {
31306                                           // 0xef800430
31307                                           if (((instr & 0xd00) == 0x100) ||
31308                                               ((instr & 0xd00) == 0x500) ||
31309                                               ((instr & 0xd00) == 0x900) ||
31310                                               ((instr & 0xe00) == 0xe00)) {
31311                                             UnallocatedT32(instr);
31312                                             return;
31313                                           }
31314                                           unsigned cmode = (instr >> 8) & 0xf;
31315                                           DataType dt =
31316                                               ImmediateVmvn::DecodeDt(cmode);
31317                                           if (dt.Is(kDataTypeValueInvalid)) {
31318                                             UnallocatedT32(instr);
31319                                             return;
31320                                           }
31321                                           unsigned rd =
31322                                               ExtractDRegister(instr, 22, 12);
31323                                           DOperand imm =
31324                                               ImmediateVmvn::DecodeImmediate(
31325                                                   cmode,
31326                                                   (instr & 0xf) |
31327                                                       ((instr >> 12) & 0x70) |
31328                                                       ((instr >> 21) & 0x80));
31329                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31330                                           vmvn(CurrentCond(),
31331                                                dt,
31332                                                DRegister(rd),
31333                                                imm);
31334                                           break;
31335                                         }
31336                                         default: {
31337                                           if (((instr & 0x920) == 0x100) ||
31338                                               ((instr & 0x520) == 0x100) ||
31339                                               ((instr & 0x820) == 0x20) ||
31340                                               ((instr & 0x420) == 0x20) ||
31341                                               ((instr & 0x220) == 0x20) ||
31342                                               ((instr & 0x120) == 0x120)) {
31343                                             UnallocatedT32(instr);
31344                                             return;
31345                                           }
31346                                           unsigned cmode =
31347                                               ((instr >> 8) & 0xf) |
31348                                               ((instr >> 1) & 0x10);
31349                                           DataType dt =
31350                                               ImmediateVmov::DecodeDt(cmode);
31351                                           if (dt.Is(kDataTypeValueInvalid)) {
31352                                             UnallocatedT32(instr);
31353                                             return;
31354                                           }
31355                                           unsigned rd =
31356                                               ExtractDRegister(instr, 22, 12);
31357                                           DOperand imm =
31358                                               ImmediateVmov::DecodeImmediate(
31359                                                   cmode,
31360                                                   (instr & 0xf) |
31361                                                       ((instr >> 12) & 0x70) |
31362                                                       ((instr >> 21) & 0x80));
31363                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31364                                           vmov(CurrentCond(),
31365                                                dt,
31366                                                DRegister(rd),
31367                                                imm);
31368                                           break;
31369                                         }
31370                                       }
31371                                       break;
31372                                     }
31373                                   }
31374                                   break;
31375                                 }
31376                                 case 0x00000100: {
31377                                   // 0xef800510
31378                                   switch (instr & 0x00000020) {
31379                                     case 0x00000000: {
31380                                       // 0xef800510
31381                                       if (((instr & 0x100) == 0x0) ||
31382                                           ((instr & 0xc00) == 0xc00)) {
31383                                         UnallocatedT32(instr);
31384                                         return;
31385                                       }
31386                                       unsigned cmode = (instr >> 8) & 0xf;
31387                                       DataType dt =
31388                                           ImmediateVorr::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                                           ImmediateVorr::DecodeImmediate(
31397                                               cmode,
31398                                               (instr & 0xf) |
31399                                                   ((instr >> 12) & 0x70) |
31400                                                   ((instr >> 21) & 0x80));
31401                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31402                                       vorr(CurrentCond(),
31403                                            dt,
31404                                            DRegister(rd),
31405                                            DRegister(rd),
31406                                            imm);
31407                                       break;
31408                                     }
31409                                     case 0x00000020: {
31410                                       // 0xef800530
31411                                       if (((instr & 0x100) == 0x0) ||
31412                                           ((instr & 0xc00) == 0xc00)) {
31413                                         UnallocatedT32(instr);
31414                                         return;
31415                                       }
31416                                       unsigned cmode = (instr >> 8) & 0xf;
31417                                       DataType dt =
31418                                           ImmediateVbic::DecodeDt(cmode);
31419                                       if (dt.Is(kDataTypeValueInvalid)) {
31420                                         UnallocatedT32(instr);
31421                                         return;
31422                                       }
31423                                       unsigned rd =
31424                                           ExtractDRegister(instr, 22, 12);
31425                                       DOperand imm =
31426                                           ImmediateVbic::DecodeImmediate(
31427                                               cmode,
31428                                               (instr & 0xf) |
31429                                                   ((instr >> 12) & 0x70) |
31430                                                   ((instr >> 21) & 0x80));
31431                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31432                                       vbic(CurrentCond(),
31433                                            dt,
31434                                            DRegister(rd),
31435                                            DRegister(rd),
31436                                            imm);
31437                                       break;
31438                                     }
31439                                   }
31440                                   break;
31441                                 }
31442                               }
31443                               break;
31444                             }
31445                             default: {
31446                               switch (instr & 0x00000300) {
31447                                 case 0x00000000: {
31448                                   // 0xef800410
31449                                   if ((instr & 0x10000000) == 0x10000000) {
31450                                     if (((instr & 0x380080) == 0x0)) {
31451                                       UnallocatedT32(instr);
31452                                       return;
31453                                     }
31454                                     DataType dt = Dt_L_imm6_4_Decode(
31455                                         ((instr >> 19) & 0x7) |
31456                                         ((instr >> 4) & 0x8));
31457                                     if (dt.Is(kDataTypeValueInvalid)) {
31458                                       UnallocatedT32(instr);
31459                                       return;
31460                                     }
31461                                     unsigned rd =
31462                                         ExtractDRegister(instr, 22, 12);
31463                                     unsigned rm = ExtractDRegister(instr, 5, 0);
31464                                     uint32_t imm6 = (instr >> 16) & 0x3f;
31465                                     uint32_t imm =
31466                                         (dt.IsSize(64) ? 64
31467                                                        : (dt.GetSize() * 2)) -
31468                                         imm6;
31469                                     // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31470                                     vsri(CurrentCond(),
31471                                          dt,
31472                                          DRegister(rd),
31473                                          DRegister(rm),
31474                                          imm);
31475                                   } else {
31476                                     UnallocatedT32(instr);
31477                                   }
31478                                   break;
31479                                 }
31480                                 case 0x00000100: {
31481                                   // 0xef800510
31482                                   switch (instr & 0x10000000) {
31483                                     case 0x00000000: {
31484                                       // 0xef800510
31485                                       if (((instr & 0x380080) == 0x0)) {
31486                                         UnallocatedT32(instr);
31487                                         return;
31488                                       }
31489                                       DataType dt = Dt_L_imm6_3_Decode(
31490                                           ((instr >> 19) & 0x7) |
31491                                           ((instr >> 4) & 0x8));
31492                                       if (dt.Is(kDataTypeValueInvalid)) {
31493                                         UnallocatedT32(instr);
31494                                         return;
31495                                       }
31496                                       unsigned rd =
31497                                           ExtractDRegister(instr, 22, 12);
31498                                       unsigned rm =
31499                                           ExtractDRegister(instr, 5, 0);
31500                                       uint32_t imm6 = (instr >> 16) & 0x3f;
31501                                       uint32_t imm =
31502                                           imm6 -
31503                                           (dt.IsSize(64) ? 0 : dt.GetSize());
31504                                       // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31505                                       vshl(CurrentCond(),
31506                                            dt,
31507                                            DRegister(rd),
31508                                            DRegister(rm),
31509                                            imm);
31510                                       break;
31511                                     }
31512                                     case 0x10000000: {
31513                                       // 0xff800510
31514                                       if (((instr & 0x380080) == 0x0)) {
31515                                         UnallocatedT32(instr);
31516                                         return;
31517                                       }
31518                                       DataType dt = Dt_L_imm6_4_Decode(
31519                                           ((instr >> 19) & 0x7) |
31520                                           ((instr >> 4) & 0x8));
31521                                       if (dt.Is(kDataTypeValueInvalid)) {
31522                                         UnallocatedT32(instr);
31523                                         return;
31524                                       }
31525                                       unsigned rd =
31526                                           ExtractDRegister(instr, 22, 12);
31527                                       unsigned rm =
31528                                           ExtractDRegister(instr, 5, 0);
31529                                       uint32_t imm6 = (instr >> 16) & 0x3f;
31530                                       uint32_t imm =
31531                                           imm6 -
31532                                           (dt.IsSize(64) ? 0 : dt.GetSize());
31533                                       // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31534                                       vsli(CurrentCond(),
31535                                            dt,
31536                                            DRegister(rd),
31537                                            DRegister(rm),
31538                                            imm);
31539                                       break;
31540                                     }
31541                                   }
31542                                   break;
31543                                 }
31544                                 case 0x00000200: {
31545                                   // 0xef800610
31546                                   if (((instr & 0x380080) == 0x0)) {
31547                                     UnallocatedT32(instr);
31548                                     return;
31549                                   }
31550                                   DataType dt =
31551                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
31552                                                              ((instr >> 4) &
31553                                                               0x8),
31554                                                          (instr >> 28) & 0x1);
31555                                   if (dt.Is(kDataTypeValueInvalid)) {
31556                                     UnallocatedT32(instr);
31557                                     return;
31558                                   }
31559                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31560                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31561                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31562                                   uint32_t imm =
31563                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
31564                                   // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31565                                   vqshlu(CurrentCond(),
31566                                          dt,
31567                                          DRegister(rd),
31568                                          DRegister(rm),
31569                                          imm);
31570                                   break;
31571                                 }
31572                                 case 0x00000300: {
31573                                   // 0xef800710
31574                                   if (((instr & 0x380080) == 0x0)) {
31575                                     UnallocatedT32(instr);
31576                                     return;
31577                                   }
31578                                   DataType dt =
31579                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31580                                                              ((instr >> 4) &
31581                                                               0x8),
31582                                                          (instr >> 28) & 0x1);
31583                                   if (dt.Is(kDataTypeValueInvalid)) {
31584                                     UnallocatedT32(instr);
31585                                     return;
31586                                   }
31587                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31588                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31589                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31590                                   uint32_t imm =
31591                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
31592                                   // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31593                                   vqshl(CurrentCond(),
31594                                         dt,
31595                                         DRegister(rd),
31596                                         DRegister(rm),
31597                                         imm);
31598                                   break;
31599                                 }
31600                               }
31601                               break;
31602                             }
31603                           }
31604                           break;
31605                         }
31606                         case 0x00000800: {
31607                           // 0xef800810
31608                           switch (instr & 0x00000080) {
31609                             case 0x00000000: {
31610                               // 0xef800810
31611                               switch (instr & 0x00380000) {
31612                                 case 0x00000000: {
31613                                   // 0xef800810
31614                                   switch (instr & 0x00000100) {
31615                                     case 0x00000000: {
31616                                       // 0xef800810
31617                                       switch (instr & 0x00000200) {
31618                                         default: {
31619                                           switch (instr & 0x00000020) {
31620                                             case 0x00000020: {
31621                                               // 0xef800830
31622                                               if (((instr & 0xd00) == 0x100) ||
31623                                                   ((instr & 0xd00) == 0x500) ||
31624                                                   ((instr & 0xd00) == 0x900) ||
31625                                                   ((instr & 0xe00) == 0xe00)) {
31626                                                 UnallocatedT32(instr);
31627                                                 return;
31628                                               }
31629                                               unsigned cmode =
31630                                                   (instr >> 8) & 0xf;
31631                                               DataType dt =
31632                                                   ImmediateVmvn::DecodeDt(
31633                                                       cmode);
31634                                               if (dt.Is(
31635                                                       kDataTypeValueInvalid)) {
31636                                                 UnallocatedT32(instr);
31637                                                 return;
31638                                               }
31639                                               unsigned rd =
31640                                                   ExtractDRegister(instr,
31641                                                                    22,
31642                                                                    12);
31643                                               DOperand imm = ImmediateVmvn::
31644                                                   DecodeImmediate(cmode,
31645                                                                   (instr &
31646                                                                    0xf) |
31647                                                                       ((instr >>
31648                                                                         12) &
31649                                                                        0x70) |
31650                                                                       ((instr >>
31651                                                                         21) &
31652                                                                        0x80));
31653                                               // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31654                                               vmvn(CurrentCond(),
31655                                                    dt,
31656                                                    DRegister(rd),
31657                                                    imm);
31658                                               break;
31659                                             }
31660                                             default: {
31661                                               if (((instr & 0x920) == 0x100) ||
31662                                                   ((instr & 0x520) == 0x100) ||
31663                                                   ((instr & 0x820) == 0x20) ||
31664                                                   ((instr & 0x420) == 0x20) ||
31665                                                   ((instr & 0x220) == 0x20) ||
31666                                                   ((instr & 0x120) == 0x120)) {
31667                                                 UnallocatedT32(instr);
31668                                                 return;
31669                                               }
31670                                               unsigned cmode =
31671                                                   ((instr >> 8) & 0xf) |
31672                                                   ((instr >> 1) & 0x10);
31673                                               DataType dt =
31674                                                   ImmediateVmov::DecodeDt(
31675                                                       cmode);
31676                                               if (dt.Is(
31677                                                       kDataTypeValueInvalid)) {
31678                                                 UnallocatedT32(instr);
31679                                                 return;
31680                                               }
31681                                               unsigned rd =
31682                                                   ExtractDRegister(instr,
31683                                                                    22,
31684                                                                    12);
31685                                               DOperand imm = ImmediateVmov::
31686                                                   DecodeImmediate(cmode,
31687                                                                   (instr &
31688                                                                    0xf) |
31689                                                                       ((instr >>
31690                                                                         12) &
31691                                                                        0x70) |
31692                                                                       ((instr >>
31693                                                                         21) &
31694                                                                        0x80));
31695                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31696                                               vmov(CurrentCond(),
31697                                                    dt,
31698                                                    DRegister(rd),
31699                                                    imm);
31700                                               break;
31701                                             }
31702                                           }
31703                                           break;
31704                                         }
31705                                       }
31706                                       break;
31707                                     }
31708                                     case 0x00000100: {
31709                                       // 0xef800910
31710                                       switch (instr & 0x00000020) {
31711                                         case 0x00000000: {
31712                                           // 0xef800910
31713                                           if (((instr & 0x100) == 0x0) ||
31714                                               ((instr & 0xc00) == 0xc00)) {
31715                                             UnallocatedT32(instr);
31716                                             return;
31717                                           }
31718                                           unsigned cmode = (instr >> 8) & 0xf;
31719                                           DataType dt =
31720                                               ImmediateVorr::DecodeDt(cmode);
31721                                           if (dt.Is(kDataTypeValueInvalid)) {
31722                                             UnallocatedT32(instr);
31723                                             return;
31724                                           }
31725                                           unsigned rd =
31726                                               ExtractDRegister(instr, 22, 12);
31727                                           DOperand imm =
31728                                               ImmediateVorr::DecodeImmediate(
31729                                                   cmode,
31730                                                   (instr & 0xf) |
31731                                                       ((instr >> 12) & 0x70) |
31732                                                       ((instr >> 21) & 0x80));
31733                                           // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31734                                           vorr(CurrentCond(),
31735                                                dt,
31736                                                DRegister(rd),
31737                                                DRegister(rd),
31738                                                imm);
31739                                           break;
31740                                         }
31741                                         case 0x00000020: {
31742                                           // 0xef800930
31743                                           if (((instr & 0x100) == 0x0) ||
31744                                               ((instr & 0xc00) == 0xc00)) {
31745                                             UnallocatedT32(instr);
31746                                             return;
31747                                           }
31748                                           unsigned cmode = (instr >> 8) & 0xf;
31749                                           DataType dt =
31750                                               ImmediateVbic::DecodeDt(cmode);
31751                                           if (dt.Is(kDataTypeValueInvalid)) {
31752                                             UnallocatedT32(instr);
31753                                             return;
31754                                           }
31755                                           unsigned rd =
31756                                               ExtractDRegister(instr, 22, 12);
31757                                           DOperand imm =
31758                                               ImmediateVbic::DecodeImmediate(
31759                                                   cmode,
31760                                                   (instr & 0xf) |
31761                                                       ((instr >> 12) & 0x70) |
31762                                                       ((instr >> 21) & 0x80));
31763                                           // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31764                                           vbic(CurrentCond(),
31765                                                dt,
31766                                                DRegister(rd),
31767                                                DRegister(rd),
31768                                                imm);
31769                                           break;
31770                                         }
31771                                       }
31772                                       break;
31773                                     }
31774                                   }
31775                                   break;
31776                                 }
31777                                 case 0x00180000: {
31778                                   // 0xef980810
31779                                   switch (instr & 0x00000300) {
31780                                     case 0x00000000: {
31781                                       // 0xef980810
31782                                       switch (instr & 0x10000000) {
31783                                         case 0x00000000: {
31784                                           // 0xef980810
31785                                           if (((instr & 0x380000) == 0x0)) {
31786                                             UnallocatedT32(instr);
31787                                             return;
31788                                           }
31789                                           DataType dt = Dt_imm6_3_Decode(
31790                                               (instr >> 19) & 0x7);
31791                                           if (dt.Is(kDataTypeValueInvalid)) {
31792                                             UnallocatedT32(instr);
31793                                             return;
31794                                           }
31795                                           unsigned rd =
31796                                               ExtractDRegister(instr, 22, 12);
31797                                           if ((instr & 1) != 0) {
31798                                             UnallocatedT32(instr);
31799                                             return;
31800                                           }
31801                                           unsigned rm =
31802                                               ExtractQRegister(instr, 5, 0);
31803                                           uint32_t imm6 = (instr >> 16) & 0x3f;
31804                                           uint32_t imm = dt.GetSize() - imm6;
31805                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31806                                           vshrn(CurrentCond(),
31807                                                 dt,
31808                                                 DRegister(rd),
31809                                                 QRegister(rm),
31810                                                 imm);
31811                                           break;
31812                                         }
31813                                         case 0x10000000: {
31814                                           // 0xff980810
31815                                           if (((instr & 0x380000) == 0x0)) {
31816                                             UnallocatedT32(instr);
31817                                             return;
31818                                           }
31819                                           DataType dt =
31820                                               Dt_imm6_2_Decode((instr >> 19) &
31821                                                                    0x7,
31822                                                                (instr >> 28) &
31823                                                                    0x1);
31824                                           if (dt.Is(kDataTypeValueInvalid)) {
31825                                             UnallocatedT32(instr);
31826                                             return;
31827                                           }
31828                                           unsigned rd =
31829                                               ExtractDRegister(instr, 22, 12);
31830                                           if ((instr & 1) != 0) {
31831                                             UnallocatedT32(instr);
31832                                             return;
31833                                           }
31834                                           unsigned rm =
31835                                               ExtractQRegister(instr, 5, 0);
31836                                           uint32_t imm6 = (instr >> 16) & 0x3f;
31837                                           uint32_t imm = dt.GetSize() - imm6;
31838                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31839                                           vqshrun(CurrentCond(),
31840                                                   dt,
31841                                                   DRegister(rd),
31842                                                   QRegister(rm),
31843                                                   imm);
31844                                           break;
31845                                         }
31846                                       }
31847                                       break;
31848                                     }
31849                                     case 0x00000100: {
31850                                       // 0xef980910
31851                                       if (((instr & 0x380000) == 0x0)) {
31852                                         UnallocatedT32(instr);
31853                                         return;
31854                                       }
31855                                       DataType dt =
31856                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
31857                                                            (instr >> 28) & 0x1);
31858                                       if (dt.Is(kDataTypeValueInvalid)) {
31859                                         UnallocatedT32(instr);
31860                                         return;
31861                                       }
31862                                       unsigned rd =
31863                                           ExtractDRegister(instr, 22, 12);
31864                                       if ((instr & 1) != 0) {
31865                                         UnallocatedT32(instr);
31866                                         return;
31867                                       }
31868                                       unsigned rm =
31869                                           ExtractQRegister(instr, 5, 0);
31870                                       uint32_t imm6 = (instr >> 16) & 0x3f;
31871                                       uint32_t imm = dt.GetSize() - imm6;
31872                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31873                                       vqshrn(CurrentCond(),
31874                                              dt,
31875                                              DRegister(rd),
31876                                              QRegister(rm),
31877                                              imm);
31878                                       break;
31879                                     }
31880                                     case 0x00000200: {
31881                                       // 0xef980a10
31882                                       if (((instr & 0x380000) == 0x0) ||
31883                                           ((instr & 0x3f0000) == 0x80000) ||
31884                                           ((instr & 0x3f0000) == 0x100000) ||
31885                                           ((instr & 0x3f0000) == 0x200000)) {
31886                                         UnallocatedT32(instr);
31887                                         return;
31888                                       }
31889                                       DataType dt =
31890                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
31891                                                            (instr >> 28) & 0x1);
31892                                       if (dt.Is(kDataTypeValueInvalid)) {
31893                                         UnallocatedT32(instr);
31894                                         return;
31895                                       }
31896                                       if (((instr >> 12) & 1) != 0) {
31897                                         UnallocatedT32(instr);
31898                                         return;
31899                                       }
31900                                       unsigned rd =
31901                                           ExtractQRegister(instr, 22, 12);
31902                                       unsigned rm =
31903                                           ExtractDRegister(instr, 5, 0);
31904                                       uint32_t imm6 = (instr >> 16) & 0x3f;
31905                                       uint32_t imm = imm6 - dt.GetSize();
31906                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31907                                       vshll(CurrentCond(),
31908                                             dt,
31909                                             QRegister(rd),
31910                                             DRegister(rm),
31911                                             imm);
31912                                       break;
31913                                     }
31914                                     default:
31915                                       UnallocatedT32(instr);
31916                                       break;
31917                                   }
31918                                   break;
31919                                 }
31920                                 case 0x00280000: {
31921                                   // 0xefa80810
31922                                   switch (instr & 0x00000300) {
31923                                     case 0x00000000: {
31924                                       // 0xefa80810
31925                                       switch (instr & 0x10000000) {
31926                                         case 0x00000000: {
31927                                           // 0xefa80810
31928                                           if (((instr & 0x380000) == 0x0)) {
31929                                             UnallocatedT32(instr);
31930                                             return;
31931                                           }
31932                                           DataType dt = Dt_imm6_3_Decode(
31933                                               (instr >> 19) & 0x7);
31934                                           if (dt.Is(kDataTypeValueInvalid)) {
31935                                             UnallocatedT32(instr);
31936                                             return;
31937                                           }
31938                                           unsigned rd =
31939                                               ExtractDRegister(instr, 22, 12);
31940                                           if ((instr & 1) != 0) {
31941                                             UnallocatedT32(instr);
31942                                             return;
31943                                           }
31944                                           unsigned rm =
31945                                               ExtractQRegister(instr, 5, 0);
31946                                           uint32_t imm6 = (instr >> 16) & 0x3f;
31947                                           uint32_t imm = dt.GetSize() - imm6;
31948                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31949                                           vshrn(CurrentCond(),
31950                                                 dt,
31951                                                 DRegister(rd),
31952                                                 QRegister(rm),
31953                                                 imm);
31954                                           break;
31955                                         }
31956                                         case 0x10000000: {
31957                                           // 0xffa80810
31958                                           if (((instr & 0x380000) == 0x0)) {
31959                                             UnallocatedT32(instr);
31960                                             return;
31961                                           }
31962                                           DataType dt =
31963                                               Dt_imm6_2_Decode((instr >> 19) &
31964                                                                    0x7,
31965                                                                (instr >> 28) &
31966                                                                    0x1);
31967                                           if (dt.Is(kDataTypeValueInvalid)) {
31968                                             UnallocatedT32(instr);
31969                                             return;
31970                                           }
31971                                           unsigned rd =
31972                                               ExtractDRegister(instr, 22, 12);
31973                                           if ((instr & 1) != 0) {
31974                                             UnallocatedT32(instr);
31975                                             return;
31976                                           }
31977                                           unsigned rm =
31978                                               ExtractQRegister(instr, 5, 0);
31979                                           uint32_t imm6 = (instr >> 16) & 0x3f;
31980                                           uint32_t imm = dt.GetSize() - imm6;
31981                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31982                                           vqshrun(CurrentCond(),
31983                                                   dt,
31984                                                   DRegister(rd),
31985                                                   QRegister(rm),
31986                                                   imm);
31987                                           break;
31988                                         }
31989                                       }
31990                                       break;
31991                                     }
31992                                     case 0x00000100: {
31993                                       // 0xefa80910
31994                                       if (((instr & 0x380000) == 0x0)) {
31995                                         UnallocatedT32(instr);
31996                                         return;
31997                                       }
31998                                       DataType dt =
31999                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32000                                                            (instr >> 28) & 0x1);
32001                                       if (dt.Is(kDataTypeValueInvalid)) {
32002                                         UnallocatedT32(instr);
32003                                         return;
32004                                       }
32005                                       unsigned rd =
32006                                           ExtractDRegister(instr, 22, 12);
32007                                       if ((instr & 1) != 0) {
32008                                         UnallocatedT32(instr);
32009                                         return;
32010                                       }
32011                                       unsigned rm =
32012                                           ExtractQRegister(instr, 5, 0);
32013                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32014                                       uint32_t imm = dt.GetSize() - imm6;
32015                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32016                                       vqshrn(CurrentCond(),
32017                                              dt,
32018                                              DRegister(rd),
32019                                              QRegister(rm),
32020                                              imm);
32021                                       break;
32022                                     }
32023                                     case 0x00000200: {
32024                                       // 0xefa80a10
32025                                       if (((instr & 0x380000) == 0x0) ||
32026                                           ((instr & 0x3f0000) == 0x80000) ||
32027                                           ((instr & 0x3f0000) == 0x100000) ||
32028                                           ((instr & 0x3f0000) == 0x200000)) {
32029                                         UnallocatedT32(instr);
32030                                         return;
32031                                       }
32032                                       DataType dt =
32033                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
32034                                                            (instr >> 28) & 0x1);
32035                                       if (dt.Is(kDataTypeValueInvalid)) {
32036                                         UnallocatedT32(instr);
32037                                         return;
32038                                       }
32039                                       if (((instr >> 12) & 1) != 0) {
32040                                         UnallocatedT32(instr);
32041                                         return;
32042                                       }
32043                                       unsigned rd =
32044                                           ExtractQRegister(instr, 22, 12);
32045                                       unsigned rm =
32046                                           ExtractDRegister(instr, 5, 0);
32047                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32048                                       uint32_t imm = imm6 - dt.GetSize();
32049                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32050                                       vshll(CurrentCond(),
32051                                             dt,
32052                                             QRegister(rd),
32053                                             DRegister(rm),
32054                                             imm);
32055                                       break;
32056                                     }
32057                                     default:
32058                                       UnallocatedT32(instr);
32059                                       break;
32060                                   }
32061                                   break;
32062                                 }
32063                                 case 0x00300000: {
32064                                   // 0xefb00810
32065                                   switch (instr & 0x00000300) {
32066                                     case 0x00000000: {
32067                                       // 0xefb00810
32068                                       switch (instr & 0x10000000) {
32069                                         case 0x00000000: {
32070                                           // 0xefb00810
32071                                           if (((instr & 0x380000) == 0x0)) {
32072                                             UnallocatedT32(instr);
32073                                             return;
32074                                           }
32075                                           DataType dt = Dt_imm6_3_Decode(
32076                                               (instr >> 19) & 0x7);
32077                                           if (dt.Is(kDataTypeValueInvalid)) {
32078                                             UnallocatedT32(instr);
32079                                             return;
32080                                           }
32081                                           unsigned rd =
32082                                               ExtractDRegister(instr, 22, 12);
32083                                           if ((instr & 1) != 0) {
32084                                             UnallocatedT32(instr);
32085                                             return;
32086                                           }
32087                                           unsigned rm =
32088                                               ExtractQRegister(instr, 5, 0);
32089                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32090                                           uint32_t imm = dt.GetSize() - imm6;
32091                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32092                                           vshrn(CurrentCond(),
32093                                                 dt,
32094                                                 DRegister(rd),
32095                                                 QRegister(rm),
32096                                                 imm);
32097                                           break;
32098                                         }
32099                                         case 0x10000000: {
32100                                           // 0xffb00810
32101                                           if (((instr & 0x380000) == 0x0)) {
32102                                             UnallocatedT32(instr);
32103                                             return;
32104                                           }
32105                                           DataType dt =
32106                                               Dt_imm6_2_Decode((instr >> 19) &
32107                                                                    0x7,
32108                                                                (instr >> 28) &
32109                                                                    0x1);
32110                                           if (dt.Is(kDataTypeValueInvalid)) {
32111                                             UnallocatedT32(instr);
32112                                             return;
32113                                           }
32114                                           unsigned rd =
32115                                               ExtractDRegister(instr, 22, 12);
32116                                           if ((instr & 1) != 0) {
32117                                             UnallocatedT32(instr);
32118                                             return;
32119                                           }
32120                                           unsigned rm =
32121                                               ExtractQRegister(instr, 5, 0);
32122                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32123                                           uint32_t imm = dt.GetSize() - imm6;
32124                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32125                                           vqshrun(CurrentCond(),
32126                                                   dt,
32127                                                   DRegister(rd),
32128                                                   QRegister(rm),
32129                                                   imm);
32130                                           break;
32131                                         }
32132                                       }
32133                                       break;
32134                                     }
32135                                     case 0x00000100: {
32136                                       // 0xefb00910
32137                                       if (((instr & 0x380000) == 0x0)) {
32138                                         UnallocatedT32(instr);
32139                                         return;
32140                                       }
32141                                       DataType dt =
32142                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32143                                                            (instr >> 28) & 0x1);
32144                                       if (dt.Is(kDataTypeValueInvalid)) {
32145                                         UnallocatedT32(instr);
32146                                         return;
32147                                       }
32148                                       unsigned rd =
32149                                           ExtractDRegister(instr, 22, 12);
32150                                       if ((instr & 1) != 0) {
32151                                         UnallocatedT32(instr);
32152                                         return;
32153                                       }
32154                                       unsigned rm =
32155                                           ExtractQRegister(instr, 5, 0);
32156                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32157                                       uint32_t imm = dt.GetSize() - imm6;
32158                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32159                                       vqshrn(CurrentCond(),
32160                                              dt,
32161                                              DRegister(rd),
32162                                              QRegister(rm),
32163                                              imm);
32164                                       break;
32165                                     }
32166                                     case 0x00000200: {
32167                                       // 0xefb00a10
32168                                       if (((instr & 0x380000) == 0x0) ||
32169                                           ((instr & 0x3f0000) == 0x80000) ||
32170                                           ((instr & 0x3f0000) == 0x100000) ||
32171                                           ((instr & 0x3f0000) == 0x200000)) {
32172                                         UnallocatedT32(instr);
32173                                         return;
32174                                       }
32175                                       DataType dt =
32176                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
32177                                                            (instr >> 28) & 0x1);
32178                                       if (dt.Is(kDataTypeValueInvalid)) {
32179                                         UnallocatedT32(instr);
32180                                         return;
32181                                       }
32182                                       if (((instr >> 12) & 1) != 0) {
32183                                         UnallocatedT32(instr);
32184                                         return;
32185                                       }
32186                                       unsigned rd =
32187                                           ExtractQRegister(instr, 22, 12);
32188                                       unsigned rm =
32189                                           ExtractDRegister(instr, 5, 0);
32190                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32191                                       uint32_t imm = imm6 - dt.GetSize();
32192                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32193                                       vshll(CurrentCond(),
32194                                             dt,
32195                                             QRegister(rd),
32196                                             DRegister(rm),
32197                                             imm);
32198                                       break;
32199                                     }
32200                                     default:
32201                                       UnallocatedT32(instr);
32202                                       break;
32203                                   }
32204                                   break;
32205                                 }
32206                                 case 0x00380000: {
32207                                   // 0xefb80810
32208                                   switch (instr & 0x00000300) {
32209                                     case 0x00000000: {
32210                                       // 0xefb80810
32211                                       switch (instr & 0x10000000) {
32212                                         case 0x00000000: {
32213                                           // 0xefb80810
32214                                           if (((instr & 0x380000) == 0x0)) {
32215                                             UnallocatedT32(instr);
32216                                             return;
32217                                           }
32218                                           DataType dt = Dt_imm6_3_Decode(
32219                                               (instr >> 19) & 0x7);
32220                                           if (dt.Is(kDataTypeValueInvalid)) {
32221                                             UnallocatedT32(instr);
32222                                             return;
32223                                           }
32224                                           unsigned rd =
32225                                               ExtractDRegister(instr, 22, 12);
32226                                           if ((instr & 1) != 0) {
32227                                             UnallocatedT32(instr);
32228                                             return;
32229                                           }
32230                                           unsigned rm =
32231                                               ExtractQRegister(instr, 5, 0);
32232                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32233                                           uint32_t imm = dt.GetSize() - imm6;
32234                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32235                                           vshrn(CurrentCond(),
32236                                                 dt,
32237                                                 DRegister(rd),
32238                                                 QRegister(rm),
32239                                                 imm);
32240                                           break;
32241                                         }
32242                                         case 0x10000000: {
32243                                           // 0xffb80810
32244                                           if (((instr & 0x380000) == 0x0)) {
32245                                             UnallocatedT32(instr);
32246                                             return;
32247                                           }
32248                                           DataType dt =
32249                                               Dt_imm6_2_Decode((instr >> 19) &
32250                                                                    0x7,
32251                                                                (instr >> 28) &
32252                                                                    0x1);
32253                                           if (dt.Is(kDataTypeValueInvalid)) {
32254                                             UnallocatedT32(instr);
32255                                             return;
32256                                           }
32257                                           unsigned rd =
32258                                               ExtractDRegister(instr, 22, 12);
32259                                           if ((instr & 1) != 0) {
32260                                             UnallocatedT32(instr);
32261                                             return;
32262                                           }
32263                                           unsigned rm =
32264                                               ExtractQRegister(instr, 5, 0);
32265                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32266                                           uint32_t imm = dt.GetSize() - imm6;
32267                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32268                                           vqshrun(CurrentCond(),
32269                                                   dt,
32270                                                   DRegister(rd),
32271                                                   QRegister(rm),
32272                                                   imm);
32273                                           break;
32274                                         }
32275                                       }
32276                                       break;
32277                                     }
32278                                     case 0x00000100: {
32279                                       // 0xefb80910
32280                                       if (((instr & 0x380000) == 0x0)) {
32281                                         UnallocatedT32(instr);
32282                                         return;
32283                                       }
32284                                       DataType dt =
32285                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32286                                                            (instr >> 28) & 0x1);
32287                                       if (dt.Is(kDataTypeValueInvalid)) {
32288                                         UnallocatedT32(instr);
32289                                         return;
32290                                       }
32291                                       unsigned rd =
32292                                           ExtractDRegister(instr, 22, 12);
32293                                       if ((instr & 1) != 0) {
32294                                         UnallocatedT32(instr);
32295                                         return;
32296                                       }
32297                                       unsigned rm =
32298                                           ExtractQRegister(instr, 5, 0);
32299                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32300                                       uint32_t imm = dt.GetSize() - imm6;
32301                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32302                                       vqshrn(CurrentCond(),
32303                                              dt,
32304                                              DRegister(rd),
32305                                              QRegister(rm),
32306                                              imm);
32307                                       break;
32308                                     }
32309                                     case 0x00000200: {
32310                                       // 0xefb80a10
32311                                       if (((instr & 0x380000) == 0x0) ||
32312                                           ((instr & 0x3f0000) == 0x80000) ||
32313                                           ((instr & 0x3f0000) == 0x100000) ||
32314                                           ((instr & 0x3f0000) == 0x200000)) {
32315                                         UnallocatedT32(instr);
32316                                         return;
32317                                       }
32318                                       DataType dt =
32319                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
32320                                                            (instr >> 28) & 0x1);
32321                                       if (dt.Is(kDataTypeValueInvalid)) {
32322                                         UnallocatedT32(instr);
32323                                         return;
32324                                       }
32325                                       if (((instr >> 12) & 1) != 0) {
32326                                         UnallocatedT32(instr);
32327                                         return;
32328                                       }
32329                                       unsigned rd =
32330                                           ExtractQRegister(instr, 22, 12);
32331                                       unsigned rm =
32332                                           ExtractDRegister(instr, 5, 0);
32333                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32334                                       uint32_t imm = imm6 - dt.GetSize();
32335                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32336                                       vshll(CurrentCond(),
32337                                             dt,
32338                                             QRegister(rd),
32339                                             DRegister(rm),
32340                                             imm);
32341                                       break;
32342                                     }
32343                                     default:
32344                                       UnallocatedT32(instr);
32345                                       break;
32346                                   }
32347                                   break;
32348                                 }
32349                                 default: {
32350                                   switch (instr & 0x00000300) {
32351                                     case 0x00000000: {
32352                                       // 0xef800810
32353                                       switch (instr & 0x10000000) {
32354                                         case 0x00000000: {
32355                                           // 0xef800810
32356                                           if (((instr & 0x380000) == 0x0)) {
32357                                             UnallocatedT32(instr);
32358                                             return;
32359                                           }
32360                                           DataType dt = Dt_imm6_3_Decode(
32361                                               (instr >> 19) & 0x7);
32362                                           if (dt.Is(kDataTypeValueInvalid)) {
32363                                             UnallocatedT32(instr);
32364                                             return;
32365                                           }
32366                                           unsigned rd =
32367                                               ExtractDRegister(instr, 22, 12);
32368                                           if ((instr & 1) != 0) {
32369                                             UnallocatedT32(instr);
32370                                             return;
32371                                           }
32372                                           unsigned rm =
32373                                               ExtractQRegister(instr, 5, 0);
32374                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32375                                           uint32_t imm = dt.GetSize() - imm6;
32376                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32377                                           vshrn(CurrentCond(),
32378                                                 dt,
32379                                                 DRegister(rd),
32380                                                 QRegister(rm),
32381                                                 imm);
32382                                           break;
32383                                         }
32384                                         case 0x10000000: {
32385                                           // 0xff800810
32386                                           if (((instr & 0x380000) == 0x0)) {
32387                                             UnallocatedT32(instr);
32388                                             return;
32389                                           }
32390                                           DataType dt =
32391                                               Dt_imm6_2_Decode((instr >> 19) &
32392                                                                    0x7,
32393                                                                (instr >> 28) &
32394                                                                    0x1);
32395                                           if (dt.Is(kDataTypeValueInvalid)) {
32396                                             UnallocatedT32(instr);
32397                                             return;
32398                                           }
32399                                           unsigned rd =
32400                                               ExtractDRegister(instr, 22, 12);
32401                                           if ((instr & 1) != 0) {
32402                                             UnallocatedT32(instr);
32403                                             return;
32404                                           }
32405                                           unsigned rm =
32406                                               ExtractQRegister(instr, 5, 0);
32407                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32408                                           uint32_t imm = dt.GetSize() - imm6;
32409                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32410                                           vqshrun(CurrentCond(),
32411                                                   dt,
32412                                                   DRegister(rd),
32413                                                   QRegister(rm),
32414                                                   imm);
32415                                           break;
32416                                         }
32417                                       }
32418                                       break;
32419                                     }
32420                                     case 0x00000100: {
32421                                       // 0xef800910
32422                                       if (((instr & 0x380000) == 0x0)) {
32423                                         UnallocatedT32(instr);
32424                                         return;
32425                                       }
32426                                       DataType dt =
32427                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32428                                                            (instr >> 28) & 0x1);
32429                                       if (dt.Is(kDataTypeValueInvalid)) {
32430                                         UnallocatedT32(instr);
32431                                         return;
32432                                       }
32433                                       unsigned rd =
32434                                           ExtractDRegister(instr, 22, 12);
32435                                       if ((instr & 1) != 0) {
32436                                         UnallocatedT32(instr);
32437                                         return;
32438                                       }
32439                                       unsigned rm =
32440                                           ExtractQRegister(instr, 5, 0);
32441                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32442                                       uint32_t imm = dt.GetSize() - imm6;
32443                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32444                                       vqshrn(CurrentCond(),
32445                                              dt,
32446                                              DRegister(rd),
32447                                              QRegister(rm),
32448                                              imm);
32449                                       break;
32450                                     }
32451                                     case 0x00000200: {
32452                                       // 0xef800a10
32453                                       switch (instr & 0x00070000) {
32454                                         case 0x00000000: {
32455                                           // 0xef800a10
32456                                           switch (instr & 0x003f0000) {
32457                                             case 0x00080000: {
32458                                               // 0xef880a10
32459                                               if (((instr & 0x380000) == 0x0) ||
32460                                                   ((instr & 0x380000) ==
32461                                                    0x180000) ||
32462                                                   ((instr & 0x380000) ==
32463                                                    0x280000) ||
32464                                                   ((instr & 0x380000) ==
32465                                                    0x300000) ||
32466                                                   ((instr & 0x380000) ==
32467                                                    0x380000)) {
32468                                                 UnallocatedT32(instr);
32469                                                 return;
32470                                               }
32471                                               DataType dt = Dt_U_imm3H_1_Decode(
32472                                                   ((instr >> 19) & 0x7) |
32473                                                   ((instr >> 25) & 0x8));
32474                                               if (dt.Is(
32475                                                       kDataTypeValueInvalid)) {
32476                                                 UnallocatedT32(instr);
32477                                                 return;
32478                                               }
32479                                               if (((instr >> 12) & 1) != 0) {
32480                                                 UnallocatedT32(instr);
32481                                                 return;
32482                                               }
32483                                               unsigned rd =
32484                                                   ExtractQRegister(instr,
32485                                                                    22,
32486                                                                    12);
32487                                               unsigned rm =
32488                                                   ExtractDRegister(instr, 5, 0);
32489                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
32490                                               vmovl(CurrentCond(),
32491                                                     dt,
32492                                                     QRegister(rd),
32493                                                     DRegister(rm));
32494                                               break;
32495                                             }
32496                                             case 0x00090000: {
32497                                               // 0xef890a10
32498                                               if (((instr & 0x380000) == 0x0) ||
32499                                                   ((instr & 0x3f0000) ==
32500                                                    0x80000) ||
32501                                                   ((instr & 0x3f0000) ==
32502                                                    0x100000) ||
32503                                                   ((instr & 0x3f0000) ==
32504                                                    0x200000)) {
32505                                                 UnallocatedT32(instr);
32506                                                 return;
32507                                               }
32508                                               DataType dt =
32509                                                   Dt_imm6_4_Decode((instr >>
32510                                                                     19) &
32511                                                                        0x7,
32512                                                                    (instr >>
32513                                                                     28) &
32514                                                                        0x1);
32515                                               if (dt.Is(
32516                                                       kDataTypeValueInvalid)) {
32517                                                 UnallocatedT32(instr);
32518                                                 return;
32519                                               }
32520                                               if (((instr >> 12) & 1) != 0) {
32521                                                 UnallocatedT32(instr);
32522                                                 return;
32523                                               }
32524                                               unsigned rd =
32525                                                   ExtractQRegister(instr,
32526                                                                    22,
32527                                                                    12);
32528                                               unsigned rm =
32529                                                   ExtractDRegister(instr, 5, 0);
32530                                               uint32_t imm6 =
32531                                                   (instr >> 16) & 0x3f;
32532                                               uint32_t imm =
32533                                                   imm6 - dt.GetSize();
32534                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32535                                               vshll(CurrentCond(),
32536                                                     dt,
32537                                                     QRegister(rd),
32538                                                     DRegister(rm),
32539                                                     imm);
32540                                               break;
32541                                             }
32542                                             case 0x000a0000: {
32543                                               // 0xef8a0a10
32544                                               if (((instr & 0x380000) == 0x0) ||
32545                                                   ((instr & 0x3f0000) ==
32546                                                    0x80000) ||
32547                                                   ((instr & 0x3f0000) ==
32548                                                    0x100000) ||
32549                                                   ((instr & 0x3f0000) ==
32550                                                    0x200000)) {
32551                                                 UnallocatedT32(instr);
32552                                                 return;
32553                                               }
32554                                               DataType dt =
32555                                                   Dt_imm6_4_Decode((instr >>
32556                                                                     19) &
32557                                                                        0x7,
32558                                                                    (instr >>
32559                                                                     28) &
32560                                                                        0x1);
32561                                               if (dt.Is(
32562                                                       kDataTypeValueInvalid)) {
32563                                                 UnallocatedT32(instr);
32564                                                 return;
32565                                               }
32566                                               if (((instr >> 12) & 1) != 0) {
32567                                                 UnallocatedT32(instr);
32568                                                 return;
32569                                               }
32570                                               unsigned rd =
32571                                                   ExtractQRegister(instr,
32572                                                                    22,
32573                                                                    12);
32574                                               unsigned rm =
32575                                                   ExtractDRegister(instr, 5, 0);
32576                                               uint32_t imm6 =
32577                                                   (instr >> 16) & 0x3f;
32578                                               uint32_t imm =
32579                                                   imm6 - dt.GetSize();
32580                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32581                                               vshll(CurrentCond(),
32582                                                     dt,
32583                                                     QRegister(rd),
32584                                                     DRegister(rm),
32585                                                     imm);
32586                                               break;
32587                                             }
32588                                             case 0x000b0000: {
32589                                               // 0xef8b0a10
32590                                               if (((instr & 0x380000) == 0x0) ||
32591                                                   ((instr & 0x3f0000) ==
32592                                                    0x80000) ||
32593                                                   ((instr & 0x3f0000) ==
32594                                                    0x100000) ||
32595                                                   ((instr & 0x3f0000) ==
32596                                                    0x200000)) {
32597                                                 UnallocatedT32(instr);
32598                                                 return;
32599                                               }
32600                                               DataType dt =
32601                                                   Dt_imm6_4_Decode((instr >>
32602                                                                     19) &
32603                                                                        0x7,
32604                                                                    (instr >>
32605                                                                     28) &
32606                                                                        0x1);
32607                                               if (dt.Is(
32608                                                       kDataTypeValueInvalid)) {
32609                                                 UnallocatedT32(instr);
32610                                                 return;
32611                                               }
32612                                               if (((instr >> 12) & 1) != 0) {
32613                                                 UnallocatedT32(instr);
32614                                                 return;
32615                                               }
32616                                               unsigned rd =
32617                                                   ExtractQRegister(instr,
32618                                                                    22,
32619                                                                    12);
32620                                               unsigned rm =
32621                                                   ExtractDRegister(instr, 5, 0);
32622                                               uint32_t imm6 =
32623                                                   (instr >> 16) & 0x3f;
32624                                               uint32_t imm =
32625                                                   imm6 - dt.GetSize();
32626                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32627                                               vshll(CurrentCond(),
32628                                                     dt,
32629                                                     QRegister(rd),
32630                                                     DRegister(rm),
32631                                                     imm);
32632                                               break;
32633                                             }
32634                                             case 0x000c0000: {
32635                                               // 0xef8c0a10
32636                                               if (((instr & 0x380000) == 0x0) ||
32637                                                   ((instr & 0x3f0000) ==
32638                                                    0x80000) ||
32639                                                   ((instr & 0x3f0000) ==
32640                                                    0x100000) ||
32641                                                   ((instr & 0x3f0000) ==
32642                                                    0x200000)) {
32643                                                 UnallocatedT32(instr);
32644                                                 return;
32645                                               }
32646                                               DataType dt =
32647                                                   Dt_imm6_4_Decode((instr >>
32648                                                                     19) &
32649                                                                        0x7,
32650                                                                    (instr >>
32651                                                                     28) &
32652                                                                        0x1);
32653                                               if (dt.Is(
32654                                                       kDataTypeValueInvalid)) {
32655                                                 UnallocatedT32(instr);
32656                                                 return;
32657                                               }
32658                                               if (((instr >> 12) & 1) != 0) {
32659                                                 UnallocatedT32(instr);
32660                                                 return;
32661                                               }
32662                                               unsigned rd =
32663                                                   ExtractQRegister(instr,
32664                                                                    22,
32665                                                                    12);
32666                                               unsigned rm =
32667                                                   ExtractDRegister(instr, 5, 0);
32668                                               uint32_t imm6 =
32669                                                   (instr >> 16) & 0x3f;
32670                                               uint32_t imm =
32671                                                   imm6 - dt.GetSize();
32672                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32673                                               vshll(CurrentCond(),
32674                                                     dt,
32675                                                     QRegister(rd),
32676                                                     DRegister(rm),
32677                                                     imm);
32678                                               break;
32679                                             }
32680                                             case 0x000d0000: {
32681                                               // 0xef8d0a10
32682                                               if (((instr & 0x380000) == 0x0) ||
32683                                                   ((instr & 0x3f0000) ==
32684                                                    0x80000) ||
32685                                                   ((instr & 0x3f0000) ==
32686                                                    0x100000) ||
32687                                                   ((instr & 0x3f0000) ==
32688                                                    0x200000)) {
32689                                                 UnallocatedT32(instr);
32690                                                 return;
32691                                               }
32692                                               DataType dt =
32693                                                   Dt_imm6_4_Decode((instr >>
32694                                                                     19) &
32695                                                                        0x7,
32696                                                                    (instr >>
32697                                                                     28) &
32698                                                                        0x1);
32699                                               if (dt.Is(
32700                                                       kDataTypeValueInvalid)) {
32701                                                 UnallocatedT32(instr);
32702                                                 return;
32703                                               }
32704                                               if (((instr >> 12) & 1) != 0) {
32705                                                 UnallocatedT32(instr);
32706                                                 return;
32707                                               }
32708                                               unsigned rd =
32709                                                   ExtractQRegister(instr,
32710                                                                    22,
32711                                                                    12);
32712                                               unsigned rm =
32713                                                   ExtractDRegister(instr, 5, 0);
32714                                               uint32_t imm6 =
32715                                                   (instr >> 16) & 0x3f;
32716                                               uint32_t imm =
32717                                                   imm6 - dt.GetSize();
32718                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32719                                               vshll(CurrentCond(),
32720                                                     dt,
32721                                                     QRegister(rd),
32722                                                     DRegister(rm),
32723                                                     imm);
32724                                               break;
32725                                             }
32726                                             case 0x000e0000: {
32727                                               // 0xef8e0a10
32728                                               if (((instr & 0x380000) == 0x0) ||
32729                                                   ((instr & 0x3f0000) ==
32730                                                    0x80000) ||
32731                                                   ((instr & 0x3f0000) ==
32732                                                    0x100000) ||
32733                                                   ((instr & 0x3f0000) ==
32734                                                    0x200000)) {
32735                                                 UnallocatedT32(instr);
32736                                                 return;
32737                                               }
32738                                               DataType dt =
32739                                                   Dt_imm6_4_Decode((instr >>
32740                                                                     19) &
32741                                                                        0x7,
32742                                                                    (instr >>
32743                                                                     28) &
32744                                                                        0x1);
32745                                               if (dt.Is(
32746                                                       kDataTypeValueInvalid)) {
32747                                                 UnallocatedT32(instr);
32748                                                 return;
32749                                               }
32750                                               if (((instr >> 12) & 1) != 0) {
32751                                                 UnallocatedT32(instr);
32752                                                 return;
32753                                               }
32754                                               unsigned rd =
32755                                                   ExtractQRegister(instr,
32756                                                                    22,
32757                                                                    12);
32758                                               unsigned rm =
32759                                                   ExtractDRegister(instr, 5, 0);
32760                                               uint32_t imm6 =
32761                                                   (instr >> 16) & 0x3f;
32762                                               uint32_t imm =
32763                                                   imm6 - dt.GetSize();
32764                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32765                                               vshll(CurrentCond(),
32766                                                     dt,
32767                                                     QRegister(rd),
32768                                                     DRegister(rm),
32769                                                     imm);
32770                                               break;
32771                                             }
32772                                             case 0x000f0000: {
32773                                               // 0xef8f0a10
32774                                               if (((instr & 0x380000) == 0x0) ||
32775                                                   ((instr & 0x3f0000) ==
32776                                                    0x80000) ||
32777                                                   ((instr & 0x3f0000) ==
32778                                                    0x100000) ||
32779                                                   ((instr & 0x3f0000) ==
32780                                                    0x200000)) {
32781                                                 UnallocatedT32(instr);
32782                                                 return;
32783                                               }
32784                                               DataType dt =
32785                                                   Dt_imm6_4_Decode((instr >>
32786                                                                     19) &
32787                                                                        0x7,
32788                                                                    (instr >>
32789                                                                     28) &
32790                                                                        0x1);
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                                               uint32_t imm6 =
32807                                                   (instr >> 16) & 0x3f;
32808                                               uint32_t imm =
32809                                                   imm6 - dt.GetSize();
32810                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32811                                               vshll(CurrentCond(),
32812                                                     dt,
32813                                                     QRegister(rd),
32814                                                     DRegister(rm),
32815                                                     imm);
32816                                               break;
32817                                             }
32818                                             case 0x00100000: {
32819                                               // 0xef900a10
32820                                               if (((instr & 0x380000) == 0x0) ||
32821                                                   ((instr & 0x380000) ==
32822                                                    0x180000) ||
32823                                                   ((instr & 0x380000) ==
32824                                                    0x280000) ||
32825                                                   ((instr & 0x380000) ==
32826                                                    0x300000) ||
32827                                                   ((instr & 0x380000) ==
32828                                                    0x380000)) {
32829                                                 UnallocatedT32(instr);
32830                                                 return;
32831                                               }
32832                                               DataType dt = Dt_U_imm3H_1_Decode(
32833                                                   ((instr >> 19) & 0x7) |
32834                                                   ((instr >> 25) & 0x8));
32835                                               if (dt.Is(
32836                                                       kDataTypeValueInvalid)) {
32837                                                 UnallocatedT32(instr);
32838                                                 return;
32839                                               }
32840                                               if (((instr >> 12) & 1) != 0) {
32841                                                 UnallocatedT32(instr);
32842                                                 return;
32843                                               }
32844                                               unsigned rd =
32845                                                   ExtractQRegister(instr,
32846                                                                    22,
32847                                                                    12);
32848                                               unsigned rm =
32849                                                   ExtractDRegister(instr, 5, 0);
32850                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
32851                                               vmovl(CurrentCond(),
32852                                                     dt,
32853                                                     QRegister(rd),
32854                                                     DRegister(rm));
32855                                               break;
32856                                             }
32857                                             case 0x00110000: {
32858                                               // 0xef910a10
32859                                               if (((instr & 0x380000) == 0x0) ||
32860                                                   ((instr & 0x3f0000) ==
32861                                                    0x80000) ||
32862                                                   ((instr & 0x3f0000) ==
32863                                                    0x100000) ||
32864                                                   ((instr & 0x3f0000) ==
32865                                                    0x200000)) {
32866                                                 UnallocatedT32(instr);
32867                                                 return;
32868                                               }
32869                                               DataType dt =
32870                                                   Dt_imm6_4_Decode((instr >>
32871                                                                     19) &
32872                                                                        0x7,
32873                                                                    (instr >>
32874                                                                     28) &
32875                                                                        0x1);
32876                                               if (dt.Is(
32877                                                       kDataTypeValueInvalid)) {
32878                                                 UnallocatedT32(instr);
32879                                                 return;
32880                                               }
32881                                               if (((instr >> 12) & 1) != 0) {
32882                                                 UnallocatedT32(instr);
32883                                                 return;
32884                                               }
32885                                               unsigned rd =
32886                                                   ExtractQRegister(instr,
32887                                                                    22,
32888                                                                    12);
32889                                               unsigned rm =
32890                                                   ExtractDRegister(instr, 5, 0);
32891                                               uint32_t imm6 =
32892                                                   (instr >> 16) & 0x3f;
32893                                               uint32_t imm =
32894                                                   imm6 - dt.GetSize();
32895                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32896                                               vshll(CurrentCond(),
32897                                                     dt,
32898                                                     QRegister(rd),
32899                                                     DRegister(rm),
32900                                                     imm);
32901                                               break;
32902                                             }
32903                                             case 0x00120000: {
32904                                               // 0xef920a10
32905                                               if (((instr & 0x380000) == 0x0) ||
32906                                                   ((instr & 0x3f0000) ==
32907                                                    0x80000) ||
32908                                                   ((instr & 0x3f0000) ==
32909                                                    0x100000) ||
32910                                                   ((instr & 0x3f0000) ==
32911                                                    0x200000)) {
32912                                                 UnallocatedT32(instr);
32913                                                 return;
32914                                               }
32915                                               DataType dt =
32916                                                   Dt_imm6_4_Decode((instr >>
32917                                                                     19) &
32918                                                                        0x7,
32919                                                                    (instr >>
32920                                                                     28) &
32921                                                                        0x1);
32922                                               if (dt.Is(
32923                                                       kDataTypeValueInvalid)) {
32924                                                 UnallocatedT32(instr);
32925                                                 return;
32926                                               }
32927                                               if (((instr >> 12) & 1) != 0) {
32928                                                 UnallocatedT32(instr);
32929                                                 return;
32930                                               }
32931                                               unsigned rd =
32932                                                   ExtractQRegister(instr,
32933                                                                    22,
32934                                                                    12);
32935                                               unsigned rm =
32936                                                   ExtractDRegister(instr, 5, 0);
32937                                               uint32_t imm6 =
32938                                                   (instr >> 16) & 0x3f;
32939                                               uint32_t imm =
32940                                                   imm6 - dt.GetSize();
32941                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32942                                               vshll(CurrentCond(),
32943                                                     dt,
32944                                                     QRegister(rd),
32945                                                     DRegister(rm),
32946                                                     imm);
32947                                               break;
32948                                             }
32949                                             case 0x00130000: {
32950                                               // 0xef930a10
32951                                               if (((instr & 0x380000) == 0x0) ||
32952                                                   ((instr & 0x3f0000) ==
32953                                                    0x80000) ||
32954                                                   ((instr & 0x3f0000) ==
32955                                                    0x100000) ||
32956                                                   ((instr & 0x3f0000) ==
32957                                                    0x200000)) {
32958                                                 UnallocatedT32(instr);
32959                                                 return;
32960                                               }
32961                                               DataType dt =
32962                                                   Dt_imm6_4_Decode((instr >>
32963                                                                     19) &
32964                                                                        0x7,
32965                                                                    (instr >>
32966                                                                     28) &
32967                                                                        0x1);
32968                                               if (dt.Is(
32969                                                       kDataTypeValueInvalid)) {
32970                                                 UnallocatedT32(instr);
32971                                                 return;
32972                                               }
32973                                               if (((instr >> 12) & 1) != 0) {
32974                                                 UnallocatedT32(instr);
32975                                                 return;
32976                                               }
32977                                               unsigned rd =
32978                                                   ExtractQRegister(instr,
32979                                                                    22,
32980                                                                    12);
32981                                               unsigned rm =
32982                                                   ExtractDRegister(instr, 5, 0);
32983                                               uint32_t imm6 =
32984                                                   (instr >> 16) & 0x3f;
32985                                               uint32_t imm =
32986                                                   imm6 - dt.GetSize();
32987                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32988                                               vshll(CurrentCond(),
32989                                                     dt,
32990                                                     QRegister(rd),
32991                                                     DRegister(rm),
32992                                                     imm);
32993                                               break;
32994                                             }
32995                                             case 0x00140000: {
32996                                               // 0xef940a10
32997                                               if (((instr & 0x380000) == 0x0) ||
32998                                                   ((instr & 0x3f0000) ==
32999                                                    0x80000) ||
33000                                                   ((instr & 0x3f0000) ==
33001                                                    0x100000) ||
33002                                                   ((instr & 0x3f0000) ==
33003                                                    0x200000)) {
33004                                                 UnallocatedT32(instr);
33005                                                 return;
33006                                               }
33007                                               DataType dt =
33008                                                   Dt_imm6_4_Decode((instr >>
33009                                                                     19) &
33010                                                                        0x7,
33011                                                                    (instr >>
33012                                                                     28) &
33013                                                                        0x1);
33014                                               if (dt.Is(
33015                                                       kDataTypeValueInvalid)) {
33016                                                 UnallocatedT32(instr);
33017                                                 return;
33018                                               }
33019                                               if (((instr >> 12) & 1) != 0) {
33020                                                 UnallocatedT32(instr);
33021                                                 return;
33022                                               }
33023                                               unsigned rd =
33024                                                   ExtractQRegister(instr,
33025                                                                    22,
33026                                                                    12);
33027                                               unsigned rm =
33028                                                   ExtractDRegister(instr, 5, 0);
33029                                               uint32_t imm6 =
33030                                                   (instr >> 16) & 0x3f;
33031                                               uint32_t imm =
33032                                                   imm6 - dt.GetSize();
33033                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33034                                               vshll(CurrentCond(),
33035                                                     dt,
33036                                                     QRegister(rd),
33037                                                     DRegister(rm),
33038                                                     imm);
33039                                               break;
33040                                             }
33041                                             case 0x00150000: {
33042                                               // 0xef950a10
33043                                               if (((instr & 0x380000) == 0x0) ||
33044                                                   ((instr & 0x3f0000) ==
33045                                                    0x80000) ||
33046                                                   ((instr & 0x3f0000) ==
33047                                                    0x100000) ||
33048                                                   ((instr & 0x3f0000) ==
33049                                                    0x200000)) {
33050                                                 UnallocatedT32(instr);
33051                                                 return;
33052                                               }
33053                                               DataType dt =
33054                                                   Dt_imm6_4_Decode((instr >>
33055                                                                     19) &
33056                                                                        0x7,
33057                                                                    (instr >>
33058                                                                     28) &
33059                                                                        0x1);
33060                                               if (dt.Is(
33061                                                       kDataTypeValueInvalid)) {
33062                                                 UnallocatedT32(instr);
33063                                                 return;
33064                                               }
33065                                               if (((instr >> 12) & 1) != 0) {
33066                                                 UnallocatedT32(instr);
33067                                                 return;
33068                                               }
33069                                               unsigned rd =
33070                                                   ExtractQRegister(instr,
33071                                                                    22,
33072                                                                    12);
33073                                               unsigned rm =
33074                                                   ExtractDRegister(instr, 5, 0);
33075                                               uint32_t imm6 =
33076                                                   (instr >> 16) & 0x3f;
33077                                               uint32_t imm =
33078                                                   imm6 - dt.GetSize();
33079                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33080                                               vshll(CurrentCond(),
33081                                                     dt,
33082                                                     QRegister(rd),
33083                                                     DRegister(rm),
33084                                                     imm);
33085                                               break;
33086                                             }
33087                                             case 0x00160000: {
33088                                               // 0xef960a10
33089                                               if (((instr & 0x380000) == 0x0) ||
33090                                                   ((instr & 0x3f0000) ==
33091                                                    0x80000) ||
33092                                                   ((instr & 0x3f0000) ==
33093                                                    0x100000) ||
33094                                                   ((instr & 0x3f0000) ==
33095                                                    0x200000)) {
33096                                                 UnallocatedT32(instr);
33097                                                 return;
33098                                               }
33099                                               DataType dt =
33100                                                   Dt_imm6_4_Decode((instr >>
33101                                                                     19) &
33102                                                                        0x7,
33103                                                                    (instr >>
33104                                                                     28) &
33105                                                                        0x1);
33106                                               if (dt.Is(
33107                                                       kDataTypeValueInvalid)) {
33108                                                 UnallocatedT32(instr);
33109                                                 return;
33110                                               }
33111                                               if (((instr >> 12) & 1) != 0) {
33112                                                 UnallocatedT32(instr);
33113                                                 return;
33114                                               }
33115                                               unsigned rd =
33116                                                   ExtractQRegister(instr,
33117                                                                    22,
33118                                                                    12);
33119                                               unsigned rm =
33120                                                   ExtractDRegister(instr, 5, 0);
33121                                               uint32_t imm6 =
33122                                                   (instr >> 16) & 0x3f;
33123                                               uint32_t imm =
33124                                                   imm6 - dt.GetSize();
33125                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33126                                               vshll(CurrentCond(),
33127                                                     dt,
33128                                                     QRegister(rd),
33129                                                     DRegister(rm),
33130                                                     imm);
33131                                               break;
33132                                             }
33133                                             case 0x00170000: {
33134                                               // 0xef970a10
33135                                               if (((instr & 0x380000) == 0x0) ||
33136                                                   ((instr & 0x3f0000) ==
33137                                                    0x80000) ||
33138                                                   ((instr & 0x3f0000) ==
33139                                                    0x100000) ||
33140                                                   ((instr & 0x3f0000) ==
33141                                                    0x200000)) {
33142                                                 UnallocatedT32(instr);
33143                                                 return;
33144                                               }
33145                                               DataType dt =
33146                                                   Dt_imm6_4_Decode((instr >>
33147                                                                     19) &
33148                                                                        0x7,
33149                                                                    (instr >>
33150                                                                     28) &
33151                                                                        0x1);
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                                               uint32_t imm6 =
33168                                                   (instr >> 16) & 0x3f;
33169                                               uint32_t imm =
33170                                                   imm6 - dt.GetSize();
33171                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33172                                               vshll(CurrentCond(),
33173                                                     dt,
33174                                                     QRegister(rd),
33175                                                     DRegister(rm),
33176                                                     imm);
33177                                               break;
33178                                             }
33179                                             case 0x00180000: {
33180                                               // 0xef980a10
33181                                               if (((instr & 0x380000) == 0x0) ||
33182                                                   ((instr & 0x3f0000) ==
33183                                                    0x80000) ||
33184                                                   ((instr & 0x3f0000) ==
33185                                                    0x100000) ||
33186                                                   ((instr & 0x3f0000) ==
33187                                                    0x200000)) {
33188                                                 UnallocatedT32(instr);
33189                                                 return;
33190                                               }
33191                                               DataType dt =
33192                                                   Dt_imm6_4_Decode((instr >>
33193                                                                     19) &
33194                                                                        0x7,
33195                                                                    (instr >>
33196                                                                     28) &
33197                                                                        0x1);
33198                                               if (dt.Is(
33199                                                       kDataTypeValueInvalid)) {
33200                                                 UnallocatedT32(instr);
33201                                                 return;
33202                                               }
33203                                               if (((instr >> 12) & 1) != 0) {
33204                                                 UnallocatedT32(instr);
33205                                                 return;
33206                                               }
33207                                               unsigned rd =
33208                                                   ExtractQRegister(instr,
33209                                                                    22,
33210                                                                    12);
33211                                               unsigned rm =
33212                                                   ExtractDRegister(instr, 5, 0);
33213                                               uint32_t imm6 =
33214                                                   (instr >> 16) & 0x3f;
33215                                               uint32_t imm =
33216                                                   imm6 - dt.GetSize();
33217                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33218                                               vshll(CurrentCond(),
33219                                                     dt,
33220                                                     QRegister(rd),
33221                                                     DRegister(rm),
33222                                                     imm);
33223                                               break;
33224                                             }
33225                                             case 0x00190000: {
33226                                               // 0xef990a10
33227                                               if (((instr & 0x380000) == 0x0) ||
33228                                                   ((instr & 0x3f0000) ==
33229                                                    0x80000) ||
33230                                                   ((instr & 0x3f0000) ==
33231                                                    0x100000) ||
33232                                                   ((instr & 0x3f0000) ==
33233                                                    0x200000)) {
33234                                                 UnallocatedT32(instr);
33235                                                 return;
33236                                               }
33237                                               DataType dt =
33238                                                   Dt_imm6_4_Decode((instr >>
33239                                                                     19) &
33240                                                                        0x7,
33241                                                                    (instr >>
33242                                                                     28) &
33243                                                                        0x1);
33244                                               if (dt.Is(
33245                                                       kDataTypeValueInvalid)) {
33246                                                 UnallocatedT32(instr);
33247                                                 return;
33248                                               }
33249                                               if (((instr >> 12) & 1) != 0) {
33250                                                 UnallocatedT32(instr);
33251                                                 return;
33252                                               }
33253                                               unsigned rd =
33254                                                   ExtractQRegister(instr,
33255                                                                    22,
33256                                                                    12);
33257                                               unsigned rm =
33258                                                   ExtractDRegister(instr, 5, 0);
33259                                               uint32_t imm6 =
33260                                                   (instr >> 16) & 0x3f;
33261                                               uint32_t imm =
33262                                                   imm6 - dt.GetSize();
33263                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33264                                               vshll(CurrentCond(),
33265                                                     dt,
33266                                                     QRegister(rd),
33267                                                     DRegister(rm),
33268                                                     imm);
33269                                               break;
33270                                             }
33271                                             case 0x001a0000: {
33272                                               // 0xef9a0a10
33273                                               if (((instr & 0x380000) == 0x0) ||
33274                                                   ((instr & 0x3f0000) ==
33275                                                    0x80000) ||
33276                                                   ((instr & 0x3f0000) ==
33277                                                    0x100000) ||
33278                                                   ((instr & 0x3f0000) ==
33279                                                    0x200000)) {
33280                                                 UnallocatedT32(instr);
33281                                                 return;
33282                                               }
33283                                               DataType dt =
33284                                                   Dt_imm6_4_Decode((instr >>
33285                                                                     19) &
33286                                                                        0x7,
33287                                                                    (instr >>
33288                                                                     28) &
33289                                                                        0x1);
33290                                               if (dt.Is(
33291                                                       kDataTypeValueInvalid)) {
33292                                                 UnallocatedT32(instr);
33293                                                 return;
33294                                               }
33295                                               if (((instr >> 12) & 1) != 0) {
33296                                                 UnallocatedT32(instr);
33297                                                 return;
33298                                               }
33299                                               unsigned rd =
33300                                                   ExtractQRegister(instr,
33301                                                                    22,
33302                                                                    12);
33303                                               unsigned rm =
33304                                                   ExtractDRegister(instr, 5, 0);
33305                                               uint32_t imm6 =
33306                                                   (instr >> 16) & 0x3f;
33307                                               uint32_t imm =
33308                                                   imm6 - dt.GetSize();
33309                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33310                                               vshll(CurrentCond(),
33311                                                     dt,
33312                                                     QRegister(rd),
33313                                                     DRegister(rm),
33314                                                     imm);
33315                                               break;
33316                                             }
33317                                             case 0x001b0000: {
33318                                               // 0xef9b0a10
33319                                               if (((instr & 0x380000) == 0x0) ||
33320                                                   ((instr & 0x3f0000) ==
33321                                                    0x80000) ||
33322                                                   ((instr & 0x3f0000) ==
33323                                                    0x100000) ||
33324                                                   ((instr & 0x3f0000) ==
33325                                                    0x200000)) {
33326                                                 UnallocatedT32(instr);
33327                                                 return;
33328                                               }
33329                                               DataType dt =
33330                                                   Dt_imm6_4_Decode((instr >>
33331                                                                     19) &
33332                                                                        0x7,
33333                                                                    (instr >>
33334                                                                     28) &
33335                                                                        0x1);
33336                                               if (dt.Is(
33337                                                       kDataTypeValueInvalid)) {
33338                                                 UnallocatedT32(instr);
33339                                                 return;
33340                                               }
33341                                               if (((instr >> 12) & 1) != 0) {
33342                                                 UnallocatedT32(instr);
33343                                                 return;
33344                                               }
33345                                               unsigned rd =
33346                                                   ExtractQRegister(instr,
33347                                                                    22,
33348                                                                    12);
33349                                               unsigned rm =
33350                                                   ExtractDRegister(instr, 5, 0);
33351                                               uint32_t imm6 =
33352                                                   (instr >> 16) & 0x3f;
33353                                               uint32_t imm =
33354                                                   imm6 - dt.GetSize();
33355                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33356                                               vshll(CurrentCond(),
33357                                                     dt,
33358                                                     QRegister(rd),
33359                                                     DRegister(rm),
33360                                                     imm);
33361                                               break;
33362                                             }
33363                                             case 0x001c0000: {
33364                                               // 0xef9c0a10
33365                                               if (((instr & 0x380000) == 0x0) ||
33366                                                   ((instr & 0x3f0000) ==
33367                                                    0x80000) ||
33368                                                   ((instr & 0x3f0000) ==
33369                                                    0x100000) ||
33370                                                   ((instr & 0x3f0000) ==
33371                                                    0x200000)) {
33372                                                 UnallocatedT32(instr);
33373                                                 return;
33374                                               }
33375                                               DataType dt =
33376                                                   Dt_imm6_4_Decode((instr >>
33377                                                                     19) &
33378                                                                        0x7,
33379                                                                    (instr >>
33380                                                                     28) &
33381                                                                        0x1);
33382                                               if (dt.Is(
33383                                                       kDataTypeValueInvalid)) {
33384                                                 UnallocatedT32(instr);
33385                                                 return;
33386                                               }
33387                                               if (((instr >> 12) & 1) != 0) {
33388                                                 UnallocatedT32(instr);
33389                                                 return;
33390                                               }
33391                                               unsigned rd =
33392                                                   ExtractQRegister(instr,
33393                                                                    22,
33394                                                                    12);
33395                                               unsigned rm =
33396                                                   ExtractDRegister(instr, 5, 0);
33397                                               uint32_t imm6 =
33398                                                   (instr >> 16) & 0x3f;
33399                                               uint32_t imm =
33400                                                   imm6 - dt.GetSize();
33401                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33402                                               vshll(CurrentCond(),
33403                                                     dt,
33404                                                     QRegister(rd),
33405                                                     DRegister(rm),
33406                                                     imm);
33407                                               break;
33408                                             }
33409                                             case 0x001d0000: {
33410                                               // 0xef9d0a10
33411                                               if (((instr & 0x380000) == 0x0) ||
33412                                                   ((instr & 0x3f0000) ==
33413                                                    0x80000) ||
33414                                                   ((instr & 0x3f0000) ==
33415                                                    0x100000) ||
33416                                                   ((instr & 0x3f0000) ==
33417                                                    0x200000)) {
33418                                                 UnallocatedT32(instr);
33419                                                 return;
33420                                               }
33421                                               DataType dt =
33422                                                   Dt_imm6_4_Decode((instr >>
33423                                                                     19) &
33424                                                                        0x7,
33425                                                                    (instr >>
33426                                                                     28) &
33427                                                                        0x1);
33428                                               if (dt.Is(
33429                                                       kDataTypeValueInvalid)) {
33430                                                 UnallocatedT32(instr);
33431                                                 return;
33432                                               }
33433                                               if (((instr >> 12) & 1) != 0) {
33434                                                 UnallocatedT32(instr);
33435                                                 return;
33436                                               }
33437                                               unsigned rd =
33438                                                   ExtractQRegister(instr,
33439                                                                    22,
33440                                                                    12);
33441                                               unsigned rm =
33442                                                   ExtractDRegister(instr, 5, 0);
33443                                               uint32_t imm6 =
33444                                                   (instr >> 16) & 0x3f;
33445                                               uint32_t imm =
33446                                                   imm6 - dt.GetSize();
33447                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33448                                               vshll(CurrentCond(),
33449                                                     dt,
33450                                                     QRegister(rd),
33451                                                     DRegister(rm),
33452                                                     imm);
33453                                               break;
33454                                             }
33455                                             case 0x001e0000: {
33456                                               // 0xef9e0a10
33457                                               if (((instr & 0x380000) == 0x0) ||
33458                                                   ((instr & 0x3f0000) ==
33459                                                    0x80000) ||
33460                                                   ((instr & 0x3f0000) ==
33461                                                    0x100000) ||
33462                                                   ((instr & 0x3f0000) ==
33463                                                    0x200000)) {
33464                                                 UnallocatedT32(instr);
33465                                                 return;
33466                                               }
33467                                               DataType dt =
33468                                                   Dt_imm6_4_Decode((instr >>
33469                                                                     19) &
33470                                                                        0x7,
33471                                                                    (instr >>
33472                                                                     28) &
33473                                                                        0x1);
33474                                               if (dt.Is(
33475                                                       kDataTypeValueInvalid)) {
33476                                                 UnallocatedT32(instr);
33477                                                 return;
33478                                               }
33479                                               if (((instr >> 12) & 1) != 0) {
33480                                                 UnallocatedT32(instr);
33481                                                 return;
33482                                               }
33483                                               unsigned rd =
33484                                                   ExtractQRegister(instr,
33485                                                                    22,
33486                                                                    12);
33487                                               unsigned rm =
33488                                                   ExtractDRegister(instr, 5, 0);
33489                                               uint32_t imm6 =
33490                                                   (instr >> 16) & 0x3f;
33491                                               uint32_t imm =
33492                                                   imm6 - dt.GetSize();
33493                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33494                                               vshll(CurrentCond(),
33495                                                     dt,
33496                                                     QRegister(rd),
33497                                                     DRegister(rm),
33498                                                     imm);
33499                                               break;
33500                                             }
33501                                             case 0x001f0000: {
33502                                               // 0xef9f0a10
33503                                               if (((instr & 0x380000) == 0x0) ||
33504                                                   ((instr & 0x3f0000) ==
33505                                                    0x80000) ||
33506                                                   ((instr & 0x3f0000) ==
33507                                                    0x100000) ||
33508                                                   ((instr & 0x3f0000) ==
33509                                                    0x200000)) {
33510                                                 UnallocatedT32(instr);
33511                                                 return;
33512                                               }
33513                                               DataType dt =
33514                                                   Dt_imm6_4_Decode((instr >>
33515                                                                     19) &
33516                                                                        0x7,
33517                                                                    (instr >>
33518                                                                     28) &
33519                                                                        0x1);
33520                                               if (dt.Is(
33521                                                       kDataTypeValueInvalid)) {
33522                                                 UnallocatedT32(instr);
33523                                                 return;
33524                                               }
33525                                               if (((instr >> 12) & 1) != 0) {
33526                                                 UnallocatedT32(instr);
33527                                                 return;
33528                                               }
33529                                               unsigned rd =
33530                                                   ExtractQRegister(instr,
33531                                                                    22,
33532                                                                    12);
33533                                               unsigned rm =
33534                                                   ExtractDRegister(instr, 5, 0);
33535                                               uint32_t imm6 =
33536                                                   (instr >> 16) & 0x3f;
33537                                               uint32_t imm =
33538                                                   imm6 - dt.GetSize();
33539                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33540                                               vshll(CurrentCond(),
33541                                                     dt,
33542                                                     QRegister(rd),
33543                                                     DRegister(rm),
33544                                                     imm);
33545                                               break;
33546                                             }
33547                                             case 0x00200000: {
33548                                               // 0xefa00a10
33549                                               if (((instr & 0x380000) == 0x0) ||
33550                                                   ((instr & 0x380000) ==
33551                                                    0x180000) ||
33552                                                   ((instr & 0x380000) ==
33553                                                    0x280000) ||
33554                                                   ((instr & 0x380000) ==
33555                                                    0x300000) ||
33556                                                   ((instr & 0x380000) ==
33557                                                    0x380000)) {
33558                                                 UnallocatedT32(instr);
33559                                                 return;
33560                                               }
33561                                               DataType dt = Dt_U_imm3H_1_Decode(
33562                                                   ((instr >> 19) & 0x7) |
33563                                                   ((instr >> 25) & 0x8));
33564                                               if (dt.Is(
33565                                                       kDataTypeValueInvalid)) {
33566                                                 UnallocatedT32(instr);
33567                                                 return;
33568                                               }
33569                                               if (((instr >> 12) & 1) != 0) {
33570                                                 UnallocatedT32(instr);
33571                                                 return;
33572                                               }
33573                                               unsigned rd =
33574                                                   ExtractQRegister(instr,
33575                                                                    22,
33576                                                                    12);
33577                                               unsigned rm =
33578                                                   ExtractDRegister(instr, 5, 0);
33579                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
33580                                               vmovl(CurrentCond(),
33581                                                     dt,
33582                                                     QRegister(rd),
33583                                                     DRegister(rm));
33584                                               break;
33585                                             }
33586                                             case 0x00210000: {
33587                                               // 0xefa10a10
33588                                               if (((instr & 0x380000) == 0x0) ||
33589                                                   ((instr & 0x3f0000) ==
33590                                                    0x80000) ||
33591                                                   ((instr & 0x3f0000) ==
33592                                                    0x100000) ||
33593                                                   ((instr & 0x3f0000) ==
33594                                                    0x200000)) {
33595                                                 UnallocatedT32(instr);
33596                                                 return;
33597                                               }
33598                                               DataType dt =
33599                                                   Dt_imm6_4_Decode((instr >>
33600                                                                     19) &
33601                                                                        0x7,
33602                                                                    (instr >>
33603                                                                     28) &
33604                                                                        0x1);
33605                                               if (dt.Is(
33606                                                       kDataTypeValueInvalid)) {
33607                                                 UnallocatedT32(instr);
33608                                                 return;
33609                                               }
33610                                               if (((instr >> 12) & 1) != 0) {
33611                                                 UnallocatedT32(instr);
33612                                                 return;
33613                                               }
33614                                               unsigned rd =
33615                                                   ExtractQRegister(instr,
33616                                                                    22,
33617                                                                    12);
33618                                               unsigned rm =
33619                                                   ExtractDRegister(instr, 5, 0);
33620                                               uint32_t imm6 =
33621                                                   (instr >> 16) & 0x3f;
33622                                               uint32_t imm =
33623                                                   imm6 - dt.GetSize();
33624                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33625                                               vshll(CurrentCond(),
33626                                                     dt,
33627                                                     QRegister(rd),
33628                                                     DRegister(rm),
33629                                                     imm);
33630                                               break;
33631                                             }
33632                                             case 0x00220000: {
33633                                               // 0xefa20a10
33634                                               if (((instr & 0x380000) == 0x0) ||
33635                                                   ((instr & 0x3f0000) ==
33636                                                    0x80000) ||
33637                                                   ((instr & 0x3f0000) ==
33638                                                    0x100000) ||
33639                                                   ((instr & 0x3f0000) ==
33640                                                    0x200000)) {
33641                                                 UnallocatedT32(instr);
33642                                                 return;
33643                                               }
33644                                               DataType dt =
33645                                                   Dt_imm6_4_Decode((instr >>
33646                                                                     19) &
33647                                                                        0x7,
33648                                                                    (instr >>
33649                                                                     28) &
33650                                                                        0x1);
33651                                               if (dt.Is(
33652                                                       kDataTypeValueInvalid)) {
33653                                                 UnallocatedT32(instr);
33654                                                 return;
33655                                               }
33656                                               if (((instr >> 12) & 1) != 0) {
33657                                                 UnallocatedT32(instr);
33658                                                 return;
33659                                               }
33660                                               unsigned rd =
33661                                                   ExtractQRegister(instr,
33662                                                                    22,
33663                                                                    12);
33664                                               unsigned rm =
33665                                                   ExtractDRegister(instr, 5, 0);
33666                                               uint32_t imm6 =
33667                                                   (instr >> 16) & 0x3f;
33668                                               uint32_t imm =
33669                                                   imm6 - dt.GetSize();
33670                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33671                                               vshll(CurrentCond(),
33672                                                     dt,
33673                                                     QRegister(rd),
33674                                                     DRegister(rm),
33675                                                     imm);
33676                                               break;
33677                                             }
33678                                             case 0x00230000: {
33679                                               // 0xefa30a10
33680                                               if (((instr & 0x380000) == 0x0) ||
33681                                                   ((instr & 0x3f0000) ==
33682                                                    0x80000) ||
33683                                                   ((instr & 0x3f0000) ==
33684                                                    0x100000) ||
33685                                                   ((instr & 0x3f0000) ==
33686                                                    0x200000)) {
33687                                                 UnallocatedT32(instr);
33688                                                 return;
33689                                               }
33690                                               DataType dt =
33691                                                   Dt_imm6_4_Decode((instr >>
33692                                                                     19) &
33693                                                                        0x7,
33694                                                                    (instr >>
33695                                                                     28) &
33696                                                                        0x1);
33697                                               if (dt.Is(
33698                                                       kDataTypeValueInvalid)) {
33699                                                 UnallocatedT32(instr);
33700                                                 return;
33701                                               }
33702                                               if (((instr >> 12) & 1) != 0) {
33703                                                 UnallocatedT32(instr);
33704                                                 return;
33705                                               }
33706                                               unsigned rd =
33707                                                   ExtractQRegister(instr,
33708                                                                    22,
33709                                                                    12);
33710                                               unsigned rm =
33711                                                   ExtractDRegister(instr, 5, 0);
33712                                               uint32_t imm6 =
33713                                                   (instr >> 16) & 0x3f;
33714                                               uint32_t imm =
33715                                                   imm6 - dt.GetSize();
33716                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33717                                               vshll(CurrentCond(),
33718                                                     dt,
33719                                                     QRegister(rd),
33720                                                     DRegister(rm),
33721                                                     imm);
33722                                               break;
33723                                             }
33724                                             case 0x00240000: {
33725                                               // 0xefa40a10
33726                                               if (((instr & 0x380000) == 0x0) ||
33727                                                   ((instr & 0x3f0000) ==
33728                                                    0x80000) ||
33729                                                   ((instr & 0x3f0000) ==
33730                                                    0x100000) ||
33731                                                   ((instr & 0x3f0000) ==
33732                                                    0x200000)) {
33733                                                 UnallocatedT32(instr);
33734                                                 return;
33735                                               }
33736                                               DataType dt =
33737                                                   Dt_imm6_4_Decode((instr >>
33738                                                                     19) &
33739                                                                        0x7,
33740                                                                    (instr >>
33741                                                                     28) &
33742                                                                        0x1);
33743                                               if (dt.Is(
33744                                                       kDataTypeValueInvalid)) {
33745                                                 UnallocatedT32(instr);
33746                                                 return;
33747                                               }
33748                                               if (((instr >> 12) & 1) != 0) {
33749                                                 UnallocatedT32(instr);
33750                                                 return;
33751                                               }
33752                                               unsigned rd =
33753                                                   ExtractQRegister(instr,
33754                                                                    22,
33755                                                                    12);
33756                                               unsigned rm =
33757                                                   ExtractDRegister(instr, 5, 0);
33758                                               uint32_t imm6 =
33759                                                   (instr >> 16) & 0x3f;
33760                                               uint32_t imm =
33761                                                   imm6 - dt.GetSize();
33762                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33763                                               vshll(CurrentCond(),
33764                                                     dt,
33765                                                     QRegister(rd),
33766                                                     DRegister(rm),
33767                                                     imm);
33768                                               break;
33769                                             }
33770                                             case 0x00250000: {
33771                                               // 0xefa50a10
33772                                               if (((instr & 0x380000) == 0x0) ||
33773                                                   ((instr & 0x3f0000) ==
33774                                                    0x80000) ||
33775                                                   ((instr & 0x3f0000) ==
33776                                                    0x100000) ||
33777                                                   ((instr & 0x3f0000) ==
33778                                                    0x200000)) {
33779                                                 UnallocatedT32(instr);
33780                                                 return;
33781                                               }
33782                                               DataType dt =
33783                                                   Dt_imm6_4_Decode((instr >>
33784                                                                     19) &
33785                                                                        0x7,
33786                                                                    (instr >>
33787                                                                     28) &
33788                                                                        0x1);
33789                                               if (dt.Is(
33790                                                       kDataTypeValueInvalid)) {
33791                                                 UnallocatedT32(instr);
33792                                                 return;
33793                                               }
33794                                               if (((instr >> 12) & 1) != 0) {
33795                                                 UnallocatedT32(instr);
33796                                                 return;
33797                                               }
33798                                               unsigned rd =
33799                                                   ExtractQRegister(instr,
33800                                                                    22,
33801                                                                    12);
33802                                               unsigned rm =
33803                                                   ExtractDRegister(instr, 5, 0);
33804                                               uint32_t imm6 =
33805                                                   (instr >> 16) & 0x3f;
33806                                               uint32_t imm =
33807                                                   imm6 - dt.GetSize();
33808                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33809                                               vshll(CurrentCond(),
33810                                                     dt,
33811                                                     QRegister(rd),
33812                                                     DRegister(rm),
33813                                                     imm);
33814                                               break;
33815                                             }
33816                                             case 0x00260000: {
33817                                               // 0xefa60a10
33818                                               if (((instr & 0x380000) == 0x0) ||
33819                                                   ((instr & 0x3f0000) ==
33820                                                    0x80000) ||
33821                                                   ((instr & 0x3f0000) ==
33822                                                    0x100000) ||
33823                                                   ((instr & 0x3f0000) ==
33824                                                    0x200000)) {
33825                                                 UnallocatedT32(instr);
33826                                                 return;
33827                                               }
33828                                               DataType dt =
33829                                                   Dt_imm6_4_Decode((instr >>
33830                                                                     19) &
33831                                                                        0x7,
33832                                                                    (instr >>
33833                                                                     28) &
33834                                                                        0x1);
33835                                               if (dt.Is(
33836                                                       kDataTypeValueInvalid)) {
33837                                                 UnallocatedT32(instr);
33838                                                 return;
33839                                               }
33840                                               if (((instr >> 12) & 1) != 0) {
33841                                                 UnallocatedT32(instr);
33842                                                 return;
33843                                               }
33844                                               unsigned rd =
33845                                                   ExtractQRegister(instr,
33846                                                                    22,
33847                                                                    12);
33848                                               unsigned rm =
33849                                                   ExtractDRegister(instr, 5, 0);
33850                                               uint32_t imm6 =
33851                                                   (instr >> 16) & 0x3f;
33852                                               uint32_t imm =
33853                                                   imm6 - dt.GetSize();
33854                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33855                                               vshll(CurrentCond(),
33856                                                     dt,
33857                                                     QRegister(rd),
33858                                                     DRegister(rm),
33859                                                     imm);
33860                                               break;
33861                                             }
33862                                             case 0x00270000: {
33863                                               // 0xefa70a10
33864                                               if (((instr & 0x380000) == 0x0) ||
33865                                                   ((instr & 0x3f0000) ==
33866                                                    0x80000) ||
33867                                                   ((instr & 0x3f0000) ==
33868                                                    0x100000) ||
33869                                                   ((instr & 0x3f0000) ==
33870                                                    0x200000)) {
33871                                                 UnallocatedT32(instr);
33872                                                 return;
33873                                               }
33874                                               DataType dt =
33875                                                   Dt_imm6_4_Decode((instr >>
33876                                                                     19) &
33877                                                                        0x7,
33878                                                                    (instr >>
33879                                                                     28) &
33880                                                                        0x1);
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                                               uint32_t imm6 =
33897                                                   (instr >> 16) & 0x3f;
33898                                               uint32_t imm =
33899                                                   imm6 - dt.GetSize();
33900                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33901                                               vshll(CurrentCond(),
33902                                                     dt,
33903                                                     QRegister(rd),
33904                                                     DRegister(rm),
33905                                                     imm);
33906                                               break;
33907                                             }
33908                                             case 0x00280000: {
33909                                               // 0xefa80a10
33910                                               if (((instr & 0x380000) == 0x0) ||
33911                                                   ((instr & 0x3f0000) ==
33912                                                    0x80000) ||
33913                                                   ((instr & 0x3f0000) ==
33914                                                    0x100000) ||
33915                                                   ((instr & 0x3f0000) ==
33916                                                    0x200000)) {
33917                                                 UnallocatedT32(instr);
33918                                                 return;
33919                                               }
33920                                               DataType dt =
33921                                                   Dt_imm6_4_Decode((instr >>
33922                                                                     19) &
33923                                                                        0x7,
33924                                                                    (instr >>
33925                                                                     28) &
33926                                                                        0x1);
33927                                               if (dt.Is(
33928                                                       kDataTypeValueInvalid)) {
33929                                                 UnallocatedT32(instr);
33930                                                 return;
33931                                               }
33932                                               if (((instr >> 12) & 1) != 0) {
33933                                                 UnallocatedT32(instr);
33934                                                 return;
33935                                               }
33936                                               unsigned rd =
33937                                                   ExtractQRegister(instr,
33938                                                                    22,
33939                                                                    12);
33940                                               unsigned rm =
33941                                                   ExtractDRegister(instr, 5, 0);
33942                                               uint32_t imm6 =
33943                                                   (instr >> 16) & 0x3f;
33944                                               uint32_t imm =
33945                                                   imm6 - dt.GetSize();
33946                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33947                                               vshll(CurrentCond(),
33948                                                     dt,
33949                                                     QRegister(rd),
33950                                                     DRegister(rm),
33951                                                     imm);
33952                                               break;
33953                                             }
33954                                             case 0x00290000: {
33955                                               // 0xefa90a10
33956                                               if (((instr & 0x380000) == 0x0) ||
33957                                                   ((instr & 0x3f0000) ==
33958                                                    0x80000) ||
33959                                                   ((instr & 0x3f0000) ==
33960                                                    0x100000) ||
33961                                                   ((instr & 0x3f0000) ==
33962                                                    0x200000)) {
33963                                                 UnallocatedT32(instr);
33964                                                 return;
33965                                               }
33966                                               DataType dt =
33967                                                   Dt_imm6_4_Decode((instr >>
33968                                                                     19) &
33969                                                                        0x7,
33970                                                                    (instr >>
33971                                                                     28) &
33972                                                                        0x1);
33973                                               if (dt.Is(
33974                                                       kDataTypeValueInvalid)) {
33975                                                 UnallocatedT32(instr);
33976                                                 return;
33977                                               }
33978                                               if (((instr >> 12) & 1) != 0) {
33979                                                 UnallocatedT32(instr);
33980                                                 return;
33981                                               }
33982                                               unsigned rd =
33983                                                   ExtractQRegister(instr,
33984                                                                    22,
33985                                                                    12);
33986                                               unsigned rm =
33987                                                   ExtractDRegister(instr, 5, 0);
33988                                               uint32_t imm6 =
33989                                                   (instr >> 16) & 0x3f;
33990                                               uint32_t imm =
33991                                                   imm6 - dt.GetSize();
33992                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33993                                               vshll(CurrentCond(),
33994                                                     dt,
33995                                                     QRegister(rd),
33996                                                     DRegister(rm),
33997                                                     imm);
33998                                               break;
33999                                             }
34000                                             case 0x002a0000: {
34001                                               // 0xefaa0a10
34002                                               if (((instr & 0x380000) == 0x0) ||
34003                                                   ((instr & 0x3f0000) ==
34004                                                    0x80000) ||
34005                                                   ((instr & 0x3f0000) ==
34006                                                    0x100000) ||
34007                                                   ((instr & 0x3f0000) ==
34008                                                    0x200000)) {
34009                                                 UnallocatedT32(instr);
34010                                                 return;
34011                                               }
34012                                               DataType dt =
34013                                                   Dt_imm6_4_Decode((instr >>
34014                                                                     19) &
34015                                                                        0x7,
34016                                                                    (instr >>
34017                                                                     28) &
34018                                                                        0x1);
34019                                               if (dt.Is(
34020                                                       kDataTypeValueInvalid)) {
34021                                                 UnallocatedT32(instr);
34022                                                 return;
34023                                               }
34024                                               if (((instr >> 12) & 1) != 0) {
34025                                                 UnallocatedT32(instr);
34026                                                 return;
34027                                               }
34028                                               unsigned rd =
34029                                                   ExtractQRegister(instr,
34030                                                                    22,
34031                                                                    12);
34032                                               unsigned rm =
34033                                                   ExtractDRegister(instr, 5, 0);
34034                                               uint32_t imm6 =
34035                                                   (instr >> 16) & 0x3f;
34036                                               uint32_t imm =
34037                                                   imm6 - dt.GetSize();
34038                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34039                                               vshll(CurrentCond(),
34040                                                     dt,
34041                                                     QRegister(rd),
34042                                                     DRegister(rm),
34043                                                     imm);
34044                                               break;
34045                                             }
34046                                             case 0x002b0000: {
34047                                               // 0xefab0a10
34048                                               if (((instr & 0x380000) == 0x0) ||
34049                                                   ((instr & 0x3f0000) ==
34050                                                    0x80000) ||
34051                                                   ((instr & 0x3f0000) ==
34052                                                    0x100000) ||
34053                                                   ((instr & 0x3f0000) ==
34054                                                    0x200000)) {
34055                                                 UnallocatedT32(instr);
34056                                                 return;
34057                                               }
34058                                               DataType dt =
34059                                                   Dt_imm6_4_Decode((instr >>
34060                                                                     19) &
34061                                                                        0x7,
34062                                                                    (instr >>
34063                                                                     28) &
34064                                                                        0x1);
34065                                               if (dt.Is(
34066                                                       kDataTypeValueInvalid)) {
34067                                                 UnallocatedT32(instr);
34068                                                 return;
34069                                               }
34070                                               if (((instr >> 12) & 1) != 0) {
34071                                                 UnallocatedT32(instr);
34072                                                 return;
34073                                               }
34074                                               unsigned rd =
34075                                                   ExtractQRegister(instr,
34076                                                                    22,
34077                                                                    12);
34078                                               unsigned rm =
34079                                                   ExtractDRegister(instr, 5, 0);
34080                                               uint32_t imm6 =
34081                                                   (instr >> 16) & 0x3f;
34082                                               uint32_t imm =
34083                                                   imm6 - dt.GetSize();
34084                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34085                                               vshll(CurrentCond(),
34086                                                     dt,
34087                                                     QRegister(rd),
34088                                                     DRegister(rm),
34089                                                     imm);
34090                                               break;
34091                                             }
34092                                             case 0x002c0000: {
34093                                               // 0xefac0a10
34094                                               if (((instr & 0x380000) == 0x0) ||
34095                                                   ((instr & 0x3f0000) ==
34096                                                    0x80000) ||
34097                                                   ((instr & 0x3f0000) ==
34098                                                    0x100000) ||
34099                                                   ((instr & 0x3f0000) ==
34100                                                    0x200000)) {
34101                                                 UnallocatedT32(instr);
34102                                                 return;
34103                                               }
34104                                               DataType dt =
34105                                                   Dt_imm6_4_Decode((instr >>
34106                                                                     19) &
34107                                                                        0x7,
34108                                                                    (instr >>
34109                                                                     28) &
34110                                                                        0x1);
34111                                               if (dt.Is(
34112                                                       kDataTypeValueInvalid)) {
34113                                                 UnallocatedT32(instr);
34114                                                 return;
34115                                               }
34116                                               if (((instr >> 12) & 1) != 0) {
34117                                                 UnallocatedT32(instr);
34118                                                 return;
34119                                               }
34120                                               unsigned rd =
34121                                                   ExtractQRegister(instr,
34122                                                                    22,
34123                                                                    12);
34124                                               unsigned rm =
34125                                                   ExtractDRegister(instr, 5, 0);
34126                                               uint32_t imm6 =
34127                                                   (instr >> 16) & 0x3f;
34128                                               uint32_t imm =
34129                                                   imm6 - dt.GetSize();
34130                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34131                                               vshll(CurrentCond(),
34132                                                     dt,
34133                                                     QRegister(rd),
34134                                                     DRegister(rm),
34135                                                     imm);
34136                                               break;
34137                                             }
34138                                             case 0x002d0000: {
34139                                               // 0xefad0a10
34140                                               if (((instr & 0x380000) == 0x0) ||
34141                                                   ((instr & 0x3f0000) ==
34142                                                    0x80000) ||
34143                                                   ((instr & 0x3f0000) ==
34144                                                    0x100000) ||
34145                                                   ((instr & 0x3f0000) ==
34146                                                    0x200000)) {
34147                                                 UnallocatedT32(instr);
34148                                                 return;
34149                                               }
34150                                               DataType dt =
34151                                                   Dt_imm6_4_Decode((instr >>
34152                                                                     19) &
34153                                                                        0x7,
34154                                                                    (instr >>
34155                                                                     28) &
34156                                                                        0x1);
34157                                               if (dt.Is(
34158                                                       kDataTypeValueInvalid)) {
34159                                                 UnallocatedT32(instr);
34160                                                 return;
34161                                               }
34162                                               if (((instr >> 12) & 1) != 0) {
34163                                                 UnallocatedT32(instr);
34164                                                 return;
34165                                               }
34166                                               unsigned rd =
34167                                                   ExtractQRegister(instr,
34168                                                                    22,
34169                                                                    12);
34170                                               unsigned rm =
34171                                                   ExtractDRegister(instr, 5, 0);
34172                                               uint32_t imm6 =
34173                                                   (instr >> 16) & 0x3f;
34174                                               uint32_t imm =
34175                                                   imm6 - dt.GetSize();
34176                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34177                                               vshll(CurrentCond(),
34178                                                     dt,
34179                                                     QRegister(rd),
34180                                                     DRegister(rm),
34181                                                     imm);
34182                                               break;
34183                                             }
34184                                             case 0x002e0000: {
34185                                               // 0xefae0a10
34186                                               if (((instr & 0x380000) == 0x0) ||
34187                                                   ((instr & 0x3f0000) ==
34188                                                    0x80000) ||
34189                                                   ((instr & 0x3f0000) ==
34190                                                    0x100000) ||
34191                                                   ((instr & 0x3f0000) ==
34192                                                    0x200000)) {
34193                                                 UnallocatedT32(instr);
34194                                                 return;
34195                                               }
34196                                               DataType dt =
34197                                                   Dt_imm6_4_Decode((instr >>
34198                                                                     19) &
34199                                                                        0x7,
34200                                                                    (instr >>
34201                                                                     28) &
34202                                                                        0x1);
34203                                               if (dt.Is(
34204                                                       kDataTypeValueInvalid)) {
34205                                                 UnallocatedT32(instr);
34206                                                 return;
34207                                               }
34208                                               if (((instr >> 12) & 1) != 0) {
34209                                                 UnallocatedT32(instr);
34210                                                 return;
34211                                               }
34212                                               unsigned rd =
34213                                                   ExtractQRegister(instr,
34214                                                                    22,
34215                                                                    12);
34216                                               unsigned rm =
34217                                                   ExtractDRegister(instr, 5, 0);
34218                                               uint32_t imm6 =
34219                                                   (instr >> 16) & 0x3f;
34220                                               uint32_t imm =
34221                                                   imm6 - dt.GetSize();
34222                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34223                                               vshll(CurrentCond(),
34224                                                     dt,
34225                                                     QRegister(rd),
34226                                                     DRegister(rm),
34227                                                     imm);
34228                                               break;
34229                                             }
34230                                             case 0x002f0000: {
34231                                               // 0xefaf0a10
34232                                               if (((instr & 0x380000) == 0x0) ||
34233                                                   ((instr & 0x3f0000) ==
34234                                                    0x80000) ||
34235                                                   ((instr & 0x3f0000) ==
34236                                                    0x100000) ||
34237                                                   ((instr & 0x3f0000) ==
34238                                                    0x200000)) {
34239                                                 UnallocatedT32(instr);
34240                                                 return;
34241                                               }
34242                                               DataType dt =
34243                                                   Dt_imm6_4_Decode((instr >>
34244                                                                     19) &
34245                                                                        0x7,
34246                                                                    (instr >>
34247                                                                     28) &
34248                                                                        0x1);
34249                                               if (dt.Is(
34250                                                       kDataTypeValueInvalid)) {
34251                                                 UnallocatedT32(instr);
34252                                                 return;
34253                                               }
34254                                               if (((instr >> 12) & 1) != 0) {
34255                                                 UnallocatedT32(instr);
34256                                                 return;
34257                                               }
34258                                               unsigned rd =
34259                                                   ExtractQRegister(instr,
34260                                                                    22,
34261                                                                    12);
34262                                               unsigned rm =
34263                                                   ExtractDRegister(instr, 5, 0);
34264                                               uint32_t imm6 =
34265                                                   (instr >> 16) & 0x3f;
34266                                               uint32_t imm =
34267                                                   imm6 - dt.GetSize();
34268                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34269                                               vshll(CurrentCond(),
34270                                                     dt,
34271                                                     QRegister(rd),
34272                                                     DRegister(rm),
34273                                                     imm);
34274                                               break;
34275                                             }
34276                                             case 0x00300000: {
34277                                               // 0xefb00a10
34278                                               if (((instr & 0x380000) == 0x0) ||
34279                                                   ((instr & 0x3f0000) ==
34280                                                    0x80000) ||
34281                                                   ((instr & 0x3f0000) ==
34282                                                    0x100000) ||
34283                                                   ((instr & 0x3f0000) ==
34284                                                    0x200000)) {
34285                                                 UnallocatedT32(instr);
34286                                                 return;
34287                                               }
34288                                               DataType dt =
34289                                                   Dt_imm6_4_Decode((instr >>
34290                                                                     19) &
34291                                                                        0x7,
34292                                                                    (instr >>
34293                                                                     28) &
34294                                                                        0x1);
34295                                               if (dt.Is(
34296                                                       kDataTypeValueInvalid)) {
34297                                                 UnallocatedT32(instr);
34298                                                 return;
34299                                               }
34300                                               if (((instr >> 12) & 1) != 0) {
34301                                                 UnallocatedT32(instr);
34302                                                 return;
34303                                               }
34304                                               unsigned rd =
34305                                                   ExtractQRegister(instr,
34306                                                                    22,
34307                                                                    12);
34308                                               unsigned rm =
34309                                                   ExtractDRegister(instr, 5, 0);
34310                                               uint32_t imm6 =
34311                                                   (instr >> 16) & 0x3f;
34312                                               uint32_t imm =
34313                                                   imm6 - dt.GetSize();
34314                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34315                                               vshll(CurrentCond(),
34316                                                     dt,
34317                                                     QRegister(rd),
34318                                                     DRegister(rm),
34319                                                     imm);
34320                                               break;
34321                                             }
34322                                             case 0x00310000: {
34323                                               // 0xefb10a10
34324                                               if (((instr & 0x380000) == 0x0) ||
34325                                                   ((instr & 0x3f0000) ==
34326                                                    0x80000) ||
34327                                                   ((instr & 0x3f0000) ==
34328                                                    0x100000) ||
34329                                                   ((instr & 0x3f0000) ==
34330                                                    0x200000)) {
34331                                                 UnallocatedT32(instr);
34332                                                 return;
34333                                               }
34334                                               DataType dt =
34335                                                   Dt_imm6_4_Decode((instr >>
34336                                                                     19) &
34337                                                                        0x7,
34338                                                                    (instr >>
34339                                                                     28) &
34340                                                                        0x1);
34341                                               if (dt.Is(
34342                                                       kDataTypeValueInvalid)) {
34343                                                 UnallocatedT32(instr);
34344                                                 return;
34345                                               }
34346                                               if (((instr >> 12) & 1) != 0) {
34347                                                 UnallocatedT32(instr);
34348                                                 return;
34349                                               }
34350                                               unsigned rd =
34351                                                   ExtractQRegister(instr,
34352                                                                    22,
34353                                                                    12);
34354                                               unsigned rm =
34355                                                   ExtractDRegister(instr, 5, 0);
34356                                               uint32_t imm6 =
34357                                                   (instr >> 16) & 0x3f;
34358                                               uint32_t imm =
34359                                                   imm6 - dt.GetSize();
34360                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34361                                               vshll(CurrentCond(),
34362                                                     dt,
34363                                                     QRegister(rd),
34364                                                     DRegister(rm),
34365                                                     imm);
34366                                               break;
34367                                             }
34368                                             case 0x00320000: {
34369                                               // 0xefb20a10
34370                                               if (((instr & 0x380000) == 0x0) ||
34371                                                   ((instr & 0x3f0000) ==
34372                                                    0x80000) ||
34373                                                   ((instr & 0x3f0000) ==
34374                                                    0x100000) ||
34375                                                   ((instr & 0x3f0000) ==
34376                                                    0x200000)) {
34377                                                 UnallocatedT32(instr);
34378                                                 return;
34379                                               }
34380                                               DataType dt =
34381                                                   Dt_imm6_4_Decode((instr >>
34382                                                                     19) &
34383                                                                        0x7,
34384                                                                    (instr >>
34385                                                                     28) &
34386                                                                        0x1);
34387                                               if (dt.Is(
34388                                                       kDataTypeValueInvalid)) {
34389                                                 UnallocatedT32(instr);
34390                                                 return;
34391                                               }
34392                                               if (((instr >> 12) & 1) != 0) {
34393                                                 UnallocatedT32(instr);
34394                                                 return;
34395                                               }
34396                                               unsigned rd =
34397                                                   ExtractQRegister(instr,
34398                                                                    22,
34399                                                                    12);
34400                                               unsigned rm =
34401                                                   ExtractDRegister(instr, 5, 0);
34402                                               uint32_t imm6 =
34403                                                   (instr >> 16) & 0x3f;
34404                                               uint32_t imm =
34405                                                   imm6 - dt.GetSize();
34406                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34407                                               vshll(CurrentCond(),
34408                                                     dt,
34409                                                     QRegister(rd),
34410                                                     DRegister(rm),
34411                                                     imm);
34412                                               break;
34413                                             }
34414                                             case 0x00330000: {
34415                                               // 0xefb30a10
34416                                               if (((instr & 0x380000) == 0x0) ||
34417                                                   ((instr & 0x3f0000) ==
34418                                                    0x80000) ||
34419                                                   ((instr & 0x3f0000) ==
34420                                                    0x100000) ||
34421                                                   ((instr & 0x3f0000) ==
34422                                                    0x200000)) {
34423                                                 UnallocatedT32(instr);
34424                                                 return;
34425                                               }
34426                                               DataType dt =
34427                                                   Dt_imm6_4_Decode((instr >>
34428                                                                     19) &
34429                                                                        0x7,
34430                                                                    (instr >>
34431                                                                     28) &
34432                                                                        0x1);
34433                                               if (dt.Is(
34434                                                       kDataTypeValueInvalid)) {
34435                                                 UnallocatedT32(instr);
34436                                                 return;
34437                                               }
34438                                               if (((instr >> 12) & 1) != 0) {
34439                                                 UnallocatedT32(instr);
34440                                                 return;
34441                                               }
34442                                               unsigned rd =
34443                                                   ExtractQRegister(instr,
34444                                                                    22,
34445                                                                    12);
34446                                               unsigned rm =
34447                                                   ExtractDRegister(instr, 5, 0);
34448                                               uint32_t imm6 =
34449                                                   (instr >> 16) & 0x3f;
34450                                               uint32_t imm =
34451                                                   imm6 - dt.GetSize();
34452                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34453                                               vshll(CurrentCond(),
34454                                                     dt,
34455                                                     QRegister(rd),
34456                                                     DRegister(rm),
34457                                                     imm);
34458                                               break;
34459                                             }
34460                                             case 0x00340000: {
34461                                               // 0xefb40a10
34462                                               if (((instr & 0x380000) == 0x0) ||
34463                                                   ((instr & 0x3f0000) ==
34464                                                    0x80000) ||
34465                                                   ((instr & 0x3f0000) ==
34466                                                    0x100000) ||
34467                                                   ((instr & 0x3f0000) ==
34468                                                    0x200000)) {
34469                                                 UnallocatedT32(instr);
34470                                                 return;
34471                                               }
34472                                               DataType dt =
34473                                                   Dt_imm6_4_Decode((instr >>
34474                                                                     19) &
34475                                                                        0x7,
34476                                                                    (instr >>
34477                                                                     28) &
34478                                                                        0x1);
34479                                               if (dt.Is(
34480                                                       kDataTypeValueInvalid)) {
34481                                                 UnallocatedT32(instr);
34482                                                 return;
34483                                               }
34484                                               if (((instr >> 12) & 1) != 0) {
34485                                                 UnallocatedT32(instr);
34486                                                 return;
34487                                               }
34488                                               unsigned rd =
34489                                                   ExtractQRegister(instr,
34490                                                                    22,
34491                                                                    12);
34492                                               unsigned rm =
34493                                                   ExtractDRegister(instr, 5, 0);
34494                                               uint32_t imm6 =
34495                                                   (instr >> 16) & 0x3f;
34496                                               uint32_t imm =
34497                                                   imm6 - dt.GetSize();
34498                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34499                                               vshll(CurrentCond(),
34500                                                     dt,
34501                                                     QRegister(rd),
34502                                                     DRegister(rm),
34503                                                     imm);
34504                                               break;
34505                                             }
34506                                             case 0x00350000: {
34507                                               // 0xefb50a10
34508                                               if (((instr & 0x380000) == 0x0) ||
34509                                                   ((instr & 0x3f0000) ==
34510                                                    0x80000) ||
34511                                                   ((instr & 0x3f0000) ==
34512                                                    0x100000) ||
34513                                                   ((instr & 0x3f0000) ==
34514                                                    0x200000)) {
34515                                                 UnallocatedT32(instr);
34516                                                 return;
34517                                               }
34518                                               DataType dt =
34519                                                   Dt_imm6_4_Decode((instr >>
34520                                                                     19) &
34521                                                                        0x7,
34522                                                                    (instr >>
34523                                                                     28) &
34524                                                                        0x1);
34525                                               if (dt.Is(
34526                                                       kDataTypeValueInvalid)) {
34527                                                 UnallocatedT32(instr);
34528                                                 return;
34529                                               }
34530                                               if (((instr >> 12) & 1) != 0) {
34531                                                 UnallocatedT32(instr);
34532                                                 return;
34533                                               }
34534                                               unsigned rd =
34535                                                   ExtractQRegister(instr,
34536                                                                    22,
34537                                                                    12);
34538                                               unsigned rm =
34539                                                   ExtractDRegister(instr, 5, 0);
34540                                               uint32_t imm6 =
34541                                                   (instr >> 16) & 0x3f;
34542                                               uint32_t imm =
34543                                                   imm6 - dt.GetSize();
34544                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34545                                               vshll(CurrentCond(),
34546                                                     dt,
34547                                                     QRegister(rd),
34548                                                     DRegister(rm),
34549                                                     imm);
34550                                               break;
34551                                             }
34552                                             case 0x00360000: {
34553                                               // 0xefb60a10
34554                                               if (((instr & 0x380000) == 0x0) ||
34555                                                   ((instr & 0x3f0000) ==
34556                                                    0x80000) ||
34557                                                   ((instr & 0x3f0000) ==
34558                                                    0x100000) ||
34559                                                   ((instr & 0x3f0000) ==
34560                                                    0x200000)) {
34561                                                 UnallocatedT32(instr);
34562                                                 return;
34563                                               }
34564                                               DataType dt =
34565                                                   Dt_imm6_4_Decode((instr >>
34566                                                                     19) &
34567                                                                        0x7,
34568                                                                    (instr >>
34569                                                                     28) &
34570                                                                        0x1);
34571                                               if (dt.Is(
34572                                                       kDataTypeValueInvalid)) {
34573                                                 UnallocatedT32(instr);
34574                                                 return;
34575                                               }
34576                                               if (((instr >> 12) & 1) != 0) {
34577                                                 UnallocatedT32(instr);
34578                                                 return;
34579                                               }
34580                                               unsigned rd =
34581                                                   ExtractQRegister(instr,
34582                                                                    22,
34583                                                                    12);
34584                                               unsigned rm =
34585                                                   ExtractDRegister(instr, 5, 0);
34586                                               uint32_t imm6 =
34587                                                   (instr >> 16) & 0x3f;
34588                                               uint32_t imm =
34589                                                   imm6 - dt.GetSize();
34590                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34591                                               vshll(CurrentCond(),
34592                                                     dt,
34593                                                     QRegister(rd),
34594                                                     DRegister(rm),
34595                                                     imm);
34596                                               break;
34597                                             }
34598                                             case 0x00370000: {
34599                                               // 0xefb70a10
34600                                               if (((instr & 0x380000) == 0x0) ||
34601                                                   ((instr & 0x3f0000) ==
34602                                                    0x80000) ||
34603                                                   ((instr & 0x3f0000) ==
34604                                                    0x100000) ||
34605                                                   ((instr & 0x3f0000) ==
34606                                                    0x200000)) {
34607                                                 UnallocatedT32(instr);
34608                                                 return;
34609                                               }
34610                                               DataType dt =
34611                                                   Dt_imm6_4_Decode((instr >>
34612                                                                     19) &
34613                                                                        0x7,
34614                                                                    (instr >>
34615                                                                     28) &
34616                                                                        0x1);
34617                                               if (dt.Is(
34618                                                       kDataTypeValueInvalid)) {
34619                                                 UnallocatedT32(instr);
34620                                                 return;
34621                                               }
34622                                               if (((instr >> 12) & 1) != 0) {
34623                                                 UnallocatedT32(instr);
34624                                                 return;
34625                                               }
34626                                               unsigned rd =
34627                                                   ExtractQRegister(instr,
34628                                                                    22,
34629                                                                    12);
34630                                               unsigned rm =
34631                                                   ExtractDRegister(instr, 5, 0);
34632                                               uint32_t imm6 =
34633                                                   (instr >> 16) & 0x3f;
34634                                               uint32_t imm =
34635                                                   imm6 - dt.GetSize();
34636                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34637                                               vshll(CurrentCond(),
34638                                                     dt,
34639                                                     QRegister(rd),
34640                                                     DRegister(rm),
34641                                                     imm);
34642                                               break;
34643                                             }
34644                                             case 0x00380000: {
34645                                               // 0xefb80a10
34646                                               if (((instr & 0x380000) == 0x0) ||
34647                                                   ((instr & 0x3f0000) ==
34648                                                    0x80000) ||
34649                                                   ((instr & 0x3f0000) ==
34650                                                    0x100000) ||
34651                                                   ((instr & 0x3f0000) ==
34652                                                    0x200000)) {
34653                                                 UnallocatedT32(instr);
34654                                                 return;
34655                                               }
34656                                               DataType dt =
34657                                                   Dt_imm6_4_Decode((instr >>
34658                                                                     19) &
34659                                                                        0x7,
34660                                                                    (instr >>
34661                                                                     28) &
34662                                                                        0x1);
34663                                               if (dt.Is(
34664                                                       kDataTypeValueInvalid)) {
34665                                                 UnallocatedT32(instr);
34666                                                 return;
34667                                               }
34668                                               if (((instr >> 12) & 1) != 0) {
34669                                                 UnallocatedT32(instr);
34670                                                 return;
34671                                               }
34672                                               unsigned rd =
34673                                                   ExtractQRegister(instr,
34674                                                                    22,
34675                                                                    12);
34676                                               unsigned rm =
34677                                                   ExtractDRegister(instr, 5, 0);
34678                                               uint32_t imm6 =
34679                                                   (instr >> 16) & 0x3f;
34680                                               uint32_t imm =
34681                                                   imm6 - dt.GetSize();
34682                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34683                                               vshll(CurrentCond(),
34684                                                     dt,
34685                                                     QRegister(rd),
34686                                                     DRegister(rm),
34687                                                     imm);
34688                                               break;
34689                                             }
34690                                             case 0x00390000: {
34691                                               // 0xefb90a10
34692                                               if (((instr & 0x380000) == 0x0) ||
34693                                                   ((instr & 0x3f0000) ==
34694                                                    0x80000) ||
34695                                                   ((instr & 0x3f0000) ==
34696                                                    0x100000) ||
34697                                                   ((instr & 0x3f0000) ==
34698                                                    0x200000)) {
34699                                                 UnallocatedT32(instr);
34700                                                 return;
34701                                               }
34702                                               DataType dt =
34703                                                   Dt_imm6_4_Decode((instr >>
34704                                                                     19) &
34705                                                                        0x7,
34706                                                                    (instr >>
34707                                                                     28) &
34708                                                                        0x1);
34709                                               if (dt.Is(
34710                                                       kDataTypeValueInvalid)) {
34711                                                 UnallocatedT32(instr);
34712                                                 return;
34713                                               }
34714                                               if (((instr >> 12) & 1) != 0) {
34715                                                 UnallocatedT32(instr);
34716                                                 return;
34717                                               }
34718                                               unsigned rd =
34719                                                   ExtractQRegister(instr,
34720                                                                    22,
34721                                                                    12);
34722                                               unsigned rm =
34723                                                   ExtractDRegister(instr, 5, 0);
34724                                               uint32_t imm6 =
34725                                                   (instr >> 16) & 0x3f;
34726                                               uint32_t imm =
34727                                                   imm6 - dt.GetSize();
34728                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34729                                               vshll(CurrentCond(),
34730                                                     dt,
34731                                                     QRegister(rd),
34732                                                     DRegister(rm),
34733                                                     imm);
34734                                               break;
34735                                             }
34736                                             case 0x003a0000: {
34737                                               // 0xefba0a10
34738                                               if (((instr & 0x380000) == 0x0) ||
34739                                                   ((instr & 0x3f0000) ==
34740                                                    0x80000) ||
34741                                                   ((instr & 0x3f0000) ==
34742                                                    0x100000) ||
34743                                                   ((instr & 0x3f0000) ==
34744                                                    0x200000)) {
34745                                                 UnallocatedT32(instr);
34746                                                 return;
34747                                               }
34748                                               DataType dt =
34749                                                   Dt_imm6_4_Decode((instr >>
34750                                                                     19) &
34751                                                                        0x7,
34752                                                                    (instr >>
34753                                                                     28) &
34754                                                                        0x1);
34755                                               if (dt.Is(
34756                                                       kDataTypeValueInvalid)) {
34757                                                 UnallocatedT32(instr);
34758                                                 return;
34759                                               }
34760                                               if (((instr >> 12) & 1) != 0) {
34761                                                 UnallocatedT32(instr);
34762                                                 return;
34763                                               }
34764                                               unsigned rd =
34765                                                   ExtractQRegister(instr,
34766                                                                    22,
34767                                                                    12);
34768                                               unsigned rm =
34769                                                   ExtractDRegister(instr, 5, 0);
34770                                               uint32_t imm6 =
34771                                                   (instr >> 16) & 0x3f;
34772                                               uint32_t imm =
34773                                                   imm6 - dt.GetSize();
34774                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34775                                               vshll(CurrentCond(),
34776                                                     dt,
34777                                                     QRegister(rd),
34778                                                     DRegister(rm),
34779                                                     imm);
34780                                               break;
34781                                             }
34782                                             case 0x003b0000: {
34783                                               // 0xefbb0a10
34784                                               if (((instr & 0x380000) == 0x0) ||
34785                                                   ((instr & 0x3f0000) ==
34786                                                    0x80000) ||
34787                                                   ((instr & 0x3f0000) ==
34788                                                    0x100000) ||
34789                                                   ((instr & 0x3f0000) ==
34790                                                    0x200000)) {
34791                                                 UnallocatedT32(instr);
34792                                                 return;
34793                                               }
34794                                               DataType dt =
34795                                                   Dt_imm6_4_Decode((instr >>
34796                                                                     19) &
34797                                                                        0x7,
34798                                                                    (instr >>
34799                                                                     28) &
34800                                                                        0x1);
34801                                               if (dt.Is(
34802                                                       kDataTypeValueInvalid)) {
34803                                                 UnallocatedT32(instr);
34804                                                 return;
34805                                               }
34806                                               if (((instr >> 12) & 1) != 0) {
34807                                                 UnallocatedT32(instr);
34808                                                 return;
34809                                               }
34810                                               unsigned rd =
34811                                                   ExtractQRegister(instr,
34812                                                                    22,
34813                                                                    12);
34814                                               unsigned rm =
34815                                                   ExtractDRegister(instr, 5, 0);
34816                                               uint32_t imm6 =
34817                                                   (instr >> 16) & 0x3f;
34818                                               uint32_t imm =
34819                                                   imm6 - dt.GetSize();
34820                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34821                                               vshll(CurrentCond(),
34822                                                     dt,
34823                                                     QRegister(rd),
34824                                                     DRegister(rm),
34825                                                     imm);
34826                                               break;
34827                                             }
34828                                             case 0x003c0000: {
34829                                               // 0xefbc0a10
34830                                               if (((instr & 0x380000) == 0x0) ||
34831                                                   ((instr & 0x3f0000) ==
34832                                                    0x80000) ||
34833                                                   ((instr & 0x3f0000) ==
34834                                                    0x100000) ||
34835                                                   ((instr & 0x3f0000) ==
34836                                                    0x200000)) {
34837                                                 UnallocatedT32(instr);
34838                                                 return;
34839                                               }
34840                                               DataType dt =
34841                                                   Dt_imm6_4_Decode((instr >>
34842                                                                     19) &
34843                                                                        0x7,
34844                                                                    (instr >>
34845                                                                     28) &
34846                                                                        0x1);
34847                                               if (dt.Is(
34848                                                       kDataTypeValueInvalid)) {
34849                                                 UnallocatedT32(instr);
34850                                                 return;
34851                                               }
34852                                               if (((instr >> 12) & 1) != 0) {
34853                                                 UnallocatedT32(instr);
34854                                                 return;
34855                                               }
34856                                               unsigned rd =
34857                                                   ExtractQRegister(instr,
34858                                                                    22,
34859                                                                    12);
34860                                               unsigned rm =
34861                                                   ExtractDRegister(instr, 5, 0);
34862                                               uint32_t imm6 =
34863                                                   (instr >> 16) & 0x3f;
34864                                               uint32_t imm =
34865                                                   imm6 - dt.GetSize();
34866                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34867                                               vshll(CurrentCond(),
34868                                                     dt,
34869                                                     QRegister(rd),
34870                                                     DRegister(rm),
34871                                                     imm);
34872                                               break;
34873                                             }
34874                                             case 0x003d0000: {
34875                                               // 0xefbd0a10
34876                                               if (((instr & 0x380000) == 0x0) ||
34877                                                   ((instr & 0x3f0000) ==
34878                                                    0x80000) ||
34879                                                   ((instr & 0x3f0000) ==
34880                                                    0x100000) ||
34881                                                   ((instr & 0x3f0000) ==
34882                                                    0x200000)) {
34883                                                 UnallocatedT32(instr);
34884                                                 return;
34885                                               }
34886                                               DataType dt =
34887                                                   Dt_imm6_4_Decode((instr >>
34888                                                                     19) &
34889                                                                        0x7,
34890                                                                    (instr >>
34891                                                                     28) &
34892                                                                        0x1);
34893                                               if (dt.Is(
34894                                                       kDataTypeValueInvalid)) {
34895                                                 UnallocatedT32(instr);
34896                                                 return;
34897                                               }
34898                                               if (((instr >> 12) & 1) != 0) {
34899                                                 UnallocatedT32(instr);
34900                                                 return;
34901                                               }
34902                                               unsigned rd =
34903                                                   ExtractQRegister(instr,
34904                                                                    22,
34905                                                                    12);
34906                                               unsigned rm =
34907                                                   ExtractDRegister(instr, 5, 0);
34908                                               uint32_t imm6 =
34909                                                   (instr >> 16) & 0x3f;
34910                                               uint32_t imm =
34911                                                   imm6 - dt.GetSize();
34912                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34913                                               vshll(CurrentCond(),
34914                                                     dt,
34915                                                     QRegister(rd),
34916                                                     DRegister(rm),
34917                                                     imm);
34918                                               break;
34919                                             }
34920                                             case 0x003e0000: {
34921                                               // 0xefbe0a10
34922                                               if (((instr & 0x380000) == 0x0) ||
34923                                                   ((instr & 0x3f0000) ==
34924                                                    0x80000) ||
34925                                                   ((instr & 0x3f0000) ==
34926                                                    0x100000) ||
34927                                                   ((instr & 0x3f0000) ==
34928                                                    0x200000)) {
34929                                                 UnallocatedT32(instr);
34930                                                 return;
34931                                               }
34932                                               DataType dt =
34933                                                   Dt_imm6_4_Decode((instr >>
34934                                                                     19) &
34935                                                                        0x7,
34936                                                                    (instr >>
34937                                                                     28) &
34938                                                                        0x1);
34939                                               if (dt.Is(
34940                                                       kDataTypeValueInvalid)) {
34941                                                 UnallocatedT32(instr);
34942                                                 return;
34943                                               }
34944                                               if (((instr >> 12) & 1) != 0) {
34945                                                 UnallocatedT32(instr);
34946                                                 return;
34947                                               }
34948                                               unsigned rd =
34949                                                   ExtractQRegister(instr,
34950                                                                    22,
34951                                                                    12);
34952                                               unsigned rm =
34953                                                   ExtractDRegister(instr, 5, 0);
34954                                               uint32_t imm6 =
34955                                                   (instr >> 16) & 0x3f;
34956                                               uint32_t imm =
34957                                                   imm6 - dt.GetSize();
34958                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34959                                               vshll(CurrentCond(),
34960                                                     dt,
34961                                                     QRegister(rd),
34962                                                     DRegister(rm),
34963                                                     imm);
34964                                               break;
34965                                             }
34966                                             case 0x003f0000: {
34967                                               // 0xefbf0a10
34968                                               if (((instr & 0x380000) == 0x0) ||
34969                                                   ((instr & 0x3f0000) ==
34970                                                    0x80000) ||
34971                                                   ((instr & 0x3f0000) ==
34972                                                    0x100000) ||
34973                                                   ((instr & 0x3f0000) ==
34974                                                    0x200000)) {
34975                                                 UnallocatedT32(instr);
34976                                                 return;
34977                                               }
34978                                               DataType dt =
34979                                                   Dt_imm6_4_Decode((instr >>
34980                                                                     19) &
34981                                                                        0x7,
34982                                                                    (instr >>
34983                                                                     28) &
34984                                                                        0x1);
34985                                               if (dt.Is(
34986                                                       kDataTypeValueInvalid)) {
34987                                                 UnallocatedT32(instr);
34988                                                 return;
34989                                               }
34990                                               if (((instr >> 12) & 1) != 0) {
34991                                                 UnallocatedT32(instr);
34992                                                 return;
34993                                               }
34994                                               unsigned rd =
34995                                                   ExtractQRegister(instr,
34996                                                                    22,
34997                                                                    12);
34998                                               unsigned rm =
34999                                                   ExtractDRegister(instr, 5, 0);
35000                                               uint32_t imm6 =
35001                                                   (instr >> 16) & 0x3f;
35002                                               uint32_t imm =
35003                                                   imm6 - dt.GetSize();
35004                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35005                                               vshll(CurrentCond(),
35006                                                     dt,
35007                                                     QRegister(rd),
35008                                                     DRegister(rm),
35009                                                     imm);
35010                                               break;
35011                                             }
35012                                             default:
35013                                               UnallocatedT32(instr);
35014                                               break;
35015                                           }
35016                                           break;
35017                                         }
35018                                         default: {
35019                                           if (((instr & 0x380000) == 0x0) ||
35020                                               ((instr & 0x3f0000) == 0x80000) ||
35021                                               ((instr & 0x3f0000) ==
35022                                                0x100000) ||
35023                                               ((instr & 0x3f0000) ==
35024                                                0x200000)) {
35025                                             UnallocatedT32(instr);
35026                                             return;
35027                                           }
35028                                           DataType dt =
35029                                               Dt_imm6_4_Decode((instr >> 19) &
35030                                                                    0x7,
35031                                                                (instr >> 28) &
35032                                                                    0x1);
35033                                           if (dt.Is(kDataTypeValueInvalid)) {
35034                                             UnallocatedT32(instr);
35035                                             return;
35036                                           }
35037                                           if (((instr >> 12) & 1) != 0) {
35038                                             UnallocatedT32(instr);
35039                                             return;
35040                                           }
35041                                           unsigned rd =
35042                                               ExtractQRegister(instr, 22, 12);
35043                                           unsigned rm =
35044                                               ExtractDRegister(instr, 5, 0);
35045                                           uint32_t imm6 = (instr >> 16) & 0x3f;
35046                                           uint32_t imm = imm6 - dt.GetSize();
35047                                           // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35048                                           vshll(CurrentCond(),
35049                                                 dt,
35050                                                 QRegister(rd),
35051                                                 DRegister(rm),
35052                                                 imm);
35053                                           break;
35054                                         }
35055                                       }
35056                                       break;
35057                                     }
35058                                     default:
35059                                       UnallocatedT32(instr);
35060                                       break;
35061                                   }
35062                                   break;
35063                                 }
35064                               }
35065                               break;
35066                             }
35067                             default:
35068                               UnallocatedT32(instr);
35069                               break;
35070                           }
35071                           break;
35072                         }
35073                         case 0x00000c00: {
35074                           // 0xef800c10
35075                           switch (instr & 0x00000080) {
35076                             case 0x00000000: {
35077                               // 0xef800c10
35078                               switch (instr & 0x00200000) {
35079                                 case 0x00000000: {
35080                                   // 0xef800c10
35081                                   switch (instr & 0x00180000) {
35082                                     case 0x00000000: {
35083                                       // 0xef800c10
35084                                       switch (instr & 0x00000300) {
35085                                         case 0x00000200: {
35086                                           // 0xef800e10
35087                                           if (((instr & 0x920) == 0x100) ||
35088                                               ((instr & 0x520) == 0x100) ||
35089                                               ((instr & 0x820) == 0x20) ||
35090                                               ((instr & 0x420) == 0x20) ||
35091                                               ((instr & 0x220) == 0x20) ||
35092                                               ((instr & 0x120) == 0x120)) {
35093                                             UnallocatedT32(instr);
35094                                             return;
35095                                           }
35096                                           unsigned cmode =
35097                                               ((instr >> 8) & 0xf) |
35098                                               ((instr >> 1) & 0x10);
35099                                           DataType dt =
35100                                               ImmediateVmov::DecodeDt(cmode);
35101                                           if (dt.Is(kDataTypeValueInvalid)) {
35102                                             UnallocatedT32(instr);
35103                                             return;
35104                                           }
35105                                           unsigned rd =
35106                                               ExtractDRegister(instr, 22, 12);
35107                                           DOperand imm =
35108                                               ImmediateVmov::DecodeImmediate(
35109                                                   cmode,
35110                                                   (instr & 0xf) |
35111                                                       ((instr >> 12) & 0x70) |
35112                                                       ((instr >> 21) & 0x80));
35113                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35114                                           vmov(CurrentCond(),
35115                                                dt,
35116                                                DRegister(rd),
35117                                                imm);
35118                                           break;
35119                                         }
35120                                         case 0x00000300: {
35121                                           // 0xef800f10
35122                                           if (((instr & 0x920) == 0x100) ||
35123                                               ((instr & 0x520) == 0x100) ||
35124                                               ((instr & 0x820) == 0x20) ||
35125                                               ((instr & 0x420) == 0x20) ||
35126                                               ((instr & 0x220) == 0x20) ||
35127                                               ((instr & 0x120) == 0x120)) {
35128                                             UnallocatedT32(instr);
35129                                             return;
35130                                           }
35131                                           unsigned cmode =
35132                                               ((instr >> 8) & 0xf) |
35133                                               ((instr >> 1) & 0x10);
35134                                           DataType dt =
35135                                               ImmediateVmov::DecodeDt(cmode);
35136                                           if (dt.Is(kDataTypeValueInvalid)) {
35137                                             UnallocatedT32(instr);
35138                                             return;
35139                                           }
35140                                           unsigned rd =
35141                                               ExtractDRegister(instr, 22, 12);
35142                                           DOperand imm =
35143                                               ImmediateVmov::DecodeImmediate(
35144                                                   cmode,
35145                                                   (instr & 0xf) |
35146                                                       ((instr >> 12) & 0x70) |
35147                                                       ((instr >> 21) & 0x80));
35148                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35149                                           vmov(CurrentCond(),
35150                                                dt,
35151                                                DRegister(rd),
35152                                                imm);
35153                                           break;
35154                                         }
35155                                         default: {
35156                                           switch (instr & 0x00000020) {
35157                                             case 0x00000020: {
35158                                               // 0xef800c30
35159                                               switch (instr & 0x00000f20) {
35160                                                 case 0x00000000: {
35161                                                   // 0xef800c10
35162                                                   if (((instr & 0x920) ==
35163                                                        0x100) ||
35164                                                       ((instr & 0x520) ==
35165                                                        0x100) ||
35166                                                       ((instr & 0x820) ==
35167                                                        0x20) ||
35168                                                       ((instr & 0x420) ==
35169                                                        0x20) ||
35170                                                       ((instr & 0x220) ==
35171                                                        0x20) ||
35172                                                       ((instr & 0x120) ==
35173                                                        0x120)) {
35174                                                     UnallocatedT32(instr);
35175                                                     return;
35176                                                   }
35177                                                   unsigned cmode =
35178                                                       ((instr >> 8) & 0xf) |
35179                                                       ((instr >> 1) & 0x10);
35180                                                   DataType dt =
35181                                                       ImmediateVmov::DecodeDt(
35182                                                           cmode);
35183                                                   if (dt.Is(
35184                                                           kDataTypeValueInvalid)) {
35185                                                     UnallocatedT32(instr);
35186                                                     return;
35187                                                   }
35188                                                   unsigned rd =
35189                                                       ExtractDRegister(instr,
35190                                                                        22,
35191                                                                        12);
35192                                                   DOperand imm = ImmediateVmov::
35193                                                       DecodeImmediate(
35194                                                           cmode,
35195                                                           (instr & 0xf) |
35196                                                               ((instr >> 12) &
35197                                                                0x70) |
35198                                                               ((instr >> 21) &
35199                                                                0x80));
35200                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35201                                                   vmov(CurrentCond(),
35202                                                        dt,
35203                                                        DRegister(rd),
35204                                                        imm);
35205                                                   break;
35206                                                 }
35207                                                 case 0x00000020: {
35208                                                   // 0xef800c30
35209                                                   if (((instr & 0xd00) ==
35210                                                        0x100) ||
35211                                                       ((instr & 0xd00) ==
35212                                                        0x500) ||
35213                                                       ((instr & 0xd00) ==
35214                                                        0x900) ||
35215                                                       ((instr & 0xe00) ==
35216                                                        0xe00)) {
35217                                                     UnallocatedT32(instr);
35218                                                     return;
35219                                                   }
35220                                                   unsigned cmode =
35221                                                       (instr >> 8) & 0xf;
35222                                                   DataType dt =
35223                                                       ImmediateVmvn::DecodeDt(
35224                                                           cmode);
35225                                                   if (dt.Is(
35226                                                           kDataTypeValueInvalid)) {
35227                                                     UnallocatedT32(instr);
35228                                                     return;
35229                                                   }
35230                                                   unsigned rd =
35231                                                       ExtractDRegister(instr,
35232                                                                        22,
35233                                                                        12);
35234                                                   DOperand imm = ImmediateVmvn::
35235                                                       DecodeImmediate(
35236                                                           cmode,
35237                                                           (instr & 0xf) |
35238                                                               ((instr >> 12) &
35239                                                                0x70) |
35240                                                               ((instr >> 21) &
35241                                                                0x80));
35242                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35243                                                   vmvn(CurrentCond(),
35244                                                        dt,
35245                                                        DRegister(rd),
35246                                                        imm);
35247                                                   break;
35248                                                 }
35249                                                 case 0x00000200: {
35250                                                   // 0xef800e10
35251                                                   if (((instr & 0x920) ==
35252                                                        0x100) ||
35253                                                       ((instr & 0x520) ==
35254                                                        0x100) ||
35255                                                       ((instr & 0x820) ==
35256                                                        0x20) ||
35257                                                       ((instr & 0x420) ==
35258                                                        0x20) ||
35259                                                       ((instr & 0x220) ==
35260                                                        0x20) ||
35261                                                       ((instr & 0x120) ==
35262                                                        0x120)) {
35263                                                     UnallocatedT32(instr);
35264                                                     return;
35265                                                   }
35266                                                   unsigned cmode =
35267                                                       ((instr >> 8) & 0xf) |
35268                                                       ((instr >> 1) & 0x10);
35269                                                   DataType dt =
35270                                                       ImmediateVmov::DecodeDt(
35271                                                           cmode);
35272                                                   if (dt.Is(
35273                                                           kDataTypeValueInvalid)) {
35274                                                     UnallocatedT32(instr);
35275                                                     return;
35276                                                   }
35277                                                   unsigned rd =
35278                                                       ExtractDRegister(instr,
35279                                                                        22,
35280                                                                        12);
35281                                                   DOperand imm = ImmediateVmov::
35282                                                       DecodeImmediate(
35283                                                           cmode,
35284                                                           (instr & 0xf) |
35285                                                               ((instr >> 12) &
35286                                                                0x70) |
35287                                                               ((instr >> 21) &
35288                                                                0x80));
35289                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35290                                                   vmov(CurrentCond(),
35291                                                        dt,
35292                                                        DRegister(rd),
35293                                                        imm);
35294                                                   break;
35295                                                 }
35296                                                 case 0x00000220: {
35297                                                   // 0xef800e30
35298                                                   if (((instr & 0xd00) ==
35299                                                        0x100) ||
35300                                                       ((instr & 0xd00) ==
35301                                                        0x500) ||
35302                                                       ((instr & 0xd00) ==
35303                                                        0x900) ||
35304                                                       ((instr & 0xe00) ==
35305                                                        0xe00)) {
35306                                                     UnallocatedT32(instr);
35307                                                     return;
35308                                                   }
35309                                                   unsigned cmode =
35310                                                       (instr >> 8) & 0xf;
35311                                                   DataType dt =
35312                                                       ImmediateVmvn::DecodeDt(
35313                                                           cmode);
35314                                                   if (dt.Is(
35315                                                           kDataTypeValueInvalid)) {
35316                                                     UnallocatedT32(instr);
35317                                                     return;
35318                                                   }
35319                                                   unsigned rd =
35320                                                       ExtractDRegister(instr,
35321                                                                        22,
35322                                                                        12);
35323                                                   DOperand imm = ImmediateVmvn::
35324                                                       DecodeImmediate(
35325                                                           cmode,
35326                                                           (instr & 0xf) |
35327                                                               ((instr >> 12) &
35328                                                                0x70) |
35329                                                               ((instr >> 21) &
35330                                                                0x80));
35331                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35332                                                   vmvn(CurrentCond(),
35333                                                        dt,
35334                                                        DRegister(rd),
35335                                                        imm);
35336                                                   break;
35337                                                 }
35338                                                 case 0x00000400: {
35339                                                   // 0xef800c10
35340                                                   if (((instr & 0x920) ==
35341                                                        0x100) ||
35342                                                       ((instr & 0x520) ==
35343                                                        0x100) ||
35344                                                       ((instr & 0x820) ==
35345                                                        0x20) ||
35346                                                       ((instr & 0x420) ==
35347                                                        0x20) ||
35348                                                       ((instr & 0x220) ==
35349                                                        0x20) ||
35350                                                       ((instr & 0x120) ==
35351                                                        0x120)) {
35352                                                     UnallocatedT32(instr);
35353                                                     return;
35354                                                   }
35355                                                   unsigned cmode =
35356                                                       ((instr >> 8) & 0xf) |
35357                                                       ((instr >> 1) & 0x10);
35358                                                   DataType dt =
35359                                                       ImmediateVmov::DecodeDt(
35360                                                           cmode);
35361                                                   if (dt.Is(
35362                                                           kDataTypeValueInvalid)) {
35363                                                     UnallocatedT32(instr);
35364                                                     return;
35365                                                   }
35366                                                   unsigned rd =
35367                                                       ExtractDRegister(instr,
35368                                                                        22,
35369                                                                        12);
35370                                                   DOperand imm = ImmediateVmov::
35371                                                       DecodeImmediate(
35372                                                           cmode,
35373                                                           (instr & 0xf) |
35374                                                               ((instr >> 12) &
35375                                                                0x70) |
35376                                                               ((instr >> 21) &
35377                                                                0x80));
35378                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35379                                                   vmov(CurrentCond(),
35380                                                        dt,
35381                                                        DRegister(rd),
35382                                                        imm);
35383                                                   break;
35384                                                 }
35385                                                 case 0x00000420: {
35386                                                   // 0xef800c30
35387                                                   if (((instr & 0xd00) ==
35388                                                        0x100) ||
35389                                                       ((instr & 0xd00) ==
35390                                                        0x500) ||
35391                                                       ((instr & 0xd00) ==
35392                                                        0x900) ||
35393                                                       ((instr & 0xe00) ==
35394                                                        0xe00)) {
35395                                                     UnallocatedT32(instr);
35396                                                     return;
35397                                                   }
35398                                                   unsigned cmode =
35399                                                       (instr >> 8) & 0xf;
35400                                                   DataType dt =
35401                                                       ImmediateVmvn::DecodeDt(
35402                                                           cmode);
35403                                                   if (dt.Is(
35404                                                           kDataTypeValueInvalid)) {
35405                                                     UnallocatedT32(instr);
35406                                                     return;
35407                                                   }
35408                                                   unsigned rd =
35409                                                       ExtractDRegister(instr,
35410                                                                        22,
35411                                                                        12);
35412                                                   DOperand imm = ImmediateVmvn::
35413                                                       DecodeImmediate(
35414                                                           cmode,
35415                                                           (instr & 0xf) |
35416                                                               ((instr >> 12) &
35417                                                                0x70) |
35418                                                               ((instr >> 21) &
35419                                                                0x80));
35420                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35421                                                   vmvn(CurrentCond(),
35422                                                        dt,
35423                                                        DRegister(rd),
35424                                                        imm);
35425                                                   break;
35426                                                 }
35427                                                 case 0x00000600: {
35428                                                   // 0xef800e10
35429                                                   if (((instr & 0x920) ==
35430                                                        0x100) ||
35431                                                       ((instr & 0x520) ==
35432                                                        0x100) ||
35433                                                       ((instr & 0x820) ==
35434                                                        0x20) ||
35435                                                       ((instr & 0x420) ==
35436                                                        0x20) ||
35437                                                       ((instr & 0x220) ==
35438                                                        0x20) ||
35439                                                       ((instr & 0x120) ==
35440                                                        0x120)) {
35441                                                     UnallocatedT32(instr);
35442                                                     return;
35443                                                   }
35444                                                   unsigned cmode =
35445                                                       ((instr >> 8) & 0xf) |
35446                                                       ((instr >> 1) & 0x10);
35447                                                   DataType dt =
35448                                                       ImmediateVmov::DecodeDt(
35449                                                           cmode);
35450                                                   if (dt.Is(
35451                                                           kDataTypeValueInvalid)) {
35452                                                     UnallocatedT32(instr);
35453                                                     return;
35454                                                   }
35455                                                   unsigned rd =
35456                                                       ExtractDRegister(instr,
35457                                                                        22,
35458                                                                        12);
35459                                                   DOperand imm = ImmediateVmov::
35460                                                       DecodeImmediate(
35461                                                           cmode,
35462                                                           (instr & 0xf) |
35463                                                               ((instr >> 12) &
35464                                                                0x70) |
35465                                                               ((instr >> 21) &
35466                                                                0x80));
35467                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35468                                                   vmov(CurrentCond(),
35469                                                        dt,
35470                                                        DRegister(rd),
35471                                                        imm);
35472                                                   break;
35473                                                 }
35474                                                 case 0x00000620: {
35475                                                   // 0xef800e30
35476                                                   if (((instr & 0xd00) ==
35477                                                        0x100) ||
35478                                                       ((instr & 0xd00) ==
35479                                                        0x500) ||
35480                                                       ((instr & 0xd00) ==
35481                                                        0x900) ||
35482                                                       ((instr & 0xe00) ==
35483                                                        0xe00)) {
35484                                                     UnallocatedT32(instr);
35485                                                     return;
35486                                                   }
35487                                                   unsigned cmode =
35488                                                       (instr >> 8) & 0xf;
35489                                                   DataType dt =
35490                                                       ImmediateVmvn::DecodeDt(
35491                                                           cmode);
35492                                                   if (dt.Is(
35493                                                           kDataTypeValueInvalid)) {
35494                                                     UnallocatedT32(instr);
35495                                                     return;
35496                                                   }
35497                                                   unsigned rd =
35498                                                       ExtractDRegister(instr,
35499                                                                        22,
35500                                                                        12);
35501                                                   DOperand imm = ImmediateVmvn::
35502                                                       DecodeImmediate(
35503                                                           cmode,
35504                                                           (instr & 0xf) |
35505                                                               ((instr >> 12) &
35506                                                                0x70) |
35507                                                               ((instr >> 21) &
35508                                                                0x80));
35509                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35510                                                   vmvn(CurrentCond(),
35511                                                        dt,
35512                                                        DRegister(rd),
35513                                                        imm);
35514                                                   break;
35515                                                 }
35516                                                 case 0x00000800: {
35517                                                   // 0xef800c10
35518                                                   if (((instr & 0x920) ==
35519                                                        0x100) ||
35520                                                       ((instr & 0x520) ==
35521                                                        0x100) ||
35522                                                       ((instr & 0x820) ==
35523                                                        0x20) ||
35524                                                       ((instr & 0x420) ==
35525                                                        0x20) ||
35526                                                       ((instr & 0x220) ==
35527                                                        0x20) ||
35528                                                       ((instr & 0x120) ==
35529                                                        0x120)) {
35530                                                     UnallocatedT32(instr);
35531                                                     return;
35532                                                   }
35533                                                   unsigned cmode =
35534                                                       ((instr >> 8) & 0xf) |
35535                                                       ((instr >> 1) & 0x10);
35536                                                   DataType dt =
35537                                                       ImmediateVmov::DecodeDt(
35538                                                           cmode);
35539                                                   if (dt.Is(
35540                                                           kDataTypeValueInvalid)) {
35541                                                     UnallocatedT32(instr);
35542                                                     return;
35543                                                   }
35544                                                   unsigned rd =
35545                                                       ExtractDRegister(instr,
35546                                                                        22,
35547                                                                        12);
35548                                                   DOperand imm = ImmediateVmov::
35549                                                       DecodeImmediate(
35550                                                           cmode,
35551                                                           (instr & 0xf) |
35552                                                               ((instr >> 12) &
35553                                                                0x70) |
35554                                                               ((instr >> 21) &
35555                                                                0x80));
35556                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35557                                                   vmov(CurrentCond(),
35558                                                        dt,
35559                                                        DRegister(rd),
35560                                                        imm);
35561                                                   break;
35562                                                 }
35563                                                 case 0x00000820: {
35564                                                   // 0xef800c30
35565                                                   if (((instr & 0xd00) ==
35566                                                        0x100) ||
35567                                                       ((instr & 0xd00) ==
35568                                                        0x500) ||
35569                                                       ((instr & 0xd00) ==
35570                                                        0x900) ||
35571                                                       ((instr & 0xe00) ==
35572                                                        0xe00)) {
35573                                                     UnallocatedT32(instr);
35574                                                     return;
35575                                                   }
35576                                                   unsigned cmode =
35577                                                       (instr >> 8) & 0xf;
35578                                                   DataType dt =
35579                                                       ImmediateVmvn::DecodeDt(
35580                                                           cmode);
35581                                                   if (dt.Is(
35582                                                           kDataTypeValueInvalid)) {
35583                                                     UnallocatedT32(instr);
35584                                                     return;
35585                                                   }
35586                                                   unsigned rd =
35587                                                       ExtractDRegister(instr,
35588                                                                        22,
35589                                                                        12);
35590                                                   DOperand imm = ImmediateVmvn::
35591                                                       DecodeImmediate(
35592                                                           cmode,
35593                                                           (instr & 0xf) |
35594                                                               ((instr >> 12) &
35595                                                                0x70) |
35596                                                               ((instr >> 21) &
35597                                                                0x80));
35598                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35599                                                   vmvn(CurrentCond(),
35600                                                        dt,
35601                                                        DRegister(rd),
35602                                                        imm);
35603                                                   break;
35604                                                 }
35605                                                 case 0x00000a00: {
35606                                                   // 0xef800e10
35607                                                   if (((instr & 0x920) ==
35608                                                        0x100) ||
35609                                                       ((instr & 0x520) ==
35610                                                        0x100) ||
35611                                                       ((instr & 0x820) ==
35612                                                        0x20) ||
35613                                                       ((instr & 0x420) ==
35614                                                        0x20) ||
35615                                                       ((instr & 0x220) ==
35616                                                        0x20) ||
35617                                                       ((instr & 0x120) ==
35618                                                        0x120)) {
35619                                                     UnallocatedT32(instr);
35620                                                     return;
35621                                                   }
35622                                                   unsigned cmode =
35623                                                       ((instr >> 8) & 0xf) |
35624                                                       ((instr >> 1) & 0x10);
35625                                                   DataType dt =
35626                                                       ImmediateVmov::DecodeDt(
35627                                                           cmode);
35628                                                   if (dt.Is(
35629                                                           kDataTypeValueInvalid)) {
35630                                                     UnallocatedT32(instr);
35631                                                     return;
35632                                                   }
35633                                                   unsigned rd =
35634                                                       ExtractDRegister(instr,
35635                                                                        22,
35636                                                                        12);
35637                                                   DOperand imm = ImmediateVmov::
35638                                                       DecodeImmediate(
35639                                                           cmode,
35640                                                           (instr & 0xf) |
35641                                                               ((instr >> 12) &
35642                                                                0x70) |
35643                                                               ((instr >> 21) &
35644                                                                0x80));
35645                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35646                                                   vmov(CurrentCond(),
35647                                                        dt,
35648                                                        DRegister(rd),
35649                                                        imm);
35650                                                   break;
35651                                                 }
35652                                                 case 0x00000a20: {
35653                                                   // 0xef800e30
35654                                                   if (((instr & 0xd00) ==
35655                                                        0x100) ||
35656                                                       ((instr & 0xd00) ==
35657                                                        0x500) ||
35658                                                       ((instr & 0xd00) ==
35659                                                        0x900) ||
35660                                                       ((instr & 0xe00) ==
35661                                                        0xe00)) {
35662                                                     UnallocatedT32(instr);
35663                                                     return;
35664                                                   }
35665                                                   unsigned cmode =
35666                                                       (instr >> 8) & 0xf;
35667                                                   DataType dt =
35668                                                       ImmediateVmvn::DecodeDt(
35669                                                           cmode);
35670                                                   if (dt.Is(
35671                                                           kDataTypeValueInvalid)) {
35672                                                     UnallocatedT32(instr);
35673                                                     return;
35674                                                   }
35675                                                   unsigned rd =
35676                                                       ExtractDRegister(instr,
35677                                                                        22,
35678                                                                        12);
35679                                                   DOperand imm = ImmediateVmvn::
35680                                                       DecodeImmediate(
35681                                                           cmode,
35682                                                           (instr & 0xf) |
35683                                                               ((instr >> 12) &
35684                                                                0x70) |
35685                                                               ((instr >> 21) &
35686                                                                0x80));
35687                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35688                                                   vmvn(CurrentCond(),
35689                                                        dt,
35690                                                        DRegister(rd),
35691                                                        imm);
35692                                                   break;
35693                                                 }
35694                                                 case 0x00000c00: {
35695                                                   // 0xef800c10
35696                                                   if (((instr & 0x920) ==
35697                                                        0x100) ||
35698                                                       ((instr & 0x520) ==
35699                                                        0x100) ||
35700                                                       ((instr & 0x820) ==
35701                                                        0x20) ||
35702                                                       ((instr & 0x420) ==
35703                                                        0x20) ||
35704                                                       ((instr & 0x220) ==
35705                                                        0x20) ||
35706                                                       ((instr & 0x120) ==
35707                                                        0x120)) {
35708                                                     UnallocatedT32(instr);
35709                                                     return;
35710                                                   }
35711                                                   unsigned cmode =
35712                                                       ((instr >> 8) & 0xf) |
35713                                                       ((instr >> 1) & 0x10);
35714                                                   DataType dt =
35715                                                       ImmediateVmov::DecodeDt(
35716                                                           cmode);
35717                                                   if (dt.Is(
35718                                                           kDataTypeValueInvalid)) {
35719                                                     UnallocatedT32(instr);
35720                                                     return;
35721                                                   }
35722                                                   unsigned rd =
35723                                                       ExtractDRegister(instr,
35724                                                                        22,
35725                                                                        12);
35726                                                   DOperand imm = ImmediateVmov::
35727                                                       DecodeImmediate(
35728                                                           cmode,
35729                                                           (instr & 0xf) |
35730                                                               ((instr >> 12) &
35731                                                                0x70) |
35732                                                               ((instr >> 21) &
35733                                                                0x80));
35734                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35735                                                   vmov(CurrentCond(),
35736                                                        dt,
35737                                                        DRegister(rd),
35738                                                        imm);
35739                                                   break;
35740                                                 }
35741                                                 case 0x00000c20: {
35742                                                   // 0xef800c30
35743                                                   if (((instr & 0xd00) ==
35744                                                        0x100) ||
35745                                                       ((instr & 0xd00) ==
35746                                                        0x500) ||
35747                                                       ((instr & 0xd00) ==
35748                                                        0x900) ||
35749                                                       ((instr & 0xe00) ==
35750                                                        0xe00)) {
35751                                                     UnallocatedT32(instr);
35752                                                     return;
35753                                                   }
35754                                                   unsigned cmode =
35755                                                       (instr >> 8) & 0xf;
35756                                                   DataType dt =
35757                                                       ImmediateVmvn::DecodeDt(
35758                                                           cmode);
35759                                                   if (dt.Is(
35760                                                           kDataTypeValueInvalid)) {
35761                                                     UnallocatedT32(instr);
35762                                                     return;
35763                                                   }
35764                                                   unsigned rd =
35765                                                       ExtractDRegister(instr,
35766                                                                        22,
35767                                                                        12);
35768                                                   DOperand imm = ImmediateVmvn::
35769                                                       DecodeImmediate(
35770                                                           cmode,
35771                                                           (instr & 0xf) |
35772                                                               ((instr >> 12) &
35773                                                                0x70) |
35774                                                               ((instr >> 21) &
35775                                                                0x80));
35776                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35777                                                   vmvn(CurrentCond(),
35778                                                        dt,
35779                                                        DRegister(rd),
35780                                                        imm);
35781                                                   break;
35782                                                 }
35783                                                 case 0x00000d00: {
35784                                                   // 0xef800d10
35785                                                   if (((instr & 0x920) ==
35786                                                        0x100) ||
35787                                                       ((instr & 0x520) ==
35788                                                        0x100) ||
35789                                                       ((instr & 0x820) ==
35790                                                        0x20) ||
35791                                                       ((instr & 0x420) ==
35792                                                        0x20) ||
35793                                                       ((instr & 0x220) ==
35794                                                        0x20) ||
35795                                                       ((instr & 0x120) ==
35796                                                        0x120)) {
35797                                                     UnallocatedT32(instr);
35798                                                     return;
35799                                                   }
35800                                                   unsigned cmode =
35801                                                       ((instr >> 8) & 0xf) |
35802                                                       ((instr >> 1) & 0x10);
35803                                                   DataType dt =
35804                                                       ImmediateVmov::DecodeDt(
35805                                                           cmode);
35806                                                   if (dt.Is(
35807                                                           kDataTypeValueInvalid)) {
35808                                                     UnallocatedT32(instr);
35809                                                     return;
35810                                                   }
35811                                                   unsigned rd =
35812                                                       ExtractDRegister(instr,
35813                                                                        22,
35814                                                                        12);
35815                                                   DOperand imm = ImmediateVmov::
35816                                                       DecodeImmediate(
35817                                                           cmode,
35818                                                           (instr & 0xf) |
35819                                                               ((instr >> 12) &
35820                                                                0x70) |
35821                                                               ((instr >> 21) &
35822                                                                0x80));
35823                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35824                                                   vmov(CurrentCond(),
35825                                                        dt,
35826                                                        DRegister(rd),
35827                                                        imm);
35828                                                   break;
35829                                                 }
35830                                                 case 0x00000d20: {
35831                                                   // 0xef800d30
35832                                                   if (((instr & 0xd00) ==
35833                                                        0x100) ||
35834                                                       ((instr & 0xd00) ==
35835                                                        0x500) ||
35836                                                       ((instr & 0xd00) ==
35837                                                        0x900) ||
35838                                                       ((instr & 0xe00) ==
35839                                                        0xe00)) {
35840                                                     UnallocatedT32(instr);
35841                                                     return;
35842                                                   }
35843                                                   unsigned cmode =
35844                                                       (instr >> 8) & 0xf;
35845                                                   DataType dt =
35846                                                       ImmediateVmvn::DecodeDt(
35847                                                           cmode);
35848                                                   if (dt.Is(
35849                                                           kDataTypeValueInvalid)) {
35850                                                     UnallocatedT32(instr);
35851                                                     return;
35852                                                   }
35853                                                   unsigned rd =
35854                                                       ExtractDRegister(instr,
35855                                                                        22,
35856                                                                        12);
35857                                                   DOperand imm = ImmediateVmvn::
35858                                                       DecodeImmediate(
35859                                                           cmode,
35860                                                           (instr & 0xf) |
35861                                                               ((instr >> 12) &
35862                                                                0x70) |
35863                                                               ((instr >> 21) &
35864                                                                0x80));
35865                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35866                                                   vmvn(CurrentCond(),
35867                                                        dt,
35868                                                        DRegister(rd),
35869                                                        imm);
35870                                                   break;
35871                                                 }
35872                                                 case 0x00000e00: {
35873                                                   // 0xef800e10
35874                                                   if (((instr & 0x920) ==
35875                                                        0x100) ||
35876                                                       ((instr & 0x520) ==
35877                                                        0x100) ||
35878                                                       ((instr & 0x820) ==
35879                                                        0x20) ||
35880                                                       ((instr & 0x420) ==
35881                                                        0x20) ||
35882                                                       ((instr & 0x220) ==
35883                                                        0x20) ||
35884                                                       ((instr & 0x120) ==
35885                                                        0x120)) {
35886                                                     UnallocatedT32(instr);
35887                                                     return;
35888                                                   }
35889                                                   unsigned cmode =
35890                                                       ((instr >> 8) & 0xf) |
35891                                                       ((instr >> 1) & 0x10);
35892                                                   DataType dt =
35893                                                       ImmediateVmov::DecodeDt(
35894                                                           cmode);
35895                                                   if (dt.Is(
35896                                                           kDataTypeValueInvalid)) {
35897                                                     UnallocatedT32(instr);
35898                                                     return;
35899                                                   }
35900                                                   unsigned rd =
35901                                                       ExtractDRegister(instr,
35902                                                                        22,
35903                                                                        12);
35904                                                   DOperand imm = ImmediateVmov::
35905                                                       DecodeImmediate(
35906                                                           cmode,
35907                                                           (instr & 0xf) |
35908                                                               ((instr >> 12) &
35909                                                                0x70) |
35910                                                               ((instr >> 21) &
35911                                                                0x80));
35912                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35913                                                   vmov(CurrentCond(),
35914                                                        dt,
35915                                                        DRegister(rd),
35916                                                        imm);
35917                                                   break;
35918                                                 }
35919                                                 case 0x00000e20: {
35920                                                   // 0xef800e30
35921                                                   if (((instr & 0x920) ==
35922                                                        0x100) ||
35923                                                       ((instr & 0x520) ==
35924                                                        0x100) ||
35925                                                       ((instr & 0x820) ==
35926                                                        0x20) ||
35927                                                       ((instr & 0x420) ==
35928                                                        0x20) ||
35929                                                       ((instr & 0x220) ==
35930                                                        0x20) ||
35931                                                       ((instr & 0x120) ==
35932                                                        0x120)) {
35933                                                     UnallocatedT32(instr);
35934                                                     return;
35935                                                   }
35936                                                   unsigned cmode =
35937                                                       ((instr >> 8) & 0xf) |
35938                                                       ((instr >> 1) & 0x10);
35939                                                   DataType dt =
35940                                                       ImmediateVmov::DecodeDt(
35941                                                           cmode);
35942                                                   if (dt.Is(
35943                                                           kDataTypeValueInvalid)) {
35944                                                     UnallocatedT32(instr);
35945                                                     return;
35946                                                   }
35947                                                   unsigned rd =
35948                                                       ExtractDRegister(instr,
35949                                                                        22,
35950                                                                        12);
35951                                                   DOperand imm = ImmediateVmov::
35952                                                       DecodeImmediate(
35953                                                           cmode,
35954                                                           (instr & 0xf) |
35955                                                               ((instr >> 12) &
35956                                                                0x70) |
35957                                                               ((instr >> 21) &
35958                                                                0x80));
35959                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35960                                                   vmov(CurrentCond(),
35961                                                        dt,
35962                                                        DRegister(rd),
35963                                                        imm);
35964                                                   break;
35965                                                 }
35966                                                 case 0x00000f00: {
35967                                                   // 0xef800f10
35968                                                   if (((instr & 0x920) ==
35969                                                        0x100) ||
35970                                                       ((instr & 0x520) ==
35971                                                        0x100) ||
35972                                                       ((instr & 0x820) ==
35973                                                        0x20) ||
35974                                                       ((instr & 0x420) ==
35975                                                        0x20) ||
35976                                                       ((instr & 0x220) ==
35977                                                        0x20) ||
35978                                                       ((instr & 0x120) ==
35979                                                        0x120)) {
35980                                                     UnallocatedT32(instr);
35981                                                     return;
35982                                                   }
35983                                                   unsigned cmode =
35984                                                       ((instr >> 8) & 0xf) |
35985                                                       ((instr >> 1) & 0x10);
35986                                                   DataType dt =
35987                                                       ImmediateVmov::DecodeDt(
35988                                                           cmode);
35989                                                   if (dt.Is(
35990                                                           kDataTypeValueInvalid)) {
35991                                                     UnallocatedT32(instr);
35992                                                     return;
35993                                                   }
35994                                                   unsigned rd =
35995                                                       ExtractDRegister(instr,
35996                                                                        22,
35997                                                                        12);
35998                                                   DOperand imm = ImmediateVmov::
35999                                                       DecodeImmediate(
36000                                                           cmode,
36001                                                           (instr & 0xf) |
36002                                                               ((instr >> 12) &
36003                                                                0x70) |
36004                                                               ((instr >> 21) &
36005                                                                0x80));
36006                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36007                                                   vmov(CurrentCond(),
36008                                                        dt,
36009                                                        DRegister(rd),
36010                                                        imm);
36011                                                   break;
36012                                                 }
36013                                                 default:
36014                                                   UnallocatedT32(instr);
36015                                                   break;
36016                                               }
36017                                               break;
36018                                             }
36019                                             default: {
36020                                               if (((instr & 0x920) == 0x100) ||
36021                                                   ((instr & 0x520) == 0x100) ||
36022                                                   ((instr & 0x820) == 0x20) ||
36023                                                   ((instr & 0x420) == 0x20) ||
36024                                                   ((instr & 0x220) == 0x20) ||
36025                                                   ((instr & 0x120) == 0x120)) {
36026                                                 UnallocatedT32(instr);
36027                                                 return;
36028                                               }
36029                                               unsigned cmode =
36030                                                   ((instr >> 8) & 0xf) |
36031                                                   ((instr >> 1) & 0x10);
36032                                               DataType dt =
36033                                                   ImmediateVmov::DecodeDt(
36034                                                       cmode);
36035                                               if (dt.Is(
36036                                                       kDataTypeValueInvalid)) {
36037                                                 UnallocatedT32(instr);
36038                                                 return;
36039                                               }
36040                                               unsigned rd =
36041                                                   ExtractDRegister(instr,
36042                                                                    22,
36043                                                                    12);
36044                                               DOperand imm = ImmediateVmov::
36045                                                   DecodeImmediate(cmode,
36046                                                                   (instr &
36047                                                                    0xf) |
36048                                                                       ((instr >>
36049                                                                         12) &
36050                                                                        0x70) |
36051                                                                       ((instr >>
36052                                                                         21) &
36053                                                                        0x80));
36054                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36055                                               vmov(CurrentCond(),
36056                                                    dt,
36057                                                    DRegister(rd),
36058                                                    imm);
36059                                               break;
36060                                             }
36061                                           }
36062                                           break;
36063                                         }
36064                                       }
36065                                       break;
36066                                     }
36067                                     default:
36068                                       UnallocatedT32(instr);
36069                                       break;
36070                                   }
36071                                   break;
36072                                 }
36073                                 default: {
36074                                   if ((instr & 0x00000200) == 0x00000200) {
36075                                     if (((instr & 0x200000) == 0x0)) {
36076                                       UnallocatedT32(instr);
36077                                       return;
36078                                     }
36079                                     DataType dt1 = Dt_op_U_1_Decode1(
36080                                         ((instr >> 28) & 0x1) |
36081                                         ((instr >> 7) & 0x2));
36082                                     if (dt1.Is(kDataTypeValueInvalid)) {
36083                                       UnallocatedT32(instr);
36084                                       return;
36085                                     }
36086                                     DataType dt2 = Dt_op_U_1_Decode2(
36087                                         ((instr >> 28) & 0x1) |
36088                                         ((instr >> 7) & 0x2));
36089                                     if (dt2.Is(kDataTypeValueInvalid)) {
36090                                       UnallocatedT32(instr);
36091                                       return;
36092                                     }
36093                                     unsigned rd =
36094                                         ExtractDRegister(instr, 22, 12);
36095                                     unsigned rm = ExtractDRegister(instr, 5, 0);
36096                                     uint32_t fbits =
36097                                         64 - ((instr >> 16) & 0x3f);
36098                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
36099                                     vcvt(CurrentCond(),
36100                                          dt1,
36101                                          dt2,
36102                                          DRegister(rd),
36103                                          DRegister(rm),
36104                                          fbits);
36105                                   } else {
36106                                     UnallocatedT32(instr);
36107                                   }
36108                                   break;
36109                                 }
36110                               }
36111                               break;
36112                             }
36113                             default:
36114                               UnallocatedT32(instr);
36115                               break;
36116                           }
36117                           break;
36118                         }
36119                       }
36120                       break;
36121                     }
36122                     case 0x00800040: {
36123                       // 0xef800050
36124                       switch (instr & 0x00000c00) {
36125                         case 0x00000000: {
36126                           // 0xef800050
36127                           switch (instr & 0x00380080) {
36128                             case 0x00000000: {
36129                               // 0xef800050
36130                               switch (instr & 0x00000100) {
36131                                 case 0x00000000: {
36132                                   // 0xef800050
36133                                   switch (instr & 0x00000200) {
36134                                     default: {
36135                                       switch (instr & 0x00000020) {
36136                                         case 0x00000020: {
36137                                           // 0xef800070
36138                                           if (((instr & 0xd00) == 0x100) ||
36139                                               ((instr & 0xd00) == 0x500) ||
36140                                               ((instr & 0xd00) == 0x900) ||
36141                                               ((instr & 0xe00) == 0xe00)) {
36142                                             UnallocatedT32(instr);
36143                                             return;
36144                                           }
36145                                           unsigned cmode = (instr >> 8) & 0xf;
36146                                           DataType dt =
36147                                               ImmediateVmvn::DecodeDt(cmode);
36148                                           if (dt.Is(kDataTypeValueInvalid)) {
36149                                             UnallocatedT32(instr);
36150                                             return;
36151                                           }
36152                                           if (((instr >> 12) & 1) != 0) {
36153                                             UnallocatedT32(instr);
36154                                             return;
36155                                           }
36156                                           unsigned rd =
36157                                               ExtractQRegister(instr, 22, 12);
36158                                           QOperand imm =
36159                                               ImmediateVmvn::DecodeImmediate(
36160                                                   cmode,
36161                                                   (instr & 0xf) |
36162                                                       ((instr >> 12) & 0x70) |
36163                                                       ((instr >> 21) & 0x80));
36164                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36165                                           vmvn(CurrentCond(),
36166                                                dt,
36167                                                QRegister(rd),
36168                                                imm);
36169                                           break;
36170                                         }
36171                                         default: {
36172                                           if (((instr & 0x920) == 0x100) ||
36173                                               ((instr & 0x520) == 0x100) ||
36174                                               ((instr & 0x820) == 0x20) ||
36175                                               ((instr & 0x420) == 0x20) ||
36176                                               ((instr & 0x220) == 0x20) ||
36177                                               ((instr & 0x120) == 0x120)) {
36178                                             UnallocatedT32(instr);
36179                                             return;
36180                                           }
36181                                           unsigned cmode =
36182                                               ((instr >> 8) & 0xf) |
36183                                               ((instr >> 1) & 0x10);
36184                                           DataType dt =
36185                                               ImmediateVmov::DecodeDt(cmode);
36186                                           if (dt.Is(kDataTypeValueInvalid)) {
36187                                             UnallocatedT32(instr);
36188                                             return;
36189                                           }
36190                                           if (((instr >> 12) & 1) != 0) {
36191                                             UnallocatedT32(instr);
36192                                             return;
36193                                           }
36194                                           unsigned rd =
36195                                               ExtractQRegister(instr, 22, 12);
36196                                           QOperand imm =
36197                                               ImmediateVmov::DecodeImmediate(
36198                                                   cmode,
36199                                                   (instr & 0xf) |
36200                                                       ((instr >> 12) & 0x70) |
36201                                                       ((instr >> 21) & 0x80));
36202                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36203                                           vmov(CurrentCond(),
36204                                                dt,
36205                                                QRegister(rd),
36206                                                imm);
36207                                           break;
36208                                         }
36209                                       }
36210                                       break;
36211                                     }
36212                                   }
36213                                   break;
36214                                 }
36215                                 case 0x00000100: {
36216                                   // 0xef800150
36217                                   switch (instr & 0x00000020) {
36218                                     case 0x00000000: {
36219                                       // 0xef800150
36220                                       if (((instr & 0x100) == 0x0) ||
36221                                           ((instr & 0xc00) == 0xc00)) {
36222                                         UnallocatedT32(instr);
36223                                         return;
36224                                       }
36225                                       unsigned cmode = (instr >> 8) & 0xf;
36226                                       DataType dt =
36227                                           ImmediateVorr::DecodeDt(cmode);
36228                                       if (dt.Is(kDataTypeValueInvalid)) {
36229                                         UnallocatedT32(instr);
36230                                         return;
36231                                       }
36232                                       if (((instr >> 12) & 1) != 0) {
36233                                         UnallocatedT32(instr);
36234                                         return;
36235                                       }
36236                                       unsigned rd =
36237                                           ExtractQRegister(instr, 22, 12);
36238                                       QOperand imm =
36239                                           ImmediateVorr::DecodeImmediate(
36240                                               cmode,
36241                                               (instr & 0xf) |
36242                                                   ((instr >> 12) & 0x70) |
36243                                                   ((instr >> 21) & 0x80));
36244                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36245                                       vorr(CurrentCond(),
36246                                            dt,
36247                                            QRegister(rd),
36248                                            QRegister(rd),
36249                                            imm);
36250                                       break;
36251                                     }
36252                                     case 0x00000020: {
36253                                       // 0xef800170
36254                                       if (((instr & 0x100) == 0x0) ||
36255                                           ((instr & 0xc00) == 0xc00)) {
36256                                         UnallocatedT32(instr);
36257                                         return;
36258                                       }
36259                                       unsigned cmode = (instr >> 8) & 0xf;
36260                                       DataType dt =
36261                                           ImmediateVbic::DecodeDt(cmode);
36262                                       if (dt.Is(kDataTypeValueInvalid)) {
36263                                         UnallocatedT32(instr);
36264                                         return;
36265                                       }
36266                                       if (((instr >> 12) & 1) != 0) {
36267                                         UnallocatedT32(instr);
36268                                         return;
36269                                       }
36270                                       unsigned rd =
36271                                           ExtractQRegister(instr, 22, 12);
36272                                       QOperand imm =
36273                                           ImmediateVbic::DecodeImmediate(
36274                                               cmode,
36275                                               (instr & 0xf) |
36276                                                   ((instr >> 12) & 0x70) |
36277                                                   ((instr >> 21) & 0x80));
36278                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36279                                       vbic(CurrentCond(),
36280                                            dt,
36281                                            QRegister(rd),
36282                                            QRegister(rd),
36283                                            imm);
36284                                       break;
36285                                     }
36286                                   }
36287                                   break;
36288                                 }
36289                               }
36290                               break;
36291                             }
36292                             default: {
36293                               switch (instr & 0x00000300) {
36294                                 case 0x00000000: {
36295                                   // 0xef800050
36296                                   if (((instr & 0x380080) == 0x0)) {
36297                                     UnallocatedT32(instr);
36298                                     return;
36299                                   }
36300                                   DataType dt =
36301                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36302                                                              ((instr >> 4) &
36303                                                               0x8),
36304                                                          (instr >> 28) & 0x1);
36305                                   if (dt.Is(kDataTypeValueInvalid)) {
36306                                     UnallocatedT32(instr);
36307                                     return;
36308                                   }
36309                                   if (((instr >> 12) & 1) != 0) {
36310                                     UnallocatedT32(instr);
36311                                     return;
36312                                   }
36313                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36314                                   if ((instr & 1) != 0) {
36315                                     UnallocatedT32(instr);
36316                                     return;
36317                                   }
36318                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36319                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36320                                   uint32_t imm =
36321                                       (dt.IsSize(64) ? 64
36322                                                      : (dt.GetSize() * 2)) -
36323                                       imm6;
36324                                   // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36325                                   vshr(CurrentCond(),
36326                                        dt,
36327                                        QRegister(rd),
36328                                        QRegister(rm),
36329                                        imm);
36330                                   break;
36331                                 }
36332                                 case 0x00000100: {
36333                                   // 0xef800150
36334                                   if (((instr & 0x380080) == 0x0)) {
36335                                     UnallocatedT32(instr);
36336                                     return;
36337                                   }
36338                                   DataType dt =
36339                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36340                                                              ((instr >> 4) &
36341                                                               0x8),
36342                                                          (instr >> 28) & 0x1);
36343                                   if (dt.Is(kDataTypeValueInvalid)) {
36344                                     UnallocatedT32(instr);
36345                                     return;
36346                                   }
36347                                   if (((instr >> 12) & 1) != 0) {
36348                                     UnallocatedT32(instr);
36349                                     return;
36350                                   }
36351                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36352                                   if ((instr & 1) != 0) {
36353                                     UnallocatedT32(instr);
36354                                     return;
36355                                   }
36356                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36357                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36358                                   uint32_t imm =
36359                                       (dt.IsSize(64) ? 64
36360                                                      : (dt.GetSize() * 2)) -
36361                                       imm6;
36362                                   // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36363                                   vsra(CurrentCond(),
36364                                        dt,
36365                                        QRegister(rd),
36366                                        QRegister(rm),
36367                                        imm);
36368                                   break;
36369                                 }
36370                                 case 0x00000200: {
36371                                   // 0xef800250
36372                                   if (((instr & 0x380080) == 0x0)) {
36373                                     UnallocatedT32(instr);
36374                                     return;
36375                                   }
36376                                   DataType dt =
36377                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36378                                                              ((instr >> 4) &
36379                                                               0x8),
36380                                                          (instr >> 28) & 0x1);
36381                                   if (dt.Is(kDataTypeValueInvalid)) {
36382                                     UnallocatedT32(instr);
36383                                     return;
36384                                   }
36385                                   if (((instr >> 12) & 1) != 0) {
36386                                     UnallocatedT32(instr);
36387                                     return;
36388                                   }
36389                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36390                                   if ((instr & 1) != 0) {
36391                                     UnallocatedT32(instr);
36392                                     return;
36393                                   }
36394                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36395                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36396                                   uint32_t imm =
36397                                       (dt.IsSize(64) ? 64
36398                                                      : (dt.GetSize() * 2)) -
36399                                       imm6;
36400                                   // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36401                                   vrshr(CurrentCond(),
36402                                         dt,
36403                                         QRegister(rd),
36404                                         QRegister(rm),
36405                                         imm);
36406                                   break;
36407                                 }
36408                                 case 0x00000300: {
36409                                   // 0xef800350
36410                                   if (((instr & 0x380080) == 0x0)) {
36411                                     UnallocatedT32(instr);
36412                                     return;
36413                                   }
36414                                   DataType dt =
36415                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36416                                                              ((instr >> 4) &
36417                                                               0x8),
36418                                                          (instr >> 28) & 0x1);
36419                                   if (dt.Is(kDataTypeValueInvalid)) {
36420                                     UnallocatedT32(instr);
36421                                     return;
36422                                   }
36423                                   if (((instr >> 12) & 1) != 0) {
36424                                     UnallocatedT32(instr);
36425                                     return;
36426                                   }
36427                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36428                                   if ((instr & 1) != 0) {
36429                                     UnallocatedT32(instr);
36430                                     return;
36431                                   }
36432                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36433                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36434                                   uint32_t imm =
36435                                       (dt.IsSize(64) ? 64
36436                                                      : (dt.GetSize() * 2)) -
36437                                       imm6;
36438                                   // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36439                                   vrsra(CurrentCond(),
36440                                         dt,
36441                                         QRegister(rd),
36442                                         QRegister(rm),
36443                                         imm);
36444                                   break;
36445                                 }
36446                               }
36447                               break;
36448                             }
36449                           }
36450                           break;
36451                         }
36452                         case 0x00000400: {
36453                           // 0xef800450
36454                           switch (instr & 0x00380080) {
36455                             case 0x00000000: {
36456                               // 0xef800450
36457                               switch (instr & 0x00000100) {
36458                                 case 0x00000000: {
36459                                   // 0xef800450
36460                                   switch (instr & 0x00000200) {
36461                                     default: {
36462                                       switch (instr & 0x00000020) {
36463                                         case 0x00000020: {
36464                                           // 0xef800470
36465                                           if (((instr & 0xd00) == 0x100) ||
36466                                               ((instr & 0xd00) == 0x500) ||
36467                                               ((instr & 0xd00) == 0x900) ||
36468                                               ((instr & 0xe00) == 0xe00)) {
36469                                             UnallocatedT32(instr);
36470                                             return;
36471                                           }
36472                                           unsigned cmode = (instr >> 8) & 0xf;
36473                                           DataType dt =
36474                                               ImmediateVmvn::DecodeDt(cmode);
36475                                           if (dt.Is(kDataTypeValueInvalid)) {
36476                                             UnallocatedT32(instr);
36477                                             return;
36478                                           }
36479                                           if (((instr >> 12) & 1) != 0) {
36480                                             UnallocatedT32(instr);
36481                                             return;
36482                                           }
36483                                           unsigned rd =
36484                                               ExtractQRegister(instr, 22, 12);
36485                                           QOperand imm =
36486                                               ImmediateVmvn::DecodeImmediate(
36487                                                   cmode,
36488                                                   (instr & 0xf) |
36489                                                       ((instr >> 12) & 0x70) |
36490                                                       ((instr >> 21) & 0x80));
36491                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36492                                           vmvn(CurrentCond(),
36493                                                dt,
36494                                                QRegister(rd),
36495                                                imm);
36496                                           break;
36497                                         }
36498                                         default: {
36499                                           if (((instr & 0x920) == 0x100) ||
36500                                               ((instr & 0x520) == 0x100) ||
36501                                               ((instr & 0x820) == 0x20) ||
36502                                               ((instr & 0x420) == 0x20) ||
36503                                               ((instr & 0x220) == 0x20) ||
36504                                               ((instr & 0x120) == 0x120)) {
36505                                             UnallocatedT32(instr);
36506                                             return;
36507                                           }
36508                                           unsigned cmode =
36509                                               ((instr >> 8) & 0xf) |
36510                                               ((instr >> 1) & 0x10);
36511                                           DataType dt =
36512                                               ImmediateVmov::DecodeDt(cmode);
36513                                           if (dt.Is(kDataTypeValueInvalid)) {
36514                                             UnallocatedT32(instr);
36515                                             return;
36516                                           }
36517                                           if (((instr >> 12) & 1) != 0) {
36518                                             UnallocatedT32(instr);
36519                                             return;
36520                                           }
36521                                           unsigned rd =
36522                                               ExtractQRegister(instr, 22, 12);
36523                                           QOperand imm =
36524                                               ImmediateVmov::DecodeImmediate(
36525                                                   cmode,
36526                                                   (instr & 0xf) |
36527                                                       ((instr >> 12) & 0x70) |
36528                                                       ((instr >> 21) & 0x80));
36529                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36530                                           vmov(CurrentCond(),
36531                                                dt,
36532                                                QRegister(rd),
36533                                                imm);
36534                                           break;
36535                                         }
36536                                       }
36537                                       break;
36538                                     }
36539                                   }
36540                                   break;
36541                                 }
36542                                 case 0x00000100: {
36543                                   // 0xef800550
36544                                   switch (instr & 0x00000020) {
36545                                     case 0x00000000: {
36546                                       // 0xef800550
36547                                       if (((instr & 0x100) == 0x0) ||
36548                                           ((instr & 0xc00) == 0xc00)) {
36549                                         UnallocatedT32(instr);
36550                                         return;
36551                                       }
36552                                       unsigned cmode = (instr >> 8) & 0xf;
36553                                       DataType dt =
36554                                           ImmediateVorr::DecodeDt(cmode);
36555                                       if (dt.Is(kDataTypeValueInvalid)) {
36556                                         UnallocatedT32(instr);
36557                                         return;
36558                                       }
36559                                       if (((instr >> 12) & 1) != 0) {
36560                                         UnallocatedT32(instr);
36561                                         return;
36562                                       }
36563                                       unsigned rd =
36564                                           ExtractQRegister(instr, 22, 12);
36565                                       QOperand imm =
36566                                           ImmediateVorr::DecodeImmediate(
36567                                               cmode,
36568                                               (instr & 0xf) |
36569                                                   ((instr >> 12) & 0x70) |
36570                                                   ((instr >> 21) & 0x80));
36571                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36572                                       vorr(CurrentCond(),
36573                                            dt,
36574                                            QRegister(rd),
36575                                            QRegister(rd),
36576                                            imm);
36577                                       break;
36578                                     }
36579                                     case 0x00000020: {
36580                                       // 0xef800570
36581                                       if (((instr & 0x100) == 0x0) ||
36582                                           ((instr & 0xc00) == 0xc00)) {
36583                                         UnallocatedT32(instr);
36584                                         return;
36585                                       }
36586                                       unsigned cmode = (instr >> 8) & 0xf;
36587                                       DataType dt =
36588                                           ImmediateVbic::DecodeDt(cmode);
36589                                       if (dt.Is(kDataTypeValueInvalid)) {
36590                                         UnallocatedT32(instr);
36591                                         return;
36592                                       }
36593                                       if (((instr >> 12) & 1) != 0) {
36594                                         UnallocatedT32(instr);
36595                                         return;
36596                                       }
36597                                       unsigned rd =
36598                                           ExtractQRegister(instr, 22, 12);
36599                                       QOperand imm =
36600                                           ImmediateVbic::DecodeImmediate(
36601                                               cmode,
36602                                               (instr & 0xf) |
36603                                                   ((instr >> 12) & 0x70) |
36604                                                   ((instr >> 21) & 0x80));
36605                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36606                                       vbic(CurrentCond(),
36607                                            dt,
36608                                            QRegister(rd),
36609                                            QRegister(rd),
36610                                            imm);
36611                                       break;
36612                                     }
36613                                   }
36614                                   break;
36615                                 }
36616                               }
36617                               break;
36618                             }
36619                             default: {
36620                               switch (instr & 0x00000300) {
36621                                 case 0x00000000: {
36622                                   // 0xef800450
36623                                   if ((instr & 0x10000000) == 0x10000000) {
36624                                     if (((instr & 0x380080) == 0x0)) {
36625                                       UnallocatedT32(instr);
36626                                       return;
36627                                     }
36628                                     DataType dt = Dt_L_imm6_4_Decode(
36629                                         ((instr >> 19) & 0x7) |
36630                                         ((instr >> 4) & 0x8));
36631                                     if (dt.Is(kDataTypeValueInvalid)) {
36632                                       UnallocatedT32(instr);
36633                                       return;
36634                                     }
36635                                     if (((instr >> 12) & 1) != 0) {
36636                                       UnallocatedT32(instr);
36637                                       return;
36638                                     }
36639                                     unsigned rd =
36640                                         ExtractQRegister(instr, 22, 12);
36641                                     if ((instr & 1) != 0) {
36642                                       UnallocatedT32(instr);
36643                                       return;
36644                                     }
36645                                     unsigned rm = ExtractQRegister(instr, 5, 0);
36646                                     uint32_t imm6 = (instr >> 16) & 0x3f;
36647                                     uint32_t imm =
36648                                         (dt.IsSize(64) ? 64
36649                                                        : (dt.GetSize() * 2)) -
36650                                         imm6;
36651                                     // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36652                                     vsri(CurrentCond(),
36653                                          dt,
36654                                          QRegister(rd),
36655                                          QRegister(rm),
36656                                          imm);
36657                                   } else {
36658                                     UnallocatedT32(instr);
36659                                   }
36660                                   break;
36661                                 }
36662                                 case 0x00000100: {
36663                                   // 0xef800550
36664                                   switch (instr & 0x10000000) {
36665                                     case 0x00000000: {
36666                                       // 0xef800550
36667                                       if (((instr & 0x380080) == 0x0)) {
36668                                         UnallocatedT32(instr);
36669                                         return;
36670                                       }
36671                                       DataType dt = Dt_L_imm6_3_Decode(
36672                                           ((instr >> 19) & 0x7) |
36673                                           ((instr >> 4) & 0x8));
36674                                       if (dt.Is(kDataTypeValueInvalid)) {
36675                                         UnallocatedT32(instr);
36676                                         return;
36677                                       }
36678                                       if (((instr >> 12) & 1) != 0) {
36679                                         UnallocatedT32(instr);
36680                                         return;
36681                                       }
36682                                       unsigned rd =
36683                                           ExtractQRegister(instr, 22, 12);
36684                                       if ((instr & 1) != 0) {
36685                                         UnallocatedT32(instr);
36686                                         return;
36687                                       }
36688                                       unsigned rm =
36689                                           ExtractQRegister(instr, 5, 0);
36690                                       uint32_t imm6 = (instr >> 16) & 0x3f;
36691                                       uint32_t imm =
36692                                           imm6 -
36693                                           (dt.IsSize(64) ? 0 : dt.GetSize());
36694                                       // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36695                                       vshl(CurrentCond(),
36696                                            dt,
36697                                            QRegister(rd),
36698                                            QRegister(rm),
36699                                            imm);
36700                                       break;
36701                                     }
36702                                     case 0x10000000: {
36703                                       // 0xff800550
36704                                       if (((instr & 0x380080) == 0x0)) {
36705                                         UnallocatedT32(instr);
36706                                         return;
36707                                       }
36708                                       DataType dt = Dt_L_imm6_4_Decode(
36709                                           ((instr >> 19) & 0x7) |
36710                                           ((instr >> 4) & 0x8));
36711                                       if (dt.Is(kDataTypeValueInvalid)) {
36712                                         UnallocatedT32(instr);
36713                                         return;
36714                                       }
36715                                       if (((instr >> 12) & 1) != 0) {
36716                                         UnallocatedT32(instr);
36717                                         return;
36718                                       }
36719                                       unsigned rd =
36720                                           ExtractQRegister(instr, 22, 12);
36721                                       if ((instr & 1) != 0) {
36722                                         UnallocatedT32(instr);
36723                                         return;
36724                                       }
36725                                       unsigned rm =
36726                                           ExtractQRegister(instr, 5, 0);
36727                                       uint32_t imm6 = (instr >> 16) & 0x3f;
36728                                       uint32_t imm =
36729                                           imm6 -
36730                                           (dt.IsSize(64) ? 0 : dt.GetSize());
36731                                       // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36732                                       vsli(CurrentCond(),
36733                                            dt,
36734                                            QRegister(rd),
36735                                            QRegister(rm),
36736                                            imm);
36737                                       break;
36738                                     }
36739                                   }
36740                                   break;
36741                                 }
36742                                 case 0x00000200: {
36743                                   // 0xef800650
36744                                   if (((instr & 0x380080) == 0x0)) {
36745                                     UnallocatedT32(instr);
36746                                     return;
36747                                   }
36748                                   DataType dt =
36749                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
36750                                                              ((instr >> 4) &
36751                                                               0x8),
36752                                                          (instr >> 28) & 0x1);
36753                                   if (dt.Is(kDataTypeValueInvalid)) {
36754                                     UnallocatedT32(instr);
36755                                     return;
36756                                   }
36757                                   if (((instr >> 12) & 1) != 0) {
36758                                     UnallocatedT32(instr);
36759                                     return;
36760                                   }
36761                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36762                                   if ((instr & 1) != 0) {
36763                                     UnallocatedT32(instr);
36764                                     return;
36765                                   }
36766                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36767                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36768                                   uint32_t imm =
36769                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
36770                                   // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36771                                   vqshlu(CurrentCond(),
36772                                          dt,
36773                                          QRegister(rd),
36774                                          QRegister(rm),
36775                                          imm);
36776                                   break;
36777                                 }
36778                                 case 0x00000300: {
36779                                   // 0xef800750
36780                                   if (((instr & 0x380080) == 0x0)) {
36781                                     UnallocatedT32(instr);
36782                                     return;
36783                                   }
36784                                   DataType dt =
36785                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36786                                                              ((instr >> 4) &
36787                                                               0x8),
36788                                                          (instr >> 28) & 0x1);
36789                                   if (dt.Is(kDataTypeValueInvalid)) {
36790                                     UnallocatedT32(instr);
36791                                     return;
36792                                   }
36793                                   if (((instr >> 12) & 1) != 0) {
36794                                     UnallocatedT32(instr);
36795                                     return;
36796                                   }
36797                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36798                                   if ((instr & 1) != 0) {
36799                                     UnallocatedT32(instr);
36800                                     return;
36801                                   }
36802                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36803                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36804                                   uint32_t imm =
36805                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
36806                                   // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36807                                   vqshl(CurrentCond(),
36808                                         dt,
36809                                         QRegister(rd),
36810                                         QRegister(rm),
36811                                         imm);
36812                                   break;
36813                                 }
36814                               }
36815                               break;
36816                             }
36817                           }
36818                           break;
36819                         }
36820                         case 0x00000800: {
36821                           // 0xef800850
36822                           switch (instr & 0x00000080) {
36823                             case 0x00000000: {
36824                               // 0xef800850
36825                               switch (instr & 0x00380000) {
36826                                 case 0x00000000: {
36827                                   // 0xef800850
36828                                   switch (instr & 0x00000100) {
36829                                     case 0x00000000: {
36830                                       // 0xef800850
36831                                       switch (instr & 0x00000200) {
36832                                         default: {
36833                                           switch (instr & 0x00000020) {
36834                                             case 0x00000020: {
36835                                               // 0xef800870
36836                                               if (((instr & 0xd00) == 0x100) ||
36837                                                   ((instr & 0xd00) == 0x500) ||
36838                                                   ((instr & 0xd00) == 0x900) ||
36839                                                   ((instr & 0xe00) == 0xe00)) {
36840                                                 UnallocatedT32(instr);
36841                                                 return;
36842                                               }
36843                                               unsigned cmode =
36844                                                   (instr >> 8) & 0xf;
36845                                               DataType dt =
36846                                                   ImmediateVmvn::DecodeDt(
36847                                                       cmode);
36848                                               if (dt.Is(
36849                                                       kDataTypeValueInvalid)) {
36850                                                 UnallocatedT32(instr);
36851                                                 return;
36852                                               }
36853                                               if (((instr >> 12) & 1) != 0) {
36854                                                 UnallocatedT32(instr);
36855                                                 return;
36856                                               }
36857                                               unsigned rd =
36858                                                   ExtractQRegister(instr,
36859                                                                    22,
36860                                                                    12);
36861                                               QOperand imm = ImmediateVmvn::
36862                                                   DecodeImmediate(cmode,
36863                                                                   (instr &
36864                                                                    0xf) |
36865                                                                       ((instr >>
36866                                                                         12) &
36867                                                                        0x70) |
36868                                                                       ((instr >>
36869                                                                         21) &
36870                                                                        0x80));
36871                                               // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36872                                               vmvn(CurrentCond(),
36873                                                    dt,
36874                                                    QRegister(rd),
36875                                                    imm);
36876                                               break;
36877                                             }
36878                                             default: {
36879                                               if (((instr & 0x920) == 0x100) ||
36880                                                   ((instr & 0x520) == 0x100) ||
36881                                                   ((instr & 0x820) == 0x20) ||
36882                                                   ((instr & 0x420) == 0x20) ||
36883                                                   ((instr & 0x220) == 0x20) ||
36884                                                   ((instr & 0x120) == 0x120)) {
36885                                                 UnallocatedT32(instr);
36886                                                 return;
36887                                               }
36888                                               unsigned cmode =
36889                                                   ((instr >> 8) & 0xf) |
36890                                                   ((instr >> 1) & 0x10);
36891                                               DataType dt =
36892                                                   ImmediateVmov::DecodeDt(
36893                                                       cmode);
36894                                               if (dt.Is(
36895                                                       kDataTypeValueInvalid)) {
36896                                                 UnallocatedT32(instr);
36897                                                 return;
36898                                               }
36899                                               if (((instr >> 12) & 1) != 0) {
36900                                                 UnallocatedT32(instr);
36901                                                 return;
36902                                               }
36903                                               unsigned rd =
36904                                                   ExtractQRegister(instr,
36905                                                                    22,
36906                                                                    12);
36907                                               QOperand imm = ImmediateVmov::
36908                                                   DecodeImmediate(cmode,
36909                                                                   (instr &
36910                                                                    0xf) |
36911                                                                       ((instr >>
36912                                                                         12) &
36913                                                                        0x70) |
36914                                                                       ((instr >>
36915                                                                         21) &
36916                                                                        0x80));
36917                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36918                                               vmov(CurrentCond(),
36919                                                    dt,
36920                                                    QRegister(rd),
36921                                                    imm);
36922                                               break;
36923                                             }
36924                                           }
36925                                           break;
36926                                         }
36927                                       }
36928                                       break;
36929                                     }
36930                                     case 0x00000100: {
36931                                       // 0xef800950
36932                                       switch (instr & 0x00000020) {
36933                                         case 0x00000000: {
36934                                           // 0xef800950
36935                                           if (((instr & 0x100) == 0x0) ||
36936                                               ((instr & 0xc00) == 0xc00)) {
36937                                             UnallocatedT32(instr);
36938                                             return;
36939                                           }
36940                                           unsigned cmode = (instr >> 8) & 0xf;
36941                                           DataType dt =
36942                                               ImmediateVorr::DecodeDt(cmode);
36943                                           if (dt.Is(kDataTypeValueInvalid)) {
36944                                             UnallocatedT32(instr);
36945                                             return;
36946                                           }
36947                                           if (((instr >> 12) & 1) != 0) {
36948                                             UnallocatedT32(instr);
36949                                             return;
36950                                           }
36951                                           unsigned rd =
36952                                               ExtractQRegister(instr, 22, 12);
36953                                           QOperand imm =
36954                                               ImmediateVorr::DecodeImmediate(
36955                                                   cmode,
36956                                                   (instr & 0xf) |
36957                                                       ((instr >> 12) & 0x70) |
36958                                                       ((instr >> 21) & 0x80));
36959                                           // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36960                                           vorr(CurrentCond(),
36961                                                dt,
36962                                                QRegister(rd),
36963                                                QRegister(rd),
36964                                                imm);
36965                                           break;
36966                                         }
36967                                         case 0x00000020: {
36968                                           // 0xef800970
36969                                           if (((instr & 0x100) == 0x0) ||
36970                                               ((instr & 0xc00) == 0xc00)) {
36971                                             UnallocatedT32(instr);
36972                                             return;
36973                                           }
36974                                           unsigned cmode = (instr >> 8) & 0xf;
36975                                           DataType dt =
36976                                               ImmediateVbic::DecodeDt(cmode);
36977                                           if (dt.Is(kDataTypeValueInvalid)) {
36978                                             UnallocatedT32(instr);
36979                                             return;
36980                                           }
36981                                           if (((instr >> 12) & 1) != 0) {
36982                                             UnallocatedT32(instr);
36983                                             return;
36984                                           }
36985                                           unsigned rd =
36986                                               ExtractQRegister(instr, 22, 12);
36987                                           QOperand imm =
36988                                               ImmediateVbic::DecodeImmediate(
36989                                                   cmode,
36990                                                   (instr & 0xf) |
36991                                                       ((instr >> 12) & 0x70) |
36992                                                       ((instr >> 21) & 0x80));
36993                                           // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36994                                           vbic(CurrentCond(),
36995                                                dt,
36996                                                QRegister(rd),
36997                                                QRegister(rd),
36998                                                imm);
36999                                           break;
37000                                         }
37001                                       }
37002                                       break;
37003                                     }
37004                                   }
37005                                   break;
37006                                 }
37007                                 default: {
37008                                   switch (instr & 0x00000300) {
37009                                     case 0x00000000: {
37010                                       // 0xef800850
37011                                       switch (instr & 0x10000000) {
37012                                         case 0x00000000: {
37013                                           // 0xef800850
37014                                           if (((instr & 0x380000) == 0x0)) {
37015                                             UnallocatedT32(instr);
37016                                             return;
37017                                           }
37018                                           DataType dt = Dt_imm6_3_Decode(
37019                                               (instr >> 19) & 0x7);
37020                                           if (dt.Is(kDataTypeValueInvalid)) {
37021                                             UnallocatedT32(instr);
37022                                             return;
37023                                           }
37024                                           unsigned rd =
37025                                               ExtractDRegister(instr, 22, 12);
37026                                           if ((instr & 1) != 0) {
37027                                             UnallocatedT32(instr);
37028                                             return;
37029                                           }
37030                                           unsigned rm =
37031                                               ExtractQRegister(instr, 5, 0);
37032                                           uint32_t imm6 = (instr >> 16) & 0x3f;
37033                                           uint32_t imm = dt.GetSize() - imm6;
37034                                           // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37035                                           vrshrn(CurrentCond(),
37036                                                  dt,
37037                                                  DRegister(rd),
37038                                                  QRegister(rm),
37039                                                  imm);
37040                                           break;
37041                                         }
37042                                         case 0x10000000: {
37043                                           // 0xff800850
37044                                           if (((instr & 0x380000) == 0x0)) {
37045                                             UnallocatedT32(instr);
37046                                             return;
37047                                           }
37048                                           DataType dt =
37049                                               Dt_imm6_2_Decode((instr >> 19) &
37050                                                                    0x7,
37051                                                                (instr >> 28) &
37052                                                                    0x1);
37053                                           if (dt.Is(kDataTypeValueInvalid)) {
37054                                             UnallocatedT32(instr);
37055                                             return;
37056                                           }
37057                                           unsigned rd =
37058                                               ExtractDRegister(instr, 22, 12);
37059                                           if ((instr & 1) != 0) {
37060                                             UnallocatedT32(instr);
37061                                             return;
37062                                           }
37063                                           unsigned rm =
37064                                               ExtractQRegister(instr, 5, 0);
37065                                           uint32_t imm6 = (instr >> 16) & 0x3f;
37066                                           uint32_t imm = dt.GetSize() - imm6;
37067                                           // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37068                                           vqrshrun(CurrentCond(),
37069                                                    dt,
37070                                                    DRegister(rd),
37071                                                    QRegister(rm),
37072                                                    imm);
37073                                           break;
37074                                         }
37075                                       }
37076                                       break;
37077                                     }
37078                                     case 0x00000100: {
37079                                       // 0xef800950
37080                                       if (((instr & 0x380000) == 0x0)) {
37081                                         UnallocatedT32(instr);
37082                                         return;
37083                                       }
37084                                       DataType dt =
37085                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
37086                                                            (instr >> 28) & 0x1);
37087                                       if (dt.Is(kDataTypeValueInvalid)) {
37088                                         UnallocatedT32(instr);
37089                                         return;
37090                                       }
37091                                       unsigned rd =
37092                                           ExtractDRegister(instr, 22, 12);
37093                                       if ((instr & 1) != 0) {
37094                                         UnallocatedT32(instr);
37095                                         return;
37096                                       }
37097                                       unsigned rm =
37098                                           ExtractQRegister(instr, 5, 0);
37099                                       uint32_t imm6 = (instr >> 16) & 0x3f;
37100                                       uint32_t imm = dt.GetSize() - imm6;
37101                                       // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37102                                       vqrshrn(CurrentCond(),
37103                                               dt,
37104                                               DRegister(rd),
37105                                               QRegister(rm),
37106                                               imm);
37107                                       break;
37108                                     }
37109                                     default:
37110                                       UnallocatedT32(instr);
37111                                       break;
37112                                   }
37113                                   break;
37114                                 }
37115                               }
37116                               break;
37117                             }
37118                             default:
37119                               UnallocatedT32(instr);
37120                               break;
37121                           }
37122                           break;
37123                         }
37124                         case 0x00000c00: {
37125                           // 0xef800c50
37126                           switch (instr & 0x00000080) {
37127                             case 0x00000000: {
37128                               // 0xef800c50
37129                               switch (instr & 0x00200000) {
37130                                 case 0x00000000: {
37131                                   // 0xef800c50
37132                                   switch (instr & 0x00180000) {
37133                                     case 0x00000000: {
37134                                       // 0xef800c50
37135                                       switch (instr & 0x00000300) {
37136                                         case 0x00000200: {
37137                                           // 0xef800e50
37138                                           if (((instr & 0x920) == 0x100) ||
37139                                               ((instr & 0x520) == 0x100) ||
37140                                               ((instr & 0x820) == 0x20) ||
37141                                               ((instr & 0x420) == 0x20) ||
37142                                               ((instr & 0x220) == 0x20) ||
37143                                               ((instr & 0x120) == 0x120)) {
37144                                             UnallocatedT32(instr);
37145                                             return;
37146                                           }
37147                                           unsigned cmode =
37148                                               ((instr >> 8) & 0xf) |
37149                                               ((instr >> 1) & 0x10);
37150                                           DataType dt =
37151                                               ImmediateVmov::DecodeDt(cmode);
37152                                           if (dt.Is(kDataTypeValueInvalid)) {
37153                                             UnallocatedT32(instr);
37154                                             return;
37155                                           }
37156                                           if (((instr >> 12) & 1) != 0) {
37157                                             UnallocatedT32(instr);
37158                                             return;
37159                                           }
37160                                           unsigned rd =
37161                                               ExtractQRegister(instr, 22, 12);
37162                                           QOperand imm =
37163                                               ImmediateVmov::DecodeImmediate(
37164                                                   cmode,
37165                                                   (instr & 0xf) |
37166                                                       ((instr >> 12) & 0x70) |
37167                                                       ((instr >> 21) & 0x80));
37168                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37169                                           vmov(CurrentCond(),
37170                                                dt,
37171                                                QRegister(rd),
37172                                                imm);
37173                                           break;
37174                                         }
37175                                         case 0x00000300: {
37176                                           // 0xef800f50
37177                                           if (((instr & 0x920) == 0x100) ||
37178                                               ((instr & 0x520) == 0x100) ||
37179                                               ((instr & 0x820) == 0x20) ||
37180                                               ((instr & 0x420) == 0x20) ||
37181                                               ((instr & 0x220) == 0x20) ||
37182                                               ((instr & 0x120) == 0x120)) {
37183                                             UnallocatedT32(instr);
37184                                             return;
37185                                           }
37186                                           unsigned cmode =
37187                                               ((instr >> 8) & 0xf) |
37188                                               ((instr >> 1) & 0x10);
37189                                           DataType dt =
37190                                               ImmediateVmov::DecodeDt(cmode);
37191                                           if (dt.Is(kDataTypeValueInvalid)) {
37192                                             UnallocatedT32(instr);
37193                                             return;
37194                                           }
37195                                           if (((instr >> 12) & 1) != 0) {
37196                                             UnallocatedT32(instr);
37197                                             return;
37198                                           }
37199                                           unsigned rd =
37200                                               ExtractQRegister(instr, 22, 12);
37201                                           QOperand imm =
37202                                               ImmediateVmov::DecodeImmediate(
37203                                                   cmode,
37204                                                   (instr & 0xf) |
37205                                                       ((instr >> 12) & 0x70) |
37206                                                       ((instr >> 21) & 0x80));
37207                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37208                                           vmov(CurrentCond(),
37209                                                dt,
37210                                                QRegister(rd),
37211                                                imm);
37212                                           break;
37213                                         }
37214                                         default: {
37215                                           switch (instr & 0x00000020) {
37216                                             case 0x00000020: {
37217                                               // 0xef800c70
37218                                               switch (instr & 0x00000f20) {
37219                                                 case 0x00000000: {
37220                                                   // 0xef800c50
37221                                                   if (((instr & 0x920) ==
37222                                                        0x100) ||
37223                                                       ((instr & 0x520) ==
37224                                                        0x100) ||
37225                                                       ((instr & 0x820) ==
37226                                                        0x20) ||
37227                                                       ((instr & 0x420) ==
37228                                                        0x20) ||
37229                                                       ((instr & 0x220) ==
37230                                                        0x20) ||
37231                                                       ((instr & 0x120) ==
37232                                                        0x120)) {
37233                                                     UnallocatedT32(instr);
37234                                                     return;
37235                                                   }
37236                                                   unsigned cmode =
37237                                                       ((instr >> 8) & 0xf) |
37238                                                       ((instr >> 1) & 0x10);
37239                                                   DataType dt =
37240                                                       ImmediateVmov::DecodeDt(
37241                                                           cmode);
37242                                                   if (dt.Is(
37243                                                           kDataTypeValueInvalid)) {
37244                                                     UnallocatedT32(instr);
37245                                                     return;
37246                                                   }
37247                                                   if (((instr >> 12) & 1) !=
37248                                                       0) {
37249                                                     UnallocatedT32(instr);
37250                                                     return;
37251                                                   }
37252                                                   unsigned rd =
37253                                                       ExtractQRegister(instr,
37254                                                                        22,
37255                                                                        12);
37256                                                   QOperand imm = ImmediateVmov::
37257                                                       DecodeImmediate(
37258                                                           cmode,
37259                                                           (instr & 0xf) |
37260                                                               ((instr >> 12) &
37261                                                                0x70) |
37262                                                               ((instr >> 21) &
37263                                                                0x80));
37264                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37265                                                   vmov(CurrentCond(),
37266                                                        dt,
37267                                                        QRegister(rd),
37268                                                        imm);
37269                                                   break;
37270                                                 }
37271                                                 case 0x00000020: {
37272                                                   // 0xef800c70
37273                                                   if (((instr & 0xd00) ==
37274                                                        0x100) ||
37275                                                       ((instr & 0xd00) ==
37276                                                        0x500) ||
37277                                                       ((instr & 0xd00) ==
37278                                                        0x900) ||
37279                                                       ((instr & 0xe00) ==
37280                                                        0xe00)) {
37281                                                     UnallocatedT32(instr);
37282                                                     return;
37283                                                   }
37284                                                   unsigned cmode =
37285                                                       (instr >> 8) & 0xf;
37286                                                   DataType dt =
37287                                                       ImmediateVmvn::DecodeDt(
37288                                                           cmode);
37289                                                   if (dt.Is(
37290                                                           kDataTypeValueInvalid)) {
37291                                                     UnallocatedT32(instr);
37292                                                     return;
37293                                                   }
37294                                                   if (((instr >> 12) & 1) !=
37295                                                       0) {
37296                                                     UnallocatedT32(instr);
37297                                                     return;
37298                                                   }
37299                                                   unsigned rd =
37300                                                       ExtractQRegister(instr,
37301                                                                        22,
37302                                                                        12);
37303                                                   QOperand imm = ImmediateVmvn::
37304                                                       DecodeImmediate(
37305                                                           cmode,
37306                                                           (instr & 0xf) |
37307                                                               ((instr >> 12) &
37308                                                                0x70) |
37309                                                               ((instr >> 21) &
37310                                                                0x80));
37311                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37312                                                   vmvn(CurrentCond(),
37313                                                        dt,
37314                                                        QRegister(rd),
37315                                                        imm);
37316                                                   break;
37317                                                 }
37318                                                 case 0x00000200: {
37319                                                   // 0xef800e50
37320                                                   if (((instr & 0x920) ==
37321                                                        0x100) ||
37322                                                       ((instr & 0x520) ==
37323                                                        0x100) ||
37324                                                       ((instr & 0x820) ==
37325                                                        0x20) ||
37326                                                       ((instr & 0x420) ==
37327                                                        0x20) ||
37328                                                       ((instr & 0x220) ==
37329                                                        0x20) ||
37330                                                       ((instr & 0x120) ==
37331                                                        0x120)) {
37332                                                     UnallocatedT32(instr);
37333                                                     return;
37334                                                   }
37335                                                   unsigned cmode =
37336                                                       ((instr >> 8) & 0xf) |
37337                                                       ((instr >> 1) & 0x10);
37338                                                   DataType dt =
37339                                                       ImmediateVmov::DecodeDt(
37340                                                           cmode);
37341                                                   if (dt.Is(
37342                                                           kDataTypeValueInvalid)) {
37343                                                     UnallocatedT32(instr);
37344                                                     return;
37345                                                   }
37346                                                   if (((instr >> 12) & 1) !=
37347                                                       0) {
37348                                                     UnallocatedT32(instr);
37349                                                     return;
37350                                                   }
37351                                                   unsigned rd =
37352                                                       ExtractQRegister(instr,
37353                                                                        22,
37354                                                                        12);
37355                                                   QOperand imm = ImmediateVmov::
37356                                                       DecodeImmediate(
37357                                                           cmode,
37358                                                           (instr & 0xf) |
37359                                                               ((instr >> 12) &
37360                                                                0x70) |
37361                                                               ((instr >> 21) &
37362                                                                0x80));
37363                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37364                                                   vmov(CurrentCond(),
37365                                                        dt,
37366                                                        QRegister(rd),
37367                                                        imm);
37368                                                   break;
37369                                                 }
37370                                                 case 0x00000220: {
37371                                                   // 0xef800e70
37372                                                   if (((instr & 0xd00) ==
37373                                                        0x100) ||
37374                                                       ((instr & 0xd00) ==
37375                                                        0x500) ||
37376                                                       ((instr & 0xd00) ==
37377                                                        0x900) ||
37378                                                       ((instr & 0xe00) ==
37379                                                        0xe00)) {
37380                                                     UnallocatedT32(instr);
37381                                                     return;
37382                                                   }
37383                                                   unsigned cmode =
37384                                                       (instr >> 8) & 0xf;
37385                                                   DataType dt =
37386                                                       ImmediateVmvn::DecodeDt(
37387                                                           cmode);
37388                                                   if (dt.Is(
37389                                                           kDataTypeValueInvalid)) {
37390                                                     UnallocatedT32(instr);
37391                                                     return;
37392                                                   }
37393                                                   if (((instr >> 12) & 1) !=
37394                                                       0) {
37395                                                     UnallocatedT32(instr);
37396                                                     return;
37397                                                   }
37398                                                   unsigned rd =
37399                                                       ExtractQRegister(instr,
37400                                                                        22,
37401                                                                        12);
37402                                                   QOperand imm = ImmediateVmvn::
37403                                                       DecodeImmediate(
37404                                                           cmode,
37405                                                           (instr & 0xf) |
37406                                                               ((instr >> 12) &
37407                                                                0x70) |
37408                                                               ((instr >> 21) &
37409                                                                0x80));
37410                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37411                                                   vmvn(CurrentCond(),
37412                                                        dt,
37413                                                        QRegister(rd),
37414                                                        imm);
37415                                                   break;
37416                                                 }
37417                                                 case 0x00000400: {
37418                                                   // 0xef800c50
37419                                                   if (((instr & 0x920) ==
37420                                                        0x100) ||
37421                                                       ((instr & 0x520) ==
37422                                                        0x100) ||
37423                                                       ((instr & 0x820) ==
37424                                                        0x20) ||
37425                                                       ((instr & 0x420) ==
37426                                                        0x20) ||
37427                                                       ((instr & 0x220) ==
37428                                                        0x20) ||
37429                                                       ((instr & 0x120) ==
37430                                                        0x120)) {
37431                                                     UnallocatedT32(instr);
37432                                                     return;
37433                                                   }
37434                                                   unsigned cmode =
37435                                                       ((instr >> 8) & 0xf) |
37436                                                       ((instr >> 1) & 0x10);
37437                                                   DataType dt =
37438                                                       ImmediateVmov::DecodeDt(
37439                                                           cmode);
37440                                                   if (dt.Is(
37441                                                           kDataTypeValueInvalid)) {
37442                                                     UnallocatedT32(instr);
37443                                                     return;
37444                                                   }
37445                                                   if (((instr >> 12) & 1) !=
37446                                                       0) {
37447                                                     UnallocatedT32(instr);
37448                                                     return;
37449                                                   }
37450                                                   unsigned rd =
37451                                                       ExtractQRegister(instr,
37452                                                                        22,
37453                                                                        12);
37454                                                   QOperand imm = ImmediateVmov::
37455                                                       DecodeImmediate(
37456                                                           cmode,
37457                                                           (instr & 0xf) |
37458                                                               ((instr >> 12) &
37459                                                                0x70) |
37460                                                               ((instr >> 21) &
37461                                                                0x80));
37462                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37463                                                   vmov(CurrentCond(),
37464                                                        dt,
37465                                                        QRegister(rd),
37466                                                        imm);
37467                                                   break;
37468                                                 }
37469                                                 case 0x00000420: {
37470                                                   // 0xef800c70
37471                                                   if (((instr & 0xd00) ==
37472                                                        0x100) ||
37473                                                       ((instr & 0xd00) ==
37474                                                        0x500) ||
37475                                                       ((instr & 0xd00) ==
37476                                                        0x900) ||
37477                                                       ((instr & 0xe00) ==
37478                                                        0xe00)) {
37479                                                     UnallocatedT32(instr);
37480                                                     return;
37481                                                   }
37482                                                   unsigned cmode =
37483                                                       (instr >> 8) & 0xf;
37484                                                   DataType dt =
37485                                                       ImmediateVmvn::DecodeDt(
37486                                                           cmode);
37487                                                   if (dt.Is(
37488                                                           kDataTypeValueInvalid)) {
37489                                                     UnallocatedT32(instr);
37490                                                     return;
37491                                                   }
37492                                                   if (((instr >> 12) & 1) !=
37493                                                       0) {
37494                                                     UnallocatedT32(instr);
37495                                                     return;
37496                                                   }
37497                                                   unsigned rd =
37498                                                       ExtractQRegister(instr,
37499                                                                        22,
37500                                                                        12);
37501                                                   QOperand imm = ImmediateVmvn::
37502                                                       DecodeImmediate(
37503                                                           cmode,
37504                                                           (instr & 0xf) |
37505                                                               ((instr >> 12) &
37506                                                                0x70) |
37507                                                               ((instr >> 21) &
37508                                                                0x80));
37509                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37510                                                   vmvn(CurrentCond(),
37511                                                        dt,
37512                                                        QRegister(rd),
37513                                                        imm);
37514                                                   break;
37515                                                 }
37516                                                 case 0x00000600: {
37517                                                   // 0xef800e50
37518                                                   if (((instr & 0x920) ==
37519                                                        0x100) ||
37520                                                       ((instr & 0x520) ==
37521                                                        0x100) ||
37522                                                       ((instr & 0x820) ==
37523                                                        0x20) ||
37524                                                       ((instr & 0x420) ==
37525                                                        0x20) ||
37526                                                       ((instr & 0x220) ==
37527                                                        0x20) ||
37528                                                       ((instr & 0x120) ==
37529                                                        0x120)) {
37530                                                     UnallocatedT32(instr);
37531                                                     return;
37532                                                   }
37533                                                   unsigned cmode =
37534                                                       ((instr >> 8) & 0xf) |
37535                                                       ((instr >> 1) & 0x10);
37536                                                   DataType dt =
37537                                                       ImmediateVmov::DecodeDt(
37538                                                           cmode);
37539                                                   if (dt.Is(
37540                                                           kDataTypeValueInvalid)) {
37541                                                     UnallocatedT32(instr);
37542                                                     return;
37543                                                   }
37544                                                   if (((instr >> 12) & 1) !=
37545                                                       0) {
37546                                                     UnallocatedT32(instr);
37547                                                     return;
37548                                                   }
37549                                                   unsigned rd =
37550                                                       ExtractQRegister(instr,
37551                                                                        22,
37552                                                                        12);
37553                                                   QOperand imm = ImmediateVmov::
37554                                                       DecodeImmediate(
37555                                                           cmode,
37556                                                           (instr & 0xf) |
37557                                                               ((instr >> 12) &
37558                                                                0x70) |
37559                                                               ((instr >> 21) &
37560                                                                0x80));
37561                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37562                                                   vmov(CurrentCond(),
37563                                                        dt,
37564                                                        QRegister(rd),
37565                                                        imm);
37566                                                   break;
37567                                                 }
37568                                                 case 0x00000620: {
37569                                                   // 0xef800e70
37570                                                   if (((instr & 0xd00) ==
37571                                                        0x100) ||
37572                                                       ((instr & 0xd00) ==
37573                                                        0x500) ||
37574                                                       ((instr & 0xd00) ==
37575                                                        0x900) ||
37576                                                       ((instr & 0xe00) ==
37577                                                        0xe00)) {
37578                                                     UnallocatedT32(instr);
37579                                                     return;
37580                                                   }
37581                                                   unsigned cmode =
37582                                                       (instr >> 8) & 0xf;
37583                                                   DataType dt =
37584                                                       ImmediateVmvn::DecodeDt(
37585                                                           cmode);
37586                                                   if (dt.Is(
37587                                                           kDataTypeValueInvalid)) {
37588                                                     UnallocatedT32(instr);
37589                                                     return;
37590                                                   }
37591                                                   if (((instr >> 12) & 1) !=
37592                                                       0) {
37593                                                     UnallocatedT32(instr);
37594                                                     return;
37595                                                   }
37596                                                   unsigned rd =
37597                                                       ExtractQRegister(instr,
37598                                                                        22,
37599                                                                        12);
37600                                                   QOperand imm = ImmediateVmvn::
37601                                                       DecodeImmediate(
37602                                                           cmode,
37603                                                           (instr & 0xf) |
37604                                                               ((instr >> 12) &
37605                                                                0x70) |
37606                                                               ((instr >> 21) &
37607                                                                0x80));
37608                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37609                                                   vmvn(CurrentCond(),
37610                                                        dt,
37611                                                        QRegister(rd),
37612                                                        imm);
37613                                                   break;
37614                                                 }
37615                                                 case 0x00000800: {
37616                                                   // 0xef800c50
37617                                                   if (((instr & 0x920) ==
37618                                                        0x100) ||
37619                                                       ((instr & 0x520) ==
37620                                                        0x100) ||
37621                                                       ((instr & 0x820) ==
37622                                                        0x20) ||
37623                                                       ((instr & 0x420) ==
37624                                                        0x20) ||
37625                                                       ((instr & 0x220) ==
37626                                                        0x20) ||
37627                                                       ((instr & 0x120) ==
37628                                                        0x120)) {
37629                                                     UnallocatedT32(instr);
37630                                                     return;
37631                                                   }
37632                                                   unsigned cmode =
37633                                                       ((instr >> 8) & 0xf) |
37634                                                       ((instr >> 1) & 0x10);
37635                                                   DataType dt =
37636                                                       ImmediateVmov::DecodeDt(
37637                                                           cmode);
37638                                                   if (dt.Is(
37639                                                           kDataTypeValueInvalid)) {
37640                                                     UnallocatedT32(instr);
37641                                                     return;
37642                                                   }
37643                                                   if (((instr >> 12) & 1) !=
37644                                                       0) {
37645                                                     UnallocatedT32(instr);
37646                                                     return;
37647                                                   }
37648                                                   unsigned rd =
37649                                                       ExtractQRegister(instr,
37650                                                                        22,
37651                                                                        12);
37652                                                   QOperand imm = ImmediateVmov::
37653                                                       DecodeImmediate(
37654                                                           cmode,
37655                                                           (instr & 0xf) |
37656                                                               ((instr >> 12) &
37657                                                                0x70) |
37658                                                               ((instr >> 21) &
37659                                                                0x80));
37660                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37661                                                   vmov(CurrentCond(),
37662                                                        dt,
37663                                                        QRegister(rd),
37664                                                        imm);
37665                                                   break;
37666                                                 }
37667                                                 case 0x00000820: {
37668                                                   // 0xef800c70
37669                                                   if (((instr & 0xd00) ==
37670                                                        0x100) ||
37671                                                       ((instr & 0xd00) ==
37672                                                        0x500) ||
37673                                                       ((instr & 0xd00) ==
37674                                                        0x900) ||
37675                                                       ((instr & 0xe00) ==
37676                                                        0xe00)) {
37677                                                     UnallocatedT32(instr);
37678                                                     return;
37679                                                   }
37680                                                   unsigned cmode =
37681                                                       (instr >> 8) & 0xf;
37682                                                   DataType dt =
37683                                                       ImmediateVmvn::DecodeDt(
37684                                                           cmode);
37685                                                   if (dt.Is(
37686                                                           kDataTypeValueInvalid)) {
37687                                                     UnallocatedT32(instr);
37688                                                     return;
37689                                                   }
37690                                                   if (((instr >> 12) & 1) !=
37691                                                       0) {
37692                                                     UnallocatedT32(instr);
37693                                                     return;
37694                                                   }
37695                                                   unsigned rd =
37696                                                       ExtractQRegister(instr,
37697                                                                        22,
37698                                                                        12);
37699                                                   QOperand imm = ImmediateVmvn::
37700                                                       DecodeImmediate(
37701                                                           cmode,
37702                                                           (instr & 0xf) |
37703                                                               ((instr >> 12) &
37704                                                                0x70) |
37705                                                               ((instr >> 21) &
37706                                                                0x80));
37707                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37708                                                   vmvn(CurrentCond(),
37709                                                        dt,
37710                                                        QRegister(rd),
37711                                                        imm);
37712                                                   break;
37713                                                 }
37714                                                 case 0x00000a00: {
37715                                                   // 0xef800e50
37716                                                   if (((instr & 0x920) ==
37717                                                        0x100) ||
37718                                                       ((instr & 0x520) ==
37719                                                        0x100) ||
37720                                                       ((instr & 0x820) ==
37721                                                        0x20) ||
37722                                                       ((instr & 0x420) ==
37723                                                        0x20) ||
37724                                                       ((instr & 0x220) ==
37725                                                        0x20) ||
37726                                                       ((instr & 0x120) ==
37727                                                        0x120)) {
37728                                                     UnallocatedT32(instr);
37729                                                     return;
37730                                                   }
37731                                                   unsigned cmode =
37732                                                       ((instr >> 8) & 0xf) |
37733                                                       ((instr >> 1) & 0x10);
37734                                                   DataType dt =
37735                                                       ImmediateVmov::DecodeDt(
37736                                                           cmode);
37737                                                   if (dt.Is(
37738                                                           kDataTypeValueInvalid)) {
37739                                                     UnallocatedT32(instr);
37740                                                     return;
37741                                                   }
37742                                                   if (((instr >> 12) & 1) !=
37743                                                       0) {
37744                                                     UnallocatedT32(instr);
37745                                                     return;
37746                                                   }
37747                                                   unsigned rd =
37748                                                       ExtractQRegister(instr,
37749                                                                        22,
37750                                                                        12);
37751                                                   QOperand imm = ImmediateVmov::
37752                                                       DecodeImmediate(
37753                                                           cmode,
37754                                                           (instr & 0xf) |
37755                                                               ((instr >> 12) &
37756                                                                0x70) |
37757                                                               ((instr >> 21) &
37758                                                                0x80));
37759                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37760                                                   vmov(CurrentCond(),
37761                                                        dt,
37762                                                        QRegister(rd),
37763                                                        imm);
37764                                                   break;
37765                                                 }
37766                                                 case 0x00000a20: {
37767                                                   // 0xef800e70
37768                                                   if (((instr & 0xd00) ==
37769                                                        0x100) ||
37770                                                       ((instr & 0xd00) ==
37771                                                        0x500) ||
37772                                                       ((instr & 0xd00) ==
37773                                                        0x900) ||
37774                                                       ((instr & 0xe00) ==
37775                                                        0xe00)) {
37776                                                     UnallocatedT32(instr);
37777                                                     return;
37778                                                   }
37779                                                   unsigned cmode =
37780                                                       (instr >> 8) & 0xf;
37781                                                   DataType dt =
37782                                                       ImmediateVmvn::DecodeDt(
37783                                                           cmode);
37784                                                   if (dt.Is(
37785                                                           kDataTypeValueInvalid)) {
37786                                                     UnallocatedT32(instr);
37787                                                     return;
37788                                                   }
37789                                                   if (((instr >> 12) & 1) !=
37790                                                       0) {
37791                                                     UnallocatedT32(instr);
37792                                                     return;
37793                                                   }
37794                                                   unsigned rd =
37795                                                       ExtractQRegister(instr,
37796                                                                        22,
37797                                                                        12);
37798                                                   QOperand imm = ImmediateVmvn::
37799                                                       DecodeImmediate(
37800                                                           cmode,
37801                                                           (instr & 0xf) |
37802                                                               ((instr >> 12) &
37803                                                                0x70) |
37804                                                               ((instr >> 21) &
37805                                                                0x80));
37806                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37807                                                   vmvn(CurrentCond(),
37808                                                        dt,
37809                                                        QRegister(rd),
37810                                                        imm);
37811                                                   break;
37812                                                 }
37813                                                 case 0x00000c00: {
37814                                                   // 0xef800c50
37815                                                   if (((instr & 0x920) ==
37816                                                        0x100) ||
37817                                                       ((instr & 0x520) ==
37818                                                        0x100) ||
37819                                                       ((instr & 0x820) ==
37820                                                        0x20) ||
37821                                                       ((instr & 0x420) ==
37822                                                        0x20) ||
37823                                                       ((instr & 0x220) ==
37824                                                        0x20) ||
37825                                                       ((instr & 0x120) ==
37826                                                        0x120)) {
37827                                                     UnallocatedT32(instr);
37828                                                     return;
37829                                                   }
37830                                                   unsigned cmode =
37831                                                       ((instr >> 8) & 0xf) |
37832                                                       ((instr >> 1) & 0x10);
37833                                                   DataType dt =
37834                                                       ImmediateVmov::DecodeDt(
37835                                                           cmode);
37836                                                   if (dt.Is(
37837                                                           kDataTypeValueInvalid)) {
37838                                                     UnallocatedT32(instr);
37839                                                     return;
37840                                                   }
37841                                                   if (((instr >> 12) & 1) !=
37842                                                       0) {
37843                                                     UnallocatedT32(instr);
37844                                                     return;
37845                                                   }
37846                                                   unsigned rd =
37847                                                       ExtractQRegister(instr,
37848                                                                        22,
37849                                                                        12);
37850                                                   QOperand imm = ImmediateVmov::
37851                                                       DecodeImmediate(
37852                                                           cmode,
37853                                                           (instr & 0xf) |
37854                                                               ((instr >> 12) &
37855                                                                0x70) |
37856                                                               ((instr >> 21) &
37857                                                                0x80));
37858                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37859                                                   vmov(CurrentCond(),
37860                                                        dt,
37861                                                        QRegister(rd),
37862                                                        imm);
37863                                                   break;
37864                                                 }
37865                                                 case 0x00000c20: {
37866                                                   // 0xef800c70
37867                                                   if (((instr & 0xd00) ==
37868                                                        0x100) ||
37869                                                       ((instr & 0xd00) ==
37870                                                        0x500) ||
37871                                                       ((instr & 0xd00) ==
37872                                                        0x900) ||
37873                                                       ((instr & 0xe00) ==
37874                                                        0xe00)) {
37875                                                     UnallocatedT32(instr);
37876                                                     return;
37877                                                   }
37878                                                   unsigned cmode =
37879                                                       (instr >> 8) & 0xf;
37880                                                   DataType dt =
37881                                                       ImmediateVmvn::DecodeDt(
37882                                                           cmode);
37883                                                   if (dt.Is(
37884                                                           kDataTypeValueInvalid)) {
37885                                                     UnallocatedT32(instr);
37886                                                     return;
37887                                                   }
37888                                                   if (((instr >> 12) & 1) !=
37889                                                       0) {
37890                                                     UnallocatedT32(instr);
37891                                                     return;
37892                                                   }
37893                                                   unsigned rd =
37894                                                       ExtractQRegister(instr,
37895                                                                        22,
37896                                                                        12);
37897                                                   QOperand imm = ImmediateVmvn::
37898                                                       DecodeImmediate(
37899                                                           cmode,
37900                                                           (instr & 0xf) |
37901                                                               ((instr >> 12) &
37902                                                                0x70) |
37903                                                               ((instr >> 21) &
37904                                                                0x80));
37905                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37906                                                   vmvn(CurrentCond(),
37907                                                        dt,
37908                                                        QRegister(rd),
37909                                                        imm);
37910                                                   break;
37911                                                 }
37912                                                 case 0x00000d00: {
37913                                                   // 0xef800d50
37914                                                   if (((instr & 0x920) ==
37915                                                        0x100) ||
37916                                                       ((instr & 0x520) ==
37917                                                        0x100) ||
37918                                                       ((instr & 0x820) ==
37919                                                        0x20) ||
37920                                                       ((instr & 0x420) ==
37921                                                        0x20) ||
37922                                                       ((instr & 0x220) ==
37923                                                        0x20) ||
37924                                                       ((instr & 0x120) ==
37925                                                        0x120)) {
37926                                                     UnallocatedT32(instr);
37927                                                     return;
37928                                                   }
37929                                                   unsigned cmode =
37930                                                       ((instr >> 8) & 0xf) |
37931                                                       ((instr >> 1) & 0x10);
37932                                                   DataType dt =
37933                                                       ImmediateVmov::DecodeDt(
37934                                                           cmode);
37935                                                   if (dt.Is(
37936                                                           kDataTypeValueInvalid)) {
37937                                                     UnallocatedT32(instr);
37938                                                     return;
37939                                                   }
37940                                                   if (((instr >> 12) & 1) !=
37941                                                       0) {
37942                                                     UnallocatedT32(instr);
37943                                                     return;
37944                                                   }
37945                                                   unsigned rd =
37946                                                       ExtractQRegister(instr,
37947                                                                        22,
37948                                                                        12);
37949                                                   QOperand imm = ImmediateVmov::
37950                                                       DecodeImmediate(
37951                                                           cmode,
37952                                                           (instr & 0xf) |
37953                                                               ((instr >> 12) &
37954                                                                0x70) |
37955                                                               ((instr >> 21) &
37956                                                                0x80));
37957                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37958                                                   vmov(CurrentCond(),
37959                                                        dt,
37960                                                        QRegister(rd),
37961                                                        imm);
37962                                                   break;
37963                                                 }
37964                                                 case 0x00000d20: {
37965                                                   // 0xef800d70
37966                                                   if (((instr & 0xd00) ==
37967                                                        0x100) ||
37968                                                       ((instr & 0xd00) ==
37969                                                        0x500) ||
37970                                                       ((instr & 0xd00) ==
37971                                                        0x900) ||
37972                                                       ((instr & 0xe00) ==
37973                                                        0xe00)) {
37974                                                     UnallocatedT32(instr);
37975                                                     return;
37976                                                   }
37977                                                   unsigned cmode =
37978                                                       (instr >> 8) & 0xf;
37979                                                   DataType dt =
37980                                                       ImmediateVmvn::DecodeDt(
37981                                                           cmode);
37982                                                   if (dt.Is(
37983                                                           kDataTypeValueInvalid)) {
37984                                                     UnallocatedT32(instr);
37985                                                     return;
37986                                                   }
37987                                                   if (((instr >> 12) & 1) !=
37988                                                       0) {
37989                                                     UnallocatedT32(instr);
37990                                                     return;
37991                                                   }
37992                                                   unsigned rd =
37993                                                       ExtractQRegister(instr,
37994                                                                        22,
37995                                                                        12);
37996                                                   QOperand imm = ImmediateVmvn::
37997                                                       DecodeImmediate(
37998                                                           cmode,
37999                                                           (instr & 0xf) |
38000                                                               ((instr >> 12) &
38001                                                                0x70) |
38002                                                               ((instr >> 21) &
38003                                                                0x80));
38004                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38005                                                   vmvn(CurrentCond(),
38006                                                        dt,
38007                                                        QRegister(rd),
38008                                                        imm);
38009                                                   break;
38010                                                 }
38011                                                 case 0x00000e00: {
38012                                                   // 0xef800e50
38013                                                   if (((instr & 0x920) ==
38014                                                        0x100) ||
38015                                                       ((instr & 0x520) ==
38016                                                        0x100) ||
38017                                                       ((instr & 0x820) ==
38018                                                        0x20) ||
38019                                                       ((instr & 0x420) ==
38020                                                        0x20) ||
38021                                                       ((instr & 0x220) ==
38022                                                        0x20) ||
38023                                                       ((instr & 0x120) ==
38024                                                        0x120)) {
38025                                                     UnallocatedT32(instr);
38026                                                     return;
38027                                                   }
38028                                                   unsigned cmode =
38029                                                       ((instr >> 8) & 0xf) |
38030                                                       ((instr >> 1) & 0x10);
38031                                                   DataType dt =
38032                                                       ImmediateVmov::DecodeDt(
38033                                                           cmode);
38034                                                   if (dt.Is(
38035                                                           kDataTypeValueInvalid)) {
38036                                                     UnallocatedT32(instr);
38037                                                     return;
38038                                                   }
38039                                                   if (((instr >> 12) & 1) !=
38040                                                       0) {
38041                                                     UnallocatedT32(instr);
38042                                                     return;
38043                                                   }
38044                                                   unsigned rd =
38045                                                       ExtractQRegister(instr,
38046                                                                        22,
38047                                                                        12);
38048                                                   QOperand imm = ImmediateVmov::
38049                                                       DecodeImmediate(
38050                                                           cmode,
38051                                                           (instr & 0xf) |
38052                                                               ((instr >> 12) &
38053                                                                0x70) |
38054                                                               ((instr >> 21) &
38055                                                                0x80));
38056                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38057                                                   vmov(CurrentCond(),
38058                                                        dt,
38059                                                        QRegister(rd),
38060                                                        imm);
38061                                                   break;
38062                                                 }
38063                                                 case 0x00000e20: {
38064                                                   // 0xef800e70
38065                                                   if (((instr & 0x920) ==
38066                                                        0x100) ||
38067                                                       ((instr & 0x520) ==
38068                                                        0x100) ||
38069                                                       ((instr & 0x820) ==
38070                                                        0x20) ||
38071                                                       ((instr & 0x420) ==
38072                                                        0x20) ||
38073                                                       ((instr & 0x220) ==
38074                                                        0x20) ||
38075                                                       ((instr & 0x120) ==
38076                                                        0x120)) {
38077                                                     UnallocatedT32(instr);
38078                                                     return;
38079                                                   }
38080                                                   unsigned cmode =
38081                                                       ((instr >> 8) & 0xf) |
38082                                                       ((instr >> 1) & 0x10);
38083                                                   DataType dt =
38084                                                       ImmediateVmov::DecodeDt(
38085                                                           cmode);
38086                                                   if (dt.Is(
38087                                                           kDataTypeValueInvalid)) {
38088                                                     UnallocatedT32(instr);
38089                                                     return;
38090                                                   }
38091                                                   if (((instr >> 12) & 1) !=
38092                                                       0) {
38093                                                     UnallocatedT32(instr);
38094                                                     return;
38095                                                   }
38096                                                   unsigned rd =
38097                                                       ExtractQRegister(instr,
38098                                                                        22,
38099                                                                        12);
38100                                                   QOperand imm = ImmediateVmov::
38101                                                       DecodeImmediate(
38102                                                           cmode,
38103                                                           (instr & 0xf) |
38104                                                               ((instr >> 12) &
38105                                                                0x70) |
38106                                                               ((instr >> 21) &
38107                                                                0x80));
38108                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38109                                                   vmov(CurrentCond(),
38110                                                        dt,
38111                                                        QRegister(rd),
38112                                                        imm);
38113                                                   break;
38114                                                 }
38115                                                 case 0x00000f00: {
38116                                                   // 0xef800f50
38117                                                   if (((instr & 0x920) ==
38118                                                        0x100) ||
38119                                                       ((instr & 0x520) ==
38120                                                        0x100) ||
38121                                                       ((instr & 0x820) ==
38122                                                        0x20) ||
38123                                                       ((instr & 0x420) ==
38124                                                        0x20) ||
38125                                                       ((instr & 0x220) ==
38126                                                        0x20) ||
38127                                                       ((instr & 0x120) ==
38128                                                        0x120)) {
38129                                                     UnallocatedT32(instr);
38130                                                     return;
38131                                                   }
38132                                                   unsigned cmode =
38133                                                       ((instr >> 8) & 0xf) |
38134                                                       ((instr >> 1) & 0x10);
38135                                                   DataType dt =
38136                                                       ImmediateVmov::DecodeDt(
38137                                                           cmode);
38138                                                   if (dt.Is(
38139                                                           kDataTypeValueInvalid)) {
38140                                                     UnallocatedT32(instr);
38141                                                     return;
38142                                                   }
38143                                                   if (((instr >> 12) & 1) !=
38144                                                       0) {
38145                                                     UnallocatedT32(instr);
38146                                                     return;
38147                                                   }
38148                                                   unsigned rd =
38149                                                       ExtractQRegister(instr,
38150                                                                        22,
38151                                                                        12);
38152                                                   QOperand imm = ImmediateVmov::
38153                                                       DecodeImmediate(
38154                                                           cmode,
38155                                                           (instr & 0xf) |
38156                                                               ((instr >> 12) &
38157                                                                0x70) |
38158                                                               ((instr >> 21) &
38159                                                                0x80));
38160                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38161                                                   vmov(CurrentCond(),
38162                                                        dt,
38163                                                        QRegister(rd),
38164                                                        imm);
38165                                                   break;
38166                                                 }
38167                                                 default:
38168                                                   UnallocatedT32(instr);
38169                                                   break;
38170                                               }
38171                                               break;
38172                                             }
38173                                             default: {
38174                                               if (((instr & 0x920) == 0x100) ||
38175                                                   ((instr & 0x520) == 0x100) ||
38176                                                   ((instr & 0x820) == 0x20) ||
38177                                                   ((instr & 0x420) == 0x20) ||
38178                                                   ((instr & 0x220) == 0x20) ||
38179                                                   ((instr & 0x120) == 0x120)) {
38180                                                 UnallocatedT32(instr);
38181                                                 return;
38182                                               }
38183                                               unsigned cmode =
38184                                                   ((instr >> 8) & 0xf) |
38185                                                   ((instr >> 1) & 0x10);
38186                                               DataType dt =
38187                                                   ImmediateVmov::DecodeDt(
38188                                                       cmode);
38189                                               if (dt.Is(
38190                                                       kDataTypeValueInvalid)) {
38191                                                 UnallocatedT32(instr);
38192                                                 return;
38193                                               }
38194                                               if (((instr >> 12) & 1) != 0) {
38195                                                 UnallocatedT32(instr);
38196                                                 return;
38197                                               }
38198                                               unsigned rd =
38199                                                   ExtractQRegister(instr,
38200                                                                    22,
38201                                                                    12);
38202                                               QOperand imm = ImmediateVmov::
38203                                                   DecodeImmediate(cmode,
38204                                                                   (instr &
38205                                                                    0xf) |
38206                                                                       ((instr >>
38207                                                                         12) &
38208                                                                        0x70) |
38209                                                                       ((instr >>
38210                                                                         21) &
38211                                                                        0x80));
38212                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38213                                               vmov(CurrentCond(),
38214                                                    dt,
38215                                                    QRegister(rd),
38216                                                    imm);
38217                                               break;
38218                                             }
38219                                           }
38220                                           break;
38221                                         }
38222                                       }
38223                                       break;
38224                                     }
38225                                     default:
38226                                       UnallocatedT32(instr);
38227                                       break;
38228                                   }
38229                                   break;
38230                                 }
38231                                 default: {
38232                                   if ((instr & 0x00000200) == 0x00000200) {
38233                                     if (((instr & 0x200000) == 0x0)) {
38234                                       UnallocatedT32(instr);
38235                                       return;
38236                                     }
38237                                     DataType dt1 = Dt_op_U_1_Decode1(
38238                                         ((instr >> 28) & 0x1) |
38239                                         ((instr >> 7) & 0x2));
38240                                     if (dt1.Is(kDataTypeValueInvalid)) {
38241                                       UnallocatedT32(instr);
38242                                       return;
38243                                     }
38244                                     DataType dt2 = Dt_op_U_1_Decode2(
38245                                         ((instr >> 28) & 0x1) |
38246                                         ((instr >> 7) & 0x2));
38247                                     if (dt2.Is(kDataTypeValueInvalid)) {
38248                                       UnallocatedT32(instr);
38249                                       return;
38250                                     }
38251                                     if (((instr >> 12) & 1) != 0) {
38252                                       UnallocatedT32(instr);
38253                                       return;
38254                                     }
38255                                     unsigned rd =
38256                                         ExtractQRegister(instr, 22, 12);
38257                                     if ((instr & 1) != 0) {
38258                                       UnallocatedT32(instr);
38259                                       return;
38260                                     }
38261                                     unsigned rm = ExtractQRegister(instr, 5, 0);
38262                                     uint32_t fbits =
38263                                         64 - ((instr >> 16) & 0x3f);
38264                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
38265                                     vcvt(CurrentCond(),
38266                                          dt1,
38267                                          dt2,
38268                                          QRegister(rd),
38269                                          QRegister(rm),
38270                                          fbits);
38271                                   } else {
38272                                     UnallocatedT32(instr);
38273                                   }
38274                                   break;
38275                                 }
38276                               }
38277                               break;
38278                             }
38279                             default:
38280                               UnallocatedT32(instr);
38281                               break;
38282                           }
38283                           break;
38284                         }
38285                       }
38286                       break;
38287                     }
38288                   }
38289                   break;
38290                 }
38291               }
38292               break;
38293             }
38294           }
38295           break;
38296         }
38297       }
38298       break;
38299     }
38300   }
38301 }  // NOLINT(readability/fn_size)
38302 
DecodeA32(uint32_t instr)38303 void Disassembler::DecodeA32(uint32_t instr) {
38304   A32CodeAddressIncrementer incrementer(&code_address_);
38305   if ((instr & 0xf0000000) == 0xf0000000) {
38306     switch (instr & 0x0e000000) {
38307       case 0x00000000: {
38308         // 0xf0000000
38309         switch (instr & 0x01f10020) {
38310           case 0x01000000: {
38311             // 0xf1000000
38312             switch (instr & 0x000e0000) {
38313               case 0x00020000: {
38314                 // 0xf1020000
38315                 if ((instr & 0x000001c0) == 0x00000000) {
38316                   UnimplementedA32("CPS", instr);
38317                 } else {
38318                   UnallocatedA32(instr);
38319                 }
38320                 break;
38321               }
38322               case 0x00080000: {
38323                 // 0xf1080000
38324                 if ((instr & 0x0000001f) == 0x00000000) {
38325                   UnimplementedA32("CPSIE", instr);
38326                 } else {
38327                   UnallocatedA32(instr);
38328                 }
38329                 break;
38330               }
38331               case 0x000a0000: {
38332                 // 0xf10a0000
38333                 UnimplementedA32("CPSIE", instr);
38334                 break;
38335               }
38336               case 0x000c0000: {
38337                 // 0xf10c0000
38338                 if ((instr & 0x0000001f) == 0x00000000) {
38339                   UnimplementedA32("CPSID", instr);
38340                 } else {
38341                   UnallocatedA32(instr);
38342                 }
38343                 break;
38344               }
38345               case 0x000e0000: {
38346                 // 0xf10e0000
38347                 UnimplementedA32("CPSID", instr);
38348                 break;
38349               }
38350               default:
38351                 UnallocatedA32(instr);
38352                 break;
38353             }
38354             break;
38355           }
38356           case 0x01010000: {
38357             // 0xf1010000
38358             if ((instr & 0x000000d0) == 0x00000000) {
38359               UnimplementedA32("SETEND", instr);
38360             } else {
38361               UnallocatedA32(instr);
38362             }
38363             break;
38364           }
38365           default:
38366             UnallocatedA32(instr);
38367             break;
38368         }
38369         break;
38370       }
38371       case 0x02000000: {
38372         // 0xf2000000
38373         switch (instr & 0x00800010) {
38374           case 0x00000000: {
38375             // 0xf2000000
38376             switch (instr & 0x00000f40) {
38377               case 0x00000000: {
38378                 // 0xf2000000
38379                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38380                                                  ((instr >> 22) & 0x4));
38381                 if (dt.Is(kDataTypeValueInvalid)) {
38382                   UnallocatedA32(instr);
38383                   return;
38384                 }
38385                 unsigned rd = ExtractDRegister(instr, 22, 12);
38386                 unsigned rn = ExtractDRegister(instr, 7, 16);
38387                 unsigned rm = ExtractDRegister(instr, 5, 0);
38388                 // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38389                 vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38390                 break;
38391               }
38392               case 0x00000040: {
38393                 // 0xf2000040
38394                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38395                                                  ((instr >> 22) & 0x4));
38396                 if (dt.Is(kDataTypeValueInvalid)) {
38397                   UnallocatedA32(instr);
38398                   return;
38399                 }
38400                 if (((instr >> 12) & 1) != 0) {
38401                   UnallocatedA32(instr);
38402                   return;
38403                 }
38404                 unsigned rd = ExtractQRegister(instr, 22, 12);
38405                 if (((instr >> 16) & 1) != 0) {
38406                   UnallocatedA32(instr);
38407                   return;
38408                 }
38409                 unsigned rn = ExtractQRegister(instr, 7, 16);
38410                 if ((instr & 1) != 0) {
38411                   UnallocatedA32(instr);
38412                   return;
38413                 }
38414                 unsigned rm = ExtractQRegister(instr, 5, 0);
38415                 // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38416                 vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38417                 break;
38418               }
38419               case 0x00000100: {
38420                 // 0xf2000100
38421                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38422                                                  ((instr >> 22) & 0x4));
38423                 if (dt.Is(kDataTypeValueInvalid)) {
38424                   UnallocatedA32(instr);
38425                   return;
38426                 }
38427                 unsigned rd = ExtractDRegister(instr, 22, 12);
38428                 unsigned rn = ExtractDRegister(instr, 7, 16);
38429                 unsigned rm = ExtractDRegister(instr, 5, 0);
38430                 // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38431                 vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38432                 break;
38433               }
38434               case 0x00000140: {
38435                 // 0xf2000140
38436                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38437                                                  ((instr >> 22) & 0x4));
38438                 if (dt.Is(kDataTypeValueInvalid)) {
38439                   UnallocatedA32(instr);
38440                   return;
38441                 }
38442                 if (((instr >> 12) & 1) != 0) {
38443                   UnallocatedA32(instr);
38444                   return;
38445                 }
38446                 unsigned rd = ExtractQRegister(instr, 22, 12);
38447                 if (((instr >> 16) & 1) != 0) {
38448                   UnallocatedA32(instr);
38449                   return;
38450                 }
38451                 unsigned rn = ExtractQRegister(instr, 7, 16);
38452                 if ((instr & 1) != 0) {
38453                   UnallocatedA32(instr);
38454                   return;
38455                 }
38456                 unsigned rm = ExtractQRegister(instr, 5, 0);
38457                 // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38458                 vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38459                 break;
38460               }
38461               case 0x00000200: {
38462                 // 0xf2000200
38463                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38464                                                  ((instr >> 22) & 0x4));
38465                 if (dt.Is(kDataTypeValueInvalid)) {
38466                   UnallocatedA32(instr);
38467                   return;
38468                 }
38469                 unsigned rd = ExtractDRegister(instr, 22, 12);
38470                 unsigned rn = ExtractDRegister(instr, 7, 16);
38471                 unsigned rm = ExtractDRegister(instr, 5, 0);
38472                 // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38473                 vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38474                 break;
38475               }
38476               case 0x00000240: {
38477                 // 0xf2000240
38478                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38479                                                  ((instr >> 22) & 0x4));
38480                 if (dt.Is(kDataTypeValueInvalid)) {
38481                   UnallocatedA32(instr);
38482                   return;
38483                 }
38484                 if (((instr >> 12) & 1) != 0) {
38485                   UnallocatedA32(instr);
38486                   return;
38487                 }
38488                 unsigned rd = ExtractQRegister(instr, 22, 12);
38489                 if (((instr >> 16) & 1) != 0) {
38490                   UnallocatedA32(instr);
38491                   return;
38492                 }
38493                 unsigned rn = ExtractQRegister(instr, 7, 16);
38494                 if ((instr & 1) != 0) {
38495                   UnallocatedA32(instr);
38496                   return;
38497                 }
38498                 unsigned rm = ExtractQRegister(instr, 5, 0);
38499                 // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38500                 vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38501                 break;
38502               }
38503               case 0x00000300: {
38504                 // 0xf2000300
38505                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38506                                                  ((instr >> 22) & 0x4));
38507                 if (dt.Is(kDataTypeValueInvalid)) {
38508                   UnallocatedA32(instr);
38509                   return;
38510                 }
38511                 unsigned rd = ExtractDRegister(instr, 22, 12);
38512                 unsigned rn = ExtractDRegister(instr, 7, 16);
38513                 unsigned rm = ExtractDRegister(instr, 5, 0);
38514                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38515                 vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38516                 break;
38517               }
38518               case 0x00000340: {
38519                 // 0xf2000340
38520                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38521                                                  ((instr >> 22) & 0x4));
38522                 if (dt.Is(kDataTypeValueInvalid)) {
38523                   UnallocatedA32(instr);
38524                   return;
38525                 }
38526                 if (((instr >> 12) & 1) != 0) {
38527                   UnallocatedA32(instr);
38528                   return;
38529                 }
38530                 unsigned rd = ExtractQRegister(instr, 22, 12);
38531                 if (((instr >> 16) & 1) != 0) {
38532                   UnallocatedA32(instr);
38533                   return;
38534                 }
38535                 unsigned rn = ExtractQRegister(instr, 7, 16);
38536                 if ((instr & 1) != 0) {
38537                   UnallocatedA32(instr);
38538                   return;
38539                 }
38540                 unsigned rm = ExtractQRegister(instr, 5, 0);
38541                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38542                 vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38543                 break;
38544               }
38545               case 0x00000400: {
38546                 // 0xf2000400
38547                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38548                                                  ((instr >> 22) & 0x4));
38549                 if (dt.Is(kDataTypeValueInvalid)) {
38550                   UnallocatedA32(instr);
38551                   return;
38552                 }
38553                 unsigned rd = ExtractDRegister(instr, 22, 12);
38554                 unsigned rm = ExtractDRegister(instr, 5, 0);
38555                 unsigned rn = ExtractDRegister(instr, 7, 16);
38556                 // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
38557                 vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
38558                 break;
38559               }
38560               case 0x00000440: {
38561                 // 0xf2000440
38562                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38563                                                  ((instr >> 22) & 0x4));
38564                 if (dt.Is(kDataTypeValueInvalid)) {
38565                   UnallocatedA32(instr);
38566                   return;
38567                 }
38568                 if (((instr >> 12) & 1) != 0) {
38569                   UnallocatedA32(instr);
38570                   return;
38571                 }
38572                 unsigned rd = ExtractQRegister(instr, 22, 12);
38573                 if ((instr & 1) != 0) {
38574                   UnallocatedA32(instr);
38575                   return;
38576                 }
38577                 unsigned rm = ExtractQRegister(instr, 5, 0);
38578                 if (((instr >> 16) & 1) != 0) {
38579                   UnallocatedA32(instr);
38580                   return;
38581                 }
38582                 unsigned rn = ExtractQRegister(instr, 7, 16);
38583                 // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
38584                 vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
38585                 break;
38586               }
38587               case 0x00000500: {
38588                 // 0xf2000500
38589                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38590                                                  ((instr >> 22) & 0x4));
38591                 if (dt.Is(kDataTypeValueInvalid)) {
38592                   UnallocatedA32(instr);
38593                   return;
38594                 }
38595                 unsigned rd = ExtractDRegister(instr, 22, 12);
38596                 unsigned rm = ExtractDRegister(instr, 5, 0);
38597                 unsigned rn = ExtractDRegister(instr, 7, 16);
38598                 // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
38599                 vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
38600                 break;
38601               }
38602               case 0x00000540: {
38603                 // 0xf2000540
38604                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38605                                                  ((instr >> 22) & 0x4));
38606                 if (dt.Is(kDataTypeValueInvalid)) {
38607                   UnallocatedA32(instr);
38608                   return;
38609                 }
38610                 if (((instr >> 12) & 1) != 0) {
38611                   UnallocatedA32(instr);
38612                   return;
38613                 }
38614                 unsigned rd = ExtractQRegister(instr, 22, 12);
38615                 if ((instr & 1) != 0) {
38616                   UnallocatedA32(instr);
38617                   return;
38618                 }
38619                 unsigned rm = ExtractQRegister(instr, 5, 0);
38620                 if (((instr >> 16) & 1) != 0) {
38621                   UnallocatedA32(instr);
38622                   return;
38623                 }
38624                 unsigned rn = ExtractQRegister(instr, 7, 16);
38625                 // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
38626                 vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
38627                 break;
38628               }
38629               case 0x00000600: {
38630                 // 0xf2000600
38631                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38632                                                  ((instr >> 22) & 0x4));
38633                 if (dt.Is(kDataTypeValueInvalid)) {
38634                   UnallocatedA32(instr);
38635                   return;
38636                 }
38637                 unsigned rd = ExtractDRegister(instr, 22, 12);
38638                 unsigned rn = ExtractDRegister(instr, 7, 16);
38639                 unsigned rm = ExtractDRegister(instr, 5, 0);
38640                 // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38641                 vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38642                 break;
38643               }
38644               case 0x00000640: {
38645                 // 0xf2000640
38646                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38647                                                  ((instr >> 22) & 0x4));
38648                 if (dt.Is(kDataTypeValueInvalid)) {
38649                   UnallocatedA32(instr);
38650                   return;
38651                 }
38652                 if (((instr >> 12) & 1) != 0) {
38653                   UnallocatedA32(instr);
38654                   return;
38655                 }
38656                 unsigned rd = ExtractQRegister(instr, 22, 12);
38657                 if (((instr >> 16) & 1) != 0) {
38658                   UnallocatedA32(instr);
38659                   return;
38660                 }
38661                 unsigned rn = ExtractQRegister(instr, 7, 16);
38662                 if ((instr & 1) != 0) {
38663                   UnallocatedA32(instr);
38664                   return;
38665                 }
38666                 unsigned rm = ExtractQRegister(instr, 5, 0);
38667                 // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38668                 vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38669                 break;
38670               }
38671               case 0x00000700: {
38672                 // 0xf2000700
38673                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38674                                                  ((instr >> 22) & 0x4));
38675                 if (dt.Is(kDataTypeValueInvalid)) {
38676                   UnallocatedA32(instr);
38677                   return;
38678                 }
38679                 unsigned rd = ExtractDRegister(instr, 22, 12);
38680                 unsigned rn = ExtractDRegister(instr, 7, 16);
38681                 unsigned rm = ExtractDRegister(instr, 5, 0);
38682                 // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38683                 vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38684                 break;
38685               }
38686               case 0x00000740: {
38687                 // 0xf2000740
38688                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38689                                                  ((instr >> 22) & 0x4));
38690                 if (dt.Is(kDataTypeValueInvalid)) {
38691                   UnallocatedA32(instr);
38692                   return;
38693                 }
38694                 if (((instr >> 12) & 1) != 0) {
38695                   UnallocatedA32(instr);
38696                   return;
38697                 }
38698                 unsigned rd = ExtractQRegister(instr, 22, 12);
38699                 if (((instr >> 16) & 1) != 0) {
38700                   UnallocatedA32(instr);
38701                   return;
38702                 }
38703                 unsigned rn = ExtractQRegister(instr, 7, 16);
38704                 if ((instr & 1) != 0) {
38705                   UnallocatedA32(instr);
38706                   return;
38707                 }
38708                 unsigned rm = ExtractQRegister(instr, 5, 0);
38709                 // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38710                 vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38711                 break;
38712               }
38713               case 0x00000800: {
38714                 // 0xf2000800
38715                 switch (instr & 0x01000000) {
38716                   case 0x00000000: {
38717                     // 0xf2000800
38718                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
38719                     if (dt.Is(kDataTypeValueInvalid)) {
38720                       UnallocatedA32(instr);
38721                       return;
38722                     }
38723                     unsigned rd = ExtractDRegister(instr, 22, 12);
38724                     unsigned rn = ExtractDRegister(instr, 7, 16);
38725                     unsigned rm = ExtractDRegister(instr, 5, 0);
38726                     // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38727                     vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38728                     break;
38729                   }
38730                   case 0x01000000: {
38731                     // 0xf3000800
38732                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
38733                     if (dt.Is(kDataTypeValueInvalid)) {
38734                       UnallocatedA32(instr);
38735                       return;
38736                     }
38737                     unsigned rd = ExtractDRegister(instr, 22, 12);
38738                     unsigned rn = ExtractDRegister(instr, 7, 16);
38739                     unsigned rm = ExtractDRegister(instr, 5, 0);
38740                     // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38741                     vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38742                     break;
38743                   }
38744                 }
38745                 break;
38746               }
38747               case 0x00000840: {
38748                 // 0xf2000840
38749                 switch (instr & 0x01000000) {
38750                   case 0x00000000: {
38751                     // 0xf2000840
38752                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
38753                     if (dt.Is(kDataTypeValueInvalid)) {
38754                       UnallocatedA32(instr);
38755                       return;
38756                     }
38757                     if (((instr >> 12) & 1) != 0) {
38758                       UnallocatedA32(instr);
38759                       return;
38760                     }
38761                     unsigned rd = ExtractQRegister(instr, 22, 12);
38762                     if (((instr >> 16) & 1) != 0) {
38763                       UnallocatedA32(instr);
38764                       return;
38765                     }
38766                     unsigned rn = ExtractQRegister(instr, 7, 16);
38767                     if ((instr & 1) != 0) {
38768                       UnallocatedA32(instr);
38769                       return;
38770                     }
38771                     unsigned rm = ExtractQRegister(instr, 5, 0);
38772                     // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38773                     vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38774                     break;
38775                   }
38776                   case 0x01000000: {
38777                     // 0xf3000840
38778                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
38779                     if (dt.Is(kDataTypeValueInvalid)) {
38780                       UnallocatedA32(instr);
38781                       return;
38782                     }
38783                     if (((instr >> 12) & 1) != 0) {
38784                       UnallocatedA32(instr);
38785                       return;
38786                     }
38787                     unsigned rd = ExtractQRegister(instr, 22, 12);
38788                     if (((instr >> 16) & 1) != 0) {
38789                       UnallocatedA32(instr);
38790                       return;
38791                     }
38792                     unsigned rn = ExtractQRegister(instr, 7, 16);
38793                     if ((instr & 1) != 0) {
38794                       UnallocatedA32(instr);
38795                       return;
38796                     }
38797                     unsigned rm = ExtractQRegister(instr, 5, 0);
38798                     // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38799                     vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38800                     break;
38801                   }
38802                 }
38803                 break;
38804               }
38805               case 0x00000900: {
38806                 // 0xf2000900
38807                 switch (instr & 0x01000000) {
38808                   case 0x00000000: {
38809                     // 0xf2000900
38810                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
38811                     if (dt.Is(kDataTypeValueInvalid)) {
38812                       UnallocatedA32(instr);
38813                       return;
38814                     }
38815                     unsigned rd = ExtractDRegister(instr, 22, 12);
38816                     unsigned rn = ExtractDRegister(instr, 7, 16);
38817                     unsigned rm = ExtractDRegister(instr, 5, 0);
38818                     // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
38819                     vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38820                     break;
38821                   }
38822                   case 0x01000000: {
38823                     // 0xf3000900
38824                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
38825                     if (dt.Is(kDataTypeValueInvalid)) {
38826                       UnallocatedA32(instr);
38827                       return;
38828                     }
38829                     unsigned rd = ExtractDRegister(instr, 22, 12);
38830                     unsigned rn = ExtractDRegister(instr, 7, 16);
38831                     unsigned rm = ExtractDRegister(instr, 5, 0);
38832                     // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
38833                     vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38834                     break;
38835                   }
38836                 }
38837                 break;
38838               }
38839               case 0x00000940: {
38840                 // 0xf2000940
38841                 switch (instr & 0x01000000) {
38842                   case 0x00000000: {
38843                     // 0xf2000940
38844                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
38845                     if (dt.Is(kDataTypeValueInvalid)) {
38846                       UnallocatedA32(instr);
38847                       return;
38848                     }
38849                     if (((instr >> 12) & 1) != 0) {
38850                       UnallocatedA32(instr);
38851                       return;
38852                     }
38853                     unsigned rd = ExtractQRegister(instr, 22, 12);
38854                     if (((instr >> 16) & 1) != 0) {
38855                       UnallocatedA32(instr);
38856                       return;
38857                     }
38858                     unsigned rn = ExtractQRegister(instr, 7, 16);
38859                     if ((instr & 1) != 0) {
38860                       UnallocatedA32(instr);
38861                       return;
38862                     }
38863                     unsigned rm = ExtractQRegister(instr, 5, 0);
38864                     // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
38865                     vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38866                     break;
38867                   }
38868                   case 0x01000000: {
38869                     // 0xf3000940
38870                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
38871                     if (dt.Is(kDataTypeValueInvalid)) {
38872                       UnallocatedA32(instr);
38873                       return;
38874                     }
38875                     if (((instr >> 12) & 1) != 0) {
38876                       UnallocatedA32(instr);
38877                       return;
38878                     }
38879                     unsigned rd = ExtractQRegister(instr, 22, 12);
38880                     if (((instr >> 16) & 1) != 0) {
38881                       UnallocatedA32(instr);
38882                       return;
38883                     }
38884                     unsigned rn = ExtractQRegister(instr, 7, 16);
38885                     if ((instr & 1) != 0) {
38886                       UnallocatedA32(instr);
38887                       return;
38888                     }
38889                     unsigned rm = ExtractQRegister(instr, 5, 0);
38890                     // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
38891                     vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38892                     break;
38893                   }
38894                 }
38895                 break;
38896               }
38897               case 0x00000a00: {
38898                 // 0xf2000a00
38899                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38900                                                  ((instr >> 22) & 0x4));
38901                 if (dt.Is(kDataTypeValueInvalid)) {
38902                   UnallocatedA32(instr);
38903                   return;
38904                 }
38905                 unsigned rd = ExtractDRegister(instr, 22, 12);
38906                 unsigned rn = ExtractDRegister(instr, 7, 16);
38907                 unsigned rm = ExtractDRegister(instr, 5, 0);
38908                 // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38909                 vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38910                 break;
38911               }
38912               case 0x00000b00: {
38913                 // 0xf2000b00
38914                 switch (instr & 0x01000000) {
38915                   case 0x00000000: {
38916                     // 0xf2000b00
38917                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
38918                     if (dt.Is(kDataTypeValueInvalid)) {
38919                       UnallocatedA32(instr);
38920                       return;
38921                     }
38922                     unsigned rd = ExtractDRegister(instr, 22, 12);
38923                     unsigned rn = ExtractDRegister(instr, 7, 16);
38924                     unsigned rm = ExtractDRegister(instr, 5, 0);
38925                     // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38926                     vqdmulh(al,
38927                             dt,
38928                             DRegister(rd),
38929                             DRegister(rn),
38930                             DRegister(rm));
38931                     break;
38932                   }
38933                   case 0x01000000: {
38934                     // 0xf3000b00
38935                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
38936                     if (dt.Is(kDataTypeValueInvalid)) {
38937                       UnallocatedA32(instr);
38938                       return;
38939                     }
38940                     unsigned rd = ExtractDRegister(instr, 22, 12);
38941                     unsigned rn = ExtractDRegister(instr, 7, 16);
38942                     unsigned rm = ExtractDRegister(instr, 5, 0);
38943                     // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38944                     vqrdmulh(al,
38945                              dt,
38946                              DRegister(rd),
38947                              DRegister(rn),
38948                              DRegister(rm));
38949                     break;
38950                   }
38951                 }
38952                 break;
38953               }
38954               case 0x00000b40: {
38955                 // 0xf2000b40
38956                 switch (instr & 0x01000000) {
38957                   case 0x00000000: {
38958                     // 0xf2000b40
38959                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
38960                     if (dt.Is(kDataTypeValueInvalid)) {
38961                       UnallocatedA32(instr);
38962                       return;
38963                     }
38964                     if (((instr >> 12) & 1) != 0) {
38965                       UnallocatedA32(instr);
38966                       return;
38967                     }
38968                     unsigned rd = ExtractQRegister(instr, 22, 12);
38969                     if (((instr >> 16) & 1) != 0) {
38970                       UnallocatedA32(instr);
38971                       return;
38972                     }
38973                     unsigned rn = ExtractQRegister(instr, 7, 16);
38974                     if ((instr & 1) != 0) {
38975                       UnallocatedA32(instr);
38976                       return;
38977                     }
38978                     unsigned rm = ExtractQRegister(instr, 5, 0);
38979                     // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38980                     vqdmulh(al,
38981                             dt,
38982                             QRegister(rd),
38983                             QRegister(rn),
38984                             QRegister(rm));
38985                     break;
38986                   }
38987                   case 0x01000000: {
38988                     // 0xf3000b40
38989                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
38990                     if (dt.Is(kDataTypeValueInvalid)) {
38991                       UnallocatedA32(instr);
38992                       return;
38993                     }
38994                     if (((instr >> 12) & 1) != 0) {
38995                       UnallocatedA32(instr);
38996                       return;
38997                     }
38998                     unsigned rd = ExtractQRegister(instr, 22, 12);
38999                     if (((instr >> 16) & 1) != 0) {
39000                       UnallocatedA32(instr);
39001                       return;
39002                     }
39003                     unsigned rn = ExtractQRegister(instr, 7, 16);
39004                     if ((instr & 1) != 0) {
39005                       UnallocatedA32(instr);
39006                       return;
39007                     }
39008                     unsigned rm = ExtractQRegister(instr, 5, 0);
39009                     // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39010                     vqrdmulh(al,
39011                              dt,
39012                              QRegister(rd),
39013                              QRegister(rn),
39014                              QRegister(rm));
39015                     break;
39016                   }
39017                 }
39018                 break;
39019               }
39020               case 0x00000c40: {
39021                 // 0xf2000c40
39022                 switch (instr & 0x01300000) {
39023                   case 0x00000000: {
39024                     // 0xf2000c40
39025                     UnimplementedA32("SHA1C", instr);
39026                     break;
39027                   }
39028                   case 0x00100000: {
39029                     // 0xf2100c40
39030                     UnimplementedA32("SHA1P", instr);
39031                     break;
39032                   }
39033                   case 0x00200000: {
39034                     // 0xf2200c40
39035                     UnimplementedA32("SHA1M", instr);
39036                     break;
39037                   }
39038                   case 0x00300000: {
39039                     // 0xf2300c40
39040                     UnimplementedA32("SHA1SU0", instr);
39041                     break;
39042                   }
39043                   case 0x01000000: {
39044                     // 0xf3000c40
39045                     UnimplementedA32("SHA256H", instr);
39046                     break;
39047                   }
39048                   case 0x01100000: {
39049                     // 0xf3100c40
39050                     UnimplementedA32("SHA256H2", instr);
39051                     break;
39052                   }
39053                   case 0x01200000: {
39054                     // 0xf3200c40
39055                     UnimplementedA32("SHA256SU1", instr);
39056                     break;
39057                   }
39058                   default:
39059                     UnallocatedA32(instr);
39060                     break;
39061                 }
39062                 break;
39063               }
39064               case 0x00000d00: {
39065                 // 0xf2000d00
39066                 switch (instr & 0x01300000) {
39067                   case 0x00000000: {
39068                     // 0xf2000d00
39069                     unsigned rd = ExtractDRegister(instr, 22, 12);
39070                     unsigned rn = ExtractDRegister(instr, 7, 16);
39071                     unsigned rm = ExtractDRegister(instr, 5, 0);
39072                     // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39073                     vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39074                     break;
39075                   }
39076                   case 0x00200000: {
39077                     // 0xf2200d00
39078                     unsigned rd = ExtractDRegister(instr, 22, 12);
39079                     unsigned rn = ExtractDRegister(instr, 7, 16);
39080                     unsigned rm = ExtractDRegister(instr, 5, 0);
39081                     // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39082                     vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39083                     break;
39084                   }
39085                   case 0x01000000: {
39086                     // 0xf3000d00
39087                     unsigned rd = ExtractDRegister(instr, 22, 12);
39088                     unsigned rn = ExtractDRegister(instr, 7, 16);
39089                     unsigned rm = ExtractDRegister(instr, 5, 0);
39090                     // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39091                     vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39092                     break;
39093                   }
39094                   case 0x01200000: {
39095                     // 0xf3200d00
39096                     unsigned rd = ExtractDRegister(instr, 22, 12);
39097                     unsigned rn = ExtractDRegister(instr, 7, 16);
39098                     unsigned rm = ExtractDRegister(instr, 5, 0);
39099                     // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39100                     vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39101                     break;
39102                   }
39103                   default:
39104                     UnallocatedA32(instr);
39105                     break;
39106                 }
39107                 break;
39108               }
39109               case 0x00000d40: {
39110                 // 0xf2000d40
39111                 switch (instr & 0x01300000) {
39112                   case 0x00000000: {
39113                     // 0xf2000d40
39114                     if (((instr >> 12) & 1) != 0) {
39115                       UnallocatedA32(instr);
39116                       return;
39117                     }
39118                     unsigned rd = ExtractQRegister(instr, 22, 12);
39119                     if (((instr >> 16) & 1) != 0) {
39120                       UnallocatedA32(instr);
39121                       return;
39122                     }
39123                     unsigned rn = ExtractQRegister(instr, 7, 16);
39124                     if ((instr & 1) != 0) {
39125                       UnallocatedA32(instr);
39126                       return;
39127                     }
39128                     unsigned rm = ExtractQRegister(instr, 5, 0);
39129                     // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39130                     vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39131                     break;
39132                   }
39133                   case 0x00200000: {
39134                     // 0xf2200d40
39135                     if (((instr >> 12) & 1) != 0) {
39136                       UnallocatedA32(instr);
39137                       return;
39138                     }
39139                     unsigned rd = ExtractQRegister(instr, 22, 12);
39140                     if (((instr >> 16) & 1) != 0) {
39141                       UnallocatedA32(instr);
39142                       return;
39143                     }
39144                     unsigned rn = ExtractQRegister(instr, 7, 16);
39145                     if ((instr & 1) != 0) {
39146                       UnallocatedA32(instr);
39147                       return;
39148                     }
39149                     unsigned rm = ExtractQRegister(instr, 5, 0);
39150                     // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39151                     vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39152                     break;
39153                   }
39154                   case 0x01200000: {
39155                     // 0xf3200d40
39156                     if (((instr >> 12) & 1) != 0) {
39157                       UnallocatedA32(instr);
39158                       return;
39159                     }
39160                     unsigned rd = ExtractQRegister(instr, 22, 12);
39161                     if (((instr >> 16) & 1) != 0) {
39162                       UnallocatedA32(instr);
39163                       return;
39164                     }
39165                     unsigned rn = ExtractQRegister(instr, 7, 16);
39166                     if ((instr & 1) != 0) {
39167                       UnallocatedA32(instr);
39168                       return;
39169                     }
39170                     unsigned rm = ExtractQRegister(instr, 5, 0);
39171                     // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39172                     vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39173                     break;
39174                   }
39175                   default:
39176                     UnallocatedA32(instr);
39177                     break;
39178                 }
39179                 break;
39180               }
39181               case 0x00000e00: {
39182                 // 0xf2000e00
39183                 switch (instr & 0x01200000) {
39184                   case 0x00000000: {
39185                     // 0xf2000e00
39186                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
39187                     if (dt.Is(kDataTypeValueInvalid)) {
39188                       UnallocatedA32(instr);
39189                       return;
39190                     }
39191                     unsigned rd = ExtractDRegister(instr, 22, 12);
39192                     unsigned rn = ExtractDRegister(instr, 7, 16);
39193                     unsigned rm = ExtractDRegister(instr, 5, 0);
39194                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2
39195                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39196                     break;
39197                   }
39198                   case 0x01000000: {
39199                     // 0xf3000e00
39200                     if ((instr & 0x00100000) == 0x00000000) {
39201                       unsigned rd = ExtractDRegister(instr, 22, 12);
39202                       unsigned rn = ExtractDRegister(instr, 7, 16);
39203                       unsigned rm = ExtractDRegister(instr, 5, 0);
39204                       // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
39205                       vcge(al,
39206                            F32,
39207                            DRegister(rd),
39208                            DRegister(rn),
39209                            DRegister(rm));
39210                     } else {
39211                       UnallocatedA32(instr);
39212                     }
39213                     break;
39214                   }
39215                   case 0x01200000: {
39216                     // 0xf3200e00
39217                     if ((instr & 0x00100000) == 0x00000000) {
39218                       unsigned rd = ExtractDRegister(instr, 22, 12);
39219                       unsigned rn = ExtractDRegister(instr, 7, 16);
39220                       unsigned rm = ExtractDRegister(instr, 5, 0);
39221                       // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
39222                       vcgt(al,
39223                            F32,
39224                            DRegister(rd),
39225                            DRegister(rn),
39226                            DRegister(rm));
39227                     } else {
39228                       UnallocatedA32(instr);
39229                     }
39230                     break;
39231                   }
39232                   default:
39233                     UnallocatedA32(instr);
39234                     break;
39235                 }
39236                 break;
39237               }
39238               case 0x00000e40: {
39239                 // 0xf2000e40
39240                 switch (instr & 0x01200000) {
39241                   case 0x00000000: {
39242                     // 0xf2000e40
39243                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
39244                     if (dt.Is(kDataTypeValueInvalid)) {
39245                       UnallocatedA32(instr);
39246                       return;
39247                     }
39248                     if (((instr >> 12) & 1) != 0) {
39249                       UnallocatedA32(instr);
39250                       return;
39251                     }
39252                     unsigned rd = ExtractQRegister(instr, 22, 12);
39253                     if (((instr >> 16) & 1) != 0) {
39254                       UnallocatedA32(instr);
39255                       return;
39256                     }
39257                     unsigned rn = ExtractQRegister(instr, 7, 16);
39258                     if ((instr & 1) != 0) {
39259                       UnallocatedA32(instr);
39260                       return;
39261                     }
39262                     unsigned rm = ExtractQRegister(instr, 5, 0);
39263                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2
39264                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39265                     break;
39266                   }
39267                   case 0x01000000: {
39268                     // 0xf3000e40
39269                     if ((instr & 0x00100000) == 0x00000000) {
39270                       if (((instr >> 12) & 1) != 0) {
39271                         UnallocatedA32(instr);
39272                         return;
39273                       }
39274                       unsigned rd = ExtractQRegister(instr, 22, 12);
39275                       if (((instr >> 16) & 1) != 0) {
39276                         UnallocatedA32(instr);
39277                         return;
39278                       }
39279                       unsigned rn = ExtractQRegister(instr, 7, 16);
39280                       if ((instr & 1) != 0) {
39281                         UnallocatedA32(instr);
39282                         return;
39283                       }
39284                       unsigned rm = ExtractQRegister(instr, 5, 0);
39285                       // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
39286                       vcge(al,
39287                            F32,
39288                            QRegister(rd),
39289                            QRegister(rn),
39290                            QRegister(rm));
39291                     } else {
39292                       UnallocatedA32(instr);
39293                     }
39294                     break;
39295                   }
39296                   case 0x01200000: {
39297                     // 0xf3200e40
39298                     if ((instr & 0x00100000) == 0x00000000) {
39299                       if (((instr >> 12) & 1) != 0) {
39300                         UnallocatedA32(instr);
39301                         return;
39302                       }
39303                       unsigned rd = ExtractQRegister(instr, 22, 12);
39304                       if (((instr >> 16) & 1) != 0) {
39305                         UnallocatedA32(instr);
39306                         return;
39307                       }
39308                       unsigned rn = ExtractQRegister(instr, 7, 16);
39309                       if ((instr & 1) != 0) {
39310                         UnallocatedA32(instr);
39311                         return;
39312                       }
39313                       unsigned rm = ExtractQRegister(instr, 5, 0);
39314                       // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
39315                       vcgt(al,
39316                            F32,
39317                            QRegister(rd),
39318                            QRegister(rn),
39319                            QRegister(rm));
39320                     } else {
39321                       UnallocatedA32(instr);
39322                     }
39323                     break;
39324                   }
39325                   default:
39326                     UnallocatedA32(instr);
39327                     break;
39328                 }
39329                 break;
39330               }
39331               case 0x00000f00: {
39332                 // 0xf2000f00
39333                 switch (instr & 0x01300000) {
39334                   case 0x00000000: {
39335                     // 0xf2000f00
39336                     unsigned rd = ExtractDRegister(instr, 22, 12);
39337                     unsigned rn = ExtractDRegister(instr, 7, 16);
39338                     unsigned rm = ExtractDRegister(instr, 5, 0);
39339                     // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39340                     vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39341                     break;
39342                   }
39343                   case 0x00200000: {
39344                     // 0xf2200f00
39345                     unsigned rd = ExtractDRegister(instr, 22, 12);
39346                     unsigned rn = ExtractDRegister(instr, 7, 16);
39347                     unsigned rm = ExtractDRegister(instr, 5, 0);
39348                     // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39349                     vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39350                     break;
39351                   }
39352                   case 0x01000000: {
39353                     // 0xf3000f00
39354                     unsigned rd = ExtractDRegister(instr, 22, 12);
39355                     unsigned rn = ExtractDRegister(instr, 7, 16);
39356                     unsigned rm = ExtractDRegister(instr, 5, 0);
39357                     // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39358                     vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39359                     break;
39360                   }
39361                   case 0x01200000: {
39362                     // 0xf3200f00
39363                     unsigned rd = ExtractDRegister(instr, 22, 12);
39364                     unsigned rn = ExtractDRegister(instr, 7, 16);
39365                     unsigned rm = ExtractDRegister(instr, 5, 0);
39366                     // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39367                     vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39368                     break;
39369                   }
39370                   default:
39371                     UnallocatedA32(instr);
39372                     break;
39373                 }
39374                 break;
39375               }
39376               case 0x00000f40: {
39377                 // 0xf2000f40
39378                 switch (instr & 0x01300000) {
39379                   case 0x00000000: {
39380                     // 0xf2000f40
39381                     if (((instr >> 12) & 1) != 0) {
39382                       UnallocatedA32(instr);
39383                       return;
39384                     }
39385                     unsigned rd = ExtractQRegister(instr, 22, 12);
39386                     if (((instr >> 16) & 1) != 0) {
39387                       UnallocatedA32(instr);
39388                       return;
39389                     }
39390                     unsigned rn = ExtractQRegister(instr, 7, 16);
39391                     if ((instr & 1) != 0) {
39392                       UnallocatedA32(instr);
39393                       return;
39394                     }
39395                     unsigned rm = ExtractQRegister(instr, 5, 0);
39396                     // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39397                     vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39398                     break;
39399                   }
39400                   case 0x00200000: {
39401                     // 0xf2200f40
39402                     if (((instr >> 12) & 1) != 0) {
39403                       UnallocatedA32(instr);
39404                       return;
39405                     }
39406                     unsigned rd = ExtractQRegister(instr, 22, 12);
39407                     if (((instr >> 16) & 1) != 0) {
39408                       UnallocatedA32(instr);
39409                       return;
39410                     }
39411                     unsigned rn = ExtractQRegister(instr, 7, 16);
39412                     if ((instr & 1) != 0) {
39413                       UnallocatedA32(instr);
39414                       return;
39415                     }
39416                     unsigned rm = ExtractQRegister(instr, 5, 0);
39417                     // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39418                     vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39419                     break;
39420                   }
39421                   default:
39422                     UnallocatedA32(instr);
39423                     break;
39424                 }
39425                 break;
39426               }
39427               default:
39428                 UnallocatedA32(instr);
39429                 break;
39430             }
39431             break;
39432           }
39433           case 0x00000010: {
39434             // 0xf2000010
39435             switch (instr & 0x00000f40) {
39436               case 0x00000000: {
39437                 // 0xf2000010
39438                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39439                                                  ((instr >> 22) & 0x4));
39440                 if (dt.Is(kDataTypeValueInvalid)) {
39441                   UnallocatedA32(instr);
39442                   return;
39443                 }
39444                 unsigned rd = ExtractDRegister(instr, 22, 12);
39445                 unsigned rn = ExtractDRegister(instr, 7, 16);
39446                 unsigned rm = ExtractDRegister(instr, 5, 0);
39447                 // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39448                 vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39449                 break;
39450               }
39451               case 0x00000040: {
39452                 // 0xf2000050
39453                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39454                                                  ((instr >> 22) & 0x4));
39455                 if (dt.Is(kDataTypeValueInvalid)) {
39456                   UnallocatedA32(instr);
39457                   return;
39458                 }
39459                 if (((instr >> 12) & 1) != 0) {
39460                   UnallocatedA32(instr);
39461                   return;
39462                 }
39463                 unsigned rd = ExtractQRegister(instr, 22, 12);
39464                 if (((instr >> 16) & 1) != 0) {
39465                   UnallocatedA32(instr);
39466                   return;
39467                 }
39468                 unsigned rn = ExtractQRegister(instr, 7, 16);
39469                 if ((instr & 1) != 0) {
39470                   UnallocatedA32(instr);
39471                   return;
39472                 }
39473                 unsigned rm = ExtractQRegister(instr, 5, 0);
39474                 // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39475                 vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39476                 break;
39477               }
39478               case 0x00000100: {
39479                 // 0xf2000110
39480                 switch (instr & 0x01300000) {
39481                   case 0x00000000: {
39482                     // 0xf2000110
39483                     unsigned rd = ExtractDRegister(instr, 22, 12);
39484                     unsigned rn = ExtractDRegister(instr, 7, 16);
39485                     unsigned rm = ExtractDRegister(instr, 5, 0);
39486                     // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39487                     vand(al,
39488                          kDataTypeValueNone,
39489                          DRegister(rd),
39490                          DRegister(rn),
39491                          DRegister(rm));
39492                     break;
39493                   }
39494                   case 0x00100000: {
39495                     // 0xf2100110
39496                     unsigned rd = ExtractDRegister(instr, 22, 12);
39497                     unsigned rn = ExtractDRegister(instr, 7, 16);
39498                     unsigned rm = ExtractDRegister(instr, 5, 0);
39499                     // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39500                     vbic(al,
39501                          kDataTypeValueNone,
39502                          DRegister(rd),
39503                          DRegister(rn),
39504                          DRegister(rm));
39505                     break;
39506                   }
39507                   case 0x00200000: {
39508                     // 0xf2200110
39509                     if (((instr & 0x00000040) == 0x00000000) &&
39510                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
39511                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
39512                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
39513                           (Uint32(instr) & Uint32(0xf))))) {
39514                       unsigned rd = ExtractDRegister(instr, 22, 12);
39515                       unsigned rm = ExtractDRegister(instr, 7, 16);
39516                       // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
39517                       vmov(al,
39518                            kDataTypeValueNone,
39519                            DRegister(rd),
39520                            DRegister(rm));
39521                       return;
39522                     }
39523                     unsigned rd = ExtractDRegister(instr, 22, 12);
39524                     unsigned rn = ExtractDRegister(instr, 7, 16);
39525                     unsigned rm = ExtractDRegister(instr, 5, 0);
39526                     // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39527                     vorr(al,
39528                          kDataTypeValueNone,
39529                          DRegister(rd),
39530                          DRegister(rn),
39531                          DRegister(rm));
39532                     break;
39533                   }
39534                   case 0x00300000: {
39535                     // 0xf2300110
39536                     unsigned rd = ExtractDRegister(instr, 22, 12);
39537                     unsigned rn = ExtractDRegister(instr, 7, 16);
39538                     unsigned rm = ExtractDRegister(instr, 5, 0);
39539                     // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39540                     vorn(al,
39541                          kDataTypeValueNone,
39542                          DRegister(rd),
39543                          DRegister(rn),
39544                          DRegister(rm));
39545                     break;
39546                   }
39547                   case 0x01000000: {
39548                     // 0xf3000110
39549                     unsigned rd = ExtractDRegister(instr, 22, 12);
39550                     unsigned rn = ExtractDRegister(instr, 7, 16);
39551                     unsigned rm = ExtractDRegister(instr, 5, 0);
39552                     // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39553                     veor(al,
39554                          kDataTypeValueNone,
39555                          DRegister(rd),
39556                          DRegister(rn),
39557                          DRegister(rm));
39558                     break;
39559                   }
39560                   case 0x01100000: {
39561                     // 0xf3100110
39562                     unsigned rd = ExtractDRegister(instr, 22, 12);
39563                     unsigned rn = ExtractDRegister(instr, 7, 16);
39564                     unsigned rm = ExtractDRegister(instr, 5, 0);
39565                     // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39566                     vbsl(al,
39567                          kDataTypeValueNone,
39568                          DRegister(rd),
39569                          DRegister(rn),
39570                          DRegister(rm));
39571                     break;
39572                   }
39573                   case 0x01200000: {
39574                     // 0xf3200110
39575                     unsigned rd = ExtractDRegister(instr, 22, 12);
39576                     unsigned rn = ExtractDRegister(instr, 7, 16);
39577                     unsigned rm = ExtractDRegister(instr, 5, 0);
39578                     // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39579                     vbit(al,
39580                          kDataTypeValueNone,
39581                          DRegister(rd),
39582                          DRegister(rn),
39583                          DRegister(rm));
39584                     break;
39585                   }
39586                   case 0x01300000: {
39587                     // 0xf3300110
39588                     unsigned rd = ExtractDRegister(instr, 22, 12);
39589                     unsigned rn = ExtractDRegister(instr, 7, 16);
39590                     unsigned rm = ExtractDRegister(instr, 5, 0);
39591                     // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39592                     vbif(al,
39593                          kDataTypeValueNone,
39594                          DRegister(rd),
39595                          DRegister(rn),
39596                          DRegister(rm));
39597                     break;
39598                   }
39599                 }
39600                 break;
39601               }
39602               case 0x00000140: {
39603                 // 0xf2000150
39604                 switch (instr & 0x01300000) {
39605                   case 0x00000000: {
39606                     // 0xf2000150
39607                     if (((instr >> 12) & 1) != 0) {
39608                       UnallocatedA32(instr);
39609                       return;
39610                     }
39611                     unsigned rd = ExtractQRegister(instr, 22, 12);
39612                     if (((instr >> 16) & 1) != 0) {
39613                       UnallocatedA32(instr);
39614                       return;
39615                     }
39616                     unsigned rn = ExtractQRegister(instr, 7, 16);
39617                     if ((instr & 1) != 0) {
39618                       UnallocatedA32(instr);
39619                       return;
39620                     }
39621                     unsigned rm = ExtractQRegister(instr, 5, 0);
39622                     // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39623                     vand(al,
39624                          kDataTypeValueNone,
39625                          QRegister(rd),
39626                          QRegister(rn),
39627                          QRegister(rm));
39628                     break;
39629                   }
39630                   case 0x00100000: {
39631                     // 0xf2100150
39632                     if (((instr >> 12) & 1) != 0) {
39633                       UnallocatedA32(instr);
39634                       return;
39635                     }
39636                     unsigned rd = ExtractQRegister(instr, 22, 12);
39637                     if (((instr >> 16) & 1) != 0) {
39638                       UnallocatedA32(instr);
39639                       return;
39640                     }
39641                     unsigned rn = ExtractQRegister(instr, 7, 16);
39642                     if ((instr & 1) != 0) {
39643                       UnallocatedA32(instr);
39644                       return;
39645                     }
39646                     unsigned rm = ExtractQRegister(instr, 5, 0);
39647                     // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39648                     vbic(al,
39649                          kDataTypeValueNone,
39650                          QRegister(rd),
39651                          QRegister(rn),
39652                          QRegister(rm));
39653                     break;
39654                   }
39655                   case 0x00200000: {
39656                     // 0xf2200150
39657                     if (((instr & 0x00000040) == 0x00000040) &&
39658                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
39659                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
39660                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
39661                           (Uint32(instr) & Uint32(0xf))))) {
39662                       if (((instr >> 12) & 1) != 0) {
39663                         UnallocatedA32(instr);
39664                         return;
39665                       }
39666                       unsigned rd = ExtractQRegister(instr, 22, 12);
39667                       if (((instr >> 16) & 1) != 0) {
39668                         UnallocatedA32(instr);
39669                         return;
39670                       }
39671                       unsigned rm = ExtractQRegister(instr, 7, 16);
39672                       // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
39673                       vmov(al,
39674                            kDataTypeValueNone,
39675                            QRegister(rd),
39676                            QRegister(rm));
39677                       return;
39678                     }
39679                     if (((instr >> 12) & 1) != 0) {
39680                       UnallocatedA32(instr);
39681                       return;
39682                     }
39683                     unsigned rd = ExtractQRegister(instr, 22, 12);
39684                     if (((instr >> 16) & 1) != 0) {
39685                       UnallocatedA32(instr);
39686                       return;
39687                     }
39688                     unsigned rn = ExtractQRegister(instr, 7, 16);
39689                     if ((instr & 1) != 0) {
39690                       UnallocatedA32(instr);
39691                       return;
39692                     }
39693                     unsigned rm = ExtractQRegister(instr, 5, 0);
39694                     // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39695                     vorr(al,
39696                          kDataTypeValueNone,
39697                          QRegister(rd),
39698                          QRegister(rn),
39699                          QRegister(rm));
39700                     break;
39701                   }
39702                   case 0x00300000: {
39703                     // 0xf2300150
39704                     if (((instr >> 12) & 1) != 0) {
39705                       UnallocatedA32(instr);
39706                       return;
39707                     }
39708                     unsigned rd = ExtractQRegister(instr, 22, 12);
39709                     if (((instr >> 16) & 1) != 0) {
39710                       UnallocatedA32(instr);
39711                       return;
39712                     }
39713                     unsigned rn = ExtractQRegister(instr, 7, 16);
39714                     if ((instr & 1) != 0) {
39715                       UnallocatedA32(instr);
39716                       return;
39717                     }
39718                     unsigned rm = ExtractQRegister(instr, 5, 0);
39719                     // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39720                     vorn(al,
39721                          kDataTypeValueNone,
39722                          QRegister(rd),
39723                          QRegister(rn),
39724                          QRegister(rm));
39725                     break;
39726                   }
39727                   case 0x01000000: {
39728                     // 0xf3000150
39729                     if (((instr >> 12) & 1) != 0) {
39730                       UnallocatedA32(instr);
39731                       return;
39732                     }
39733                     unsigned rd = ExtractQRegister(instr, 22, 12);
39734                     if (((instr >> 16) & 1) != 0) {
39735                       UnallocatedA32(instr);
39736                       return;
39737                     }
39738                     unsigned rn = ExtractQRegister(instr, 7, 16);
39739                     if ((instr & 1) != 0) {
39740                       UnallocatedA32(instr);
39741                       return;
39742                     }
39743                     unsigned rm = ExtractQRegister(instr, 5, 0);
39744                     // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39745                     veor(al,
39746                          kDataTypeValueNone,
39747                          QRegister(rd),
39748                          QRegister(rn),
39749                          QRegister(rm));
39750                     break;
39751                   }
39752                   case 0x01100000: {
39753                     // 0xf3100150
39754                     if (((instr >> 12) & 1) != 0) {
39755                       UnallocatedA32(instr);
39756                       return;
39757                     }
39758                     unsigned rd = ExtractQRegister(instr, 22, 12);
39759                     if (((instr >> 16) & 1) != 0) {
39760                       UnallocatedA32(instr);
39761                       return;
39762                     }
39763                     unsigned rn = ExtractQRegister(instr, 7, 16);
39764                     if ((instr & 1) != 0) {
39765                       UnallocatedA32(instr);
39766                       return;
39767                     }
39768                     unsigned rm = ExtractQRegister(instr, 5, 0);
39769                     // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39770                     vbsl(al,
39771                          kDataTypeValueNone,
39772                          QRegister(rd),
39773                          QRegister(rn),
39774                          QRegister(rm));
39775                     break;
39776                   }
39777                   case 0x01200000: {
39778                     // 0xf3200150
39779                     if (((instr >> 12) & 1) != 0) {
39780                       UnallocatedA32(instr);
39781                       return;
39782                     }
39783                     unsigned rd = ExtractQRegister(instr, 22, 12);
39784                     if (((instr >> 16) & 1) != 0) {
39785                       UnallocatedA32(instr);
39786                       return;
39787                     }
39788                     unsigned rn = ExtractQRegister(instr, 7, 16);
39789                     if ((instr & 1) != 0) {
39790                       UnallocatedA32(instr);
39791                       return;
39792                     }
39793                     unsigned rm = ExtractQRegister(instr, 5, 0);
39794                     // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39795                     vbit(al,
39796                          kDataTypeValueNone,
39797                          QRegister(rd),
39798                          QRegister(rn),
39799                          QRegister(rm));
39800                     break;
39801                   }
39802                   case 0x01300000: {
39803                     // 0xf3300150
39804                     if (((instr >> 12) & 1) != 0) {
39805                       UnallocatedA32(instr);
39806                       return;
39807                     }
39808                     unsigned rd = ExtractQRegister(instr, 22, 12);
39809                     if (((instr >> 16) & 1) != 0) {
39810                       UnallocatedA32(instr);
39811                       return;
39812                     }
39813                     unsigned rn = ExtractQRegister(instr, 7, 16);
39814                     if ((instr & 1) != 0) {
39815                       UnallocatedA32(instr);
39816                       return;
39817                     }
39818                     unsigned rm = ExtractQRegister(instr, 5, 0);
39819                     // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39820                     vbif(al,
39821                          kDataTypeValueNone,
39822                          QRegister(rd),
39823                          QRegister(rn),
39824                          QRegister(rm));
39825                     break;
39826                   }
39827                 }
39828                 break;
39829               }
39830               case 0x00000200: {
39831                 // 0xf2000210
39832                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39833                                                  ((instr >> 22) & 0x4));
39834                 if (dt.Is(kDataTypeValueInvalid)) {
39835                   UnallocatedA32(instr);
39836                   return;
39837                 }
39838                 unsigned rd = ExtractDRegister(instr, 22, 12);
39839                 unsigned rn = ExtractDRegister(instr, 7, 16);
39840                 unsigned rm = ExtractDRegister(instr, 5, 0);
39841                 // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39842                 vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39843                 break;
39844               }
39845               case 0x00000240: {
39846                 // 0xf2000250
39847                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39848                                                  ((instr >> 22) & 0x4));
39849                 if (dt.Is(kDataTypeValueInvalid)) {
39850                   UnallocatedA32(instr);
39851                   return;
39852                 }
39853                 if (((instr >> 12) & 1) != 0) {
39854                   UnallocatedA32(instr);
39855                   return;
39856                 }
39857                 unsigned rd = ExtractQRegister(instr, 22, 12);
39858                 if (((instr >> 16) & 1) != 0) {
39859                   UnallocatedA32(instr);
39860                   return;
39861                 }
39862                 unsigned rn = ExtractQRegister(instr, 7, 16);
39863                 if ((instr & 1) != 0) {
39864                   UnallocatedA32(instr);
39865                   return;
39866                 }
39867                 unsigned rm = ExtractQRegister(instr, 5, 0);
39868                 // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39869                 vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39870                 break;
39871               }
39872               case 0x00000300: {
39873                 // 0xf2000310
39874                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39875                                                  ((instr >> 22) & 0x4));
39876                 if (dt.Is(kDataTypeValueInvalid)) {
39877                   UnallocatedA32(instr);
39878                   return;
39879                 }
39880                 unsigned rd = ExtractDRegister(instr, 22, 12);
39881                 unsigned rn = ExtractDRegister(instr, 7, 16);
39882                 unsigned rm = ExtractDRegister(instr, 5, 0);
39883                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39884                 vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39885                 break;
39886               }
39887               case 0x00000340: {
39888                 // 0xf2000350
39889                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39890                                                  ((instr >> 22) & 0x4));
39891                 if (dt.Is(kDataTypeValueInvalid)) {
39892                   UnallocatedA32(instr);
39893                   return;
39894                 }
39895                 if (((instr >> 12) & 1) != 0) {
39896                   UnallocatedA32(instr);
39897                   return;
39898                 }
39899                 unsigned rd = ExtractQRegister(instr, 22, 12);
39900                 if (((instr >> 16) & 1) != 0) {
39901                   UnallocatedA32(instr);
39902                   return;
39903                 }
39904                 unsigned rn = ExtractQRegister(instr, 7, 16);
39905                 if ((instr & 1) != 0) {
39906                   UnallocatedA32(instr);
39907                   return;
39908                 }
39909                 unsigned rm = ExtractQRegister(instr, 5, 0);
39910                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39911                 vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39912                 break;
39913               }
39914               case 0x00000400: {
39915                 // 0xf2000410
39916                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39917                                                  ((instr >> 22) & 0x4));
39918                 if (dt.Is(kDataTypeValueInvalid)) {
39919                   UnallocatedA32(instr);
39920                   return;
39921                 }
39922                 unsigned rd = ExtractDRegister(instr, 22, 12);
39923                 unsigned rm = ExtractDRegister(instr, 5, 0);
39924                 unsigned rn = ExtractDRegister(instr, 7, 16);
39925                 // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
39926                 vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
39927                 break;
39928               }
39929               case 0x00000440: {
39930                 // 0xf2000450
39931                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39932                                                  ((instr >> 22) & 0x4));
39933                 if (dt.Is(kDataTypeValueInvalid)) {
39934                   UnallocatedA32(instr);
39935                   return;
39936                 }
39937                 if (((instr >> 12) & 1) != 0) {
39938                   UnallocatedA32(instr);
39939                   return;
39940                 }
39941                 unsigned rd = ExtractQRegister(instr, 22, 12);
39942                 if ((instr & 1) != 0) {
39943                   UnallocatedA32(instr);
39944                   return;
39945                 }
39946                 unsigned rm = ExtractQRegister(instr, 5, 0);
39947                 if (((instr >> 16) & 1) != 0) {
39948                   UnallocatedA32(instr);
39949                   return;
39950                 }
39951                 unsigned rn = ExtractQRegister(instr, 7, 16);
39952                 // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
39953                 vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
39954                 break;
39955               }
39956               case 0x00000500: {
39957                 // 0xf2000510
39958                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39959                                                  ((instr >> 22) & 0x4));
39960                 if (dt.Is(kDataTypeValueInvalid)) {
39961                   UnallocatedA32(instr);
39962                   return;
39963                 }
39964                 unsigned rd = ExtractDRegister(instr, 22, 12);
39965                 unsigned rm = ExtractDRegister(instr, 5, 0);
39966                 unsigned rn = ExtractDRegister(instr, 7, 16);
39967                 // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
39968                 vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
39969                 break;
39970               }
39971               case 0x00000540: {
39972                 // 0xf2000550
39973                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39974                                                  ((instr >> 22) & 0x4));
39975                 if (dt.Is(kDataTypeValueInvalid)) {
39976                   UnallocatedA32(instr);
39977                   return;
39978                 }
39979                 if (((instr >> 12) & 1) != 0) {
39980                   UnallocatedA32(instr);
39981                   return;
39982                 }
39983                 unsigned rd = ExtractQRegister(instr, 22, 12);
39984                 if ((instr & 1) != 0) {
39985                   UnallocatedA32(instr);
39986                   return;
39987                 }
39988                 unsigned rm = ExtractQRegister(instr, 5, 0);
39989                 if (((instr >> 16) & 1) != 0) {
39990                   UnallocatedA32(instr);
39991                   return;
39992                 }
39993                 unsigned rn = ExtractQRegister(instr, 7, 16);
39994                 // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
39995                 vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
39996                 break;
39997               }
39998               case 0x00000600: {
39999                 // 0xf2000610
40000                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40001                                                  ((instr >> 22) & 0x4));
40002                 if (dt.Is(kDataTypeValueInvalid)) {
40003                   UnallocatedA32(instr);
40004                   return;
40005                 }
40006                 unsigned rd = ExtractDRegister(instr, 22, 12);
40007                 unsigned rn = ExtractDRegister(instr, 7, 16);
40008                 unsigned rm = ExtractDRegister(instr, 5, 0);
40009                 // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40010                 vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40011                 break;
40012               }
40013               case 0x00000640: {
40014                 // 0xf2000650
40015                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40016                                                  ((instr >> 22) & 0x4));
40017                 if (dt.Is(kDataTypeValueInvalid)) {
40018                   UnallocatedA32(instr);
40019                   return;
40020                 }
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                 // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40037                 vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40038                 break;
40039               }
40040               case 0x00000700: {
40041                 // 0xf2000710
40042                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40043                                                  ((instr >> 22) & 0x4));
40044                 if (dt.Is(kDataTypeValueInvalid)) {
40045                   UnallocatedA32(instr);
40046                   return;
40047                 }
40048                 unsigned rd = ExtractDRegister(instr, 22, 12);
40049                 unsigned rn = ExtractDRegister(instr, 7, 16);
40050                 unsigned rm = ExtractDRegister(instr, 5, 0);
40051                 // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1
40052                 vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40053                 break;
40054               }
40055               case 0x00000740: {
40056                 // 0xf2000750
40057                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40058                                                  ((instr >> 22) & 0x4));
40059                 if (dt.Is(kDataTypeValueInvalid)) {
40060                   UnallocatedA32(instr);
40061                   return;
40062                 }
40063                 if (((instr >> 12) & 1) != 0) {
40064                   UnallocatedA32(instr);
40065                   return;
40066                 }
40067                 unsigned rd = ExtractQRegister(instr, 22, 12);
40068                 if (((instr >> 16) & 1) != 0) {
40069                   UnallocatedA32(instr);
40070                   return;
40071                 }
40072                 unsigned rn = ExtractQRegister(instr, 7, 16);
40073                 if ((instr & 1) != 0) {
40074                   UnallocatedA32(instr);
40075                   return;
40076                 }
40077                 unsigned rm = ExtractQRegister(instr, 5, 0);
40078                 // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1
40079                 vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40080                 break;
40081               }
40082               case 0x00000800: {
40083                 // 0xf2000810
40084                 switch (instr & 0x01000000) {
40085                   case 0x00000000: {
40086                     // 0xf2000810
40087                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
40088                     if (dt.Is(kDataTypeValueInvalid)) {
40089                       UnallocatedA32(instr);
40090                       return;
40091                     }
40092                     unsigned rd = ExtractDRegister(instr, 22, 12);
40093                     unsigned rn = ExtractDRegister(instr, 7, 16);
40094                     unsigned rm = ExtractDRegister(instr, 5, 0);
40095                     // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40096                     vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40097                     break;
40098                   }
40099                   case 0x01000000: {
40100                     // 0xf3000810
40101                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40102                     if (dt.Is(kDataTypeValueInvalid)) {
40103                       UnallocatedA32(instr);
40104                       return;
40105                     }
40106                     unsigned rd = ExtractDRegister(instr, 22, 12);
40107                     unsigned rn = ExtractDRegister(instr, 7, 16);
40108                     unsigned rm = ExtractDRegister(instr, 5, 0);
40109                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40110                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40111                     break;
40112                   }
40113                 }
40114                 break;
40115               }
40116               case 0x00000840: {
40117                 // 0xf2000850
40118                 switch (instr & 0x01000000) {
40119                   case 0x00000000: {
40120                     // 0xf2000850
40121                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
40122                     if (dt.Is(kDataTypeValueInvalid)) {
40123                       UnallocatedA32(instr);
40124                       return;
40125                     }
40126                     if (((instr >> 12) & 1) != 0) {
40127                       UnallocatedA32(instr);
40128                       return;
40129                     }
40130                     unsigned rd = ExtractQRegister(instr, 22, 12);
40131                     if (((instr >> 16) & 1) != 0) {
40132                       UnallocatedA32(instr);
40133                       return;
40134                     }
40135                     unsigned rn = ExtractQRegister(instr, 7, 16);
40136                     if ((instr & 1) != 0) {
40137                       UnallocatedA32(instr);
40138                       return;
40139                     }
40140                     unsigned rm = ExtractQRegister(instr, 5, 0);
40141                     // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40142                     vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40143                     break;
40144                   }
40145                   case 0x01000000: {
40146                     // 0xf3000850
40147                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40148                     if (dt.Is(kDataTypeValueInvalid)) {
40149                       UnallocatedA32(instr);
40150                       return;
40151                     }
40152                     if (((instr >> 12) & 1) != 0) {
40153                       UnallocatedA32(instr);
40154                       return;
40155                     }
40156                     unsigned rd = ExtractQRegister(instr, 22, 12);
40157                     if (((instr >> 16) & 1) != 0) {
40158                       UnallocatedA32(instr);
40159                       return;
40160                     }
40161                     unsigned rn = ExtractQRegister(instr, 7, 16);
40162                     if ((instr & 1) != 0) {
40163                       UnallocatedA32(instr);
40164                       return;
40165                     }
40166                     unsigned rm = ExtractQRegister(instr, 5, 0);
40167                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40168                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40169                     break;
40170                   }
40171                 }
40172                 break;
40173               }
40174               case 0x00000900: {
40175                 // 0xf2000910
40176                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
40177                                                   ((instr >> 22) & 0x4));
40178                 if (dt.Is(kDataTypeValueInvalid)) {
40179                   UnallocatedA32(instr);
40180                   return;
40181                 }
40182                 unsigned rd = ExtractDRegister(instr, 22, 12);
40183                 unsigned rn = ExtractDRegister(instr, 7, 16);
40184                 unsigned rm = ExtractDRegister(instr, 5, 0);
40185                 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40186                 vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40187                 break;
40188               }
40189               case 0x00000940: {
40190                 // 0xf2000950
40191                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
40192                                                   ((instr >> 22) & 0x4));
40193                 if (dt.Is(kDataTypeValueInvalid)) {
40194                   UnallocatedA32(instr);
40195                   return;
40196                 }
40197                 if (((instr >> 12) & 1) != 0) {
40198                   UnallocatedA32(instr);
40199                   return;
40200                 }
40201                 unsigned rd = ExtractQRegister(instr, 22, 12);
40202                 if (((instr >> 16) & 1) != 0) {
40203                   UnallocatedA32(instr);
40204                   return;
40205                 }
40206                 unsigned rn = ExtractQRegister(instr, 7, 16);
40207                 if ((instr & 1) != 0) {
40208                   UnallocatedA32(instr);
40209                   return;
40210                 }
40211                 unsigned rm = ExtractQRegister(instr, 5, 0);
40212                 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40213                 vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40214                 break;
40215               }
40216               case 0x00000a00: {
40217                 // 0xf2000a10
40218                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40219                                                  ((instr >> 22) & 0x4));
40220                 if (dt.Is(kDataTypeValueInvalid)) {
40221                   UnallocatedA32(instr);
40222                   return;
40223                 }
40224                 unsigned rd = ExtractDRegister(instr, 22, 12);
40225                 unsigned rn = ExtractDRegister(instr, 7, 16);
40226                 unsigned rm = ExtractDRegister(instr, 5, 0);
40227                 // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40228                 vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40229                 break;
40230               }
40231               case 0x00000b00: {
40232                 // 0xf2000b10
40233                 if ((instr & 0x01000000) == 0x00000000) {
40234                   DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40235                   if (dt.Is(kDataTypeValueInvalid)) {
40236                     UnallocatedA32(instr);
40237                     return;
40238                   }
40239                   unsigned rd = ExtractDRegister(instr, 22, 12);
40240                   unsigned rn = ExtractDRegister(instr, 7, 16);
40241                   unsigned rm = ExtractDRegister(instr, 5, 0);
40242                   // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40243                   vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40244                 } else {
40245                   UnallocatedA32(instr);
40246                 }
40247                 break;
40248               }
40249               case 0x00000c00: {
40250                 // 0xf2000c10
40251                 switch (instr & 0x01300000) {
40252                   case 0x00000000: {
40253                     // 0xf2000c10
40254                     unsigned rd = ExtractDRegister(instr, 22, 12);
40255                     unsigned rn = ExtractDRegister(instr, 7, 16);
40256                     unsigned rm = ExtractDRegister(instr, 5, 0);
40257                     // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40258                     vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40259                     break;
40260                   }
40261                   case 0x00200000: {
40262                     // 0xf2200c10
40263                     unsigned rd = ExtractDRegister(instr, 22, 12);
40264                     unsigned rn = ExtractDRegister(instr, 7, 16);
40265                     unsigned rm = ExtractDRegister(instr, 5, 0);
40266                     // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40267                     vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40268                     break;
40269                   }
40270                   default:
40271                     UnallocatedA32(instr);
40272                     break;
40273                 }
40274                 break;
40275               }
40276               case 0x00000c40: {
40277                 // 0xf2000c50
40278                 switch (instr & 0x01300000) {
40279                   case 0x00000000: {
40280                     // 0xf2000c50
40281                     if (((instr >> 12) & 1) != 0) {
40282                       UnallocatedA32(instr);
40283                       return;
40284                     }
40285                     unsigned rd = ExtractQRegister(instr, 22, 12);
40286                     if (((instr >> 16) & 1) != 0) {
40287                       UnallocatedA32(instr);
40288                       return;
40289                     }
40290                     unsigned rn = ExtractQRegister(instr, 7, 16);
40291                     if ((instr & 1) != 0) {
40292                       UnallocatedA32(instr);
40293                       return;
40294                     }
40295                     unsigned rm = ExtractQRegister(instr, 5, 0);
40296                     // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40297                     vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40298                     break;
40299                   }
40300                   case 0x00200000: {
40301                     // 0xf2200c50
40302                     if (((instr >> 12) & 1) != 0) {
40303                       UnallocatedA32(instr);
40304                       return;
40305                     }
40306                     unsigned rd = ExtractQRegister(instr, 22, 12);
40307                     if (((instr >> 16) & 1) != 0) {
40308                       UnallocatedA32(instr);
40309                       return;
40310                     }
40311                     unsigned rn = ExtractQRegister(instr, 7, 16);
40312                     if ((instr & 1) != 0) {
40313                       UnallocatedA32(instr);
40314                       return;
40315                     }
40316                     unsigned rm = ExtractQRegister(instr, 5, 0);
40317                     // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40318                     vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40319                     break;
40320                   }
40321                   default:
40322                     UnallocatedA32(instr);
40323                     break;
40324                 }
40325                 break;
40326               }
40327               case 0x00000d00: {
40328                 // 0xf2000d10
40329                 switch (instr & 0x01300000) {
40330                   case 0x00000000: {
40331                     // 0xf2000d10
40332                     unsigned rd = ExtractDRegister(instr, 22, 12);
40333                     unsigned rn = ExtractDRegister(instr, 7, 16);
40334                     unsigned rm = ExtractDRegister(instr, 5, 0);
40335                     // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40336                     vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40337                     break;
40338                   }
40339                   case 0x00200000: {
40340                     // 0xf2200d10
40341                     unsigned rd = ExtractDRegister(instr, 22, 12);
40342                     unsigned rn = ExtractDRegister(instr, 7, 16);
40343                     unsigned rm = ExtractDRegister(instr, 5, 0);
40344                     // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40345                     vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40346                     break;
40347                   }
40348                   case 0x01000000: {
40349                     // 0xf3000d10
40350                     unsigned rd = ExtractDRegister(instr, 22, 12);
40351                     unsigned rn = ExtractDRegister(instr, 7, 16);
40352                     unsigned rm = ExtractDRegister(instr, 5, 0);
40353                     // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40354                     vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40355                     break;
40356                   }
40357                   default:
40358                     UnallocatedA32(instr);
40359                     break;
40360                 }
40361                 break;
40362               }
40363               case 0x00000d40: {
40364                 // 0xf2000d50
40365                 switch (instr & 0x01300000) {
40366                   case 0x00000000: {
40367                     // 0xf2000d50
40368                     if (((instr >> 12) & 1) != 0) {
40369                       UnallocatedA32(instr);
40370                       return;
40371                     }
40372                     unsigned rd = ExtractQRegister(instr, 22, 12);
40373                     if (((instr >> 16) & 1) != 0) {
40374                       UnallocatedA32(instr);
40375                       return;
40376                     }
40377                     unsigned rn = ExtractQRegister(instr, 7, 16);
40378                     if ((instr & 1) != 0) {
40379                       UnallocatedA32(instr);
40380                       return;
40381                     }
40382                     unsigned rm = ExtractQRegister(instr, 5, 0);
40383                     // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40384                     vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40385                     break;
40386                   }
40387                   case 0x00200000: {
40388                     // 0xf2200d50
40389                     if (((instr >> 12) & 1) != 0) {
40390                       UnallocatedA32(instr);
40391                       return;
40392                     }
40393                     unsigned rd = ExtractQRegister(instr, 22, 12);
40394                     if (((instr >> 16) & 1) != 0) {
40395                       UnallocatedA32(instr);
40396                       return;
40397                     }
40398                     unsigned rn = ExtractQRegister(instr, 7, 16);
40399                     if ((instr & 1) != 0) {
40400                       UnallocatedA32(instr);
40401                       return;
40402                     }
40403                     unsigned rm = ExtractQRegister(instr, 5, 0);
40404                     // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40405                     vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40406                     break;
40407                   }
40408                   case 0x01000000: {
40409                     // 0xf3000d50
40410                     if (((instr >> 12) & 1) != 0) {
40411                       UnallocatedA32(instr);
40412                       return;
40413                     }
40414                     unsigned rd = ExtractQRegister(instr, 22, 12);
40415                     if (((instr >> 16) & 1) != 0) {
40416                       UnallocatedA32(instr);
40417                       return;
40418                     }
40419                     unsigned rn = ExtractQRegister(instr, 7, 16);
40420                     if ((instr & 1) != 0) {
40421                       UnallocatedA32(instr);
40422                       return;
40423                     }
40424                     unsigned rm = ExtractQRegister(instr, 5, 0);
40425                     // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40426                     vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40427                     break;
40428                   }
40429                   default:
40430                     UnallocatedA32(instr);
40431                     break;
40432                 }
40433                 break;
40434               }
40435               case 0x00000e00: {
40436                 // 0xf2000e10
40437                 switch (instr & 0x01300000) {
40438                   case 0x01000000: {
40439                     // 0xf3000e10
40440                     unsigned rd = ExtractDRegister(instr, 22, 12);
40441                     unsigned rn = ExtractDRegister(instr, 7, 16);
40442                     unsigned rm = ExtractDRegister(instr, 5, 0);
40443                     // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40444                     vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40445                     break;
40446                   }
40447                   case 0x01200000: {
40448                     // 0xf3200e10
40449                     unsigned rd = ExtractDRegister(instr, 22, 12);
40450                     unsigned rn = ExtractDRegister(instr, 7, 16);
40451                     unsigned rm = ExtractDRegister(instr, 5, 0);
40452                     // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40453                     vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40454                     break;
40455                   }
40456                   default:
40457                     UnallocatedA32(instr);
40458                     break;
40459                 }
40460                 break;
40461               }
40462               case 0x00000e40: {
40463                 // 0xf2000e50
40464                 switch (instr & 0x01300000) {
40465                   case 0x01000000: {
40466                     // 0xf3000e50
40467                     if (((instr >> 12) & 1) != 0) {
40468                       UnallocatedA32(instr);
40469                       return;
40470                     }
40471                     unsigned rd = ExtractQRegister(instr, 22, 12);
40472                     if (((instr >> 16) & 1) != 0) {
40473                       UnallocatedA32(instr);
40474                       return;
40475                     }
40476                     unsigned rn = ExtractQRegister(instr, 7, 16);
40477                     if ((instr & 1) != 0) {
40478                       UnallocatedA32(instr);
40479                       return;
40480                     }
40481                     unsigned rm = ExtractQRegister(instr, 5, 0);
40482                     // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40483                     vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40484                     break;
40485                   }
40486                   case 0x01200000: {
40487                     // 0xf3200e50
40488                     if (((instr >> 12) & 1) != 0) {
40489                       UnallocatedA32(instr);
40490                       return;
40491                     }
40492                     unsigned rd = ExtractQRegister(instr, 22, 12);
40493                     if (((instr >> 16) & 1) != 0) {
40494                       UnallocatedA32(instr);
40495                       return;
40496                     }
40497                     unsigned rn = ExtractQRegister(instr, 7, 16);
40498                     if ((instr & 1) != 0) {
40499                       UnallocatedA32(instr);
40500                       return;
40501                     }
40502                     unsigned rm = ExtractQRegister(instr, 5, 0);
40503                     // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40504                     vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40505                     break;
40506                   }
40507                   default:
40508                     UnallocatedA32(instr);
40509                     break;
40510                 }
40511                 break;
40512               }
40513               case 0x00000f00: {
40514                 // 0xf2000f10
40515                 switch (instr & 0x01300000) {
40516                   case 0x00000000: {
40517                     // 0xf2000f10
40518                     unsigned rd = ExtractDRegister(instr, 22, 12);
40519                     unsigned rn = ExtractDRegister(instr, 7, 16);
40520                     unsigned rm = ExtractDRegister(instr, 5, 0);
40521                     // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40522                     vrecps(al,
40523                            F32,
40524                            DRegister(rd),
40525                            DRegister(rn),
40526                            DRegister(rm));
40527                     break;
40528                   }
40529                   case 0x00200000: {
40530                     // 0xf2200f10
40531                     unsigned rd = ExtractDRegister(instr, 22, 12);
40532                     unsigned rn = ExtractDRegister(instr, 7, 16);
40533                     unsigned rm = ExtractDRegister(instr, 5, 0);
40534                     // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40535                     vrsqrts(al,
40536                             F32,
40537                             DRegister(rd),
40538                             DRegister(rn),
40539                             DRegister(rm));
40540                     break;
40541                   }
40542                   case 0x01000000: {
40543                     // 0xf3000f10
40544                     unsigned rd = ExtractDRegister(instr, 22, 12);
40545                     unsigned rn = ExtractDRegister(instr, 7, 16);
40546                     unsigned rm = ExtractDRegister(instr, 5, 0);
40547                     // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40548                     vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
40549                     break;
40550                   }
40551                   case 0x01200000: {
40552                     // 0xf3200f10
40553                     unsigned rd = ExtractDRegister(instr, 22, 12);
40554                     unsigned rn = ExtractDRegister(instr, 7, 16);
40555                     unsigned rm = ExtractDRegister(instr, 5, 0);
40556                     // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40557                     vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
40558                     break;
40559                   }
40560                   default:
40561                     UnallocatedA32(instr);
40562                     break;
40563                 }
40564                 break;
40565               }
40566               case 0x00000f40: {
40567                 // 0xf2000f50
40568                 switch (instr & 0x01300000) {
40569                   case 0x00000000: {
40570                     // 0xf2000f50
40571                     if (((instr >> 12) & 1) != 0) {
40572                       UnallocatedA32(instr);
40573                       return;
40574                     }
40575                     unsigned rd = ExtractQRegister(instr, 22, 12);
40576                     if (((instr >> 16) & 1) != 0) {
40577                       UnallocatedA32(instr);
40578                       return;
40579                     }
40580                     unsigned rn = ExtractQRegister(instr, 7, 16);
40581                     if ((instr & 1) != 0) {
40582                       UnallocatedA32(instr);
40583                       return;
40584                     }
40585                     unsigned rm = ExtractQRegister(instr, 5, 0);
40586                     // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40587                     vrecps(al,
40588                            F32,
40589                            QRegister(rd),
40590                            QRegister(rn),
40591                            QRegister(rm));
40592                     break;
40593                   }
40594                   case 0x00200000: {
40595                     // 0xf2200f50
40596                     if (((instr >> 12) & 1) != 0) {
40597                       UnallocatedA32(instr);
40598                       return;
40599                     }
40600                     unsigned rd = ExtractQRegister(instr, 22, 12);
40601                     if (((instr >> 16) & 1) != 0) {
40602                       UnallocatedA32(instr);
40603                       return;
40604                     }
40605                     unsigned rn = ExtractQRegister(instr, 7, 16);
40606                     if ((instr & 1) != 0) {
40607                       UnallocatedA32(instr);
40608                       return;
40609                     }
40610                     unsigned rm = ExtractQRegister(instr, 5, 0);
40611                     // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40612                     vrsqrts(al,
40613                             F32,
40614                             QRegister(rd),
40615                             QRegister(rn),
40616                             QRegister(rm));
40617                     break;
40618                   }
40619                   case 0x01000000: {
40620                     // 0xf3000f50
40621                     if (((instr >> 12) & 1) != 0) {
40622                       UnallocatedA32(instr);
40623                       return;
40624                     }
40625                     unsigned rd = ExtractQRegister(instr, 22, 12);
40626                     if (((instr >> 16) & 1) != 0) {
40627                       UnallocatedA32(instr);
40628                       return;
40629                     }
40630                     unsigned rn = ExtractQRegister(instr, 7, 16);
40631                     if ((instr & 1) != 0) {
40632                       UnallocatedA32(instr);
40633                       return;
40634                     }
40635                     unsigned rm = ExtractQRegister(instr, 5, 0);
40636                     // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40637                     vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
40638                     break;
40639                   }
40640                   case 0x01200000: {
40641                     // 0xf3200f50
40642                     if (((instr >> 12) & 1) != 0) {
40643                       UnallocatedA32(instr);
40644                       return;
40645                     }
40646                     unsigned rd = ExtractQRegister(instr, 22, 12);
40647                     if (((instr >> 16) & 1) != 0) {
40648                       UnallocatedA32(instr);
40649                       return;
40650                     }
40651                     unsigned rn = ExtractQRegister(instr, 7, 16);
40652                     if ((instr & 1) != 0) {
40653                       UnallocatedA32(instr);
40654                       return;
40655                     }
40656                     unsigned rm = ExtractQRegister(instr, 5, 0);
40657                     // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40658                     vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
40659                     break;
40660                   }
40661                   default:
40662                     UnallocatedA32(instr);
40663                     break;
40664                 }
40665                 break;
40666               }
40667               default:
40668                 UnallocatedA32(instr);
40669                 break;
40670             }
40671             break;
40672           }
40673           case 0x00800000: {
40674             // 0xf2800000
40675             switch (instr & 0x00300000) {
40676               case 0x00300000: {
40677                 // 0xf2b00000
40678                 switch (instr & 0x01000000) {
40679                   case 0x00000000: {
40680                     // 0xf2b00000
40681                     switch (instr & 0x00000040) {
40682                       case 0x00000000: {
40683                         // 0xf2b00000
40684                         if (((instr & 0x800) == 0x800)) {
40685                           UnallocatedA32(instr);
40686                           return;
40687                         }
40688                         unsigned rd = ExtractDRegister(instr, 22, 12);
40689                         unsigned rn = ExtractDRegister(instr, 7, 16);
40690                         unsigned rm = ExtractDRegister(instr, 5, 0);
40691                         uint32_t imm = (instr >> 8) & 0xf;
40692                         // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1
40693                         vext(al,
40694                              Untyped8,
40695                              DRegister(rd),
40696                              DRegister(rn),
40697                              DRegister(rm),
40698                              imm);
40699                         break;
40700                       }
40701                       case 0x00000040: {
40702                         // 0xf2b00040
40703                         if (((instr >> 12) & 1) != 0) {
40704                           UnallocatedA32(instr);
40705                           return;
40706                         }
40707                         unsigned rd = ExtractQRegister(instr, 22, 12);
40708                         if (((instr >> 16) & 1) != 0) {
40709                           UnallocatedA32(instr);
40710                           return;
40711                         }
40712                         unsigned rn = ExtractQRegister(instr, 7, 16);
40713                         if ((instr & 1) != 0) {
40714                           UnallocatedA32(instr);
40715                           return;
40716                         }
40717                         unsigned rm = ExtractQRegister(instr, 5, 0);
40718                         uint32_t imm = (instr >> 8) & 0xf;
40719                         // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1
40720                         vext(al,
40721                              Untyped8,
40722                              QRegister(rd),
40723                              QRegister(rn),
40724                              QRegister(rm),
40725                              imm);
40726                         break;
40727                       }
40728                     }
40729                     break;
40730                   }
40731                   case 0x01000000: {
40732                     // 0xf3b00000
40733                     switch (instr & 0x00000800) {
40734                       case 0x00000000: {
40735                         // 0xf3b00000
40736                         switch (instr & 0x00030200) {
40737                           case 0x00000000: {
40738                             // 0xf3b00000
40739                             switch (instr & 0x000005c0) {
40740                               case 0x00000000: {
40741                                 // 0xf3b00000
40742                                 DataType dt =
40743                                     Dt_size_7_Decode((instr >> 18) & 0x3);
40744                                 if (dt.Is(kDataTypeValueInvalid)) {
40745                                   UnallocatedA32(instr);
40746                                   return;
40747                                 }
40748                                 unsigned rd = ExtractDRegister(instr, 22, 12);
40749                                 unsigned rm = ExtractDRegister(instr, 5, 0);
40750                                 // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40751                                 vrev64(al, dt, DRegister(rd), DRegister(rm));
40752                                 break;
40753                               }
40754                               case 0x00000040: {
40755                                 // 0xf3b00040
40756                                 DataType dt =
40757                                     Dt_size_7_Decode((instr >> 18) & 0x3);
40758                                 if (dt.Is(kDataTypeValueInvalid)) {
40759                                   UnallocatedA32(instr);
40760                                   return;
40761                                 }
40762                                 if (((instr >> 12) & 1) != 0) {
40763                                   UnallocatedA32(instr);
40764                                   return;
40765                                 }
40766                                 unsigned rd = ExtractQRegister(instr, 22, 12);
40767                                 if ((instr & 1) != 0) {
40768                                   UnallocatedA32(instr);
40769                                   return;
40770                                 }
40771                                 unsigned rm = ExtractQRegister(instr, 5, 0);
40772                                 // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40773                                 vrev64(al, dt, QRegister(rd), QRegister(rm));
40774                                 break;
40775                               }
40776                               case 0x00000080: {
40777                                 // 0xf3b00080
40778                                 DataType dt =
40779                                     Dt_size_15_Decode((instr >> 18) & 0x3);
40780                                 if (dt.Is(kDataTypeValueInvalid)) {
40781                                   UnallocatedA32(instr);
40782                                   return;
40783                                 }
40784                                 unsigned rd = ExtractDRegister(instr, 22, 12);
40785                                 unsigned rm = ExtractDRegister(instr, 5, 0);
40786                                 // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40787                                 vrev32(al, dt, DRegister(rd), DRegister(rm));
40788                                 break;
40789                               }
40790                               case 0x000000c0: {
40791                                 // 0xf3b000c0
40792                                 DataType dt =
40793                                     Dt_size_15_Decode((instr >> 18) & 0x3);
40794                                 if (dt.Is(kDataTypeValueInvalid)) {
40795                                   UnallocatedA32(instr);
40796                                   return;
40797                                 }
40798                                 if (((instr >> 12) & 1) != 0) {
40799                                   UnallocatedA32(instr);
40800                                   return;
40801                                 }
40802                                 unsigned rd = ExtractQRegister(instr, 22, 12);
40803                                 if ((instr & 1) != 0) {
40804                                   UnallocatedA32(instr);
40805                                   return;
40806                                 }
40807                                 unsigned rm = ExtractQRegister(instr, 5, 0);
40808                                 // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40809                                 vrev32(al, dt, QRegister(rd), QRegister(rm));
40810                                 break;
40811                               }
40812                               case 0x00000100: {
40813                                 // 0xf3b00100
40814                                 DataType dt =
40815                                     Dt_size_1_Decode((instr >> 18) & 0x3);
40816                                 if (dt.Is(kDataTypeValueInvalid)) {
40817                                   UnallocatedA32(instr);
40818                                   return;
40819                                 }
40820                                 unsigned rd = ExtractDRegister(instr, 22, 12);
40821                                 unsigned rm = ExtractDRegister(instr, 5, 0);
40822                                 // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40823                                 vrev16(al, dt, DRegister(rd), DRegister(rm));
40824                                 break;
40825                               }
40826                               case 0x00000140: {
40827                                 // 0xf3b00140
40828                                 DataType dt =
40829                                     Dt_size_1_Decode((instr >> 18) & 0x3);
40830                                 if (dt.Is(kDataTypeValueInvalid)) {
40831                                   UnallocatedA32(instr);
40832                                   return;
40833                                 }
40834                                 if (((instr >> 12) & 1) != 0) {
40835                                   UnallocatedA32(instr);
40836                                   return;
40837                                 }
40838                                 unsigned rd = ExtractQRegister(instr, 22, 12);
40839                                 if ((instr & 1) != 0) {
40840                                   UnallocatedA32(instr);
40841                                   return;
40842                                 }
40843                                 unsigned rm = ExtractQRegister(instr, 5, 0);
40844                                 // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40845                                 vrev16(al, dt, QRegister(rd), QRegister(rm));
40846                                 break;
40847                               }
40848                               case 0x00000400: {
40849                                 // 0xf3b00400
40850                                 DataType dt =
40851                                     Dt_size_5_Decode((instr >> 18) & 0x3);
40852                                 if (dt.Is(kDataTypeValueInvalid)) {
40853                                   UnallocatedA32(instr);
40854                                   return;
40855                                 }
40856                                 unsigned rd = ExtractDRegister(instr, 22, 12);
40857                                 unsigned rm = ExtractDRegister(instr, 5, 0);
40858                                 // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40859                                 vcls(al, dt, DRegister(rd), DRegister(rm));
40860                                 break;
40861                               }
40862                               case 0x00000440: {
40863                                 // 0xf3b00440
40864                                 DataType dt =
40865                                     Dt_size_5_Decode((instr >> 18) & 0x3);
40866                                 if (dt.Is(kDataTypeValueInvalid)) {
40867                                   UnallocatedA32(instr);
40868                                   return;
40869                                 }
40870                                 if (((instr >> 12) & 1) != 0) {
40871                                   UnallocatedA32(instr);
40872                                   return;
40873                                 }
40874                                 unsigned rd = ExtractQRegister(instr, 22, 12);
40875                                 if ((instr & 1) != 0) {
40876                                   UnallocatedA32(instr);
40877                                   return;
40878                                 }
40879                                 unsigned rm = ExtractQRegister(instr, 5, 0);
40880                                 // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40881                                 vcls(al, dt, QRegister(rd), QRegister(rm));
40882                                 break;
40883                               }
40884                               case 0x00000480: {
40885                                 // 0xf3b00480
40886                                 DataType dt =
40887                                     Dt_size_4_Decode((instr >> 18) & 0x3);
40888                                 if (dt.Is(kDataTypeValueInvalid)) {
40889                                   UnallocatedA32(instr);
40890                                   return;
40891                                 }
40892                                 unsigned rd = ExtractDRegister(instr, 22, 12);
40893                                 unsigned rm = ExtractDRegister(instr, 5, 0);
40894                                 // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40895                                 vclz(al, dt, DRegister(rd), DRegister(rm));
40896                                 break;
40897                               }
40898                               case 0x000004c0: {
40899                                 // 0xf3b004c0
40900                                 DataType dt =
40901                                     Dt_size_4_Decode((instr >> 18) & 0x3);
40902                                 if (dt.Is(kDataTypeValueInvalid)) {
40903                                   UnallocatedA32(instr);
40904                                   return;
40905                                 }
40906                                 if (((instr >> 12) & 1) != 0) {
40907                                   UnallocatedA32(instr);
40908                                   return;
40909                                 }
40910                                 unsigned rd = ExtractQRegister(instr, 22, 12);
40911                                 if ((instr & 1) != 0) {
40912                                   UnallocatedA32(instr);
40913                                   return;
40914                                 }
40915                                 unsigned rm = ExtractQRegister(instr, 5, 0);
40916                                 // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40917                                 vclz(al, dt, QRegister(rd), QRegister(rm));
40918                                 break;
40919                               }
40920                               case 0x00000500: {
40921                                 // 0xf3b00500
40922                                 if ((instr & 0x000c0000) == 0x00000000) {
40923                                   unsigned rd = ExtractDRegister(instr, 22, 12);
40924                                   unsigned rm = ExtractDRegister(instr, 5, 0);
40925                                   // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1
40926                                   vcnt(al,
40927                                        Untyped8,
40928                                        DRegister(rd),
40929                                        DRegister(rm));
40930                                 } else {
40931                                   UnallocatedA32(instr);
40932                                 }
40933                                 break;
40934                               }
40935                               case 0x00000540: {
40936                                 // 0xf3b00540
40937                                 if ((instr & 0x000c0000) == 0x00000000) {
40938                                   if (((instr >> 12) & 1) != 0) {
40939                                     UnallocatedA32(instr);
40940                                     return;
40941                                   }
40942                                   unsigned rd = ExtractQRegister(instr, 22, 12);
40943                                   if ((instr & 1) != 0) {
40944                                     UnallocatedA32(instr);
40945                                     return;
40946                                   }
40947                                   unsigned rm = ExtractQRegister(instr, 5, 0);
40948                                   // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1
40949                                   vcnt(al,
40950                                        Untyped8,
40951                                        QRegister(rd),
40952                                        QRegister(rm));
40953                                 } else {
40954                                   UnallocatedA32(instr);
40955                                 }
40956                                 break;
40957                               }
40958                               case 0x00000580: {
40959                                 // 0xf3b00580
40960                                 if ((instr & 0x000c0000) == 0x00000000) {
40961                                   unsigned rd = ExtractDRegister(instr, 22, 12);
40962                                   unsigned rm = ExtractDRegister(instr, 5, 0);
40963                                   // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
40964                                   vmvn(al,
40965                                        kDataTypeValueNone,
40966                                        DRegister(rd),
40967                                        DRegister(rm));
40968                                 } else {
40969                                   UnallocatedA32(instr);
40970                                 }
40971                                 break;
40972                               }
40973                               case 0x000005c0: {
40974                                 // 0xf3b005c0
40975                                 if ((instr & 0x000c0000) == 0x00000000) {
40976                                   if (((instr >> 12) & 1) != 0) {
40977                                     UnallocatedA32(instr);
40978                                     return;
40979                                   }
40980                                   unsigned rd = ExtractQRegister(instr, 22, 12);
40981                                   if ((instr & 1) != 0) {
40982                                     UnallocatedA32(instr);
40983                                     return;
40984                                   }
40985                                   unsigned rm = ExtractQRegister(instr, 5, 0);
40986                                   // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
40987                                   vmvn(al,
40988                                        kDataTypeValueNone,
40989                                        QRegister(rd),
40990                                        QRegister(rm));
40991                                 } else {
40992                                   UnallocatedA32(instr);
40993                                 }
40994                                 break;
40995                               }
40996                               default:
40997                                 UnallocatedA32(instr);
40998                                 break;
40999                             }
41000                             break;
41001                           }
41002                           case 0x00000200: {
41003                             // 0xf3b00200
41004                             switch (instr & 0x00000540) {
41005                               case 0x00000000: {
41006                                 // 0xf3b00200
41007                                 DataType dt =
41008                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41009                                                         ((instr >> 5) & 0x4));
41010                                 if (dt.Is(kDataTypeValueInvalid)) {
41011                                   UnallocatedA32(instr);
41012                                   return;
41013                                 }
41014                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41015                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41016                                 // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41017                                 vpaddl(al, dt, DRegister(rd), DRegister(rm));
41018                                 break;
41019                               }
41020                               case 0x00000040: {
41021                                 // 0xf3b00240
41022                                 DataType dt =
41023                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41024                                                         ((instr >> 5) & 0x4));
41025                                 if (dt.Is(kDataTypeValueInvalid)) {
41026                                   UnallocatedA32(instr);
41027                                   return;
41028                                 }
41029                                 if (((instr >> 12) & 1) != 0) {
41030                                   UnallocatedA32(instr);
41031                                   return;
41032                                 }
41033                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41034                                 if ((instr & 1) != 0) {
41035                                   UnallocatedA32(instr);
41036                                   return;
41037                                 }
41038                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41039                                 // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41040                                 vpaddl(al, dt, QRegister(rd), QRegister(rm));
41041                                 break;
41042                               }
41043                               case 0x00000100: {
41044                                 // 0xf3b00300
41045                                 switch (instr & 0x00000080) {
41046                                   case 0x00000000: {
41047                                     // 0xf3b00300
41048                                     UnimplementedA32("AESE", instr);
41049                                     break;
41050                                   }
41051                                   case 0x00000080: {
41052                                     // 0xf3b00380
41053                                     UnimplementedA32("AESMC", instr);
41054                                     break;
41055                                   }
41056                                 }
41057                                 break;
41058                               }
41059                               case 0x00000140: {
41060                                 // 0xf3b00340
41061                                 switch (instr & 0x00000080) {
41062                                   case 0x00000000: {
41063                                     // 0xf3b00340
41064                                     UnimplementedA32("AESD", instr);
41065                                     break;
41066                                   }
41067                                   case 0x00000080: {
41068                                     // 0xf3b003c0
41069                                     UnimplementedA32("AESIMC", instr);
41070                                     break;
41071                                   }
41072                                 }
41073                                 break;
41074                               }
41075                               case 0x00000400: {
41076                                 // 0xf3b00600
41077                                 DataType dt =
41078                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41079                                                         ((instr >> 5) & 0x4));
41080                                 if (dt.Is(kDataTypeValueInvalid)) {
41081                                   UnallocatedA32(instr);
41082                                   return;
41083                                 }
41084                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41085                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41086                                 // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41087                                 vpadal(al, dt, DRegister(rd), DRegister(rm));
41088                                 break;
41089                               }
41090                               case 0x00000440: {
41091                                 // 0xf3b00640
41092                                 DataType dt =
41093                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41094                                                         ((instr >> 5) & 0x4));
41095                                 if (dt.Is(kDataTypeValueInvalid)) {
41096                                   UnallocatedA32(instr);
41097                                   return;
41098                                 }
41099                                 if (((instr >> 12) & 1) != 0) {
41100                                   UnallocatedA32(instr);
41101                                   return;
41102                                 }
41103                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41104                                 if ((instr & 1) != 0) {
41105                                   UnallocatedA32(instr);
41106                                   return;
41107                                 }
41108                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41109                                 // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41110                                 vpadal(al, dt, QRegister(rd), QRegister(rm));
41111                                 break;
41112                               }
41113                               case 0x00000500: {
41114                                 // 0xf3b00700
41115                                 switch (instr & 0x00000080) {
41116                                   case 0x00000000: {
41117                                     // 0xf3b00700
41118                                     DataType dt =
41119                                         Dt_size_5_Decode((instr >> 18) & 0x3);
41120                                     if (dt.Is(kDataTypeValueInvalid)) {
41121                                       UnallocatedA32(instr);
41122                                       return;
41123                                     }
41124                                     unsigned rd =
41125                                         ExtractDRegister(instr, 22, 12);
41126                                     unsigned rm = ExtractDRegister(instr, 5, 0);
41127                                     // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41128                                     vqabs(al, dt, DRegister(rd), DRegister(rm));
41129                                     break;
41130                                   }
41131                                   case 0x00000080: {
41132                                     // 0xf3b00780
41133                                     DataType dt =
41134                                         Dt_size_5_Decode((instr >> 18) & 0x3);
41135                                     if (dt.Is(kDataTypeValueInvalid)) {
41136                                       UnallocatedA32(instr);
41137                                       return;
41138                                     }
41139                                     unsigned rd =
41140                                         ExtractDRegister(instr, 22, 12);
41141                                     unsigned rm = ExtractDRegister(instr, 5, 0);
41142                                     // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41143                                     vqneg(al, dt, DRegister(rd), DRegister(rm));
41144                                     break;
41145                                   }
41146                                 }
41147                                 break;
41148                               }
41149                               case 0x00000540: {
41150                                 // 0xf3b00740
41151                                 switch (instr & 0x00000080) {
41152                                   case 0x00000000: {
41153                                     // 0xf3b00740
41154                                     DataType dt =
41155                                         Dt_size_5_Decode((instr >> 18) & 0x3);
41156                                     if (dt.Is(kDataTypeValueInvalid)) {
41157                                       UnallocatedA32(instr);
41158                                       return;
41159                                     }
41160                                     if (((instr >> 12) & 1) != 0) {
41161                                       UnallocatedA32(instr);
41162                                       return;
41163                                     }
41164                                     unsigned rd =
41165                                         ExtractQRegister(instr, 22, 12);
41166                                     if ((instr & 1) != 0) {
41167                                       UnallocatedA32(instr);
41168                                       return;
41169                                     }
41170                                     unsigned rm = ExtractQRegister(instr, 5, 0);
41171                                     // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41172                                     vqabs(al, dt, QRegister(rd), QRegister(rm));
41173                                     break;
41174                                   }
41175                                   case 0x00000080: {
41176                                     // 0xf3b007c0
41177                                     DataType dt =
41178                                         Dt_size_5_Decode((instr >> 18) & 0x3);
41179                                     if (dt.Is(kDataTypeValueInvalid)) {
41180                                       UnallocatedA32(instr);
41181                                       return;
41182                                     }
41183                                     if (((instr >> 12) & 1) != 0) {
41184                                       UnallocatedA32(instr);
41185                                       return;
41186                                     }
41187                                     unsigned rd =
41188                                         ExtractQRegister(instr, 22, 12);
41189                                     if ((instr & 1) != 0) {
41190                                       UnallocatedA32(instr);
41191                                       return;
41192                                     }
41193                                     unsigned rm = ExtractQRegister(instr, 5, 0);
41194                                     // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41195                                     vqneg(al, dt, QRegister(rd), QRegister(rm));
41196                                     break;
41197                                   }
41198                                 }
41199                                 break;
41200                               }
41201                             }
41202                             break;
41203                           }
41204                           case 0x00010000: {
41205                             // 0xf3b10000
41206                             switch (instr & 0x000001c0) {
41207                               case 0x00000000: {
41208                                 // 0xf3b10000
41209                                 DataType dt =
41210                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41211                                                        ((instr >> 8) & 0x4));
41212                                 if (dt.Is(kDataTypeValueInvalid)) {
41213                                   UnallocatedA32(instr);
41214                                   return;
41215                                 }
41216                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41217                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41218                                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41219                                 vcgt(al,
41220                                      dt,
41221                                      DRegister(rd),
41222                                      DRegister(rm),
41223                                      UINT32_C(0));
41224                                 break;
41225                               }
41226                               case 0x00000040: {
41227                                 // 0xf3b10040
41228                                 DataType dt =
41229                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41230                                                        ((instr >> 8) & 0x4));
41231                                 if (dt.Is(kDataTypeValueInvalid)) {
41232                                   UnallocatedA32(instr);
41233                                   return;
41234                                 }
41235                                 if (((instr >> 12) & 1) != 0) {
41236                                   UnallocatedA32(instr);
41237                                   return;
41238                                 }
41239                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41240                                 if ((instr & 1) != 0) {
41241                                   UnallocatedA32(instr);
41242                                   return;
41243                                 }
41244                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41245                                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41246                                 vcgt(al,
41247                                      dt,
41248                                      QRegister(rd),
41249                                      QRegister(rm),
41250                                      UINT32_C(0));
41251                                 break;
41252                               }
41253                               case 0x00000080: {
41254                                 // 0xf3b10080
41255                                 DataType dt =
41256                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41257                                                        ((instr >> 8) & 0x4));
41258                                 if (dt.Is(kDataTypeValueInvalid)) {
41259                                   UnallocatedA32(instr);
41260                                   return;
41261                                 }
41262                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41263                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41264                                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41265                                 vcge(al,
41266                                      dt,
41267                                      DRegister(rd),
41268                                      DRegister(rm),
41269                                      UINT32_C(0));
41270                                 break;
41271                               }
41272                               case 0x000000c0: {
41273                                 // 0xf3b100c0
41274                                 DataType dt =
41275                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41276                                                        ((instr >> 8) & 0x4));
41277                                 if (dt.Is(kDataTypeValueInvalid)) {
41278                                   UnallocatedA32(instr);
41279                                   return;
41280                                 }
41281                                 if (((instr >> 12) & 1) != 0) {
41282                                   UnallocatedA32(instr);
41283                                   return;
41284                                 }
41285                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41286                                 if ((instr & 1) != 0) {
41287                                   UnallocatedA32(instr);
41288                                   return;
41289                                 }
41290                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41291                                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41292                                 vcge(al,
41293                                      dt,
41294                                      QRegister(rd),
41295                                      QRegister(rm),
41296                                      UINT32_C(0));
41297                                 break;
41298                               }
41299                               case 0x00000100: {
41300                                 // 0xf3b10100
41301                                 DataType dt =
41302                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
41303                                                        ((instr >> 8) & 0x4));
41304                                 if (dt.Is(kDataTypeValueInvalid)) {
41305                                   UnallocatedA32(instr);
41306                                   return;
41307                                 }
41308                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41309                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41310                                 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41311                                 vceq(al,
41312                                      dt,
41313                                      DRegister(rd),
41314                                      DRegister(rm),
41315                                      UINT32_C(0));
41316                                 break;
41317                               }
41318                               case 0x00000140: {
41319                                 // 0xf3b10140
41320                                 DataType dt =
41321                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
41322                                                        ((instr >> 8) & 0x4));
41323                                 if (dt.Is(kDataTypeValueInvalid)) {
41324                                   UnallocatedA32(instr);
41325                                   return;
41326                                 }
41327                                 if (((instr >> 12) & 1) != 0) {
41328                                   UnallocatedA32(instr);
41329                                   return;
41330                                 }
41331                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41332                                 if ((instr & 1) != 0) {
41333                                   UnallocatedA32(instr);
41334                                   return;
41335                                 }
41336                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41337                                 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41338                                 vceq(al,
41339                                      dt,
41340                                      QRegister(rd),
41341                                      QRegister(rm),
41342                                      UINT32_C(0));
41343                                 break;
41344                               }
41345                               case 0x00000180: {
41346                                 // 0xf3b10180
41347                                 DataType dt =
41348                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41349                                                        ((instr >> 8) & 0x4));
41350                                 if (dt.Is(kDataTypeValueInvalid)) {
41351                                   UnallocatedA32(instr);
41352                                   return;
41353                                 }
41354                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41355                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41356                                 // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41357                                 vcle(al,
41358                                      dt,
41359                                      DRegister(rd),
41360                                      DRegister(rm),
41361                                      UINT32_C(0));
41362                                 break;
41363                               }
41364                               case 0x000001c0: {
41365                                 // 0xf3b101c0
41366                                 DataType dt =
41367                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41368                                                        ((instr >> 8) & 0x4));
41369                                 if (dt.Is(kDataTypeValueInvalid)) {
41370                                   UnallocatedA32(instr);
41371                                   return;
41372                                 }
41373                                 if (((instr >> 12) & 1) != 0) {
41374                                   UnallocatedA32(instr);
41375                                   return;
41376                                 }
41377                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41378                                 if ((instr & 1) != 0) {
41379                                   UnallocatedA32(instr);
41380                                   return;
41381                                 }
41382                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41383                                 // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41384                                 vcle(al,
41385                                      dt,
41386                                      QRegister(rd),
41387                                      QRegister(rm),
41388                                      UINT32_C(0));
41389                                 break;
41390                               }
41391                             }
41392                             break;
41393                           }
41394                           case 0x00010200: {
41395                             // 0xf3b10200
41396                             switch (instr & 0x000001c0) {
41397                               case 0x00000000: {
41398                                 // 0xf3b10200
41399                                 DataType dt =
41400                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41401                                                        ((instr >> 8) & 0x4));
41402                                 if (dt.Is(kDataTypeValueInvalid)) {
41403                                   UnallocatedA32(instr);
41404                                   return;
41405                                 }
41406                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41407                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41408                                 // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41409                                 vclt(al,
41410                                      dt,
41411                                      DRegister(rd),
41412                                      DRegister(rm),
41413                                      UINT32_C(0));
41414                                 break;
41415                               }
41416                               case 0x00000040: {
41417                                 // 0xf3b10240
41418                                 DataType dt =
41419                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41420                                                        ((instr >> 8) & 0x4));
41421                                 if (dt.Is(kDataTypeValueInvalid)) {
41422                                   UnallocatedA32(instr);
41423                                   return;
41424                                 }
41425                                 if (((instr >> 12) & 1) != 0) {
41426                                   UnallocatedA32(instr);
41427                                   return;
41428                                 }
41429                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41430                                 if ((instr & 1) != 0) {
41431                                   UnallocatedA32(instr);
41432                                   return;
41433                                 }
41434                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41435                                 // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41436                                 vclt(al,
41437                                      dt,
41438                                      QRegister(rd),
41439                                      QRegister(rm),
41440                                      UINT32_C(0));
41441                                 break;
41442                               }
41443                               case 0x000000c0: {
41444                                 // 0xf3b102c0
41445                                 if ((instr & 0x000c0400) == 0x00080000) {
41446                                   UnimplementedA32("SHA1H", instr);
41447                                 } else {
41448                                   UnallocatedA32(instr);
41449                                 }
41450                                 break;
41451                               }
41452                               case 0x00000100: {
41453                                 // 0xf3b10300
41454                                 DataType dt =
41455                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41456                                                        ((instr >> 8) & 0x4));
41457                                 if (dt.Is(kDataTypeValueInvalid)) {
41458                                   UnallocatedA32(instr);
41459                                   return;
41460                                 }
41461                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41462                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41463                                 // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41464                                 vabs(al, dt, DRegister(rd), DRegister(rm));
41465                                 break;
41466                               }
41467                               case 0x00000140: {
41468                                 // 0xf3b10340
41469                                 DataType dt =
41470                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41471                                                        ((instr >> 8) & 0x4));
41472                                 if (dt.Is(kDataTypeValueInvalid)) {
41473                                   UnallocatedA32(instr);
41474                                   return;
41475                                 }
41476                                 if (((instr >> 12) & 1) != 0) {
41477                                   UnallocatedA32(instr);
41478                                   return;
41479                                 }
41480                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41481                                 if ((instr & 1) != 0) {
41482                                   UnallocatedA32(instr);
41483                                   return;
41484                                 }
41485                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41486                                 // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41487                                 vabs(al, dt, QRegister(rd), QRegister(rm));
41488                                 break;
41489                               }
41490                               case 0x00000180: {
41491                                 // 0xf3b10380
41492                                 DataType dt =
41493                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41494                                                        ((instr >> 8) & 0x4));
41495                                 if (dt.Is(kDataTypeValueInvalid)) {
41496                                   UnallocatedA32(instr);
41497                                   return;
41498                                 }
41499                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41500                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41501                                 // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41502                                 vneg(al, dt, DRegister(rd), DRegister(rm));
41503                                 break;
41504                               }
41505                               case 0x000001c0: {
41506                                 // 0xf3b103c0
41507                                 DataType dt =
41508                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41509                                                        ((instr >> 8) & 0x4));
41510                                 if (dt.Is(kDataTypeValueInvalid)) {
41511                                   UnallocatedA32(instr);
41512                                   return;
41513                                 }
41514                                 if (((instr >> 12) & 1) != 0) {
41515                                   UnallocatedA32(instr);
41516                                   return;
41517                                 }
41518                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41519                                 if ((instr & 1) != 0) {
41520                                   UnallocatedA32(instr);
41521                                   return;
41522                                 }
41523                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41524                                 // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41525                                 vneg(al, dt, QRegister(rd), QRegister(rm));
41526                                 break;
41527                               }
41528                               default:
41529                                 UnallocatedA32(instr);
41530                                 break;
41531                             }
41532                             break;
41533                           }
41534                           case 0x00020000: {
41535                             // 0xf3b20000
41536                             switch (instr & 0x000005c0) {
41537                               case 0x00000000: {
41538                                 // 0xf3b20000
41539                                 if ((instr & 0x000c0000) == 0x00000000) {
41540                                   unsigned rd = ExtractDRegister(instr, 22, 12);
41541                                   unsigned rm = ExtractDRegister(instr, 5, 0);
41542                                   // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
41543                                   vswp(al,
41544                                        kDataTypeValueNone,
41545                                        DRegister(rd),
41546                                        DRegister(rm));
41547                                 } else {
41548                                   UnallocatedA32(instr);
41549                                 }
41550                                 break;
41551                               }
41552                               case 0x00000040: {
41553                                 // 0xf3b20040
41554                                 if ((instr & 0x000c0000) == 0x00000000) {
41555                                   if (((instr >> 12) & 1) != 0) {
41556                                     UnallocatedA32(instr);
41557                                     return;
41558                                   }
41559                                   unsigned rd = ExtractQRegister(instr, 22, 12);
41560                                   if ((instr & 1) != 0) {
41561                                     UnallocatedA32(instr);
41562                                     return;
41563                                   }
41564                                   unsigned rm = ExtractQRegister(instr, 5, 0);
41565                                   // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
41566                                   vswp(al,
41567                                        kDataTypeValueNone,
41568                                        QRegister(rd),
41569                                        QRegister(rm));
41570                                 } else {
41571                                   UnallocatedA32(instr);
41572                                 }
41573                                 break;
41574                               }
41575                               case 0x00000080: {
41576                                 // 0xf3b20080
41577                                 DataType dt =
41578                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41579                                 if (dt.Is(kDataTypeValueInvalid)) {
41580                                   UnallocatedA32(instr);
41581                                   return;
41582                                 }
41583                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41584                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41585                                 // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41586                                 vtrn(al, dt, DRegister(rd), DRegister(rm));
41587                                 break;
41588                               }
41589                               case 0x000000c0: {
41590                                 // 0xf3b200c0
41591                                 DataType dt =
41592                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41593                                 if (dt.Is(kDataTypeValueInvalid)) {
41594                                   UnallocatedA32(instr);
41595                                   return;
41596                                 }
41597                                 if (((instr >> 12) & 1) != 0) {
41598                                   UnallocatedA32(instr);
41599                                   return;
41600                                 }
41601                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41602                                 if ((instr & 1) != 0) {
41603                                   UnallocatedA32(instr);
41604                                   return;
41605                                 }
41606                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41607                                 // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41608                                 vtrn(al, dt, QRegister(rd), QRegister(rm));
41609                                 break;
41610                               }
41611                               case 0x00000100: {
41612                                 // 0xf3b20100
41613                                 DataType dt =
41614                                     Dt_size_15_Decode((instr >> 18) & 0x3);
41615                                 if (dt.Is(kDataTypeValueInvalid)) {
41616                                   UnallocatedA32(instr);
41617                                   return;
41618                                 }
41619                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41620                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41621                                 // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41622                                 vuzp(al, dt, DRegister(rd), DRegister(rm));
41623                                 break;
41624                               }
41625                               case 0x00000140: {
41626                                 // 0xf3b20140
41627                                 DataType dt =
41628                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41629                                 if (dt.Is(kDataTypeValueInvalid)) {
41630                                   UnallocatedA32(instr);
41631                                   return;
41632                                 }
41633                                 if (((instr >> 12) & 1) != 0) {
41634                                   UnallocatedA32(instr);
41635                                   return;
41636                                 }
41637                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41638                                 if ((instr & 1) != 0) {
41639                                   UnallocatedA32(instr);
41640                                   return;
41641                                 }
41642                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41643                                 // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41644                                 vuzp(al, dt, QRegister(rd), QRegister(rm));
41645                                 break;
41646                               }
41647                               case 0x00000180: {
41648                                 // 0xf3b20180
41649                                 DataType dt =
41650                                     Dt_size_15_Decode((instr >> 18) & 0x3);
41651                                 if (dt.Is(kDataTypeValueInvalid)) {
41652                                   UnallocatedA32(instr);
41653                                   return;
41654                                 }
41655                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41656                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41657                                 // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41658                                 vzip(al, dt, DRegister(rd), DRegister(rm));
41659                                 break;
41660                               }
41661                               case 0x000001c0: {
41662                                 // 0xf3b201c0
41663                                 DataType dt =
41664                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41665                                 if (dt.Is(kDataTypeValueInvalid)) {
41666                                   UnallocatedA32(instr);
41667                                   return;
41668                                 }
41669                                 if (((instr >> 12) & 1) != 0) {
41670                                   UnallocatedA32(instr);
41671                                   return;
41672                                 }
41673                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41674                                 if ((instr & 1) != 0) {
41675                                   UnallocatedA32(instr);
41676                                   return;
41677                                 }
41678                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41679                                 // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41680                                 vzip(al, dt, QRegister(rd), QRegister(rm));
41681                                 break;
41682                               }
41683                               case 0x00000400: {
41684                                 // 0xf3b20400
41685                                 DataType dt =
41686                                     Dt_size_16_Decode((instr >> 18) & 0x3);
41687                                 if (dt.Is(kDataTypeValueInvalid)) {
41688                                   UnallocatedA32(instr);
41689                                   return;
41690                                 }
41691                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41692                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41693                                 // VRINTN{<q>}.<dt> <Dd>, <Dm> ; A1
41694                                 vrintn(dt, DRegister(rd), DRegister(rm));
41695                                 break;
41696                               }
41697                               case 0x00000440: {
41698                                 // 0xf3b20440
41699                                 DataType dt =
41700                                     Dt_size_16_Decode((instr >> 18) & 0x3);
41701                                 if (dt.Is(kDataTypeValueInvalid)) {
41702                                   UnallocatedA32(instr);
41703                                   return;
41704                                 }
41705                                 if (((instr >> 12) & 1) != 0) {
41706                                   UnallocatedA32(instr);
41707                                   return;
41708                                 }
41709                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41710                                 if ((instr & 1) != 0) {
41711                                   UnallocatedA32(instr);
41712                                   return;
41713                                 }
41714                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41715                                 // VRINTN{<q>}.<dt> <Qd>, <Qm> ; A1
41716                                 vrintn(dt, QRegister(rd), QRegister(rm));
41717                                 break;
41718                               }
41719                               case 0x00000480: {
41720                                 // 0xf3b20480
41721                                 DataType dt =
41722                                     Dt_size_16_Decode((instr >> 18) & 0x3);
41723                                 if (dt.Is(kDataTypeValueInvalid)) {
41724                                   UnallocatedA32(instr);
41725                                   return;
41726                                 }
41727                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41728                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41729                                 // VRINTX{<q>}.<dt> <Dd>, <Dm> ; A1
41730                                 vrintx(al, dt, DRegister(rd), DRegister(rm));
41731                                 break;
41732                               }
41733                               case 0x000004c0: {
41734                                 // 0xf3b204c0
41735                                 DataType dt =
41736                                     Dt_size_16_Decode((instr >> 18) & 0x3);
41737                                 if (dt.Is(kDataTypeValueInvalid)) {
41738                                   UnallocatedA32(instr);
41739                                   return;
41740                                 }
41741                                 if (((instr >> 12) & 1) != 0) {
41742                                   UnallocatedA32(instr);
41743                                   return;
41744                                 }
41745                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41746                                 if ((instr & 1) != 0) {
41747                                   UnallocatedA32(instr);
41748                                   return;
41749                                 }
41750                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41751                                 // VRINTX{<q>}.<dt> <Qd>, <Qm> ; A1
41752                                 vrintx(dt, QRegister(rd), QRegister(rm));
41753                                 break;
41754                               }
41755                               case 0x00000500: {
41756                                 // 0xf3b20500
41757                                 DataType dt =
41758                                     Dt_size_16_Decode((instr >> 18) & 0x3);
41759                                 if (dt.Is(kDataTypeValueInvalid)) {
41760                                   UnallocatedA32(instr);
41761                                   return;
41762                                 }
41763                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41764                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41765                                 // VRINTA{<q>}.<dt> <Dd>, <Dm> ; A1
41766                                 vrinta(dt, DRegister(rd), DRegister(rm));
41767                                 break;
41768                               }
41769                               case 0x00000540: {
41770                                 // 0xf3b20540
41771                                 DataType dt =
41772                                     Dt_size_16_Decode((instr >> 18) & 0x3);
41773                                 if (dt.Is(kDataTypeValueInvalid)) {
41774                                   UnallocatedA32(instr);
41775                                   return;
41776                                 }
41777                                 if (((instr >> 12) & 1) != 0) {
41778                                   UnallocatedA32(instr);
41779                                   return;
41780                                 }
41781                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41782                                 if ((instr & 1) != 0) {
41783                                   UnallocatedA32(instr);
41784                                   return;
41785                                 }
41786                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41787                                 // VRINTA{<q>}.<dt> <Qd>, <Qm> ; A1
41788                                 vrinta(dt, QRegister(rd), QRegister(rm));
41789                                 break;
41790                               }
41791                               case 0x00000580: {
41792                                 // 0xf3b20580
41793                                 DataType dt =
41794                                     Dt_size_16_Decode((instr >> 18) & 0x3);
41795                                 if (dt.Is(kDataTypeValueInvalid)) {
41796                                   UnallocatedA32(instr);
41797                                   return;
41798                                 }
41799                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41800                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41801                                 // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; A1
41802                                 vrintz(al, dt, DRegister(rd), DRegister(rm));
41803                                 break;
41804                               }
41805                               case 0x000005c0: {
41806                                 // 0xf3b205c0
41807                                 DataType dt =
41808                                     Dt_size_16_Decode((instr >> 18) & 0x3);
41809                                 if (dt.Is(kDataTypeValueInvalid)) {
41810                                   UnallocatedA32(instr);
41811                                   return;
41812                                 }
41813                                 if (((instr >> 12) & 1) != 0) {
41814                                   UnallocatedA32(instr);
41815                                   return;
41816                                 }
41817                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41818                                 if ((instr & 1) != 0) {
41819                                   UnallocatedA32(instr);
41820                                   return;
41821                                 }
41822                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41823                                 // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; A1
41824                                 vrintz(dt, QRegister(rd), QRegister(rm));
41825                                 break;
41826                               }
41827                             }
41828                             break;
41829                           }
41830                           case 0x00020200: {
41831                             // 0xf3b20200
41832                             switch (instr & 0x00000580) {
41833                               case 0x00000000: {
41834                                 // 0xf3b20200
41835                                 switch (instr & 0x00000040) {
41836                                   case 0x00000000: {
41837                                     // 0xf3b20200
41838                                     DataType dt =
41839                                         Dt_size_3_Decode((instr >> 18) & 0x3);
41840                                     if (dt.Is(kDataTypeValueInvalid)) {
41841                                       UnallocatedA32(instr);
41842                                       return;
41843                                     }
41844                                     unsigned rd =
41845                                         ExtractDRegister(instr, 22, 12);
41846                                     if ((instr & 1) != 0) {
41847                                       UnallocatedA32(instr);
41848                                       return;
41849                                     }
41850                                     unsigned rm = ExtractQRegister(instr, 5, 0);
41851                                     // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
41852                                     vmovn(al, dt, DRegister(rd), QRegister(rm));
41853                                     break;
41854                                   }
41855                                   case 0x00000040: {
41856                                     // 0xf3b20240
41857                                     DataType dt =
41858                                         Dt_size_14_Decode((instr >> 18) & 0x3);
41859                                     if (dt.Is(kDataTypeValueInvalid)) {
41860                                       UnallocatedA32(instr);
41861                                       return;
41862                                     }
41863                                     unsigned rd =
41864                                         ExtractDRegister(instr, 22, 12);
41865                                     if ((instr & 1) != 0) {
41866                                       UnallocatedA32(instr);
41867                                       return;
41868                                     }
41869                                     unsigned rm = ExtractQRegister(instr, 5, 0);
41870                                     // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
41871                                     vqmovun(al,
41872                                             dt,
41873                                             DRegister(rd),
41874                                             QRegister(rm));
41875                                     break;
41876                                   }
41877                                 }
41878                                 break;
41879                               }
41880                               case 0x00000080: {
41881                                 // 0xf3b20280
41882                                 DataType dt =
41883                                     Dt_op_size_3_Decode(((instr >> 18) & 0x3) |
41884                                                         ((instr >> 4) & 0x4));
41885                                 if (dt.Is(kDataTypeValueInvalid)) {
41886                                   UnallocatedA32(instr);
41887                                   return;
41888                                 }
41889                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41890                                 if ((instr & 1) != 0) {
41891                                   UnallocatedA32(instr);
41892                                   return;
41893                                 }
41894                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41895                                 // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
41896                                 vqmovn(al, dt, DRegister(rd), QRegister(rm));
41897                                 break;
41898                               }
41899                               case 0x00000100: {
41900                                 // 0xf3b20300
41901                                 if ((instr & 0x00000040) == 0x00000000) {
41902                                   DataType dt =
41903                                       Dt_size_17_Decode((instr >> 18) & 0x3);
41904                                   if (dt.Is(kDataTypeValueInvalid)) {
41905                                     UnallocatedA32(instr);
41906                                     return;
41907                                   }
41908                                   if (((instr >> 12) & 1) != 0) {
41909                                     UnallocatedA32(instr);
41910                                     return;
41911                                   }
41912                                   unsigned rd = ExtractQRegister(instr, 22, 12);
41913                                   unsigned rm = ExtractDRegister(instr, 5, 0);
41914                                   uint32_t imm = dt.GetSize();
41915                                   // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length)
41916                                   vshll(al,
41917                                         dt,
41918                                         QRegister(rd),
41919                                         DRegister(rm),
41920                                         imm);
41921                                 } else {
41922                                   UnallocatedA32(instr);
41923                                 }
41924                                 break;
41925                               }
41926                               case 0x00000180: {
41927                                 // 0xf3b20380
41928                                 switch (instr & 0x000c0040) {
41929                                   case 0x00080000: {
41930                                     // 0xf3ba0380
41931                                     UnimplementedA32("SHA1SU1", instr);
41932                                     break;
41933                                   }
41934                                   case 0x00080040: {
41935                                     // 0xf3ba03c0
41936                                     UnimplementedA32("SHA256SU0", instr);
41937                                     break;
41938                                   }
41939                                   default:
41940                                     UnallocatedA32(instr);
41941                                     break;
41942                                 }
41943                                 break;
41944                               }
41945                               case 0x00000400: {
41946                                 // 0xf3b20600
41947                                 if ((instr & 0x000c0040) == 0x00040000) {
41948                                   unsigned rd = ExtractDRegister(instr, 22, 12);
41949                                   if ((instr & 1) != 0) {
41950                                     UnallocatedA32(instr);
41951                                     return;
41952                                   }
41953                                   unsigned rm = ExtractQRegister(instr, 5, 0);
41954                                   // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1
41955                                   vcvt(al,
41956                                        F16,
41957                                        F32,
41958                                        DRegister(rd),
41959                                        QRegister(rm));
41960                                 } else {
41961                                   UnallocatedA32(instr);
41962                                 }
41963                                 break;
41964                               }
41965                               case 0x00000480: {
41966                                 // 0xf3b20680
41967                                 switch (instr & 0x00000040) {
41968                                   case 0x00000000: {
41969                                     // 0xf3b20680
41970                                     DataType dt =
41971                                         Dt_size_16_Decode((instr >> 18) & 0x3);
41972                                     if (dt.Is(kDataTypeValueInvalid)) {
41973                                       UnallocatedA32(instr);
41974                                       return;
41975                                     }
41976                                     unsigned rd =
41977                                         ExtractDRegister(instr, 22, 12);
41978                                     unsigned rm = ExtractDRegister(instr, 5, 0);
41979                                     // VRINTM{<q>}.<dt> <Dd>, <Dm> ; A1
41980                                     vrintm(dt, DRegister(rd), DRegister(rm));
41981                                     break;
41982                                   }
41983                                   case 0x00000040: {
41984                                     // 0xf3b206c0
41985                                     DataType dt =
41986                                         Dt_size_16_Decode((instr >> 18) & 0x3);
41987                                     if (dt.Is(kDataTypeValueInvalid)) {
41988                                       UnallocatedA32(instr);
41989                                       return;
41990                                     }
41991                                     if (((instr >> 12) & 1) != 0) {
41992                                       UnallocatedA32(instr);
41993                                       return;
41994                                     }
41995                                     unsigned rd =
41996                                         ExtractQRegister(instr, 22, 12);
41997                                     if ((instr & 1) != 0) {
41998                                       UnallocatedA32(instr);
41999                                       return;
42000                                     }
42001                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42002                                     // VRINTM{<q>}.<dt> <Qd>, <Qm> ; A1
42003                                     vrintm(dt, QRegister(rd), QRegister(rm));
42004                                     break;
42005                                   }
42006                                 }
42007                                 break;
42008                               }
42009                               case 0x00000500: {
42010                                 // 0xf3b20700
42011                                 if ((instr & 0x000c0040) == 0x00040000) {
42012                                   if (((instr >> 12) & 1) != 0) {
42013                                     UnallocatedA32(instr);
42014                                     return;
42015                                   }
42016                                   unsigned rd = ExtractQRegister(instr, 22, 12);
42017                                   unsigned rm = ExtractDRegister(instr, 5, 0);
42018                                   // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1
42019                                   vcvt(al,
42020                                        F32,
42021                                        F16,
42022                                        QRegister(rd),
42023                                        DRegister(rm));
42024                                 } else {
42025                                   UnallocatedA32(instr);
42026                                 }
42027                                 break;
42028                               }
42029                               case 0x00000580: {
42030                                 // 0xf3b20780
42031                                 switch (instr & 0x00000040) {
42032                                   case 0x00000000: {
42033                                     // 0xf3b20780
42034                                     DataType dt =
42035                                         Dt_size_16_Decode((instr >> 18) & 0x3);
42036                                     if (dt.Is(kDataTypeValueInvalid)) {
42037                                       UnallocatedA32(instr);
42038                                       return;
42039                                     }
42040                                     unsigned rd =
42041                                         ExtractDRegister(instr, 22, 12);
42042                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42043                                     // VRINTP{<q>}.<dt> <Dd>, <Dm> ; A1
42044                                     vrintp(dt, DRegister(rd), DRegister(rm));
42045                                     break;
42046                                   }
42047                                   case 0x00000040: {
42048                                     // 0xf3b207c0
42049                                     DataType dt =
42050                                         Dt_size_16_Decode((instr >> 18) & 0x3);
42051                                     if (dt.Is(kDataTypeValueInvalid)) {
42052                                       UnallocatedA32(instr);
42053                                       return;
42054                                     }
42055                                     if (((instr >> 12) & 1) != 0) {
42056                                       UnallocatedA32(instr);
42057                                       return;
42058                                     }
42059                                     unsigned rd =
42060                                         ExtractQRegister(instr, 22, 12);
42061                                     if ((instr & 1) != 0) {
42062                                       UnallocatedA32(instr);
42063                                       return;
42064                                     }
42065                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42066                                     // VRINTP{<q>}.<dt> <Qd>, <Qm> ; A1
42067                                     vrintp(dt, QRegister(rd), QRegister(rm));
42068                                     break;
42069                                   }
42070                                 }
42071                                 break;
42072                               }
42073                             }
42074                             break;
42075                           }
42076                           case 0x00030000: {
42077                             // 0xf3b30000
42078                             switch (instr & 0x00000440) {
42079                               case 0x00000000: {
42080                                 // 0xf3b30000
42081                                 switch (instr & 0x000c0100) {
42082                                   case 0x00080000: {
42083                                     // 0xf3bb0000
42084                                     DataType dt =
42085                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42086                                     if (dt.Is(kDataTypeValueInvalid)) {
42087                                       UnallocatedA32(instr);
42088                                       return;
42089                                     }
42090                                     unsigned rd =
42091                                         ExtractDRegister(instr, 22, 12);
42092                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42093                                     // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42094                                     vcvta(dt,
42095                                           F32,
42096                                           DRegister(rd),
42097                                           DRegister(rm));
42098                                     break;
42099                                   }
42100                                   case 0x00080100: {
42101                                     // 0xf3bb0100
42102                                     DataType dt =
42103                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42104                                     if (dt.Is(kDataTypeValueInvalid)) {
42105                                       UnallocatedA32(instr);
42106                                       return;
42107                                     }
42108                                     unsigned rd =
42109                                         ExtractDRegister(instr, 22, 12);
42110                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42111                                     // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42112                                     vcvtn(dt,
42113                                           F32,
42114                                           DRegister(rd),
42115                                           DRegister(rm));
42116                                     break;
42117                                   }
42118                                   default:
42119                                     UnallocatedA32(instr);
42120                                     break;
42121                                 }
42122                                 break;
42123                               }
42124                               case 0x00000040: {
42125                                 // 0xf3b30040
42126                                 switch (instr & 0x000c0100) {
42127                                   case 0x00080000: {
42128                                     // 0xf3bb0040
42129                                     DataType dt =
42130                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42131                                     if (dt.Is(kDataTypeValueInvalid)) {
42132                                       UnallocatedA32(instr);
42133                                       return;
42134                                     }
42135                                     if (((instr >> 12) & 1) != 0) {
42136                                       UnallocatedA32(instr);
42137                                       return;
42138                                     }
42139                                     unsigned rd =
42140                                         ExtractQRegister(instr, 22, 12);
42141                                     if ((instr & 1) != 0) {
42142                                       UnallocatedA32(instr);
42143                                       return;
42144                                     }
42145                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42146                                     // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42147                                     vcvta(dt,
42148                                           F32,
42149                                           QRegister(rd),
42150                                           QRegister(rm));
42151                                     break;
42152                                   }
42153                                   case 0x00080100: {
42154                                     // 0xf3bb0140
42155                                     DataType dt =
42156                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42157                                     if (dt.Is(kDataTypeValueInvalid)) {
42158                                       UnallocatedA32(instr);
42159                                       return;
42160                                     }
42161                                     if (((instr >> 12) & 1) != 0) {
42162                                       UnallocatedA32(instr);
42163                                       return;
42164                                     }
42165                                     unsigned rd =
42166                                         ExtractQRegister(instr, 22, 12);
42167                                     if ((instr & 1) != 0) {
42168                                       UnallocatedA32(instr);
42169                                       return;
42170                                     }
42171                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42172                                     // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42173                                     vcvtn(dt,
42174                                           F32,
42175                                           QRegister(rd),
42176                                           QRegister(rm));
42177                                     break;
42178                                   }
42179                                   default:
42180                                     UnallocatedA32(instr);
42181                                     break;
42182                                 }
42183                                 break;
42184                               }
42185                               case 0x00000400: {
42186                                 // 0xf3b30400
42187                                 switch (instr & 0x00000080) {
42188                                   case 0x00000000: {
42189                                     // 0xf3b30400
42190                                     DataType dt = Dt_F_size_4_Decode(
42191                                         ((instr >> 18) & 0x3) |
42192                                         ((instr >> 6) & 0x4));
42193                                     if (dt.Is(kDataTypeValueInvalid)) {
42194                                       UnallocatedA32(instr);
42195                                       return;
42196                                     }
42197                                     unsigned rd =
42198                                         ExtractDRegister(instr, 22, 12);
42199                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42200                                     // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42201                                     vrecpe(al,
42202                                            dt,
42203                                            DRegister(rd),
42204                                            DRegister(rm));
42205                                     break;
42206                                   }
42207                                   case 0x00000080: {
42208                                     // 0xf3b30480
42209                                     DataType dt = Dt_F_size_4_Decode(
42210                                         ((instr >> 18) & 0x3) |
42211                                         ((instr >> 6) & 0x4));
42212                                     if (dt.Is(kDataTypeValueInvalid)) {
42213                                       UnallocatedA32(instr);
42214                                       return;
42215                                     }
42216                                     unsigned rd =
42217                                         ExtractDRegister(instr, 22, 12);
42218                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42219                                     // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42220                                     vrsqrte(al,
42221                                             dt,
42222                                             DRegister(rd),
42223                                             DRegister(rm));
42224                                     break;
42225                                   }
42226                                 }
42227                                 break;
42228                               }
42229                               case 0x00000440: {
42230                                 // 0xf3b30440
42231                                 switch (instr & 0x00000080) {
42232                                   case 0x00000000: {
42233                                     // 0xf3b30440
42234                                     DataType dt = Dt_F_size_4_Decode(
42235                                         ((instr >> 18) & 0x3) |
42236                                         ((instr >> 6) & 0x4));
42237                                     if (dt.Is(kDataTypeValueInvalid)) {
42238                                       UnallocatedA32(instr);
42239                                       return;
42240                                     }
42241                                     if (((instr >> 12) & 1) != 0) {
42242                                       UnallocatedA32(instr);
42243                                       return;
42244                                     }
42245                                     unsigned rd =
42246                                         ExtractQRegister(instr, 22, 12);
42247                                     if ((instr & 1) != 0) {
42248                                       UnallocatedA32(instr);
42249                                       return;
42250                                     }
42251                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42252                                     // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42253                                     vrecpe(al,
42254                                            dt,
42255                                            QRegister(rd),
42256                                            QRegister(rm));
42257                                     break;
42258                                   }
42259                                   case 0x00000080: {
42260                                     // 0xf3b304c0
42261                                     DataType dt = Dt_F_size_4_Decode(
42262                                         ((instr >> 18) & 0x3) |
42263                                         ((instr >> 6) & 0x4));
42264                                     if (dt.Is(kDataTypeValueInvalid)) {
42265                                       UnallocatedA32(instr);
42266                                       return;
42267                                     }
42268                                     if (((instr >> 12) & 1) != 0) {
42269                                       UnallocatedA32(instr);
42270                                       return;
42271                                     }
42272                                     unsigned rd =
42273                                         ExtractQRegister(instr, 22, 12);
42274                                     if ((instr & 1) != 0) {
42275                                       UnallocatedA32(instr);
42276                                       return;
42277                                     }
42278                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42279                                     // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42280                                     vrsqrte(al,
42281                                             dt,
42282                                             QRegister(rd),
42283                                             QRegister(rm));
42284                                     break;
42285                                   }
42286                                 }
42287                                 break;
42288                               }
42289                             }
42290                             break;
42291                           }
42292                           case 0x00030200: {
42293                             // 0xf3b30200
42294                             switch (instr & 0x000c0440) {
42295                               case 0x00080000: {
42296                                 // 0xf3bb0200
42297                                 switch (instr & 0x00000100) {
42298                                   case 0x00000000: {
42299                                     // 0xf3bb0200
42300                                     DataType dt =
42301                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42302                                     if (dt.Is(kDataTypeValueInvalid)) {
42303                                       UnallocatedA32(instr);
42304                                       return;
42305                                     }
42306                                     unsigned rd =
42307                                         ExtractDRegister(instr, 22, 12);
42308                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42309                                     // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42310                                     vcvtp(dt,
42311                                           F32,
42312                                           DRegister(rd),
42313                                           DRegister(rm));
42314                                     break;
42315                                   }
42316                                   case 0x00000100: {
42317                                     // 0xf3bb0300
42318                                     DataType dt =
42319                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42320                                     if (dt.Is(kDataTypeValueInvalid)) {
42321                                       UnallocatedA32(instr);
42322                                       return;
42323                                     }
42324                                     unsigned rd =
42325                                         ExtractDRegister(instr, 22, 12);
42326                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42327                                     // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42328                                     vcvtm(dt,
42329                                           F32,
42330                                           DRegister(rd),
42331                                           DRegister(rm));
42332                                     break;
42333                                   }
42334                                 }
42335                                 break;
42336                               }
42337                               case 0x00080040: {
42338                                 // 0xf3bb0240
42339                                 switch (instr & 0x00000100) {
42340                                   case 0x00000000: {
42341                                     // 0xf3bb0240
42342                                     DataType dt =
42343                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42344                                     if (dt.Is(kDataTypeValueInvalid)) {
42345                                       UnallocatedA32(instr);
42346                                       return;
42347                                     }
42348                                     if (((instr >> 12) & 1) != 0) {
42349                                       UnallocatedA32(instr);
42350                                       return;
42351                                     }
42352                                     unsigned rd =
42353                                         ExtractQRegister(instr, 22, 12);
42354                                     if ((instr & 1) != 0) {
42355                                       UnallocatedA32(instr);
42356                                       return;
42357                                     }
42358                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42359                                     // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42360                                     vcvtp(dt,
42361                                           F32,
42362                                           QRegister(rd),
42363                                           QRegister(rm));
42364                                     break;
42365                                   }
42366                                   case 0x00000100: {
42367                                     // 0xf3bb0340
42368                                     DataType dt =
42369                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42370                                     if (dt.Is(kDataTypeValueInvalid)) {
42371                                       UnallocatedA32(instr);
42372                                       return;
42373                                     }
42374                                     if (((instr >> 12) & 1) != 0) {
42375                                       UnallocatedA32(instr);
42376                                       return;
42377                                     }
42378                                     unsigned rd =
42379                                         ExtractQRegister(instr, 22, 12);
42380                                     if ((instr & 1) != 0) {
42381                                       UnallocatedA32(instr);
42382                                       return;
42383                                     }
42384                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42385                                     // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42386                                     vcvtm(dt,
42387                                           F32,
42388                                           QRegister(rd),
42389                                           QRegister(rm));
42390                                     break;
42391                                   }
42392                                 }
42393                                 break;
42394                               }
42395                               case 0x00080400: {
42396                                 // 0xf3bb0600
42397                                 DataType dt1 =
42398                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
42399                                 if (dt1.Is(kDataTypeValueInvalid)) {
42400                                   UnallocatedA32(instr);
42401                                   return;
42402                                 }
42403                                 DataType dt2 =
42404                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
42405                                 if (dt2.Is(kDataTypeValueInvalid)) {
42406                                   UnallocatedA32(instr);
42407                                   return;
42408                                 }
42409                                 unsigned rd = ExtractDRegister(instr, 22, 12);
42410                                 unsigned rm = ExtractDRegister(instr, 5, 0);
42411                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1
42412                                 vcvt(al,
42413                                      dt1,
42414                                      dt2,
42415                                      DRegister(rd),
42416                                      DRegister(rm));
42417                                 break;
42418                               }
42419                               case 0x00080440: {
42420                                 // 0xf3bb0640
42421                                 DataType dt1 =
42422                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
42423                                 if (dt1.Is(kDataTypeValueInvalid)) {
42424                                   UnallocatedA32(instr);
42425                                   return;
42426                                 }
42427                                 DataType dt2 =
42428                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
42429                                 if (dt2.Is(kDataTypeValueInvalid)) {
42430                                   UnallocatedA32(instr);
42431                                   return;
42432                                 }
42433                                 if (((instr >> 12) & 1) != 0) {
42434                                   UnallocatedA32(instr);
42435                                   return;
42436                                 }
42437                                 unsigned rd = ExtractQRegister(instr, 22, 12);
42438                                 if ((instr & 1) != 0) {
42439                                   UnallocatedA32(instr);
42440                                   return;
42441                                 }
42442                                 unsigned rm = ExtractQRegister(instr, 5, 0);
42443                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1
42444                                 vcvt(al,
42445                                      dt1,
42446                                      dt2,
42447                                      QRegister(rd),
42448                                      QRegister(rm));
42449                                 break;
42450                               }
42451                               default:
42452                                 UnallocatedA32(instr);
42453                                 break;
42454                             }
42455                             break;
42456                           }
42457                         }
42458                         break;
42459                       }
42460                       case 0x00000800: {
42461                         // 0xf3b00800
42462                         switch (instr & 0x00000440) {
42463                           case 0x00000000: {
42464                             // 0xf3b00800
42465                             unsigned rd = ExtractDRegister(instr, 22, 12);
42466                             unsigned first = ExtractDRegister(instr, 7, 16);
42467                             unsigned length;
42468                             SpacingType spacing = kSingle;
42469                             switch ((instr >> 8) & 0x3) {
42470                               default:
42471                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
42472                               case 0x0:
42473                                 length = 1;
42474                                 break;
42475                               case 0x1:
42476                                 length = 2;
42477                                 break;
42478                               case 0x2:
42479                                 length = 3;
42480                                 break;
42481                               case 0x3:
42482                                 length = 4;
42483                                 break;
42484                             }
42485                             unsigned last = first + length - 1;
42486                             TransferType transfer = kMultipleLanes;
42487                             unsigned rm = ExtractDRegister(instr, 5, 0);
42488                             // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
42489                             vtbl(al,
42490                                  Untyped8,
42491                                  DRegister(rd),
42492                                  NeonRegisterList(DRegister(first),
42493                                                   DRegister(last),
42494                                                   spacing,
42495                                                   transfer),
42496                                  DRegister(rm));
42497                             break;
42498                           }
42499                           case 0x00000040: {
42500                             // 0xf3b00840
42501                             unsigned rd = ExtractDRegister(instr, 22, 12);
42502                             unsigned first = ExtractDRegister(instr, 7, 16);
42503                             unsigned length;
42504                             SpacingType spacing = kSingle;
42505                             switch ((instr >> 8) & 0x3) {
42506                               default:
42507                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
42508                               case 0x0:
42509                                 length = 1;
42510                                 break;
42511                               case 0x1:
42512                                 length = 2;
42513                                 break;
42514                               case 0x2:
42515                                 length = 3;
42516                                 break;
42517                               case 0x3:
42518                                 length = 4;
42519                                 break;
42520                             }
42521                             unsigned last = first + length - 1;
42522                             TransferType transfer = kMultipleLanes;
42523                             unsigned rm = ExtractDRegister(instr, 5, 0);
42524                             // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
42525                             vtbx(al,
42526                                  Untyped8,
42527                                  DRegister(rd),
42528                                  NeonRegisterList(DRegister(first),
42529                                                   DRegister(last),
42530                                                   spacing,
42531                                                   transfer),
42532                                  DRegister(rm));
42533                             break;
42534                           }
42535                           case 0x00000400: {
42536                             // 0xf3b00c00
42537                             if ((instr & 0x00000380) == 0x00000000) {
42538                               unsigned lane;
42539                               DataType dt =
42540                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
42541                               if (dt.Is(kDataTypeValueInvalid)) {
42542                                 UnallocatedA32(instr);
42543                                 return;
42544                               }
42545                               unsigned rd = ExtractDRegister(instr, 22, 12);
42546                               unsigned rm = ExtractDRegister(instr, 5, 0);
42547                               // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1
42548                               vdup(al,
42549                                    dt,
42550                                    DRegister(rd),
42551                                    DRegisterLane(rm, lane));
42552                             } else {
42553                               UnallocatedA32(instr);
42554                             }
42555                             break;
42556                           }
42557                           case 0x00000440: {
42558                             // 0xf3b00c40
42559                             if ((instr & 0x00000380) == 0x00000000) {
42560                               unsigned lane;
42561                               DataType dt =
42562                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
42563                               if (dt.Is(kDataTypeValueInvalid)) {
42564                                 UnallocatedA32(instr);
42565                                 return;
42566                               }
42567                               if (((instr >> 12) & 1) != 0) {
42568                                 UnallocatedA32(instr);
42569                                 return;
42570                               }
42571                               unsigned rd = ExtractQRegister(instr, 22, 12);
42572                               unsigned rm = ExtractDRegister(instr, 5, 0);
42573                               // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1
42574                               vdup(al,
42575                                    dt,
42576                                    QRegister(rd),
42577                                    DRegisterLane(rm, lane));
42578                             } else {
42579                               UnallocatedA32(instr);
42580                             }
42581                             break;
42582                           }
42583                         }
42584                         break;
42585                       }
42586                     }
42587                     break;
42588                   }
42589                 }
42590                 break;
42591               }
42592               default: {
42593                 switch (instr & 0x00000c40) {
42594                   case 0x00000000: {
42595                     // 0xf2800000
42596                     switch (instr & 0x00000300) {
42597                       case 0x00000000: {
42598                         // 0xf2800000
42599                         if (((instr & 0x300000) == 0x300000)) {
42600                           UnallocatedA32(instr);
42601                           return;
42602                         }
42603                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42604                                                          ((instr >> 22) & 0x4));
42605                         if (dt.Is(kDataTypeValueInvalid)) {
42606                           UnallocatedA32(instr);
42607                           return;
42608                         }
42609                         if (((instr >> 12) & 1) != 0) {
42610                           UnallocatedA32(instr);
42611                           return;
42612                         }
42613                         unsigned rd = ExtractQRegister(instr, 22, 12);
42614                         unsigned rn = ExtractDRegister(instr, 7, 16);
42615                         unsigned rm = ExtractDRegister(instr, 5, 0);
42616                         // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
42617                         vaddl(al,
42618                               dt,
42619                               QRegister(rd),
42620                               DRegister(rn),
42621                               DRegister(rm));
42622                         break;
42623                       }
42624                       case 0x00000100: {
42625                         // 0xf2800100
42626                         if (((instr & 0x300000) == 0x300000)) {
42627                           UnallocatedA32(instr);
42628                           return;
42629                         }
42630                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42631                                                          ((instr >> 22) & 0x4));
42632                         if (dt.Is(kDataTypeValueInvalid)) {
42633                           UnallocatedA32(instr);
42634                           return;
42635                         }
42636                         if (((instr >> 12) & 1) != 0) {
42637                           UnallocatedA32(instr);
42638                           return;
42639                         }
42640                         unsigned rd = ExtractQRegister(instr, 22, 12);
42641                         if (((instr >> 16) & 1) != 0) {
42642                           UnallocatedA32(instr);
42643                           return;
42644                         }
42645                         unsigned rn = ExtractQRegister(instr, 7, 16);
42646                         unsigned rm = ExtractDRegister(instr, 5, 0);
42647                         // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
42648                         vaddw(al,
42649                               dt,
42650                               QRegister(rd),
42651                               QRegister(rn),
42652                               DRegister(rm));
42653                         break;
42654                       }
42655                       case 0x00000200: {
42656                         // 0xf2800200
42657                         if (((instr & 0x300000) == 0x300000)) {
42658                           UnallocatedA32(instr);
42659                           return;
42660                         }
42661                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42662                                                          ((instr >> 22) & 0x4));
42663                         if (dt.Is(kDataTypeValueInvalid)) {
42664                           UnallocatedA32(instr);
42665                           return;
42666                         }
42667                         if (((instr >> 12) & 1) != 0) {
42668                           UnallocatedA32(instr);
42669                           return;
42670                         }
42671                         unsigned rd = ExtractQRegister(instr, 22, 12);
42672                         unsigned rn = ExtractDRegister(instr, 7, 16);
42673                         unsigned rm = ExtractDRegister(instr, 5, 0);
42674                         // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
42675                         vsubl(al,
42676                               dt,
42677                               QRegister(rd),
42678                               DRegister(rn),
42679                               DRegister(rm));
42680                         break;
42681                       }
42682                       case 0x00000300: {
42683                         // 0xf2800300
42684                         if (((instr & 0x300000) == 0x300000)) {
42685                           UnallocatedA32(instr);
42686                           return;
42687                         }
42688                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42689                                                          ((instr >> 22) & 0x4));
42690                         if (dt.Is(kDataTypeValueInvalid)) {
42691                           UnallocatedA32(instr);
42692                           return;
42693                         }
42694                         if (((instr >> 12) & 1) != 0) {
42695                           UnallocatedA32(instr);
42696                           return;
42697                         }
42698                         unsigned rd = ExtractQRegister(instr, 22, 12);
42699                         if (((instr >> 16) & 1) != 0) {
42700                           UnallocatedA32(instr);
42701                           return;
42702                         }
42703                         unsigned rn = ExtractQRegister(instr, 7, 16);
42704                         unsigned rm = ExtractDRegister(instr, 5, 0);
42705                         // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
42706                         vsubw(al,
42707                               dt,
42708                               QRegister(rd),
42709                               QRegister(rn),
42710                               DRegister(rm));
42711                         break;
42712                       }
42713                     }
42714                     break;
42715                   }
42716                   case 0x00000040: {
42717                     // 0xf2800040
42718                     switch (instr & 0x00000200) {
42719                       case 0x00000000: {
42720                         // 0xf2800040
42721                         switch (instr & 0x01000000) {
42722                           case 0x00000000: {
42723                             // 0xf2800040
42724                             if (((instr & 0x300000) == 0x300000)) {
42725                               UnallocatedA32(instr);
42726                               return;
42727                             }
42728                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
42729                                                            (instr >> 8) & 0x1);
42730                             if (dt.Is(kDataTypeValueInvalid)) {
42731                               UnallocatedA32(instr);
42732                               return;
42733                             }
42734                             unsigned rd = ExtractDRegister(instr, 22, 12);
42735                             unsigned rn = ExtractDRegister(instr, 7, 16);
42736                             int lane;
42737                             unsigned rm =
42738                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
42739                             // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
42740                             vmla(al,
42741                                  dt,
42742                                  DRegister(rd),
42743                                  DRegister(rn),
42744                                  DRegisterLane(rm, lane));
42745                             break;
42746                           }
42747                           case 0x01000000: {
42748                             // 0xf3800040
42749                             if (((instr & 0x300000) == 0x300000)) {
42750                               UnallocatedA32(instr);
42751                               return;
42752                             }
42753                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
42754                                                            (instr >> 8) & 0x1);
42755                             if (dt.Is(kDataTypeValueInvalid)) {
42756                               UnallocatedA32(instr);
42757                               return;
42758                             }
42759                             if (((instr >> 12) & 1) != 0) {
42760                               UnallocatedA32(instr);
42761                               return;
42762                             }
42763                             unsigned rd = ExtractQRegister(instr, 22, 12);
42764                             if (((instr >> 16) & 1) != 0) {
42765                               UnallocatedA32(instr);
42766                               return;
42767                             }
42768                             unsigned rn = ExtractQRegister(instr, 7, 16);
42769                             int lane;
42770                             unsigned rm =
42771                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
42772                             // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
42773                             vmla(al,
42774                                  dt,
42775                                  QRegister(rd),
42776                                  QRegister(rn),
42777                                  DRegisterLane(rm, lane));
42778                             break;
42779                           }
42780                         }
42781                         break;
42782                       }
42783                       case 0x00000200: {
42784                         // 0xf2800240
42785                         switch (instr & 0x00000100) {
42786                           case 0x00000000: {
42787                             // 0xf2800240
42788                             if (((instr & 0x300000) == 0x300000)) {
42789                               UnallocatedA32(instr);
42790                               return;
42791                             }
42792                             DataType dt =
42793                                 Dt_size_11_Decode((instr >> 20) & 0x3,
42794                                                   (instr >> 24) & 0x1);
42795                             if (dt.Is(kDataTypeValueInvalid)) {
42796                               UnallocatedA32(instr);
42797                               return;
42798                             }
42799                             if (((instr >> 12) & 1) != 0) {
42800                               UnallocatedA32(instr);
42801                               return;
42802                             }
42803                             unsigned rd = ExtractQRegister(instr, 22, 12);
42804                             unsigned rn = ExtractDRegister(instr, 7, 16);
42805                             int lane;
42806                             unsigned rm =
42807                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
42808                             // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
42809                             vmlal(al,
42810                                   dt,
42811                                   QRegister(rd),
42812                                   DRegister(rn),
42813                                   DRegisterLane(rm, lane));
42814                             break;
42815                           }
42816                           case 0x00000100: {
42817                             // 0xf2800340
42818                             if ((instr & 0x01000000) == 0x00000000) {
42819                               if (((instr & 0x300000) == 0x300000)) {
42820                                 UnallocatedA32(instr);
42821                                 return;
42822                               }
42823                               DataType dt =
42824                                   Dt_size_13_Decode((instr >> 20) & 0x3);
42825                               if (dt.Is(kDataTypeValueInvalid)) {
42826                                 UnallocatedA32(instr);
42827                                 return;
42828                               }
42829                               if (((instr >> 12) & 1) != 0) {
42830                                 UnallocatedA32(instr);
42831                                 return;
42832                               }
42833                               unsigned rd = ExtractQRegister(instr, 22, 12);
42834                               unsigned rn = ExtractDRegister(instr, 7, 16);
42835                               uint32_t mvm =
42836                                   (instr & 0xf) | ((instr >> 1) & 0x10);
42837                               uint32_t shift = 4;
42838                               if (dt.Is(S16)) {
42839                                 shift = 3;
42840                               }
42841                               uint32_t vm = mvm & ((1 << shift) - 1);
42842                               uint32_t index = mvm >> shift;
42843                               // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
42844                               vqdmlal(al,
42845                                       dt,
42846                                       QRegister(rd),
42847                                       DRegister(rn),
42848                                       DRegister(vm),
42849                                       index);
42850                             } else {
42851                               UnallocatedA32(instr);
42852                             }
42853                             break;
42854                           }
42855                         }
42856                         break;
42857                       }
42858                     }
42859                     break;
42860                   }
42861                   case 0x00000400: {
42862                     // 0xf2800400
42863                     switch (instr & 0x00000300) {
42864                       case 0x00000000: {
42865                         // 0xf2800400
42866                         switch (instr & 0x01000000) {
42867                           case 0x00000000: {
42868                             // 0xf2800400
42869                             if (((instr & 0x300000) == 0x300000)) {
42870                               UnallocatedA32(instr);
42871                               return;
42872                             }
42873                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
42874                             if (dt.Is(kDataTypeValueInvalid)) {
42875                               UnallocatedA32(instr);
42876                               return;
42877                             }
42878                             unsigned rd = ExtractDRegister(instr, 22, 12);
42879                             if (((instr >> 16) & 1) != 0) {
42880                               UnallocatedA32(instr);
42881                               return;
42882                             }
42883                             unsigned rn = ExtractQRegister(instr, 7, 16);
42884                             if ((instr & 1) != 0) {
42885                               UnallocatedA32(instr);
42886                               return;
42887                             }
42888                             unsigned rm = ExtractQRegister(instr, 5, 0);
42889                             // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
42890                             vaddhn(al,
42891                                    dt,
42892                                    DRegister(rd),
42893                                    QRegister(rn),
42894                                    QRegister(rm));
42895                             break;
42896                           }
42897                           case 0x01000000: {
42898                             // 0xf3800400
42899                             if (((instr & 0x300000) == 0x300000)) {
42900                               UnallocatedA32(instr);
42901                               return;
42902                             }
42903                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
42904                             if (dt.Is(kDataTypeValueInvalid)) {
42905                               UnallocatedA32(instr);
42906                               return;
42907                             }
42908                             unsigned rd = ExtractDRegister(instr, 22, 12);
42909                             if (((instr >> 16) & 1) != 0) {
42910                               UnallocatedA32(instr);
42911                               return;
42912                             }
42913                             unsigned rn = ExtractQRegister(instr, 7, 16);
42914                             if ((instr & 1) != 0) {
42915                               UnallocatedA32(instr);
42916                               return;
42917                             }
42918                             unsigned rm = ExtractQRegister(instr, 5, 0);
42919                             // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
42920                             vraddhn(al,
42921                                     dt,
42922                                     DRegister(rd),
42923                                     QRegister(rn),
42924                                     QRegister(rm));
42925                             break;
42926                           }
42927                         }
42928                         break;
42929                       }
42930                       case 0x00000100: {
42931                         // 0xf2800500
42932                         if (((instr & 0x300000) == 0x300000)) {
42933                           UnallocatedA32(instr);
42934                           return;
42935                         }
42936                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42937                                                          ((instr >> 22) & 0x4));
42938                         if (dt.Is(kDataTypeValueInvalid)) {
42939                           UnallocatedA32(instr);
42940                           return;
42941                         }
42942                         if (((instr >> 12) & 1) != 0) {
42943                           UnallocatedA32(instr);
42944                           return;
42945                         }
42946                         unsigned rd = ExtractQRegister(instr, 22, 12);
42947                         unsigned rn = ExtractDRegister(instr, 7, 16);
42948                         unsigned rm = ExtractDRegister(instr, 5, 0);
42949                         // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
42950                         vabal(al,
42951                               dt,
42952                               QRegister(rd),
42953                               DRegister(rn),
42954                               DRegister(rm));
42955                         break;
42956                       }
42957                       case 0x00000200: {
42958                         // 0xf2800600
42959                         switch (instr & 0x01000000) {
42960                           case 0x00000000: {
42961                             // 0xf2800600
42962                             if (((instr & 0x300000) == 0x300000)) {
42963                               UnallocatedA32(instr);
42964                               return;
42965                             }
42966                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
42967                             if (dt.Is(kDataTypeValueInvalid)) {
42968                               UnallocatedA32(instr);
42969                               return;
42970                             }
42971                             unsigned rd = ExtractDRegister(instr, 22, 12);
42972                             if (((instr >> 16) & 1) != 0) {
42973                               UnallocatedA32(instr);
42974                               return;
42975                             }
42976                             unsigned rn = ExtractQRegister(instr, 7, 16);
42977                             if ((instr & 1) != 0) {
42978                               UnallocatedA32(instr);
42979                               return;
42980                             }
42981                             unsigned rm = ExtractQRegister(instr, 5, 0);
42982                             // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
42983                             vsubhn(al,
42984                                    dt,
42985                                    DRegister(rd),
42986                                    QRegister(rn),
42987                                    QRegister(rm));
42988                             break;
42989                           }
42990                           case 0x01000000: {
42991                             // 0xf3800600
42992                             if (((instr & 0x300000) == 0x300000)) {
42993                               UnallocatedA32(instr);
42994                               return;
42995                             }
42996                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
42997                             if (dt.Is(kDataTypeValueInvalid)) {
42998                               UnallocatedA32(instr);
42999                               return;
43000                             }
43001                             unsigned rd = ExtractDRegister(instr, 22, 12);
43002                             if (((instr >> 16) & 1) != 0) {
43003                               UnallocatedA32(instr);
43004                               return;
43005                             }
43006                             unsigned rn = ExtractQRegister(instr, 7, 16);
43007                             if ((instr & 1) != 0) {
43008                               UnallocatedA32(instr);
43009                               return;
43010                             }
43011                             unsigned rm = ExtractQRegister(instr, 5, 0);
43012                             // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43013                             vrsubhn(al,
43014                                     dt,
43015                                     DRegister(rd),
43016                                     QRegister(rn),
43017                                     QRegister(rm));
43018                             break;
43019                           }
43020                         }
43021                         break;
43022                       }
43023                       case 0x00000300: {
43024                         // 0xf2800700
43025                         if (((instr & 0x300000) == 0x300000)) {
43026                           UnallocatedA32(instr);
43027                           return;
43028                         }
43029                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43030                                                          ((instr >> 22) & 0x4));
43031                         if (dt.Is(kDataTypeValueInvalid)) {
43032                           UnallocatedA32(instr);
43033                           return;
43034                         }
43035                         if (((instr >> 12) & 1) != 0) {
43036                           UnallocatedA32(instr);
43037                           return;
43038                         }
43039                         unsigned rd = ExtractQRegister(instr, 22, 12);
43040                         unsigned rn = ExtractDRegister(instr, 7, 16);
43041                         unsigned rm = ExtractDRegister(instr, 5, 0);
43042                         // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43043                         vabdl(al,
43044                               dt,
43045                               QRegister(rd),
43046                               DRegister(rn),
43047                               DRegister(rm));
43048                         break;
43049                       }
43050                     }
43051                     break;
43052                   }
43053                   case 0x00000440: {
43054                     // 0xf2800440
43055                     switch (instr & 0x00000200) {
43056                       case 0x00000000: {
43057                         // 0xf2800440
43058                         switch (instr & 0x01000000) {
43059                           case 0x00000000: {
43060                             // 0xf2800440
43061                             if (((instr & 0x300000) == 0x300000)) {
43062                               UnallocatedA32(instr);
43063                               return;
43064                             }
43065                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43066                                                            (instr >> 8) & 0x1);
43067                             if (dt.Is(kDataTypeValueInvalid)) {
43068                               UnallocatedA32(instr);
43069                               return;
43070                             }
43071                             unsigned rd = ExtractDRegister(instr, 22, 12);
43072                             unsigned rn = ExtractDRegister(instr, 7, 16);
43073                             int lane;
43074                             unsigned rm =
43075                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43076                             // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43077                             vmls(al,
43078                                  dt,
43079                                  DRegister(rd),
43080                                  DRegister(rn),
43081                                  DRegisterLane(rm, lane));
43082                             break;
43083                           }
43084                           case 0x01000000: {
43085                             // 0xf3800440
43086                             if (((instr & 0x300000) == 0x300000)) {
43087                               UnallocatedA32(instr);
43088                               return;
43089                             }
43090                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43091                                                            (instr >> 8) & 0x1);
43092                             if (dt.Is(kDataTypeValueInvalid)) {
43093                               UnallocatedA32(instr);
43094                               return;
43095                             }
43096                             if (((instr >> 12) & 1) != 0) {
43097                               UnallocatedA32(instr);
43098                               return;
43099                             }
43100                             unsigned rd = ExtractQRegister(instr, 22, 12);
43101                             if (((instr >> 16) & 1) != 0) {
43102                               UnallocatedA32(instr);
43103                               return;
43104                             }
43105                             unsigned rn = ExtractQRegister(instr, 7, 16);
43106                             int lane;
43107                             unsigned rm =
43108                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43109                             // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43110                             vmls(al,
43111                                  dt,
43112                                  QRegister(rd),
43113                                  QRegister(rn),
43114                                  DRegisterLane(rm, lane));
43115                             break;
43116                           }
43117                         }
43118                         break;
43119                       }
43120                       case 0x00000200: {
43121                         // 0xf2800640
43122                         switch (instr & 0x00000100) {
43123                           case 0x00000000: {
43124                             // 0xf2800640
43125                             if (((instr & 0x300000) == 0x300000)) {
43126                               UnallocatedA32(instr);
43127                               return;
43128                             }
43129                             DataType dt =
43130                                 Dt_size_11_Decode((instr >> 20) & 0x3,
43131                                                   (instr >> 24) & 0x1);
43132                             if (dt.Is(kDataTypeValueInvalid)) {
43133                               UnallocatedA32(instr);
43134                               return;
43135                             }
43136                             if (((instr >> 12) & 1) != 0) {
43137                               UnallocatedA32(instr);
43138                               return;
43139                             }
43140                             unsigned rd = ExtractQRegister(instr, 22, 12);
43141                             unsigned rn = ExtractDRegister(instr, 7, 16);
43142                             int lane;
43143                             unsigned rm =
43144                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43145                             // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43146                             vmlsl(al,
43147                                   dt,
43148                                   QRegister(rd),
43149                                   DRegister(rn),
43150                                   DRegisterLane(rm, lane));
43151                             break;
43152                           }
43153                           case 0x00000100: {
43154                             // 0xf2800740
43155                             if ((instr & 0x01000000) == 0x00000000) {
43156                               if (((instr & 0x300000) == 0x300000)) {
43157                                 UnallocatedA32(instr);
43158                                 return;
43159                               }
43160                               DataType dt =
43161                                   Dt_size_13_Decode((instr >> 20) & 0x3);
43162                               if (dt.Is(kDataTypeValueInvalid)) {
43163                                 UnallocatedA32(instr);
43164                                 return;
43165                               }
43166                               if (((instr >> 12) & 1) != 0) {
43167                                 UnallocatedA32(instr);
43168                                 return;
43169                               }
43170                               unsigned rd = ExtractQRegister(instr, 22, 12);
43171                               unsigned rn = ExtractDRegister(instr, 7, 16);
43172                               uint32_t mvm =
43173                                   (instr & 0xf) | ((instr >> 1) & 0x10);
43174                               uint32_t shift = 4;
43175                               if (dt.Is(S16)) {
43176                                 shift = 3;
43177                               }
43178                               uint32_t vm = mvm & ((1 << shift) - 1);
43179                               uint32_t index = mvm >> shift;
43180                               // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
43181                               vqdmlsl(al,
43182                                       dt,
43183                                       QRegister(rd),
43184                                       DRegister(rn),
43185                                       DRegister(vm),
43186                                       index);
43187                             } else {
43188                               UnallocatedA32(instr);
43189                             }
43190                             break;
43191                           }
43192                         }
43193                         break;
43194                       }
43195                     }
43196                     break;
43197                   }
43198                   case 0x00000800: {
43199                     // 0xf2800800
43200                     switch (instr & 0x00000300) {
43201                       case 0x00000000: {
43202                         // 0xf2800800
43203                         if (((instr & 0x300000) == 0x300000)) {
43204                           UnallocatedA32(instr);
43205                           return;
43206                         }
43207                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
43208                                                         (instr >> 24) & 0x1);
43209                         if (dt.Is(kDataTypeValueInvalid)) {
43210                           UnallocatedA32(instr);
43211                           return;
43212                         }
43213                         if (((instr >> 12) & 1) != 0) {
43214                           UnallocatedA32(instr);
43215                           return;
43216                         }
43217                         unsigned rd = ExtractQRegister(instr, 22, 12);
43218                         unsigned rn = ExtractDRegister(instr, 7, 16);
43219                         unsigned rm = ExtractDRegister(instr, 5, 0);
43220                         // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
43221                         vmlal(al,
43222                               dt,
43223                               QRegister(rd),
43224                               DRegister(rn),
43225                               DRegister(rm));
43226                         break;
43227                       }
43228                       case 0x00000100: {
43229                         // 0xf2800900
43230                         if ((instr & 0x01000000) == 0x00000000) {
43231                           if (((instr & 0x300000) == 0x300000)) {
43232                             UnallocatedA32(instr);
43233                             return;
43234                           }
43235                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43236                           if (dt.Is(kDataTypeValueInvalid)) {
43237                             UnallocatedA32(instr);
43238                             return;
43239                           }
43240                           if (((instr >> 12) & 1) != 0) {
43241                             UnallocatedA32(instr);
43242                             return;
43243                           }
43244                           unsigned rd = ExtractQRegister(instr, 22, 12);
43245                           unsigned rn = ExtractDRegister(instr, 7, 16);
43246                           unsigned rm = ExtractDRegister(instr, 5, 0);
43247                           // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43248                           vqdmlal(al,
43249                                   dt,
43250                                   QRegister(rd),
43251                                   DRegister(rn),
43252                                   DRegister(rm));
43253                         } else {
43254                           UnallocatedA32(instr);
43255                         }
43256                         break;
43257                       }
43258                       case 0x00000200: {
43259                         // 0xf2800a00
43260                         if (((instr & 0x300000) == 0x300000)) {
43261                           UnallocatedA32(instr);
43262                           return;
43263                         }
43264                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
43265                                                         (instr >> 24) & 0x1);
43266                         if (dt.Is(kDataTypeValueInvalid)) {
43267                           UnallocatedA32(instr);
43268                           return;
43269                         }
43270                         if (((instr >> 12) & 1) != 0) {
43271                           UnallocatedA32(instr);
43272                           return;
43273                         }
43274                         unsigned rd = ExtractQRegister(instr, 22, 12);
43275                         unsigned rn = ExtractDRegister(instr, 7, 16);
43276                         unsigned rm = ExtractDRegister(instr, 5, 0);
43277                         // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
43278                         vmlsl(al,
43279                               dt,
43280                               QRegister(rd),
43281                               DRegister(rn),
43282                               DRegister(rm));
43283                         break;
43284                       }
43285                       case 0x00000300: {
43286                         // 0xf2800b00
43287                         if ((instr & 0x01000000) == 0x00000000) {
43288                           if (((instr & 0x300000) == 0x300000)) {
43289                             UnallocatedA32(instr);
43290                             return;
43291                           }
43292                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43293                           if (dt.Is(kDataTypeValueInvalid)) {
43294                             UnallocatedA32(instr);
43295                             return;
43296                           }
43297                           if (((instr >> 12) & 1) != 0) {
43298                             UnallocatedA32(instr);
43299                             return;
43300                           }
43301                           unsigned rd = ExtractQRegister(instr, 22, 12);
43302                           unsigned rn = ExtractDRegister(instr, 7, 16);
43303                           unsigned rm = ExtractDRegister(instr, 5, 0);
43304                           // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43305                           vqdmlsl(al,
43306                                   dt,
43307                                   QRegister(rd),
43308                                   DRegister(rn),
43309                                   DRegister(rm));
43310                         } else {
43311                           UnallocatedA32(instr);
43312                         }
43313                         break;
43314                       }
43315                     }
43316                     break;
43317                   }
43318                   case 0x00000840: {
43319                     // 0xf2800840
43320                     switch (instr & 0x00000200) {
43321                       case 0x00000000: {
43322                         // 0xf2800840
43323                         switch (instr & 0x01000000) {
43324                           case 0x00000000: {
43325                             // 0xf2800840
43326                             if (((instr & 0x300000) == 0x300000)) {
43327                               UnallocatedA32(instr);
43328                               return;
43329                             }
43330                             DataType dt = Dt_F_size_3_Decode(
43331                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
43332                             if (dt.Is(kDataTypeValueInvalid)) {
43333                               UnallocatedA32(instr);
43334                               return;
43335                             }
43336                             unsigned rd = ExtractDRegister(instr, 22, 12);
43337                             unsigned rn = ExtractDRegister(instr, 7, 16);
43338                             uint32_t mvm =
43339                                 (instr & 0xf) | ((instr >> 1) & 0x10);
43340                             uint32_t shift = 4;
43341                             if (dt.Is(I16)) {
43342                               shift = 3;
43343                             }
43344                             uint32_t vm = mvm & ((1 << shift) - 1);
43345                             uint32_t index = mvm >> shift;
43346                             // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43347                             vmul(al,
43348                                  dt,
43349                                  DRegister(rd),
43350                                  DRegister(rn),
43351                                  DRegister(vm),
43352                                  index);
43353                             break;
43354                           }
43355                           case 0x01000000: {
43356                             // 0xf3800840
43357                             if (((instr & 0x300000) == 0x300000)) {
43358                               UnallocatedA32(instr);
43359                               return;
43360                             }
43361                             DataType dt = Dt_F_size_3_Decode(
43362                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
43363                             if (dt.Is(kDataTypeValueInvalid)) {
43364                               UnallocatedA32(instr);
43365                               return;
43366                             }
43367                             if (((instr >> 12) & 1) != 0) {
43368                               UnallocatedA32(instr);
43369                               return;
43370                             }
43371                             unsigned rd = ExtractQRegister(instr, 22, 12);
43372                             if (((instr >> 16) & 1) != 0) {
43373                               UnallocatedA32(instr);
43374                               return;
43375                             }
43376                             unsigned rn = ExtractQRegister(instr, 7, 16);
43377                             uint32_t mvm =
43378                                 (instr & 0xf) | ((instr >> 1) & 0x10);
43379                             uint32_t shift = 4;
43380                             if (dt.Is(I16)) {
43381                               shift = 3;
43382                             }
43383                             uint32_t vm = mvm & ((1 << shift) - 1);
43384                             uint32_t index = mvm >> shift;
43385                             // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43386                             vmul(al,
43387                                  dt,
43388                                  QRegister(rd),
43389                                  QRegister(rn),
43390                                  DRegister(vm),
43391                                  index);
43392                             break;
43393                           }
43394                         }
43395                         break;
43396                       }
43397                       case 0x00000200: {
43398                         // 0xf2800a40
43399                         switch (instr & 0x00000100) {
43400                           case 0x00000000: {
43401                             // 0xf2800a40
43402                             if (((instr & 0x300000) == 0x300000)) {
43403                               UnallocatedA32(instr);
43404                               return;
43405                             }
43406                             DataType dt = Dt_U_size_2_Decode(
43407                                 ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4));
43408                             if (dt.Is(kDataTypeValueInvalid)) {
43409                               UnallocatedA32(instr);
43410                               return;
43411                             }
43412                             if (((instr >> 12) & 1) != 0) {
43413                               UnallocatedA32(instr);
43414                               return;
43415                             }
43416                             unsigned rd = ExtractQRegister(instr, 22, 12);
43417                             unsigned rn = ExtractDRegister(instr, 7, 16);
43418                             uint32_t mvm =
43419                                 (instr & 0xf) | ((instr >> 1) & 0x10);
43420                             uint32_t shift = 4;
43421                             if (dt.Is(S16) || dt.Is(U16)) {
43422                               shift = 3;
43423                             }
43424                             uint32_t vm = mvm & ((1 << shift) - 1);
43425                             uint32_t index = mvm >> shift;
43426                             // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43427                             vmull(al,
43428                                   dt,
43429                                   QRegister(rd),
43430                                   DRegister(rn),
43431                                   DRegister(vm),
43432                                   index);
43433                             break;
43434                           }
43435                           case 0x00000100: {
43436                             // 0xf2800b40
43437                             if ((instr & 0x01000000) == 0x00000000) {
43438                               if (((instr & 0x300000) == 0x300000)) {
43439                                 UnallocatedA32(instr);
43440                                 return;
43441                               }
43442                               DataType dt =
43443                                   Dt_size_13_Decode((instr >> 20) & 0x3);
43444                               if (dt.Is(kDataTypeValueInvalid)) {
43445                                 UnallocatedA32(instr);
43446                                 return;
43447                               }
43448                               if (((instr >> 12) & 1) != 0) {
43449                                 UnallocatedA32(instr);
43450                                 return;
43451                               }
43452                               unsigned rd = ExtractQRegister(instr, 22, 12);
43453                               unsigned rn = ExtractDRegister(instr, 7, 16);
43454                               int lane;
43455                               unsigned rm = ExtractDRegisterAndLane(instr,
43456                                                                     dt,
43457                                                                     5,
43458                                                                     0,
43459                                                                     &lane);
43460                               // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2
43461                               vqdmull(al,
43462                                       dt,
43463                                       QRegister(rd),
43464                                       DRegister(rn),
43465                                       DRegisterLane(rm, lane));
43466                             } else {
43467                               UnallocatedA32(instr);
43468                             }
43469                             break;
43470                           }
43471                         }
43472                         break;
43473                       }
43474                     }
43475                     break;
43476                   }
43477                   case 0x00000c00: {
43478                     // 0xf2800c00
43479                     switch (instr & 0x00000100) {
43480                       case 0x00000000: {
43481                         // 0xf2800c00
43482                         if (((instr & 0x300000) == 0x300000)) {
43483                           UnallocatedA32(instr);
43484                           return;
43485                         }
43486                         DataType dt = Dt_op_U_size_1_Decode(
43487                             ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) |
43488                             ((instr >> 6) & 0x8));
43489                         if (dt.Is(kDataTypeValueInvalid)) {
43490                           UnallocatedA32(instr);
43491                           return;
43492                         }
43493                         if (((instr >> 12) & 1) != 0) {
43494                           UnallocatedA32(instr);
43495                           return;
43496                         }
43497                         unsigned rd = ExtractQRegister(instr, 22, 12);
43498                         unsigned rn = ExtractDRegister(instr, 7, 16);
43499                         unsigned rm = ExtractDRegister(instr, 5, 0);
43500                         // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43501                         vmull(al,
43502                               dt,
43503                               QRegister(rd),
43504                               DRegister(rn),
43505                               DRegister(rm));
43506                         break;
43507                       }
43508                       case 0x00000100: {
43509                         // 0xf2800d00
43510                         if ((instr & 0x01000200) == 0x00000000) {
43511                           if (((instr & 0x300000) == 0x300000)) {
43512                             UnallocatedA32(instr);
43513                             return;
43514                           }
43515                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43516                           if (dt.Is(kDataTypeValueInvalid)) {
43517                             UnallocatedA32(instr);
43518                             return;
43519                           }
43520                           if (((instr >> 12) & 1) != 0) {
43521                             UnallocatedA32(instr);
43522                             return;
43523                           }
43524                           unsigned rd = ExtractQRegister(instr, 22, 12);
43525                           unsigned rn = ExtractDRegister(instr, 7, 16);
43526                           unsigned rm = ExtractDRegister(instr, 5, 0);
43527                           // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43528                           vqdmull(al,
43529                                   dt,
43530                                   QRegister(rd),
43531                                   DRegister(rn),
43532                                   DRegister(rm));
43533                         } else {
43534                           UnallocatedA32(instr);
43535                         }
43536                         break;
43537                       }
43538                     }
43539                     break;
43540                   }
43541                   case 0x00000c40: {
43542                     // 0xf2800c40
43543                     switch (instr & 0x01000300) {
43544                       case 0x00000000: {
43545                         // 0xf2800c40
43546                         if (((instr & 0x300000) == 0x300000)) {
43547                           UnallocatedA32(instr);
43548                           return;
43549                         }
43550                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43551                         if (dt.Is(kDataTypeValueInvalid)) {
43552                           UnallocatedA32(instr);
43553                           return;
43554                         }
43555                         unsigned rd = ExtractDRegister(instr, 22, 12);
43556                         unsigned rn = ExtractDRegister(instr, 7, 16);
43557                         int lane;
43558                         unsigned rm =
43559                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43560                         // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
43561                         vqdmulh(al,
43562                                 dt,
43563                                 DRegister(rd),
43564                                 DRegister(rn),
43565                                 DRegisterLane(rm, lane));
43566                         break;
43567                       }
43568                       case 0x00000100: {
43569                         // 0xf2800d40
43570                         if (((instr & 0x300000) == 0x300000)) {
43571                           UnallocatedA32(instr);
43572                           return;
43573                         }
43574                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43575                         if (dt.Is(kDataTypeValueInvalid)) {
43576                           UnallocatedA32(instr);
43577                           return;
43578                         }
43579                         unsigned rd = ExtractDRegister(instr, 22, 12);
43580                         unsigned rn = ExtractDRegister(instr, 7, 16);
43581                         int lane;
43582                         unsigned rm =
43583                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43584                         // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
43585                         vqrdmulh(al,
43586                                  dt,
43587                                  DRegister(rd),
43588                                  DRegister(rn),
43589                                  DRegisterLane(rm, lane));
43590                         break;
43591                       }
43592                       case 0x01000000: {
43593                         // 0xf3800c40
43594                         if (((instr & 0x300000) == 0x300000)) {
43595                           UnallocatedA32(instr);
43596                           return;
43597                         }
43598                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43599                         if (dt.Is(kDataTypeValueInvalid)) {
43600                           UnallocatedA32(instr);
43601                           return;
43602                         }
43603                         if (((instr >> 12) & 1) != 0) {
43604                           UnallocatedA32(instr);
43605                           return;
43606                         }
43607                         unsigned rd = ExtractQRegister(instr, 22, 12);
43608                         if (((instr >> 16) & 1) != 0) {
43609                           UnallocatedA32(instr);
43610                           return;
43611                         }
43612                         unsigned rn = ExtractQRegister(instr, 7, 16);
43613                         int lane;
43614                         unsigned rm =
43615                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43616                         // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
43617                         vqdmulh(al,
43618                                 dt,
43619                                 QRegister(rd),
43620                                 QRegister(rn),
43621                                 DRegisterLane(rm, lane));
43622                         break;
43623                       }
43624                       case 0x01000100: {
43625                         // 0xf3800d40
43626                         if (((instr & 0x300000) == 0x300000)) {
43627                           UnallocatedA32(instr);
43628                           return;
43629                         }
43630                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43631                         if (dt.Is(kDataTypeValueInvalid)) {
43632                           UnallocatedA32(instr);
43633                           return;
43634                         }
43635                         if (((instr >> 12) & 1) != 0) {
43636                           UnallocatedA32(instr);
43637                           return;
43638                         }
43639                         unsigned rd = ExtractQRegister(instr, 22, 12);
43640                         if (((instr >> 16) & 1) != 0) {
43641                           UnallocatedA32(instr);
43642                           return;
43643                         }
43644                         unsigned rn = ExtractQRegister(instr, 7, 16);
43645                         int lane;
43646                         unsigned rm =
43647                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43648                         // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
43649                         vqrdmulh(al,
43650                                  dt,
43651                                  QRegister(rd),
43652                                  QRegister(rn),
43653                                  DRegisterLane(rm, lane));
43654                         break;
43655                       }
43656                       default:
43657                         UnallocatedA32(instr);
43658                         break;
43659                     }
43660                     break;
43661                   }
43662                 }
43663                 break;
43664               }
43665             }
43666             break;
43667           }
43668           case 0x00800010: {
43669             // 0xf2800010
43670             switch (instr & 0x00000040) {
43671               case 0x00000000: {
43672                 // 0xf2800010
43673                 switch (instr & 0x00000c00) {
43674                   case 0x00000000: {
43675                     // 0xf2800010
43676                     switch (instr & 0x00380080) {
43677                       case 0x00000000: {
43678                         // 0xf2800010
43679                         switch (instr & 0x00000100) {
43680                           case 0x00000000: {
43681                             // 0xf2800010
43682                             switch (instr & 0x00000200) {
43683                               default: {
43684                                 switch (instr & 0x00000020) {
43685                                   case 0x00000020: {
43686                                     // 0xf2800030
43687                                     if (((instr & 0xd00) == 0x100) ||
43688                                         ((instr & 0xd00) == 0x500) ||
43689                                         ((instr & 0xd00) == 0x900) ||
43690                                         ((instr & 0xe00) == 0xe00)) {
43691                                       UnallocatedA32(instr);
43692                                       return;
43693                                     }
43694                                     unsigned cmode = (instr >> 8) & 0xf;
43695                                     DataType dt =
43696                                         ImmediateVmvn::DecodeDt(cmode);
43697                                     if (dt.Is(kDataTypeValueInvalid)) {
43698                                       UnallocatedA32(instr);
43699                                       return;
43700                                     }
43701                                     unsigned rd =
43702                                         ExtractDRegister(instr, 22, 12);
43703                                     DOperand imm =
43704                                         ImmediateVmvn::DecodeImmediate(
43705                                             cmode,
43706                                             (instr & 0xf) |
43707                                                 ((instr >> 12) & 0x70) |
43708                                                 ((instr >> 17) & 0x80));
43709                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
43710                                     vmvn(al, dt, DRegister(rd), imm);
43711                                     break;
43712                                   }
43713                                   default: {
43714                                     if (((instr & 0x920) == 0x100) ||
43715                                         ((instr & 0x520) == 0x100) ||
43716                                         ((instr & 0x820) == 0x20) ||
43717                                         ((instr & 0x420) == 0x20) ||
43718                                         ((instr & 0x220) == 0x20) ||
43719                                         ((instr & 0x120) == 0x120)) {
43720                                       UnallocatedA32(instr);
43721                                       return;
43722                                     }
43723                                     unsigned cmode = ((instr >> 8) & 0xf) |
43724                                                      ((instr >> 1) & 0x10);
43725                                     DataType dt =
43726                                         ImmediateVmov::DecodeDt(cmode);
43727                                     if (dt.Is(kDataTypeValueInvalid)) {
43728                                       UnallocatedA32(instr);
43729                                       return;
43730                                     }
43731                                     unsigned rd =
43732                                         ExtractDRegister(instr, 22, 12);
43733                                     DOperand imm =
43734                                         ImmediateVmov::DecodeImmediate(
43735                                             cmode,
43736                                             (instr & 0xf) |
43737                                                 ((instr >> 12) & 0x70) |
43738                                                 ((instr >> 17) & 0x80));
43739                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
43740                                     vmov(al, dt, DRegister(rd), imm);
43741                                     break;
43742                                   }
43743                                 }
43744                                 break;
43745                               }
43746                             }
43747                             break;
43748                           }
43749                           case 0x00000100: {
43750                             // 0xf2800110
43751                             switch (instr & 0x00000020) {
43752                               case 0x00000000: {
43753                                 // 0xf2800110
43754                                 if (((instr & 0x100) == 0x0) ||
43755                                     ((instr & 0xc00) == 0xc00)) {
43756                                   UnallocatedA32(instr);
43757                                   return;
43758                                 }
43759                                 unsigned cmode = (instr >> 8) & 0xf;
43760                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
43761                                 if (dt.Is(kDataTypeValueInvalid)) {
43762                                   UnallocatedA32(instr);
43763                                   return;
43764                                 }
43765                                 unsigned rd = ExtractDRegister(instr, 22, 12);
43766                                 DOperand imm = ImmediateVorr::DecodeImmediate(
43767                                     cmode,
43768                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
43769                                         ((instr >> 17) & 0x80));
43770                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
43771                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
43772                                 break;
43773                               }
43774                               case 0x00000020: {
43775                                 // 0xf2800130
43776                                 if (((instr & 0x100) == 0x0) ||
43777                                     ((instr & 0xc00) == 0xc00)) {
43778                                   UnallocatedA32(instr);
43779                                   return;
43780                                 }
43781                                 unsigned cmode = (instr >> 8) & 0xf;
43782                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
43783                                 if (dt.Is(kDataTypeValueInvalid)) {
43784                                   UnallocatedA32(instr);
43785                                   return;
43786                                 }
43787                                 unsigned rd = ExtractDRegister(instr, 22, 12);
43788                                 DOperand imm = ImmediateVbic::DecodeImmediate(
43789                                     cmode,
43790                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
43791                                         ((instr >> 17) & 0x80));
43792                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
43793                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
43794                                 break;
43795                               }
43796                             }
43797                             break;
43798                           }
43799                         }
43800                         break;
43801                       }
43802                       default: {
43803                         switch (instr & 0x00000300) {
43804                           case 0x00000000: {
43805                             // 0xf2800010
43806                             if (((instr & 0x380080) == 0x0)) {
43807                               UnallocatedA32(instr);
43808                               return;
43809                             }
43810                             DataType dt =
43811                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
43812                                                        ((instr >> 4) & 0x8),
43813                                                    (instr >> 24) & 0x1);
43814                             if (dt.Is(kDataTypeValueInvalid)) {
43815                               UnallocatedA32(instr);
43816                               return;
43817                             }
43818                             unsigned rd = ExtractDRegister(instr, 22, 12);
43819                             unsigned rm = ExtractDRegister(instr, 5, 0);
43820                             uint32_t imm6 = (instr >> 16) & 0x3f;
43821                             uint32_t imm =
43822                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
43823                                 imm6;
43824                             // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
43825                             vshr(al, dt, DRegister(rd), DRegister(rm), imm);
43826                             break;
43827                           }
43828                           case 0x00000100: {
43829                             // 0xf2800110
43830                             if (((instr & 0x380080) == 0x0)) {
43831                               UnallocatedA32(instr);
43832                               return;
43833                             }
43834                             DataType dt =
43835                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
43836                                                        ((instr >> 4) & 0x8),
43837                                                    (instr >> 24) & 0x1);
43838                             if (dt.Is(kDataTypeValueInvalid)) {
43839                               UnallocatedA32(instr);
43840                               return;
43841                             }
43842                             unsigned rd = ExtractDRegister(instr, 22, 12);
43843                             unsigned rm = ExtractDRegister(instr, 5, 0);
43844                             uint32_t imm6 = (instr >> 16) & 0x3f;
43845                             uint32_t imm =
43846                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
43847                                 imm6;
43848                             // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
43849                             vsra(al, dt, DRegister(rd), DRegister(rm), imm);
43850                             break;
43851                           }
43852                           case 0x00000200: {
43853                             // 0xf2800210
43854                             if (((instr & 0x380080) == 0x0)) {
43855                               UnallocatedA32(instr);
43856                               return;
43857                             }
43858                             DataType dt =
43859                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
43860                                                        ((instr >> 4) & 0x8),
43861                                                    (instr >> 24) & 0x1);
43862                             if (dt.Is(kDataTypeValueInvalid)) {
43863                               UnallocatedA32(instr);
43864                               return;
43865                             }
43866                             unsigned rd = ExtractDRegister(instr, 22, 12);
43867                             unsigned rm = ExtractDRegister(instr, 5, 0);
43868                             uint32_t imm6 = (instr >> 16) & 0x3f;
43869                             uint32_t imm =
43870                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
43871                                 imm6;
43872                             // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
43873                             vrshr(al, dt, DRegister(rd), DRegister(rm), imm);
43874                             break;
43875                           }
43876                           case 0x00000300: {
43877                             // 0xf2800310
43878                             if (((instr & 0x380080) == 0x0)) {
43879                               UnallocatedA32(instr);
43880                               return;
43881                             }
43882                             DataType dt =
43883                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
43884                                                        ((instr >> 4) & 0x8),
43885                                                    (instr >> 24) & 0x1);
43886                             if (dt.Is(kDataTypeValueInvalid)) {
43887                               UnallocatedA32(instr);
43888                               return;
43889                             }
43890                             unsigned rd = ExtractDRegister(instr, 22, 12);
43891                             unsigned rm = ExtractDRegister(instr, 5, 0);
43892                             uint32_t imm6 = (instr >> 16) & 0x3f;
43893                             uint32_t imm =
43894                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
43895                                 imm6;
43896                             // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
43897                             vrsra(al, dt, DRegister(rd), DRegister(rm), imm);
43898                             break;
43899                           }
43900                         }
43901                         break;
43902                       }
43903                     }
43904                     break;
43905                   }
43906                   case 0x00000400: {
43907                     // 0xf2800410
43908                     switch (instr & 0x00380080) {
43909                       case 0x00000000: {
43910                         // 0xf2800410
43911                         switch (instr & 0x00000100) {
43912                           case 0x00000000: {
43913                             // 0xf2800410
43914                             switch (instr & 0x00000200) {
43915                               default: {
43916                                 switch (instr & 0x00000020) {
43917                                   case 0x00000020: {
43918                                     // 0xf2800430
43919                                     if (((instr & 0xd00) == 0x100) ||
43920                                         ((instr & 0xd00) == 0x500) ||
43921                                         ((instr & 0xd00) == 0x900) ||
43922                                         ((instr & 0xe00) == 0xe00)) {
43923                                       UnallocatedA32(instr);
43924                                       return;
43925                                     }
43926                                     unsigned cmode = (instr >> 8) & 0xf;
43927                                     DataType dt =
43928                                         ImmediateVmvn::DecodeDt(cmode);
43929                                     if (dt.Is(kDataTypeValueInvalid)) {
43930                                       UnallocatedA32(instr);
43931                                       return;
43932                                     }
43933                                     unsigned rd =
43934                                         ExtractDRegister(instr, 22, 12);
43935                                     DOperand imm =
43936                                         ImmediateVmvn::DecodeImmediate(
43937                                             cmode,
43938                                             (instr & 0xf) |
43939                                                 ((instr >> 12) & 0x70) |
43940                                                 ((instr >> 17) & 0x80));
43941                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
43942                                     vmvn(al, dt, DRegister(rd), imm);
43943                                     break;
43944                                   }
43945                                   default: {
43946                                     if (((instr & 0x920) == 0x100) ||
43947                                         ((instr & 0x520) == 0x100) ||
43948                                         ((instr & 0x820) == 0x20) ||
43949                                         ((instr & 0x420) == 0x20) ||
43950                                         ((instr & 0x220) == 0x20) ||
43951                                         ((instr & 0x120) == 0x120)) {
43952                                       UnallocatedA32(instr);
43953                                       return;
43954                                     }
43955                                     unsigned cmode = ((instr >> 8) & 0xf) |
43956                                                      ((instr >> 1) & 0x10);
43957                                     DataType dt =
43958                                         ImmediateVmov::DecodeDt(cmode);
43959                                     if (dt.Is(kDataTypeValueInvalid)) {
43960                                       UnallocatedA32(instr);
43961                                       return;
43962                                     }
43963                                     unsigned rd =
43964                                         ExtractDRegister(instr, 22, 12);
43965                                     DOperand imm =
43966                                         ImmediateVmov::DecodeImmediate(
43967                                             cmode,
43968                                             (instr & 0xf) |
43969                                                 ((instr >> 12) & 0x70) |
43970                                                 ((instr >> 17) & 0x80));
43971                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
43972                                     vmov(al, dt, DRegister(rd), imm);
43973                                     break;
43974                                   }
43975                                 }
43976                                 break;
43977                               }
43978                             }
43979                             break;
43980                           }
43981                           case 0x00000100: {
43982                             // 0xf2800510
43983                             switch (instr & 0x00000020) {
43984                               case 0x00000000: {
43985                                 // 0xf2800510
43986                                 if (((instr & 0x100) == 0x0) ||
43987                                     ((instr & 0xc00) == 0xc00)) {
43988                                   UnallocatedA32(instr);
43989                                   return;
43990                                 }
43991                                 unsigned cmode = (instr >> 8) & 0xf;
43992                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
43993                                 if (dt.Is(kDataTypeValueInvalid)) {
43994                                   UnallocatedA32(instr);
43995                                   return;
43996                                 }
43997                                 unsigned rd = ExtractDRegister(instr, 22, 12);
43998                                 DOperand imm = ImmediateVorr::DecodeImmediate(
43999                                     cmode,
44000                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
44001                                         ((instr >> 17) & 0x80));
44002                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44003                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
44004                                 break;
44005                               }
44006                               case 0x00000020: {
44007                                 // 0xf2800530
44008                                 if (((instr & 0x100) == 0x0) ||
44009                                     ((instr & 0xc00) == 0xc00)) {
44010                                   UnallocatedA32(instr);
44011                                   return;
44012                                 }
44013                                 unsigned cmode = (instr >> 8) & 0xf;
44014                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
44015                                 if (dt.Is(kDataTypeValueInvalid)) {
44016                                   UnallocatedA32(instr);
44017                                   return;
44018                                 }
44019                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44020                                 DOperand imm = ImmediateVbic::DecodeImmediate(
44021                                     cmode,
44022                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
44023                                         ((instr >> 17) & 0x80));
44024                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44025                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
44026                                 break;
44027                               }
44028                             }
44029                             break;
44030                           }
44031                         }
44032                         break;
44033                       }
44034                       default: {
44035                         switch (instr & 0x00000300) {
44036                           case 0x00000000: {
44037                             // 0xf2800410
44038                             if ((instr & 0x01000000) == 0x01000000) {
44039                               if (((instr & 0x380080) == 0x0)) {
44040                                 UnallocatedA32(instr);
44041                                 return;
44042                               }
44043                               DataType dt = Dt_L_imm6_4_Decode(
44044                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
44045                               if (dt.Is(kDataTypeValueInvalid)) {
44046                                 UnallocatedA32(instr);
44047                                 return;
44048                               }
44049                               unsigned rd = ExtractDRegister(instr, 22, 12);
44050                               unsigned rm = ExtractDRegister(instr, 5, 0);
44051                               uint32_t imm6 = (instr >> 16) & 0x3f;
44052                               uint32_t imm =
44053                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44054                                   imm6;
44055                               // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
44056                               vsri(al, dt, DRegister(rd), DRegister(rm), imm);
44057                             } else {
44058                               UnallocatedA32(instr);
44059                             }
44060                             break;
44061                           }
44062                           case 0x00000100: {
44063                             // 0xf2800510
44064                             switch (instr & 0x01000000) {
44065                               case 0x00000000: {
44066                                 // 0xf2800510
44067                                 if (((instr & 0x380080) == 0x0)) {
44068                                   UnallocatedA32(instr);
44069                                   return;
44070                                 }
44071                                 DataType dt =
44072                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
44073                                                        ((instr >> 4) & 0x8));
44074                                 if (dt.Is(kDataTypeValueInvalid)) {
44075                                   UnallocatedA32(instr);
44076                                   return;
44077                                 }
44078                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44079                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44080                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44081                                 uint32_t imm =
44082                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44083                                 // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44084                                 vshl(al, dt, DRegister(rd), DRegister(rm), imm);
44085                                 break;
44086                               }
44087                               case 0x01000000: {
44088                                 // 0xf3800510
44089                                 if (((instr & 0x380080) == 0x0)) {
44090                                   UnallocatedA32(instr);
44091                                   return;
44092                                 }
44093                                 DataType dt =
44094                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
44095                                                        ((instr >> 4) & 0x8));
44096                                 if (dt.Is(kDataTypeValueInvalid)) {
44097                                   UnallocatedA32(instr);
44098                                   return;
44099                                 }
44100                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44101                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44102                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44103                                 uint32_t imm =
44104                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44105                                 // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
44106                                 vsli(al, dt, DRegister(rd), DRegister(rm), imm);
44107                                 break;
44108                               }
44109                             }
44110                             break;
44111                           }
44112                           case 0x00000200: {
44113                             // 0xf2800610
44114                             if (((instr & 0x380080) == 0x0)) {
44115                               UnallocatedA32(instr);
44116                               return;
44117                             }
44118                             DataType dt =
44119                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
44120                                                        ((instr >> 4) & 0x8),
44121                                                    (instr >> 24) & 0x1);
44122                             if (dt.Is(kDataTypeValueInvalid)) {
44123                               UnallocatedA32(instr);
44124                               return;
44125                             }
44126                             unsigned rd = ExtractDRegister(instr, 22, 12);
44127                             unsigned rm = ExtractDRegister(instr, 5, 0);
44128                             uint32_t imm6 = (instr >> 16) & 0x3f;
44129                             uint32_t imm =
44130                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44131                             // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44132                             vqshlu(al, dt, DRegister(rd), DRegister(rm), imm);
44133                             break;
44134                           }
44135                           case 0x00000300: {
44136                             // 0xf2800710
44137                             if (((instr & 0x380080) == 0x0)) {
44138                               UnallocatedA32(instr);
44139                               return;
44140                             }
44141                             DataType dt =
44142                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44143                                                        ((instr >> 4) & 0x8),
44144                                                    (instr >> 24) & 0x1);
44145                             if (dt.Is(kDataTypeValueInvalid)) {
44146                               UnallocatedA32(instr);
44147                               return;
44148                             }
44149                             unsigned rd = ExtractDRegister(instr, 22, 12);
44150                             unsigned rm = ExtractDRegister(instr, 5, 0);
44151                             uint32_t imm6 = (instr >> 16) & 0x3f;
44152                             uint32_t imm =
44153                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44154                             // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44155                             vqshl(al, dt, DRegister(rd), DRegister(rm), imm);
44156                             break;
44157                           }
44158                         }
44159                         break;
44160                       }
44161                     }
44162                     break;
44163                   }
44164                   case 0x00000800: {
44165                     // 0xf2800810
44166                     switch (instr & 0x00000080) {
44167                       case 0x00000000: {
44168                         // 0xf2800810
44169                         switch (instr & 0x00380000) {
44170                           case 0x00000000: {
44171                             // 0xf2800810
44172                             switch (instr & 0x00000100) {
44173                               case 0x00000000: {
44174                                 // 0xf2800810
44175                                 switch (instr & 0x00000200) {
44176                                   default: {
44177                                     switch (instr & 0x00000020) {
44178                                       case 0x00000020: {
44179                                         // 0xf2800830
44180                                         if (((instr & 0xd00) == 0x100) ||
44181                                             ((instr & 0xd00) == 0x500) ||
44182                                             ((instr & 0xd00) == 0x900) ||
44183                                             ((instr & 0xe00) == 0xe00)) {
44184                                           UnallocatedA32(instr);
44185                                           return;
44186                                         }
44187                                         unsigned cmode = (instr >> 8) & 0xf;
44188                                         DataType dt =
44189                                             ImmediateVmvn::DecodeDt(cmode);
44190                                         if (dt.Is(kDataTypeValueInvalid)) {
44191                                           UnallocatedA32(instr);
44192                                           return;
44193                                         }
44194                                         unsigned rd =
44195                                             ExtractDRegister(instr, 22, 12);
44196                                         DOperand imm =
44197                                             ImmediateVmvn::DecodeImmediate(
44198                                                 cmode,
44199                                                 (instr & 0xf) |
44200                                                     ((instr >> 12) & 0x70) |
44201                                                     ((instr >> 17) & 0x80));
44202                                         // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44203                                         vmvn(al, dt, DRegister(rd), imm);
44204                                         break;
44205                                       }
44206                                       default: {
44207                                         if (((instr & 0x920) == 0x100) ||
44208                                             ((instr & 0x520) == 0x100) ||
44209                                             ((instr & 0x820) == 0x20) ||
44210                                             ((instr & 0x420) == 0x20) ||
44211                                             ((instr & 0x220) == 0x20) ||
44212                                             ((instr & 0x120) == 0x120)) {
44213                                           UnallocatedA32(instr);
44214                                           return;
44215                                         }
44216                                         unsigned cmode = ((instr >> 8) & 0xf) |
44217                                                          ((instr >> 1) & 0x10);
44218                                         DataType dt =
44219                                             ImmediateVmov::DecodeDt(cmode);
44220                                         if (dt.Is(kDataTypeValueInvalid)) {
44221                                           UnallocatedA32(instr);
44222                                           return;
44223                                         }
44224                                         unsigned rd =
44225                                             ExtractDRegister(instr, 22, 12);
44226                                         DOperand imm =
44227                                             ImmediateVmov::DecodeImmediate(
44228                                                 cmode,
44229                                                 (instr & 0xf) |
44230                                                     ((instr >> 12) & 0x70) |
44231                                                     ((instr >> 17) & 0x80));
44232                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44233                                         vmov(al, dt, DRegister(rd), imm);
44234                                         break;
44235                                       }
44236                                     }
44237                                     break;
44238                                   }
44239                                 }
44240                                 break;
44241                               }
44242                               case 0x00000100: {
44243                                 // 0xf2800910
44244                                 switch (instr & 0x00000020) {
44245                                   case 0x00000000: {
44246                                     // 0xf2800910
44247                                     if (((instr & 0x100) == 0x0) ||
44248                                         ((instr & 0xc00) == 0xc00)) {
44249                                       UnallocatedA32(instr);
44250                                       return;
44251                                     }
44252                                     unsigned cmode = (instr >> 8) & 0xf;
44253                                     DataType dt =
44254                                         ImmediateVorr::DecodeDt(cmode);
44255                                     if (dt.Is(kDataTypeValueInvalid)) {
44256                                       UnallocatedA32(instr);
44257                                       return;
44258                                     }
44259                                     unsigned rd =
44260                                         ExtractDRegister(instr, 22, 12);
44261                                     DOperand imm =
44262                                         ImmediateVorr::DecodeImmediate(
44263                                             cmode,
44264                                             (instr & 0xf) |
44265                                                 ((instr >> 12) & 0x70) |
44266                                                 ((instr >> 17) & 0x80));
44267                                     // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44268                                     vorr(al,
44269                                          dt,
44270                                          DRegister(rd),
44271                                          DRegister(rd),
44272                                          imm);
44273                                     break;
44274                                   }
44275                                   case 0x00000020: {
44276                                     // 0xf2800930
44277                                     if (((instr & 0x100) == 0x0) ||
44278                                         ((instr & 0xc00) == 0xc00)) {
44279                                       UnallocatedA32(instr);
44280                                       return;
44281                                     }
44282                                     unsigned cmode = (instr >> 8) & 0xf;
44283                                     DataType dt =
44284                                         ImmediateVbic::DecodeDt(cmode);
44285                                     if (dt.Is(kDataTypeValueInvalid)) {
44286                                       UnallocatedA32(instr);
44287                                       return;
44288                                     }
44289                                     unsigned rd =
44290                                         ExtractDRegister(instr, 22, 12);
44291                                     DOperand imm =
44292                                         ImmediateVbic::DecodeImmediate(
44293                                             cmode,
44294                                             (instr & 0xf) |
44295                                                 ((instr >> 12) & 0x70) |
44296                                                 ((instr >> 17) & 0x80));
44297                                     // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44298                                     vbic(al,
44299                                          dt,
44300                                          DRegister(rd),
44301                                          DRegister(rd),
44302                                          imm);
44303                                     break;
44304                                   }
44305                                 }
44306                                 break;
44307                               }
44308                             }
44309                             break;
44310                           }
44311                           case 0x00180000: {
44312                             // 0xf2980810
44313                             switch (instr & 0x00000300) {
44314                               case 0x00000000: {
44315                                 // 0xf2980810
44316                                 switch (instr & 0x01000000) {
44317                                   case 0x00000000: {
44318                                     // 0xf2980810
44319                                     if (((instr & 0x380000) == 0x0)) {
44320                                       UnallocatedA32(instr);
44321                                       return;
44322                                     }
44323                                     DataType dt =
44324                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
44325                                     if (dt.Is(kDataTypeValueInvalid)) {
44326                                       UnallocatedA32(instr);
44327                                       return;
44328                                     }
44329                                     unsigned rd =
44330                                         ExtractDRegister(instr, 22, 12);
44331                                     if ((instr & 1) != 0) {
44332                                       UnallocatedA32(instr);
44333                                       return;
44334                                     }
44335                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44336                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44337                                     uint32_t imm = dt.GetSize() - imm6;
44338                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44339                                     vshrn(al,
44340                                           dt,
44341                                           DRegister(rd),
44342                                           QRegister(rm),
44343                                           imm);
44344                                     break;
44345                                   }
44346                                   case 0x01000000: {
44347                                     // 0xf3980810
44348                                     if (((instr & 0x380000) == 0x0)) {
44349                                       UnallocatedA32(instr);
44350                                       return;
44351                                     }
44352                                     DataType dt =
44353                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
44354                                                          (instr >> 24) & 0x1);
44355                                     if (dt.Is(kDataTypeValueInvalid)) {
44356                                       UnallocatedA32(instr);
44357                                       return;
44358                                     }
44359                                     unsigned rd =
44360                                         ExtractDRegister(instr, 22, 12);
44361                                     if ((instr & 1) != 0) {
44362                                       UnallocatedA32(instr);
44363                                       return;
44364                                     }
44365                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44366                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44367                                     uint32_t imm = dt.GetSize() - imm6;
44368                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44369                                     vqshrun(al,
44370                                             dt,
44371                                             DRegister(rd),
44372                                             QRegister(rm),
44373                                             imm);
44374                                     break;
44375                                   }
44376                                 }
44377                                 break;
44378                               }
44379                               case 0x00000100: {
44380                                 // 0xf2980910
44381                                 if (((instr & 0x380000) == 0x0)) {
44382                                   UnallocatedA32(instr);
44383                                   return;
44384                                 }
44385                                 DataType dt =
44386                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
44387                                                      (instr >> 24) & 0x1);
44388                                 if (dt.Is(kDataTypeValueInvalid)) {
44389                                   UnallocatedA32(instr);
44390                                   return;
44391                                 }
44392                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44393                                 if ((instr & 1) != 0) {
44394                                   UnallocatedA32(instr);
44395                                   return;
44396                                 }
44397                                 unsigned rm = ExtractQRegister(instr, 5, 0);
44398                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44399                                 uint32_t imm = dt.GetSize() - imm6;
44400                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44401                                 vqshrn(al,
44402                                        dt,
44403                                        DRegister(rd),
44404                                        QRegister(rm),
44405                                        imm);
44406                                 break;
44407                               }
44408                               case 0x00000200: {
44409                                 // 0xf2980a10
44410                                 if (((instr & 0x380000) == 0x0) ||
44411                                     ((instr & 0x3f0000) == 0x80000) ||
44412                                     ((instr & 0x3f0000) == 0x100000) ||
44413                                     ((instr & 0x3f0000) == 0x200000)) {
44414                                   UnallocatedA32(instr);
44415                                   return;
44416                                 }
44417                                 DataType dt =
44418                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
44419                                                      (instr >> 24) & 0x1);
44420                                 if (dt.Is(kDataTypeValueInvalid)) {
44421                                   UnallocatedA32(instr);
44422                                   return;
44423                                 }
44424                                 if (((instr >> 12) & 1) != 0) {
44425                                   UnallocatedA32(instr);
44426                                   return;
44427                                 }
44428                                 unsigned rd = ExtractQRegister(instr, 22, 12);
44429                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44430                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44431                                 uint32_t imm = imm6 - dt.GetSize();
44432                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44433                                 vshll(al,
44434                                       dt,
44435                                       QRegister(rd),
44436                                       DRegister(rm),
44437                                       imm);
44438                                 break;
44439                               }
44440                               default:
44441                                 UnallocatedA32(instr);
44442                                 break;
44443                             }
44444                             break;
44445                           }
44446                           case 0x00280000: {
44447                             // 0xf2a80810
44448                             switch (instr & 0x00000300) {
44449                               case 0x00000000: {
44450                                 // 0xf2a80810
44451                                 switch (instr & 0x01000000) {
44452                                   case 0x00000000: {
44453                                     // 0xf2a80810
44454                                     if (((instr & 0x380000) == 0x0)) {
44455                                       UnallocatedA32(instr);
44456                                       return;
44457                                     }
44458                                     DataType dt =
44459                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
44460                                     if (dt.Is(kDataTypeValueInvalid)) {
44461                                       UnallocatedA32(instr);
44462                                       return;
44463                                     }
44464                                     unsigned rd =
44465                                         ExtractDRegister(instr, 22, 12);
44466                                     if ((instr & 1) != 0) {
44467                                       UnallocatedA32(instr);
44468                                       return;
44469                                     }
44470                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44471                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44472                                     uint32_t imm = dt.GetSize() - imm6;
44473                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44474                                     vshrn(al,
44475                                           dt,
44476                                           DRegister(rd),
44477                                           QRegister(rm),
44478                                           imm);
44479                                     break;
44480                                   }
44481                                   case 0x01000000: {
44482                                     // 0xf3a80810
44483                                     if (((instr & 0x380000) == 0x0)) {
44484                                       UnallocatedA32(instr);
44485                                       return;
44486                                     }
44487                                     DataType dt =
44488                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
44489                                                          (instr >> 24) & 0x1);
44490                                     if (dt.Is(kDataTypeValueInvalid)) {
44491                                       UnallocatedA32(instr);
44492                                       return;
44493                                     }
44494                                     unsigned rd =
44495                                         ExtractDRegister(instr, 22, 12);
44496                                     if ((instr & 1) != 0) {
44497                                       UnallocatedA32(instr);
44498                                       return;
44499                                     }
44500                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44501                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44502                                     uint32_t imm = dt.GetSize() - imm6;
44503                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44504                                     vqshrun(al,
44505                                             dt,
44506                                             DRegister(rd),
44507                                             QRegister(rm),
44508                                             imm);
44509                                     break;
44510                                   }
44511                                 }
44512                                 break;
44513                               }
44514                               case 0x00000100: {
44515                                 // 0xf2a80910
44516                                 if (((instr & 0x380000) == 0x0)) {
44517                                   UnallocatedA32(instr);
44518                                   return;
44519                                 }
44520                                 DataType dt =
44521                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
44522                                                      (instr >> 24) & 0x1);
44523                                 if (dt.Is(kDataTypeValueInvalid)) {
44524                                   UnallocatedA32(instr);
44525                                   return;
44526                                 }
44527                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44528                                 if ((instr & 1) != 0) {
44529                                   UnallocatedA32(instr);
44530                                   return;
44531                                 }
44532                                 unsigned rm = ExtractQRegister(instr, 5, 0);
44533                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44534                                 uint32_t imm = dt.GetSize() - imm6;
44535                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44536                                 vqshrn(al,
44537                                        dt,
44538                                        DRegister(rd),
44539                                        QRegister(rm),
44540                                        imm);
44541                                 break;
44542                               }
44543                               case 0x00000200: {
44544                                 // 0xf2a80a10
44545                                 if (((instr & 0x380000) == 0x0) ||
44546                                     ((instr & 0x3f0000) == 0x80000) ||
44547                                     ((instr & 0x3f0000) == 0x100000) ||
44548                                     ((instr & 0x3f0000) == 0x200000)) {
44549                                   UnallocatedA32(instr);
44550                                   return;
44551                                 }
44552                                 DataType dt =
44553                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
44554                                                      (instr >> 24) & 0x1);
44555                                 if (dt.Is(kDataTypeValueInvalid)) {
44556                                   UnallocatedA32(instr);
44557                                   return;
44558                                 }
44559                                 if (((instr >> 12) & 1) != 0) {
44560                                   UnallocatedA32(instr);
44561                                   return;
44562                                 }
44563                                 unsigned rd = ExtractQRegister(instr, 22, 12);
44564                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44565                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44566                                 uint32_t imm = imm6 - dt.GetSize();
44567                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44568                                 vshll(al,
44569                                       dt,
44570                                       QRegister(rd),
44571                                       DRegister(rm),
44572                                       imm);
44573                                 break;
44574                               }
44575                               default:
44576                                 UnallocatedA32(instr);
44577                                 break;
44578                             }
44579                             break;
44580                           }
44581                           case 0x00300000: {
44582                             // 0xf2b00810
44583                             switch (instr & 0x00000300) {
44584                               case 0x00000000: {
44585                                 // 0xf2b00810
44586                                 switch (instr & 0x01000000) {
44587                                   case 0x00000000: {
44588                                     // 0xf2b00810
44589                                     if (((instr & 0x380000) == 0x0)) {
44590                                       UnallocatedA32(instr);
44591                                       return;
44592                                     }
44593                                     DataType dt =
44594                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
44595                                     if (dt.Is(kDataTypeValueInvalid)) {
44596                                       UnallocatedA32(instr);
44597                                       return;
44598                                     }
44599                                     unsigned rd =
44600                                         ExtractDRegister(instr, 22, 12);
44601                                     if ((instr & 1) != 0) {
44602                                       UnallocatedA32(instr);
44603                                       return;
44604                                     }
44605                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44606                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44607                                     uint32_t imm = dt.GetSize() - imm6;
44608                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44609                                     vshrn(al,
44610                                           dt,
44611                                           DRegister(rd),
44612                                           QRegister(rm),
44613                                           imm);
44614                                     break;
44615                                   }
44616                                   case 0x01000000: {
44617                                     // 0xf3b00810
44618                                     if (((instr & 0x380000) == 0x0)) {
44619                                       UnallocatedA32(instr);
44620                                       return;
44621                                     }
44622                                     DataType dt =
44623                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
44624                                                          (instr >> 24) & 0x1);
44625                                     if (dt.Is(kDataTypeValueInvalid)) {
44626                                       UnallocatedA32(instr);
44627                                       return;
44628                                     }
44629                                     unsigned rd =
44630                                         ExtractDRegister(instr, 22, 12);
44631                                     if ((instr & 1) != 0) {
44632                                       UnallocatedA32(instr);
44633                                       return;
44634                                     }
44635                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44636                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44637                                     uint32_t imm = dt.GetSize() - imm6;
44638                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44639                                     vqshrun(al,
44640                                             dt,
44641                                             DRegister(rd),
44642                                             QRegister(rm),
44643                                             imm);
44644                                     break;
44645                                   }
44646                                 }
44647                                 break;
44648                               }
44649                               case 0x00000100: {
44650                                 // 0xf2b00910
44651                                 if (((instr & 0x380000) == 0x0)) {
44652                                   UnallocatedA32(instr);
44653                                   return;
44654                                 }
44655                                 DataType dt =
44656                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
44657                                                      (instr >> 24) & 0x1);
44658                                 if (dt.Is(kDataTypeValueInvalid)) {
44659                                   UnallocatedA32(instr);
44660                                   return;
44661                                 }
44662                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44663                                 if ((instr & 1) != 0) {
44664                                   UnallocatedA32(instr);
44665                                   return;
44666                                 }
44667                                 unsigned rm = ExtractQRegister(instr, 5, 0);
44668                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44669                                 uint32_t imm = dt.GetSize() - imm6;
44670                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44671                                 vqshrn(al,
44672                                        dt,
44673                                        DRegister(rd),
44674                                        QRegister(rm),
44675                                        imm);
44676                                 break;
44677                               }
44678                               case 0x00000200: {
44679                                 // 0xf2b00a10
44680                                 if (((instr & 0x380000) == 0x0) ||
44681                                     ((instr & 0x3f0000) == 0x80000) ||
44682                                     ((instr & 0x3f0000) == 0x100000) ||
44683                                     ((instr & 0x3f0000) == 0x200000)) {
44684                                   UnallocatedA32(instr);
44685                                   return;
44686                                 }
44687                                 DataType dt =
44688                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
44689                                                      (instr >> 24) & 0x1);
44690                                 if (dt.Is(kDataTypeValueInvalid)) {
44691                                   UnallocatedA32(instr);
44692                                   return;
44693                                 }
44694                                 if (((instr >> 12) & 1) != 0) {
44695                                   UnallocatedA32(instr);
44696                                   return;
44697                                 }
44698                                 unsigned rd = ExtractQRegister(instr, 22, 12);
44699                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44700                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44701                                 uint32_t imm = imm6 - dt.GetSize();
44702                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44703                                 vshll(al,
44704                                       dt,
44705                                       QRegister(rd),
44706                                       DRegister(rm),
44707                                       imm);
44708                                 break;
44709                               }
44710                               default:
44711                                 UnallocatedA32(instr);
44712                                 break;
44713                             }
44714                             break;
44715                           }
44716                           case 0x00380000: {
44717                             // 0xf2b80810
44718                             switch (instr & 0x00000300) {
44719                               case 0x00000000: {
44720                                 // 0xf2b80810
44721                                 switch (instr & 0x01000000) {
44722                                   case 0x00000000: {
44723                                     // 0xf2b80810
44724                                     if (((instr & 0x380000) == 0x0)) {
44725                                       UnallocatedA32(instr);
44726                                       return;
44727                                     }
44728                                     DataType dt =
44729                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
44730                                     if (dt.Is(kDataTypeValueInvalid)) {
44731                                       UnallocatedA32(instr);
44732                                       return;
44733                                     }
44734                                     unsigned rd =
44735                                         ExtractDRegister(instr, 22, 12);
44736                                     if ((instr & 1) != 0) {
44737                                       UnallocatedA32(instr);
44738                                       return;
44739                                     }
44740                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44741                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44742                                     uint32_t imm = dt.GetSize() - imm6;
44743                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44744                                     vshrn(al,
44745                                           dt,
44746                                           DRegister(rd),
44747                                           QRegister(rm),
44748                                           imm);
44749                                     break;
44750                                   }
44751                                   case 0x01000000: {
44752                                     // 0xf3b80810
44753                                     if (((instr & 0x380000) == 0x0)) {
44754                                       UnallocatedA32(instr);
44755                                       return;
44756                                     }
44757                                     DataType dt =
44758                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
44759                                                          (instr >> 24) & 0x1);
44760                                     if (dt.Is(kDataTypeValueInvalid)) {
44761                                       UnallocatedA32(instr);
44762                                       return;
44763                                     }
44764                                     unsigned rd =
44765                                         ExtractDRegister(instr, 22, 12);
44766                                     if ((instr & 1) != 0) {
44767                                       UnallocatedA32(instr);
44768                                       return;
44769                                     }
44770                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44771                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44772                                     uint32_t imm = dt.GetSize() - imm6;
44773                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44774                                     vqshrun(al,
44775                                             dt,
44776                                             DRegister(rd),
44777                                             QRegister(rm),
44778                                             imm);
44779                                     break;
44780                                   }
44781                                 }
44782                                 break;
44783                               }
44784                               case 0x00000100: {
44785                                 // 0xf2b80910
44786                                 if (((instr & 0x380000) == 0x0)) {
44787                                   UnallocatedA32(instr);
44788                                   return;
44789                                 }
44790                                 DataType dt =
44791                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
44792                                                      (instr >> 24) & 0x1);
44793                                 if (dt.Is(kDataTypeValueInvalid)) {
44794                                   UnallocatedA32(instr);
44795                                   return;
44796                                 }
44797                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44798                                 if ((instr & 1) != 0) {
44799                                   UnallocatedA32(instr);
44800                                   return;
44801                                 }
44802                                 unsigned rm = ExtractQRegister(instr, 5, 0);
44803                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44804                                 uint32_t imm = dt.GetSize() - imm6;
44805                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44806                                 vqshrn(al,
44807                                        dt,
44808                                        DRegister(rd),
44809                                        QRegister(rm),
44810                                        imm);
44811                                 break;
44812                               }
44813                               case 0x00000200: {
44814                                 // 0xf2b80a10
44815                                 if (((instr & 0x380000) == 0x0) ||
44816                                     ((instr & 0x3f0000) == 0x80000) ||
44817                                     ((instr & 0x3f0000) == 0x100000) ||
44818                                     ((instr & 0x3f0000) == 0x200000)) {
44819                                   UnallocatedA32(instr);
44820                                   return;
44821                                 }
44822                                 DataType dt =
44823                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
44824                                                      (instr >> 24) & 0x1);
44825                                 if (dt.Is(kDataTypeValueInvalid)) {
44826                                   UnallocatedA32(instr);
44827                                   return;
44828                                 }
44829                                 if (((instr >> 12) & 1) != 0) {
44830                                   UnallocatedA32(instr);
44831                                   return;
44832                                 }
44833                                 unsigned rd = ExtractQRegister(instr, 22, 12);
44834                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44835                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44836                                 uint32_t imm = imm6 - dt.GetSize();
44837                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44838                                 vshll(al,
44839                                       dt,
44840                                       QRegister(rd),
44841                                       DRegister(rm),
44842                                       imm);
44843                                 break;
44844                               }
44845                               default:
44846                                 UnallocatedA32(instr);
44847                                 break;
44848                             }
44849                             break;
44850                           }
44851                           default: {
44852                             switch (instr & 0x00000300) {
44853                               case 0x00000000: {
44854                                 // 0xf2800810
44855                                 switch (instr & 0x01000000) {
44856                                   case 0x00000000: {
44857                                     // 0xf2800810
44858                                     if (((instr & 0x380000) == 0x0)) {
44859                                       UnallocatedA32(instr);
44860                                       return;
44861                                     }
44862                                     DataType dt =
44863                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
44864                                     if (dt.Is(kDataTypeValueInvalid)) {
44865                                       UnallocatedA32(instr);
44866                                       return;
44867                                     }
44868                                     unsigned rd =
44869                                         ExtractDRegister(instr, 22, 12);
44870                                     if ((instr & 1) != 0) {
44871                                       UnallocatedA32(instr);
44872                                       return;
44873                                     }
44874                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44875                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44876                                     uint32_t imm = dt.GetSize() - imm6;
44877                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44878                                     vshrn(al,
44879                                           dt,
44880                                           DRegister(rd),
44881                                           QRegister(rm),
44882                                           imm);
44883                                     break;
44884                                   }
44885                                   case 0x01000000: {
44886                                     // 0xf3800810
44887                                     if (((instr & 0x380000) == 0x0)) {
44888                                       UnallocatedA32(instr);
44889                                       return;
44890                                     }
44891                                     DataType dt =
44892                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
44893                                                          (instr >> 24) & 0x1);
44894                                     if (dt.Is(kDataTypeValueInvalid)) {
44895                                       UnallocatedA32(instr);
44896                                       return;
44897                                     }
44898                                     unsigned rd =
44899                                         ExtractDRegister(instr, 22, 12);
44900                                     if ((instr & 1) != 0) {
44901                                       UnallocatedA32(instr);
44902                                       return;
44903                                     }
44904                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44905                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44906                                     uint32_t imm = dt.GetSize() - imm6;
44907                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44908                                     vqshrun(al,
44909                                             dt,
44910                                             DRegister(rd),
44911                                             QRegister(rm),
44912                                             imm);
44913                                     break;
44914                                   }
44915                                 }
44916                                 break;
44917                               }
44918                               case 0x00000100: {
44919                                 // 0xf2800910
44920                                 if (((instr & 0x380000) == 0x0)) {
44921                                   UnallocatedA32(instr);
44922                                   return;
44923                                 }
44924                                 DataType dt =
44925                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
44926                                                      (instr >> 24) & 0x1);
44927                                 if (dt.Is(kDataTypeValueInvalid)) {
44928                                   UnallocatedA32(instr);
44929                                   return;
44930                                 }
44931                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44932                                 if ((instr & 1) != 0) {
44933                                   UnallocatedA32(instr);
44934                                   return;
44935                                 }
44936                                 unsigned rm = ExtractQRegister(instr, 5, 0);
44937                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44938                                 uint32_t imm = dt.GetSize() - imm6;
44939                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44940                                 vqshrn(al,
44941                                        dt,
44942                                        DRegister(rd),
44943                                        QRegister(rm),
44944                                        imm);
44945                                 break;
44946                               }
44947                               case 0x00000200: {
44948                                 // 0xf2800a10
44949                                 switch (instr & 0x00070000) {
44950                                   case 0x00000000: {
44951                                     // 0xf2800a10
44952                                     switch (instr & 0x003f0000) {
44953                                       case 0x00080000: {
44954                                         // 0xf2880a10
44955                                         if (((instr & 0x380000) == 0x0) ||
44956                                             ((instr & 0x380000) == 0x180000) ||
44957                                             ((instr & 0x380000) == 0x280000) ||
44958                                             ((instr & 0x380000) == 0x300000) ||
44959                                             ((instr & 0x380000) == 0x380000)) {
44960                                           UnallocatedA32(instr);
44961                                           return;
44962                                         }
44963                                         DataType dt = Dt_U_imm3H_1_Decode(
44964                                             ((instr >> 19) & 0x7) |
44965                                             ((instr >> 21) & 0x8));
44966                                         if (dt.Is(kDataTypeValueInvalid)) {
44967                                           UnallocatedA32(instr);
44968                                           return;
44969                                         }
44970                                         if (((instr >> 12) & 1) != 0) {
44971                                           UnallocatedA32(instr);
44972                                           return;
44973                                         }
44974                                         unsigned rd =
44975                                             ExtractQRegister(instr, 22, 12);
44976                                         unsigned rm =
44977                                             ExtractDRegister(instr, 5, 0);
44978                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
44979                                         vmovl(al,
44980                                               dt,
44981                                               QRegister(rd),
44982                                               DRegister(rm));
44983                                         break;
44984                                       }
44985                                       case 0x00090000: {
44986                                         // 0xf2890a10
44987                                         if (((instr & 0x380000) == 0x0) ||
44988                                             ((instr & 0x3f0000) == 0x80000) ||
44989                                             ((instr & 0x3f0000) == 0x100000) ||
44990                                             ((instr & 0x3f0000) == 0x200000)) {
44991                                           UnallocatedA32(instr);
44992                                           return;
44993                                         }
44994                                         DataType dt =
44995                                             Dt_imm6_4_Decode((instr >> 19) &
44996                                                                  0x7,
44997                                                              (instr >> 24) &
44998                                                                  0x1);
44999                                         if (dt.Is(kDataTypeValueInvalid)) {
45000                                           UnallocatedA32(instr);
45001                                           return;
45002                                         }
45003                                         if (((instr >> 12) & 1) != 0) {
45004                                           UnallocatedA32(instr);
45005                                           return;
45006                                         }
45007                                         unsigned rd =
45008                                             ExtractQRegister(instr, 22, 12);
45009                                         unsigned rm =
45010                                             ExtractDRegister(instr, 5, 0);
45011                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45012                                         uint32_t imm = imm6 - dt.GetSize();
45013                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45014                                         vshll(al,
45015                                               dt,
45016                                               QRegister(rd),
45017                                               DRegister(rm),
45018                                               imm);
45019                                         break;
45020                                       }
45021                                       case 0x000a0000: {
45022                                         // 0xf28a0a10
45023                                         if (((instr & 0x380000) == 0x0) ||
45024                                             ((instr & 0x3f0000) == 0x80000) ||
45025                                             ((instr & 0x3f0000) == 0x100000) ||
45026                                             ((instr & 0x3f0000) == 0x200000)) {
45027                                           UnallocatedA32(instr);
45028                                           return;
45029                                         }
45030                                         DataType dt =
45031                                             Dt_imm6_4_Decode((instr >> 19) &
45032                                                                  0x7,
45033                                                              (instr >> 24) &
45034                                                                  0x1);
45035                                         if (dt.Is(kDataTypeValueInvalid)) {
45036                                           UnallocatedA32(instr);
45037                                           return;
45038                                         }
45039                                         if (((instr >> 12) & 1) != 0) {
45040                                           UnallocatedA32(instr);
45041                                           return;
45042                                         }
45043                                         unsigned rd =
45044                                             ExtractQRegister(instr, 22, 12);
45045                                         unsigned rm =
45046                                             ExtractDRegister(instr, 5, 0);
45047                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45048                                         uint32_t imm = imm6 - dt.GetSize();
45049                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45050                                         vshll(al,
45051                                               dt,
45052                                               QRegister(rd),
45053                                               DRegister(rm),
45054                                               imm);
45055                                         break;
45056                                       }
45057                                       case 0x000b0000: {
45058                                         // 0xf28b0a10
45059                                         if (((instr & 0x380000) == 0x0) ||
45060                                             ((instr & 0x3f0000) == 0x80000) ||
45061                                             ((instr & 0x3f0000) == 0x100000) ||
45062                                             ((instr & 0x3f0000) == 0x200000)) {
45063                                           UnallocatedA32(instr);
45064                                           return;
45065                                         }
45066                                         DataType dt =
45067                                             Dt_imm6_4_Decode((instr >> 19) &
45068                                                                  0x7,
45069                                                              (instr >> 24) &
45070                                                                  0x1);
45071                                         if (dt.Is(kDataTypeValueInvalid)) {
45072                                           UnallocatedA32(instr);
45073                                           return;
45074                                         }
45075                                         if (((instr >> 12) & 1) != 0) {
45076                                           UnallocatedA32(instr);
45077                                           return;
45078                                         }
45079                                         unsigned rd =
45080                                             ExtractQRegister(instr, 22, 12);
45081                                         unsigned rm =
45082                                             ExtractDRegister(instr, 5, 0);
45083                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45084                                         uint32_t imm = imm6 - dt.GetSize();
45085                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45086                                         vshll(al,
45087                                               dt,
45088                                               QRegister(rd),
45089                                               DRegister(rm),
45090                                               imm);
45091                                         break;
45092                                       }
45093                                       case 0x000c0000: {
45094                                         // 0xf28c0a10
45095                                         if (((instr & 0x380000) == 0x0) ||
45096                                             ((instr & 0x3f0000) == 0x80000) ||
45097                                             ((instr & 0x3f0000) == 0x100000) ||
45098                                             ((instr & 0x3f0000) == 0x200000)) {
45099                                           UnallocatedA32(instr);
45100                                           return;
45101                                         }
45102                                         DataType dt =
45103                                             Dt_imm6_4_Decode((instr >> 19) &
45104                                                                  0x7,
45105                                                              (instr >> 24) &
45106                                                                  0x1);
45107                                         if (dt.Is(kDataTypeValueInvalid)) {
45108                                           UnallocatedA32(instr);
45109                                           return;
45110                                         }
45111                                         if (((instr >> 12) & 1) != 0) {
45112                                           UnallocatedA32(instr);
45113                                           return;
45114                                         }
45115                                         unsigned rd =
45116                                             ExtractQRegister(instr, 22, 12);
45117                                         unsigned rm =
45118                                             ExtractDRegister(instr, 5, 0);
45119                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45120                                         uint32_t imm = imm6 - dt.GetSize();
45121                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45122                                         vshll(al,
45123                                               dt,
45124                                               QRegister(rd),
45125                                               DRegister(rm),
45126                                               imm);
45127                                         break;
45128                                       }
45129                                       case 0x000d0000: {
45130                                         // 0xf28d0a10
45131                                         if (((instr & 0x380000) == 0x0) ||
45132                                             ((instr & 0x3f0000) == 0x80000) ||
45133                                             ((instr & 0x3f0000) == 0x100000) ||
45134                                             ((instr & 0x3f0000) == 0x200000)) {
45135                                           UnallocatedA32(instr);
45136                                           return;
45137                                         }
45138                                         DataType dt =
45139                                             Dt_imm6_4_Decode((instr >> 19) &
45140                                                                  0x7,
45141                                                              (instr >> 24) &
45142                                                                  0x1);
45143                                         if (dt.Is(kDataTypeValueInvalid)) {
45144                                           UnallocatedA32(instr);
45145                                           return;
45146                                         }
45147                                         if (((instr >> 12) & 1) != 0) {
45148                                           UnallocatedA32(instr);
45149                                           return;
45150                                         }
45151                                         unsigned rd =
45152                                             ExtractQRegister(instr, 22, 12);
45153                                         unsigned rm =
45154                                             ExtractDRegister(instr, 5, 0);
45155                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45156                                         uint32_t imm = imm6 - dt.GetSize();
45157                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45158                                         vshll(al,
45159                                               dt,
45160                                               QRegister(rd),
45161                                               DRegister(rm),
45162                                               imm);
45163                                         break;
45164                                       }
45165                                       case 0x000e0000: {
45166                                         // 0xf28e0a10
45167                                         if (((instr & 0x380000) == 0x0) ||
45168                                             ((instr & 0x3f0000) == 0x80000) ||
45169                                             ((instr & 0x3f0000) == 0x100000) ||
45170                                             ((instr & 0x3f0000) == 0x200000)) {
45171                                           UnallocatedA32(instr);
45172                                           return;
45173                                         }
45174                                         DataType dt =
45175                                             Dt_imm6_4_Decode((instr >> 19) &
45176                                                                  0x7,
45177                                                              (instr >> 24) &
45178                                                                  0x1);
45179                                         if (dt.Is(kDataTypeValueInvalid)) {
45180                                           UnallocatedA32(instr);
45181                                           return;
45182                                         }
45183                                         if (((instr >> 12) & 1) != 0) {
45184                                           UnallocatedA32(instr);
45185                                           return;
45186                                         }
45187                                         unsigned rd =
45188                                             ExtractQRegister(instr, 22, 12);
45189                                         unsigned rm =
45190                                             ExtractDRegister(instr, 5, 0);
45191                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45192                                         uint32_t imm = imm6 - dt.GetSize();
45193                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45194                                         vshll(al,
45195                                               dt,
45196                                               QRegister(rd),
45197                                               DRegister(rm),
45198                                               imm);
45199                                         break;
45200                                       }
45201                                       case 0x000f0000: {
45202                                         // 0xf28f0a10
45203                                         if (((instr & 0x380000) == 0x0) ||
45204                                             ((instr & 0x3f0000) == 0x80000) ||
45205                                             ((instr & 0x3f0000) == 0x100000) ||
45206                                             ((instr & 0x3f0000) == 0x200000)) {
45207                                           UnallocatedA32(instr);
45208                                           return;
45209                                         }
45210                                         DataType dt =
45211                                             Dt_imm6_4_Decode((instr >> 19) &
45212                                                                  0x7,
45213                                                              (instr >> 24) &
45214                                                                  0x1);
45215                                         if (dt.Is(kDataTypeValueInvalid)) {
45216                                           UnallocatedA32(instr);
45217                                           return;
45218                                         }
45219                                         if (((instr >> 12) & 1) != 0) {
45220                                           UnallocatedA32(instr);
45221                                           return;
45222                                         }
45223                                         unsigned rd =
45224                                             ExtractQRegister(instr, 22, 12);
45225                                         unsigned rm =
45226                                             ExtractDRegister(instr, 5, 0);
45227                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45228                                         uint32_t imm = imm6 - dt.GetSize();
45229                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45230                                         vshll(al,
45231                                               dt,
45232                                               QRegister(rd),
45233                                               DRegister(rm),
45234                                               imm);
45235                                         break;
45236                                       }
45237                                       case 0x00100000: {
45238                                         // 0xf2900a10
45239                                         if (((instr & 0x380000) == 0x0) ||
45240                                             ((instr & 0x380000) == 0x180000) ||
45241                                             ((instr & 0x380000) == 0x280000) ||
45242                                             ((instr & 0x380000) == 0x300000) ||
45243                                             ((instr & 0x380000) == 0x380000)) {
45244                                           UnallocatedA32(instr);
45245                                           return;
45246                                         }
45247                                         DataType dt = Dt_U_imm3H_1_Decode(
45248                                             ((instr >> 19) & 0x7) |
45249                                             ((instr >> 21) & 0x8));
45250                                         if (dt.Is(kDataTypeValueInvalid)) {
45251                                           UnallocatedA32(instr);
45252                                           return;
45253                                         }
45254                                         if (((instr >> 12) & 1) != 0) {
45255                                           UnallocatedA32(instr);
45256                                           return;
45257                                         }
45258                                         unsigned rd =
45259                                             ExtractQRegister(instr, 22, 12);
45260                                         unsigned rm =
45261                                             ExtractDRegister(instr, 5, 0);
45262                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
45263                                         vmovl(al,
45264                                               dt,
45265                                               QRegister(rd),
45266                                               DRegister(rm));
45267                                         break;
45268                                       }
45269                                       case 0x00110000: {
45270                                         // 0xf2910a10
45271                                         if (((instr & 0x380000) == 0x0) ||
45272                                             ((instr & 0x3f0000) == 0x80000) ||
45273                                             ((instr & 0x3f0000) == 0x100000) ||
45274                                             ((instr & 0x3f0000) == 0x200000)) {
45275                                           UnallocatedA32(instr);
45276                                           return;
45277                                         }
45278                                         DataType dt =
45279                                             Dt_imm6_4_Decode((instr >> 19) &
45280                                                                  0x7,
45281                                                              (instr >> 24) &
45282                                                                  0x1);
45283                                         if (dt.Is(kDataTypeValueInvalid)) {
45284                                           UnallocatedA32(instr);
45285                                           return;
45286                                         }
45287                                         if (((instr >> 12) & 1) != 0) {
45288                                           UnallocatedA32(instr);
45289                                           return;
45290                                         }
45291                                         unsigned rd =
45292                                             ExtractQRegister(instr, 22, 12);
45293                                         unsigned rm =
45294                                             ExtractDRegister(instr, 5, 0);
45295                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45296                                         uint32_t imm = imm6 - dt.GetSize();
45297                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45298                                         vshll(al,
45299                                               dt,
45300                                               QRegister(rd),
45301                                               DRegister(rm),
45302                                               imm);
45303                                         break;
45304                                       }
45305                                       case 0x00120000: {
45306                                         // 0xf2920a10
45307                                         if (((instr & 0x380000) == 0x0) ||
45308                                             ((instr & 0x3f0000) == 0x80000) ||
45309                                             ((instr & 0x3f0000) == 0x100000) ||
45310                                             ((instr & 0x3f0000) == 0x200000)) {
45311                                           UnallocatedA32(instr);
45312                                           return;
45313                                         }
45314                                         DataType dt =
45315                                             Dt_imm6_4_Decode((instr >> 19) &
45316                                                                  0x7,
45317                                                              (instr >> 24) &
45318                                                                  0x1);
45319                                         if (dt.Is(kDataTypeValueInvalid)) {
45320                                           UnallocatedA32(instr);
45321                                           return;
45322                                         }
45323                                         if (((instr >> 12) & 1) != 0) {
45324                                           UnallocatedA32(instr);
45325                                           return;
45326                                         }
45327                                         unsigned rd =
45328                                             ExtractQRegister(instr, 22, 12);
45329                                         unsigned rm =
45330                                             ExtractDRegister(instr, 5, 0);
45331                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45332                                         uint32_t imm = imm6 - dt.GetSize();
45333                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45334                                         vshll(al,
45335                                               dt,
45336                                               QRegister(rd),
45337                                               DRegister(rm),
45338                                               imm);
45339                                         break;
45340                                       }
45341                                       case 0x00130000: {
45342                                         // 0xf2930a10
45343                                         if (((instr & 0x380000) == 0x0) ||
45344                                             ((instr & 0x3f0000) == 0x80000) ||
45345                                             ((instr & 0x3f0000) == 0x100000) ||
45346                                             ((instr & 0x3f0000) == 0x200000)) {
45347                                           UnallocatedA32(instr);
45348                                           return;
45349                                         }
45350                                         DataType dt =
45351                                             Dt_imm6_4_Decode((instr >> 19) &
45352                                                                  0x7,
45353                                                              (instr >> 24) &
45354                                                                  0x1);
45355                                         if (dt.Is(kDataTypeValueInvalid)) {
45356                                           UnallocatedA32(instr);
45357                                           return;
45358                                         }
45359                                         if (((instr >> 12) & 1) != 0) {
45360                                           UnallocatedA32(instr);
45361                                           return;
45362                                         }
45363                                         unsigned rd =
45364                                             ExtractQRegister(instr, 22, 12);
45365                                         unsigned rm =
45366                                             ExtractDRegister(instr, 5, 0);
45367                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45368                                         uint32_t imm = imm6 - dt.GetSize();
45369                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45370                                         vshll(al,
45371                                               dt,
45372                                               QRegister(rd),
45373                                               DRegister(rm),
45374                                               imm);
45375                                         break;
45376                                       }
45377                                       case 0x00140000: {
45378                                         // 0xf2940a10
45379                                         if (((instr & 0x380000) == 0x0) ||
45380                                             ((instr & 0x3f0000) == 0x80000) ||
45381                                             ((instr & 0x3f0000) == 0x100000) ||
45382                                             ((instr & 0x3f0000) == 0x200000)) {
45383                                           UnallocatedA32(instr);
45384                                           return;
45385                                         }
45386                                         DataType dt =
45387                                             Dt_imm6_4_Decode((instr >> 19) &
45388                                                                  0x7,
45389                                                              (instr >> 24) &
45390                                                                  0x1);
45391                                         if (dt.Is(kDataTypeValueInvalid)) {
45392                                           UnallocatedA32(instr);
45393                                           return;
45394                                         }
45395                                         if (((instr >> 12) & 1) != 0) {
45396                                           UnallocatedA32(instr);
45397                                           return;
45398                                         }
45399                                         unsigned rd =
45400                                             ExtractQRegister(instr, 22, 12);
45401                                         unsigned rm =
45402                                             ExtractDRegister(instr, 5, 0);
45403                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45404                                         uint32_t imm = imm6 - dt.GetSize();
45405                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45406                                         vshll(al,
45407                                               dt,
45408                                               QRegister(rd),
45409                                               DRegister(rm),
45410                                               imm);
45411                                         break;
45412                                       }
45413                                       case 0x00150000: {
45414                                         // 0xf2950a10
45415                                         if (((instr & 0x380000) == 0x0) ||
45416                                             ((instr & 0x3f0000) == 0x80000) ||
45417                                             ((instr & 0x3f0000) == 0x100000) ||
45418                                             ((instr & 0x3f0000) == 0x200000)) {
45419                                           UnallocatedA32(instr);
45420                                           return;
45421                                         }
45422                                         DataType dt =
45423                                             Dt_imm6_4_Decode((instr >> 19) &
45424                                                                  0x7,
45425                                                              (instr >> 24) &
45426                                                                  0x1);
45427                                         if (dt.Is(kDataTypeValueInvalid)) {
45428                                           UnallocatedA32(instr);
45429                                           return;
45430                                         }
45431                                         if (((instr >> 12) & 1) != 0) {
45432                                           UnallocatedA32(instr);
45433                                           return;
45434                                         }
45435                                         unsigned rd =
45436                                             ExtractQRegister(instr, 22, 12);
45437                                         unsigned rm =
45438                                             ExtractDRegister(instr, 5, 0);
45439                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45440                                         uint32_t imm = imm6 - dt.GetSize();
45441                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45442                                         vshll(al,
45443                                               dt,
45444                                               QRegister(rd),
45445                                               DRegister(rm),
45446                                               imm);
45447                                         break;
45448                                       }
45449                                       case 0x00160000: {
45450                                         // 0xf2960a10
45451                                         if (((instr & 0x380000) == 0x0) ||
45452                                             ((instr & 0x3f0000) == 0x80000) ||
45453                                             ((instr & 0x3f0000) == 0x100000) ||
45454                                             ((instr & 0x3f0000) == 0x200000)) {
45455                                           UnallocatedA32(instr);
45456                                           return;
45457                                         }
45458                                         DataType dt =
45459                                             Dt_imm6_4_Decode((instr >> 19) &
45460                                                                  0x7,
45461                                                              (instr >> 24) &
45462                                                                  0x1);
45463                                         if (dt.Is(kDataTypeValueInvalid)) {
45464                                           UnallocatedA32(instr);
45465                                           return;
45466                                         }
45467                                         if (((instr >> 12) & 1) != 0) {
45468                                           UnallocatedA32(instr);
45469                                           return;
45470                                         }
45471                                         unsigned rd =
45472                                             ExtractQRegister(instr, 22, 12);
45473                                         unsigned rm =
45474                                             ExtractDRegister(instr, 5, 0);
45475                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45476                                         uint32_t imm = imm6 - dt.GetSize();
45477                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45478                                         vshll(al,
45479                                               dt,
45480                                               QRegister(rd),
45481                                               DRegister(rm),
45482                                               imm);
45483                                         break;
45484                                       }
45485                                       case 0x00170000: {
45486                                         // 0xf2970a10
45487                                         if (((instr & 0x380000) == 0x0) ||
45488                                             ((instr & 0x3f0000) == 0x80000) ||
45489                                             ((instr & 0x3f0000) == 0x100000) ||
45490                                             ((instr & 0x3f0000) == 0x200000)) {
45491                                           UnallocatedA32(instr);
45492                                           return;
45493                                         }
45494                                         DataType dt =
45495                                             Dt_imm6_4_Decode((instr >> 19) &
45496                                                                  0x7,
45497                                                              (instr >> 24) &
45498                                                                  0x1);
45499                                         if (dt.Is(kDataTypeValueInvalid)) {
45500                                           UnallocatedA32(instr);
45501                                           return;
45502                                         }
45503                                         if (((instr >> 12) & 1) != 0) {
45504                                           UnallocatedA32(instr);
45505                                           return;
45506                                         }
45507                                         unsigned rd =
45508                                             ExtractQRegister(instr, 22, 12);
45509                                         unsigned rm =
45510                                             ExtractDRegister(instr, 5, 0);
45511                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45512                                         uint32_t imm = imm6 - dt.GetSize();
45513                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45514                                         vshll(al,
45515                                               dt,
45516                                               QRegister(rd),
45517                                               DRegister(rm),
45518                                               imm);
45519                                         break;
45520                                       }
45521                                       case 0x00180000: {
45522                                         // 0xf2980a10
45523                                         if (((instr & 0x380000) == 0x0) ||
45524                                             ((instr & 0x3f0000) == 0x80000) ||
45525                                             ((instr & 0x3f0000) == 0x100000) ||
45526                                             ((instr & 0x3f0000) == 0x200000)) {
45527                                           UnallocatedA32(instr);
45528                                           return;
45529                                         }
45530                                         DataType dt =
45531                                             Dt_imm6_4_Decode((instr >> 19) &
45532                                                                  0x7,
45533                                                              (instr >> 24) &
45534                                                                  0x1);
45535                                         if (dt.Is(kDataTypeValueInvalid)) {
45536                                           UnallocatedA32(instr);
45537                                           return;
45538                                         }
45539                                         if (((instr >> 12) & 1) != 0) {
45540                                           UnallocatedA32(instr);
45541                                           return;
45542                                         }
45543                                         unsigned rd =
45544                                             ExtractQRegister(instr, 22, 12);
45545                                         unsigned rm =
45546                                             ExtractDRegister(instr, 5, 0);
45547                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45548                                         uint32_t imm = imm6 - dt.GetSize();
45549                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45550                                         vshll(al,
45551                                               dt,
45552                                               QRegister(rd),
45553                                               DRegister(rm),
45554                                               imm);
45555                                         break;
45556                                       }
45557                                       case 0x00190000: {
45558                                         // 0xf2990a10
45559                                         if (((instr & 0x380000) == 0x0) ||
45560                                             ((instr & 0x3f0000) == 0x80000) ||
45561                                             ((instr & 0x3f0000) == 0x100000) ||
45562                                             ((instr & 0x3f0000) == 0x200000)) {
45563                                           UnallocatedA32(instr);
45564                                           return;
45565                                         }
45566                                         DataType dt =
45567                                             Dt_imm6_4_Decode((instr >> 19) &
45568                                                                  0x7,
45569                                                              (instr >> 24) &
45570                                                                  0x1);
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                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45584                                         uint32_t imm = imm6 - dt.GetSize();
45585                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45586                                         vshll(al,
45587                                               dt,
45588                                               QRegister(rd),
45589                                               DRegister(rm),
45590                                               imm);
45591                                         break;
45592                                       }
45593                                       case 0x001a0000: {
45594                                         // 0xf29a0a10
45595                                         if (((instr & 0x380000) == 0x0) ||
45596                                             ((instr & 0x3f0000) == 0x80000) ||
45597                                             ((instr & 0x3f0000) == 0x100000) ||
45598                                             ((instr & 0x3f0000) == 0x200000)) {
45599                                           UnallocatedA32(instr);
45600                                           return;
45601                                         }
45602                                         DataType dt =
45603                                             Dt_imm6_4_Decode((instr >> 19) &
45604                                                                  0x7,
45605                                                              (instr >> 24) &
45606                                                                  0x1);
45607                                         if (dt.Is(kDataTypeValueInvalid)) {
45608                                           UnallocatedA32(instr);
45609                                           return;
45610                                         }
45611                                         if (((instr >> 12) & 1) != 0) {
45612                                           UnallocatedA32(instr);
45613                                           return;
45614                                         }
45615                                         unsigned rd =
45616                                             ExtractQRegister(instr, 22, 12);
45617                                         unsigned rm =
45618                                             ExtractDRegister(instr, 5, 0);
45619                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45620                                         uint32_t imm = imm6 - dt.GetSize();
45621                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45622                                         vshll(al,
45623                                               dt,
45624                                               QRegister(rd),
45625                                               DRegister(rm),
45626                                               imm);
45627                                         break;
45628                                       }
45629                                       case 0x001b0000: {
45630                                         // 0xf29b0a10
45631                                         if (((instr & 0x380000) == 0x0) ||
45632                                             ((instr & 0x3f0000) == 0x80000) ||
45633                                             ((instr & 0x3f0000) == 0x100000) ||
45634                                             ((instr & 0x3f0000) == 0x200000)) {
45635                                           UnallocatedA32(instr);
45636                                           return;
45637                                         }
45638                                         DataType dt =
45639                                             Dt_imm6_4_Decode((instr >> 19) &
45640                                                                  0x7,
45641                                                              (instr >> 24) &
45642                                                                  0x1);
45643                                         if (dt.Is(kDataTypeValueInvalid)) {
45644                                           UnallocatedA32(instr);
45645                                           return;
45646                                         }
45647                                         if (((instr >> 12) & 1) != 0) {
45648                                           UnallocatedA32(instr);
45649                                           return;
45650                                         }
45651                                         unsigned rd =
45652                                             ExtractQRegister(instr, 22, 12);
45653                                         unsigned rm =
45654                                             ExtractDRegister(instr, 5, 0);
45655                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45656                                         uint32_t imm = imm6 - dt.GetSize();
45657                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45658                                         vshll(al,
45659                                               dt,
45660                                               QRegister(rd),
45661                                               DRegister(rm),
45662                                               imm);
45663                                         break;
45664                                       }
45665                                       case 0x001c0000: {
45666                                         // 0xf29c0a10
45667                                         if (((instr & 0x380000) == 0x0) ||
45668                                             ((instr & 0x3f0000) == 0x80000) ||
45669                                             ((instr & 0x3f0000) == 0x100000) ||
45670                                             ((instr & 0x3f0000) == 0x200000)) {
45671                                           UnallocatedA32(instr);
45672                                           return;
45673                                         }
45674                                         DataType dt =
45675                                             Dt_imm6_4_Decode((instr >> 19) &
45676                                                                  0x7,
45677                                                              (instr >> 24) &
45678                                                                  0x1);
45679                                         if (dt.Is(kDataTypeValueInvalid)) {
45680                                           UnallocatedA32(instr);
45681                                           return;
45682                                         }
45683                                         if (((instr >> 12) & 1) != 0) {
45684                                           UnallocatedA32(instr);
45685                                           return;
45686                                         }
45687                                         unsigned rd =
45688                                             ExtractQRegister(instr, 22, 12);
45689                                         unsigned rm =
45690                                             ExtractDRegister(instr, 5, 0);
45691                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45692                                         uint32_t imm = imm6 - dt.GetSize();
45693                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45694                                         vshll(al,
45695                                               dt,
45696                                               QRegister(rd),
45697                                               DRegister(rm),
45698                                               imm);
45699                                         break;
45700                                       }
45701                                       case 0x001d0000: {
45702                                         // 0xf29d0a10
45703                                         if (((instr & 0x380000) == 0x0) ||
45704                                             ((instr & 0x3f0000) == 0x80000) ||
45705                                             ((instr & 0x3f0000) == 0x100000) ||
45706                                             ((instr & 0x3f0000) == 0x200000)) {
45707                                           UnallocatedA32(instr);
45708                                           return;
45709                                         }
45710                                         DataType dt =
45711                                             Dt_imm6_4_Decode((instr >> 19) &
45712                                                                  0x7,
45713                                                              (instr >> 24) &
45714                                                                  0x1);
45715                                         if (dt.Is(kDataTypeValueInvalid)) {
45716                                           UnallocatedA32(instr);
45717                                           return;
45718                                         }
45719                                         if (((instr >> 12) & 1) != 0) {
45720                                           UnallocatedA32(instr);
45721                                           return;
45722                                         }
45723                                         unsigned rd =
45724                                             ExtractQRegister(instr, 22, 12);
45725                                         unsigned rm =
45726                                             ExtractDRegister(instr, 5, 0);
45727                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45728                                         uint32_t imm = imm6 - dt.GetSize();
45729                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45730                                         vshll(al,
45731                                               dt,
45732                                               QRegister(rd),
45733                                               DRegister(rm),
45734                                               imm);
45735                                         break;
45736                                       }
45737                                       case 0x001e0000: {
45738                                         // 0xf29e0a10
45739                                         if (((instr & 0x380000) == 0x0) ||
45740                                             ((instr & 0x3f0000) == 0x80000) ||
45741                                             ((instr & 0x3f0000) == 0x100000) ||
45742                                             ((instr & 0x3f0000) == 0x200000)) {
45743                                           UnallocatedA32(instr);
45744                                           return;
45745                                         }
45746                                         DataType dt =
45747                                             Dt_imm6_4_Decode((instr >> 19) &
45748                                                                  0x7,
45749                                                              (instr >> 24) &
45750                                                                  0x1);
45751                                         if (dt.Is(kDataTypeValueInvalid)) {
45752                                           UnallocatedA32(instr);
45753                                           return;
45754                                         }
45755                                         if (((instr >> 12) & 1) != 0) {
45756                                           UnallocatedA32(instr);
45757                                           return;
45758                                         }
45759                                         unsigned rd =
45760                                             ExtractQRegister(instr, 22, 12);
45761                                         unsigned rm =
45762                                             ExtractDRegister(instr, 5, 0);
45763                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45764                                         uint32_t imm = imm6 - dt.GetSize();
45765                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45766                                         vshll(al,
45767                                               dt,
45768                                               QRegister(rd),
45769                                               DRegister(rm),
45770                                               imm);
45771                                         break;
45772                                       }
45773                                       case 0x001f0000: {
45774                                         // 0xf29f0a10
45775                                         if (((instr & 0x380000) == 0x0) ||
45776                                             ((instr & 0x3f0000) == 0x80000) ||
45777                                             ((instr & 0x3f0000) == 0x100000) ||
45778                                             ((instr & 0x3f0000) == 0x200000)) {
45779                                           UnallocatedA32(instr);
45780                                           return;
45781                                         }
45782                                         DataType dt =
45783                                             Dt_imm6_4_Decode((instr >> 19) &
45784                                                                  0x7,
45785                                                              (instr >> 24) &
45786                                                                  0x1);
45787                                         if (dt.Is(kDataTypeValueInvalid)) {
45788                                           UnallocatedA32(instr);
45789                                           return;
45790                                         }
45791                                         if (((instr >> 12) & 1) != 0) {
45792                                           UnallocatedA32(instr);
45793                                           return;
45794                                         }
45795                                         unsigned rd =
45796                                             ExtractQRegister(instr, 22, 12);
45797                                         unsigned rm =
45798                                             ExtractDRegister(instr, 5, 0);
45799                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45800                                         uint32_t imm = imm6 - dt.GetSize();
45801                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45802                                         vshll(al,
45803                                               dt,
45804                                               QRegister(rd),
45805                                               DRegister(rm),
45806                                               imm);
45807                                         break;
45808                                       }
45809                                       case 0x00200000: {
45810                                         // 0xf2a00a10
45811                                         if (((instr & 0x380000) == 0x0) ||
45812                                             ((instr & 0x380000) == 0x180000) ||
45813                                             ((instr & 0x380000) == 0x280000) ||
45814                                             ((instr & 0x380000) == 0x300000) ||
45815                                             ((instr & 0x380000) == 0x380000)) {
45816                                           UnallocatedA32(instr);
45817                                           return;
45818                                         }
45819                                         DataType dt = Dt_U_imm3H_1_Decode(
45820                                             ((instr >> 19) & 0x7) |
45821                                             ((instr >> 21) & 0x8));
45822                                         if (dt.Is(kDataTypeValueInvalid)) {
45823                                           UnallocatedA32(instr);
45824                                           return;
45825                                         }
45826                                         if (((instr >> 12) & 1) != 0) {
45827                                           UnallocatedA32(instr);
45828                                           return;
45829                                         }
45830                                         unsigned rd =
45831                                             ExtractQRegister(instr, 22, 12);
45832                                         unsigned rm =
45833                                             ExtractDRegister(instr, 5, 0);
45834                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
45835                                         vmovl(al,
45836                                               dt,
45837                                               QRegister(rd),
45838                                               DRegister(rm));
45839                                         break;
45840                                       }
45841                                       case 0x00210000: {
45842                                         // 0xf2a10a10
45843                                         if (((instr & 0x380000) == 0x0) ||
45844                                             ((instr & 0x3f0000) == 0x80000) ||
45845                                             ((instr & 0x3f0000) == 0x100000) ||
45846                                             ((instr & 0x3f0000) == 0x200000)) {
45847                                           UnallocatedA32(instr);
45848                                           return;
45849                                         }
45850                                         DataType dt =
45851                                             Dt_imm6_4_Decode((instr >> 19) &
45852                                                                  0x7,
45853                                                              (instr >> 24) &
45854                                                                  0x1);
45855                                         if (dt.Is(kDataTypeValueInvalid)) {
45856                                           UnallocatedA32(instr);
45857                                           return;
45858                                         }
45859                                         if (((instr >> 12) & 1) != 0) {
45860                                           UnallocatedA32(instr);
45861                                           return;
45862                                         }
45863                                         unsigned rd =
45864                                             ExtractQRegister(instr, 22, 12);
45865                                         unsigned rm =
45866                                             ExtractDRegister(instr, 5, 0);
45867                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45868                                         uint32_t imm = imm6 - dt.GetSize();
45869                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45870                                         vshll(al,
45871                                               dt,
45872                                               QRegister(rd),
45873                                               DRegister(rm),
45874                                               imm);
45875                                         break;
45876                                       }
45877                                       case 0x00220000: {
45878                                         // 0xf2a20a10
45879                                         if (((instr & 0x380000) == 0x0) ||
45880                                             ((instr & 0x3f0000) == 0x80000) ||
45881                                             ((instr & 0x3f0000) == 0x100000) ||
45882                                             ((instr & 0x3f0000) == 0x200000)) {
45883                                           UnallocatedA32(instr);
45884                                           return;
45885                                         }
45886                                         DataType dt =
45887                                             Dt_imm6_4_Decode((instr >> 19) &
45888                                                                  0x7,
45889                                                              (instr >> 24) &
45890                                                                  0x1);
45891                                         if (dt.Is(kDataTypeValueInvalid)) {
45892                                           UnallocatedA32(instr);
45893                                           return;
45894                                         }
45895                                         if (((instr >> 12) & 1) != 0) {
45896                                           UnallocatedA32(instr);
45897                                           return;
45898                                         }
45899                                         unsigned rd =
45900                                             ExtractQRegister(instr, 22, 12);
45901                                         unsigned rm =
45902                                             ExtractDRegister(instr, 5, 0);
45903                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45904                                         uint32_t imm = imm6 - dt.GetSize();
45905                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45906                                         vshll(al,
45907                                               dt,
45908                                               QRegister(rd),
45909                                               DRegister(rm),
45910                                               imm);
45911                                         break;
45912                                       }
45913                                       case 0x00230000: {
45914                                         // 0xf2a30a10
45915                                         if (((instr & 0x380000) == 0x0) ||
45916                                             ((instr & 0x3f0000) == 0x80000) ||
45917                                             ((instr & 0x3f0000) == 0x100000) ||
45918                                             ((instr & 0x3f0000) == 0x200000)) {
45919                                           UnallocatedA32(instr);
45920                                           return;
45921                                         }
45922                                         DataType dt =
45923                                             Dt_imm6_4_Decode((instr >> 19) &
45924                                                                  0x7,
45925                                                              (instr >> 24) &
45926                                                                  0x1);
45927                                         if (dt.Is(kDataTypeValueInvalid)) {
45928                                           UnallocatedA32(instr);
45929                                           return;
45930                                         }
45931                                         if (((instr >> 12) & 1) != 0) {
45932                                           UnallocatedA32(instr);
45933                                           return;
45934                                         }
45935                                         unsigned rd =
45936                                             ExtractQRegister(instr, 22, 12);
45937                                         unsigned rm =
45938                                             ExtractDRegister(instr, 5, 0);
45939                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45940                                         uint32_t imm = imm6 - dt.GetSize();
45941                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45942                                         vshll(al,
45943                                               dt,
45944                                               QRegister(rd),
45945                                               DRegister(rm),
45946                                               imm);
45947                                         break;
45948                                       }
45949                                       case 0x00240000: {
45950                                         // 0xf2a40a10
45951                                         if (((instr & 0x380000) == 0x0) ||
45952                                             ((instr & 0x3f0000) == 0x80000) ||
45953                                             ((instr & 0x3f0000) == 0x100000) ||
45954                                             ((instr & 0x3f0000) == 0x200000)) {
45955                                           UnallocatedA32(instr);
45956                                           return;
45957                                         }
45958                                         DataType dt =
45959                                             Dt_imm6_4_Decode((instr >> 19) &
45960                                                                  0x7,
45961                                                              (instr >> 24) &
45962                                                                  0x1);
45963                                         if (dt.Is(kDataTypeValueInvalid)) {
45964                                           UnallocatedA32(instr);
45965                                           return;
45966                                         }
45967                                         if (((instr >> 12) & 1) != 0) {
45968                                           UnallocatedA32(instr);
45969                                           return;
45970                                         }
45971                                         unsigned rd =
45972                                             ExtractQRegister(instr, 22, 12);
45973                                         unsigned rm =
45974                                             ExtractDRegister(instr, 5, 0);
45975                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45976                                         uint32_t imm = imm6 - dt.GetSize();
45977                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45978                                         vshll(al,
45979                                               dt,
45980                                               QRegister(rd),
45981                                               DRegister(rm),
45982                                               imm);
45983                                         break;
45984                                       }
45985                                       case 0x00250000: {
45986                                         // 0xf2a50a10
45987                                         if (((instr & 0x380000) == 0x0) ||
45988                                             ((instr & 0x3f0000) == 0x80000) ||
45989                                             ((instr & 0x3f0000) == 0x100000) ||
45990                                             ((instr & 0x3f0000) == 0x200000)) {
45991                                           UnallocatedA32(instr);
45992                                           return;
45993                                         }
45994                                         DataType dt =
45995                                             Dt_imm6_4_Decode((instr >> 19) &
45996                                                                  0x7,
45997                                                              (instr >> 24) &
45998                                                                  0x1);
45999                                         if (dt.Is(kDataTypeValueInvalid)) {
46000                                           UnallocatedA32(instr);
46001                                           return;
46002                                         }
46003                                         if (((instr >> 12) & 1) != 0) {
46004                                           UnallocatedA32(instr);
46005                                           return;
46006                                         }
46007                                         unsigned rd =
46008                                             ExtractQRegister(instr, 22, 12);
46009                                         unsigned rm =
46010                                             ExtractDRegister(instr, 5, 0);
46011                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46012                                         uint32_t imm = imm6 - dt.GetSize();
46013                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46014                                         vshll(al,
46015                                               dt,
46016                                               QRegister(rd),
46017                                               DRegister(rm),
46018                                               imm);
46019                                         break;
46020                                       }
46021                                       case 0x00260000: {
46022                                         // 0xf2a60a10
46023                                         if (((instr & 0x380000) == 0x0) ||
46024                                             ((instr & 0x3f0000) == 0x80000) ||
46025                                             ((instr & 0x3f0000) == 0x100000) ||
46026                                             ((instr & 0x3f0000) == 0x200000)) {
46027                                           UnallocatedA32(instr);
46028                                           return;
46029                                         }
46030                                         DataType dt =
46031                                             Dt_imm6_4_Decode((instr >> 19) &
46032                                                                  0x7,
46033                                                              (instr >> 24) &
46034                                                                  0x1);
46035                                         if (dt.Is(kDataTypeValueInvalid)) {
46036                                           UnallocatedA32(instr);
46037                                           return;
46038                                         }
46039                                         if (((instr >> 12) & 1) != 0) {
46040                                           UnallocatedA32(instr);
46041                                           return;
46042                                         }
46043                                         unsigned rd =
46044                                             ExtractQRegister(instr, 22, 12);
46045                                         unsigned rm =
46046                                             ExtractDRegister(instr, 5, 0);
46047                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46048                                         uint32_t imm = imm6 - dt.GetSize();
46049                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46050                                         vshll(al,
46051                                               dt,
46052                                               QRegister(rd),
46053                                               DRegister(rm),
46054                                               imm);
46055                                         break;
46056                                       }
46057                                       case 0x00270000: {
46058                                         // 0xf2a70a10
46059                                         if (((instr & 0x380000) == 0x0) ||
46060                                             ((instr & 0x3f0000) == 0x80000) ||
46061                                             ((instr & 0x3f0000) == 0x100000) ||
46062                                             ((instr & 0x3f0000) == 0x200000)) {
46063                                           UnallocatedA32(instr);
46064                                           return;
46065                                         }
46066                                         DataType dt =
46067                                             Dt_imm6_4_Decode((instr >> 19) &
46068                                                                  0x7,
46069                                                              (instr >> 24) &
46070                                                                  0x1);
46071                                         if (dt.Is(kDataTypeValueInvalid)) {
46072                                           UnallocatedA32(instr);
46073                                           return;
46074                                         }
46075                                         if (((instr >> 12) & 1) != 0) {
46076                                           UnallocatedA32(instr);
46077                                           return;
46078                                         }
46079                                         unsigned rd =
46080                                             ExtractQRegister(instr, 22, 12);
46081                                         unsigned rm =
46082                                             ExtractDRegister(instr, 5, 0);
46083                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46084                                         uint32_t imm = imm6 - dt.GetSize();
46085                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46086                                         vshll(al,
46087                                               dt,
46088                                               QRegister(rd),
46089                                               DRegister(rm),
46090                                               imm);
46091                                         break;
46092                                       }
46093                                       case 0x00280000: {
46094                                         // 0xf2a80a10
46095                                         if (((instr & 0x380000) == 0x0) ||
46096                                             ((instr & 0x3f0000) == 0x80000) ||
46097                                             ((instr & 0x3f0000) == 0x100000) ||
46098                                             ((instr & 0x3f0000) == 0x200000)) {
46099                                           UnallocatedA32(instr);
46100                                           return;
46101                                         }
46102                                         DataType dt =
46103                                             Dt_imm6_4_Decode((instr >> 19) &
46104                                                                  0x7,
46105                                                              (instr >> 24) &
46106                                                                  0x1);
46107                                         if (dt.Is(kDataTypeValueInvalid)) {
46108                                           UnallocatedA32(instr);
46109                                           return;
46110                                         }
46111                                         if (((instr >> 12) & 1) != 0) {
46112                                           UnallocatedA32(instr);
46113                                           return;
46114                                         }
46115                                         unsigned rd =
46116                                             ExtractQRegister(instr, 22, 12);
46117                                         unsigned rm =
46118                                             ExtractDRegister(instr, 5, 0);
46119                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46120                                         uint32_t imm = imm6 - dt.GetSize();
46121                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46122                                         vshll(al,
46123                                               dt,
46124                                               QRegister(rd),
46125                                               DRegister(rm),
46126                                               imm);
46127                                         break;
46128                                       }
46129                                       case 0x00290000: {
46130                                         // 0xf2a90a10
46131                                         if (((instr & 0x380000) == 0x0) ||
46132                                             ((instr & 0x3f0000) == 0x80000) ||
46133                                             ((instr & 0x3f0000) == 0x100000) ||
46134                                             ((instr & 0x3f0000) == 0x200000)) {
46135                                           UnallocatedA32(instr);
46136                                           return;
46137                                         }
46138                                         DataType dt =
46139                                             Dt_imm6_4_Decode((instr >> 19) &
46140                                                                  0x7,
46141                                                              (instr >> 24) &
46142                                                                  0x1);
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                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46156                                         uint32_t imm = imm6 - dt.GetSize();
46157                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46158                                         vshll(al,
46159                                               dt,
46160                                               QRegister(rd),
46161                                               DRegister(rm),
46162                                               imm);
46163                                         break;
46164                                       }
46165                                       case 0x002a0000: {
46166                                         // 0xf2aa0a10
46167                                         if (((instr & 0x380000) == 0x0) ||
46168                                             ((instr & 0x3f0000) == 0x80000) ||
46169                                             ((instr & 0x3f0000) == 0x100000) ||
46170                                             ((instr & 0x3f0000) == 0x200000)) {
46171                                           UnallocatedA32(instr);
46172                                           return;
46173                                         }
46174                                         DataType dt =
46175                                             Dt_imm6_4_Decode((instr >> 19) &
46176                                                                  0x7,
46177                                                              (instr >> 24) &
46178                                                                  0x1);
46179                                         if (dt.Is(kDataTypeValueInvalid)) {
46180                                           UnallocatedA32(instr);
46181                                           return;
46182                                         }
46183                                         if (((instr >> 12) & 1) != 0) {
46184                                           UnallocatedA32(instr);
46185                                           return;
46186                                         }
46187                                         unsigned rd =
46188                                             ExtractQRegister(instr, 22, 12);
46189                                         unsigned rm =
46190                                             ExtractDRegister(instr, 5, 0);
46191                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46192                                         uint32_t imm = imm6 - dt.GetSize();
46193                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46194                                         vshll(al,
46195                                               dt,
46196                                               QRegister(rd),
46197                                               DRegister(rm),
46198                                               imm);
46199                                         break;
46200                                       }
46201                                       case 0x002b0000: {
46202                                         // 0xf2ab0a10
46203                                         if (((instr & 0x380000) == 0x0) ||
46204                                             ((instr & 0x3f0000) == 0x80000) ||
46205                                             ((instr & 0x3f0000) == 0x100000) ||
46206                                             ((instr & 0x3f0000) == 0x200000)) {
46207                                           UnallocatedA32(instr);
46208                                           return;
46209                                         }
46210                                         DataType dt =
46211                                             Dt_imm6_4_Decode((instr >> 19) &
46212                                                                  0x7,
46213                                                              (instr >> 24) &
46214                                                                  0x1);
46215                                         if (dt.Is(kDataTypeValueInvalid)) {
46216                                           UnallocatedA32(instr);
46217                                           return;
46218                                         }
46219                                         if (((instr >> 12) & 1) != 0) {
46220                                           UnallocatedA32(instr);
46221                                           return;
46222                                         }
46223                                         unsigned rd =
46224                                             ExtractQRegister(instr, 22, 12);
46225                                         unsigned rm =
46226                                             ExtractDRegister(instr, 5, 0);
46227                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46228                                         uint32_t imm = imm6 - dt.GetSize();
46229                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46230                                         vshll(al,
46231                                               dt,
46232                                               QRegister(rd),
46233                                               DRegister(rm),
46234                                               imm);
46235                                         break;
46236                                       }
46237                                       case 0x002c0000: {
46238                                         // 0xf2ac0a10
46239                                         if (((instr & 0x380000) == 0x0) ||
46240                                             ((instr & 0x3f0000) == 0x80000) ||
46241                                             ((instr & 0x3f0000) == 0x100000) ||
46242                                             ((instr & 0x3f0000) == 0x200000)) {
46243                                           UnallocatedA32(instr);
46244                                           return;
46245                                         }
46246                                         DataType dt =
46247                                             Dt_imm6_4_Decode((instr >> 19) &
46248                                                                  0x7,
46249                                                              (instr >> 24) &
46250                                                                  0x1);
46251                                         if (dt.Is(kDataTypeValueInvalid)) {
46252                                           UnallocatedA32(instr);
46253                                           return;
46254                                         }
46255                                         if (((instr >> 12) & 1) != 0) {
46256                                           UnallocatedA32(instr);
46257                                           return;
46258                                         }
46259                                         unsigned rd =
46260                                             ExtractQRegister(instr, 22, 12);
46261                                         unsigned rm =
46262                                             ExtractDRegister(instr, 5, 0);
46263                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46264                                         uint32_t imm = imm6 - dt.GetSize();
46265                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46266                                         vshll(al,
46267                                               dt,
46268                                               QRegister(rd),
46269                                               DRegister(rm),
46270                                               imm);
46271                                         break;
46272                                       }
46273                                       case 0x002d0000: {
46274                                         // 0xf2ad0a10
46275                                         if (((instr & 0x380000) == 0x0) ||
46276                                             ((instr & 0x3f0000) == 0x80000) ||
46277                                             ((instr & 0x3f0000) == 0x100000) ||
46278                                             ((instr & 0x3f0000) == 0x200000)) {
46279                                           UnallocatedA32(instr);
46280                                           return;
46281                                         }
46282                                         DataType dt =
46283                                             Dt_imm6_4_Decode((instr >> 19) &
46284                                                                  0x7,
46285                                                              (instr >> 24) &
46286                                                                  0x1);
46287                                         if (dt.Is(kDataTypeValueInvalid)) {
46288                                           UnallocatedA32(instr);
46289                                           return;
46290                                         }
46291                                         if (((instr >> 12) & 1) != 0) {
46292                                           UnallocatedA32(instr);
46293                                           return;
46294                                         }
46295                                         unsigned rd =
46296                                             ExtractQRegister(instr, 22, 12);
46297                                         unsigned rm =
46298                                             ExtractDRegister(instr, 5, 0);
46299                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46300                                         uint32_t imm = imm6 - dt.GetSize();
46301                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46302                                         vshll(al,
46303                                               dt,
46304                                               QRegister(rd),
46305                                               DRegister(rm),
46306                                               imm);
46307                                         break;
46308                                       }
46309                                       case 0x002e0000: {
46310                                         // 0xf2ae0a10
46311                                         if (((instr & 0x380000) == 0x0) ||
46312                                             ((instr & 0x3f0000) == 0x80000) ||
46313                                             ((instr & 0x3f0000) == 0x100000) ||
46314                                             ((instr & 0x3f0000) == 0x200000)) {
46315                                           UnallocatedA32(instr);
46316                                           return;
46317                                         }
46318                                         DataType dt =
46319                                             Dt_imm6_4_Decode((instr >> 19) &
46320                                                                  0x7,
46321                                                              (instr >> 24) &
46322                                                                  0x1);
46323                                         if (dt.Is(kDataTypeValueInvalid)) {
46324                                           UnallocatedA32(instr);
46325                                           return;
46326                                         }
46327                                         if (((instr >> 12) & 1) != 0) {
46328                                           UnallocatedA32(instr);
46329                                           return;
46330                                         }
46331                                         unsigned rd =
46332                                             ExtractQRegister(instr, 22, 12);
46333                                         unsigned rm =
46334                                             ExtractDRegister(instr, 5, 0);
46335                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46336                                         uint32_t imm = imm6 - dt.GetSize();
46337                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46338                                         vshll(al,
46339                                               dt,
46340                                               QRegister(rd),
46341                                               DRegister(rm),
46342                                               imm);
46343                                         break;
46344                                       }
46345                                       case 0x002f0000: {
46346                                         // 0xf2af0a10
46347                                         if (((instr & 0x380000) == 0x0) ||
46348                                             ((instr & 0x3f0000) == 0x80000) ||
46349                                             ((instr & 0x3f0000) == 0x100000) ||
46350                                             ((instr & 0x3f0000) == 0x200000)) {
46351                                           UnallocatedA32(instr);
46352                                           return;
46353                                         }
46354                                         DataType dt =
46355                                             Dt_imm6_4_Decode((instr >> 19) &
46356                                                                  0x7,
46357                                                              (instr >> 24) &
46358                                                                  0x1);
46359                                         if (dt.Is(kDataTypeValueInvalid)) {
46360                                           UnallocatedA32(instr);
46361                                           return;
46362                                         }
46363                                         if (((instr >> 12) & 1) != 0) {
46364                                           UnallocatedA32(instr);
46365                                           return;
46366                                         }
46367                                         unsigned rd =
46368                                             ExtractQRegister(instr, 22, 12);
46369                                         unsigned rm =
46370                                             ExtractDRegister(instr, 5, 0);
46371                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46372                                         uint32_t imm = imm6 - dt.GetSize();
46373                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46374                                         vshll(al,
46375                                               dt,
46376                                               QRegister(rd),
46377                                               DRegister(rm),
46378                                               imm);
46379                                         break;
46380                                       }
46381                                       case 0x00300000: {
46382                                         // 0xf2b00a10
46383                                         if (((instr & 0x380000) == 0x0) ||
46384                                             ((instr & 0x3f0000) == 0x80000) ||
46385                                             ((instr & 0x3f0000) == 0x100000) ||
46386                                             ((instr & 0x3f0000) == 0x200000)) {
46387                                           UnallocatedA32(instr);
46388                                           return;
46389                                         }
46390                                         DataType dt =
46391                                             Dt_imm6_4_Decode((instr >> 19) &
46392                                                                  0x7,
46393                                                              (instr >> 24) &
46394                                                                  0x1);
46395                                         if (dt.Is(kDataTypeValueInvalid)) {
46396                                           UnallocatedA32(instr);
46397                                           return;
46398                                         }
46399                                         if (((instr >> 12) & 1) != 0) {
46400                                           UnallocatedA32(instr);
46401                                           return;
46402                                         }
46403                                         unsigned rd =
46404                                             ExtractQRegister(instr, 22, 12);
46405                                         unsigned rm =
46406                                             ExtractDRegister(instr, 5, 0);
46407                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46408                                         uint32_t imm = imm6 - dt.GetSize();
46409                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46410                                         vshll(al,
46411                                               dt,
46412                                               QRegister(rd),
46413                                               DRegister(rm),
46414                                               imm);
46415                                         break;
46416                                       }
46417                                       case 0x00310000: {
46418                                         // 0xf2b10a10
46419                                         if (((instr & 0x380000) == 0x0) ||
46420                                             ((instr & 0x3f0000) == 0x80000) ||
46421                                             ((instr & 0x3f0000) == 0x100000) ||
46422                                             ((instr & 0x3f0000) == 0x200000)) {
46423                                           UnallocatedA32(instr);
46424                                           return;
46425                                         }
46426                                         DataType dt =
46427                                             Dt_imm6_4_Decode((instr >> 19) &
46428                                                                  0x7,
46429                                                              (instr >> 24) &
46430                                                                  0x1);
46431                                         if (dt.Is(kDataTypeValueInvalid)) {
46432                                           UnallocatedA32(instr);
46433                                           return;
46434                                         }
46435                                         if (((instr >> 12) & 1) != 0) {
46436                                           UnallocatedA32(instr);
46437                                           return;
46438                                         }
46439                                         unsigned rd =
46440                                             ExtractQRegister(instr, 22, 12);
46441                                         unsigned rm =
46442                                             ExtractDRegister(instr, 5, 0);
46443                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46444                                         uint32_t imm = imm6 - dt.GetSize();
46445                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46446                                         vshll(al,
46447                                               dt,
46448                                               QRegister(rd),
46449                                               DRegister(rm),
46450                                               imm);
46451                                         break;
46452                                       }
46453                                       case 0x00320000: {
46454                                         // 0xf2b20a10
46455                                         if (((instr & 0x380000) == 0x0) ||
46456                                             ((instr & 0x3f0000) == 0x80000) ||
46457                                             ((instr & 0x3f0000) == 0x100000) ||
46458                                             ((instr & 0x3f0000) == 0x200000)) {
46459                                           UnallocatedA32(instr);
46460                                           return;
46461                                         }
46462                                         DataType dt =
46463                                             Dt_imm6_4_Decode((instr >> 19) &
46464                                                                  0x7,
46465                                                              (instr >> 24) &
46466                                                                  0x1);
46467                                         if (dt.Is(kDataTypeValueInvalid)) {
46468                                           UnallocatedA32(instr);
46469                                           return;
46470                                         }
46471                                         if (((instr >> 12) & 1) != 0) {
46472                                           UnallocatedA32(instr);
46473                                           return;
46474                                         }
46475                                         unsigned rd =
46476                                             ExtractQRegister(instr, 22, 12);
46477                                         unsigned rm =
46478                                             ExtractDRegister(instr, 5, 0);
46479                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46480                                         uint32_t imm = imm6 - dt.GetSize();
46481                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46482                                         vshll(al,
46483                                               dt,
46484                                               QRegister(rd),
46485                                               DRegister(rm),
46486                                               imm);
46487                                         break;
46488                                       }
46489                                       case 0x00330000: {
46490                                         // 0xf2b30a10
46491                                         if (((instr & 0x380000) == 0x0) ||
46492                                             ((instr & 0x3f0000) == 0x80000) ||
46493                                             ((instr & 0x3f0000) == 0x100000) ||
46494                                             ((instr & 0x3f0000) == 0x200000)) {
46495                                           UnallocatedA32(instr);
46496                                           return;
46497                                         }
46498                                         DataType dt =
46499                                             Dt_imm6_4_Decode((instr >> 19) &
46500                                                                  0x7,
46501                                                              (instr >> 24) &
46502                                                                  0x1);
46503                                         if (dt.Is(kDataTypeValueInvalid)) {
46504                                           UnallocatedA32(instr);
46505                                           return;
46506                                         }
46507                                         if (((instr >> 12) & 1) != 0) {
46508                                           UnallocatedA32(instr);
46509                                           return;
46510                                         }
46511                                         unsigned rd =
46512                                             ExtractQRegister(instr, 22, 12);
46513                                         unsigned rm =
46514                                             ExtractDRegister(instr, 5, 0);
46515                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46516                                         uint32_t imm = imm6 - dt.GetSize();
46517                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46518                                         vshll(al,
46519                                               dt,
46520                                               QRegister(rd),
46521                                               DRegister(rm),
46522                                               imm);
46523                                         break;
46524                                       }
46525                                       case 0x00340000: {
46526                                         // 0xf2b40a10
46527                                         if (((instr & 0x380000) == 0x0) ||
46528                                             ((instr & 0x3f0000) == 0x80000) ||
46529                                             ((instr & 0x3f0000) == 0x100000) ||
46530                                             ((instr & 0x3f0000) == 0x200000)) {
46531                                           UnallocatedA32(instr);
46532                                           return;
46533                                         }
46534                                         DataType dt =
46535                                             Dt_imm6_4_Decode((instr >> 19) &
46536                                                                  0x7,
46537                                                              (instr >> 24) &
46538                                                                  0x1);
46539                                         if (dt.Is(kDataTypeValueInvalid)) {
46540                                           UnallocatedA32(instr);
46541                                           return;
46542                                         }
46543                                         if (((instr >> 12) & 1) != 0) {
46544                                           UnallocatedA32(instr);
46545                                           return;
46546                                         }
46547                                         unsigned rd =
46548                                             ExtractQRegister(instr, 22, 12);
46549                                         unsigned rm =
46550                                             ExtractDRegister(instr, 5, 0);
46551                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46552                                         uint32_t imm = imm6 - dt.GetSize();
46553                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46554                                         vshll(al,
46555                                               dt,
46556                                               QRegister(rd),
46557                                               DRegister(rm),
46558                                               imm);
46559                                         break;
46560                                       }
46561                                       case 0x00350000: {
46562                                         // 0xf2b50a10
46563                                         if (((instr & 0x380000) == 0x0) ||
46564                                             ((instr & 0x3f0000) == 0x80000) ||
46565                                             ((instr & 0x3f0000) == 0x100000) ||
46566                                             ((instr & 0x3f0000) == 0x200000)) {
46567                                           UnallocatedA32(instr);
46568                                           return;
46569                                         }
46570                                         DataType dt =
46571                                             Dt_imm6_4_Decode((instr >> 19) &
46572                                                                  0x7,
46573                                                              (instr >> 24) &
46574                                                                  0x1);
46575                                         if (dt.Is(kDataTypeValueInvalid)) {
46576                                           UnallocatedA32(instr);
46577                                           return;
46578                                         }
46579                                         if (((instr >> 12) & 1) != 0) {
46580                                           UnallocatedA32(instr);
46581                                           return;
46582                                         }
46583                                         unsigned rd =
46584                                             ExtractQRegister(instr, 22, 12);
46585                                         unsigned rm =
46586                                             ExtractDRegister(instr, 5, 0);
46587                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46588                                         uint32_t imm = imm6 - dt.GetSize();
46589                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46590                                         vshll(al,
46591                                               dt,
46592                                               QRegister(rd),
46593                                               DRegister(rm),
46594                                               imm);
46595                                         break;
46596                                       }
46597                                       case 0x00360000: {
46598                                         // 0xf2b60a10
46599                                         if (((instr & 0x380000) == 0x0) ||
46600                                             ((instr & 0x3f0000) == 0x80000) ||
46601                                             ((instr & 0x3f0000) == 0x100000) ||
46602                                             ((instr & 0x3f0000) == 0x200000)) {
46603                                           UnallocatedA32(instr);
46604                                           return;
46605                                         }
46606                                         DataType dt =
46607                                             Dt_imm6_4_Decode((instr >> 19) &
46608                                                                  0x7,
46609                                                              (instr >> 24) &
46610                                                                  0x1);
46611                                         if (dt.Is(kDataTypeValueInvalid)) {
46612                                           UnallocatedA32(instr);
46613                                           return;
46614                                         }
46615                                         if (((instr >> 12) & 1) != 0) {
46616                                           UnallocatedA32(instr);
46617                                           return;
46618                                         }
46619                                         unsigned rd =
46620                                             ExtractQRegister(instr, 22, 12);
46621                                         unsigned rm =
46622                                             ExtractDRegister(instr, 5, 0);
46623                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46624                                         uint32_t imm = imm6 - dt.GetSize();
46625                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46626                                         vshll(al,
46627                                               dt,
46628                                               QRegister(rd),
46629                                               DRegister(rm),
46630                                               imm);
46631                                         break;
46632                                       }
46633                                       case 0x00370000: {
46634                                         // 0xf2b70a10
46635                                         if (((instr & 0x380000) == 0x0) ||
46636                                             ((instr & 0x3f0000) == 0x80000) ||
46637                                             ((instr & 0x3f0000) == 0x100000) ||
46638                                             ((instr & 0x3f0000) == 0x200000)) {
46639                                           UnallocatedA32(instr);
46640                                           return;
46641                                         }
46642                                         DataType dt =
46643                                             Dt_imm6_4_Decode((instr >> 19) &
46644                                                                  0x7,
46645                                                              (instr >> 24) &
46646                                                                  0x1);
46647                                         if (dt.Is(kDataTypeValueInvalid)) {
46648                                           UnallocatedA32(instr);
46649                                           return;
46650                                         }
46651                                         if (((instr >> 12) & 1) != 0) {
46652                                           UnallocatedA32(instr);
46653                                           return;
46654                                         }
46655                                         unsigned rd =
46656                                             ExtractQRegister(instr, 22, 12);
46657                                         unsigned rm =
46658                                             ExtractDRegister(instr, 5, 0);
46659                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46660                                         uint32_t imm = imm6 - dt.GetSize();
46661                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46662                                         vshll(al,
46663                                               dt,
46664                                               QRegister(rd),
46665                                               DRegister(rm),
46666                                               imm);
46667                                         break;
46668                                       }
46669                                       case 0x00380000: {
46670                                         // 0xf2b80a10
46671                                         if (((instr & 0x380000) == 0x0) ||
46672                                             ((instr & 0x3f0000) == 0x80000) ||
46673                                             ((instr & 0x3f0000) == 0x100000) ||
46674                                             ((instr & 0x3f0000) == 0x200000)) {
46675                                           UnallocatedA32(instr);
46676                                           return;
46677                                         }
46678                                         DataType dt =
46679                                             Dt_imm6_4_Decode((instr >> 19) &
46680                                                                  0x7,
46681                                                              (instr >> 24) &
46682                                                                  0x1);
46683                                         if (dt.Is(kDataTypeValueInvalid)) {
46684                                           UnallocatedA32(instr);
46685                                           return;
46686                                         }
46687                                         if (((instr >> 12) & 1) != 0) {
46688                                           UnallocatedA32(instr);
46689                                           return;
46690                                         }
46691                                         unsigned rd =
46692                                             ExtractQRegister(instr, 22, 12);
46693                                         unsigned rm =
46694                                             ExtractDRegister(instr, 5, 0);
46695                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46696                                         uint32_t imm = imm6 - dt.GetSize();
46697                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46698                                         vshll(al,
46699                                               dt,
46700                                               QRegister(rd),
46701                                               DRegister(rm),
46702                                               imm);
46703                                         break;
46704                                       }
46705                                       case 0x00390000: {
46706                                         // 0xf2b90a10
46707                                         if (((instr & 0x380000) == 0x0) ||
46708                                             ((instr & 0x3f0000) == 0x80000) ||
46709                                             ((instr & 0x3f0000) == 0x100000) ||
46710                                             ((instr & 0x3f0000) == 0x200000)) {
46711                                           UnallocatedA32(instr);
46712                                           return;
46713                                         }
46714                                         DataType dt =
46715                                             Dt_imm6_4_Decode((instr >> 19) &
46716                                                                  0x7,
46717                                                              (instr >> 24) &
46718                                                                  0x1);
46719                                         if (dt.Is(kDataTypeValueInvalid)) {
46720                                           UnallocatedA32(instr);
46721                                           return;
46722                                         }
46723                                         if (((instr >> 12) & 1) != 0) {
46724                                           UnallocatedA32(instr);
46725                                           return;
46726                                         }
46727                                         unsigned rd =
46728                                             ExtractQRegister(instr, 22, 12);
46729                                         unsigned rm =
46730                                             ExtractDRegister(instr, 5, 0);
46731                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46732                                         uint32_t imm = imm6 - dt.GetSize();
46733                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46734                                         vshll(al,
46735                                               dt,
46736                                               QRegister(rd),
46737                                               DRegister(rm),
46738                                               imm);
46739                                         break;
46740                                       }
46741                                       case 0x003a0000: {
46742                                         // 0xf2ba0a10
46743                                         if (((instr & 0x380000) == 0x0) ||
46744                                             ((instr & 0x3f0000) == 0x80000) ||
46745                                             ((instr & 0x3f0000) == 0x100000) ||
46746                                             ((instr & 0x3f0000) == 0x200000)) {
46747                                           UnallocatedA32(instr);
46748                                           return;
46749                                         }
46750                                         DataType dt =
46751                                             Dt_imm6_4_Decode((instr >> 19) &
46752                                                                  0x7,
46753                                                              (instr >> 24) &
46754                                                                  0x1);
46755                                         if (dt.Is(kDataTypeValueInvalid)) {
46756                                           UnallocatedA32(instr);
46757                                           return;
46758                                         }
46759                                         if (((instr >> 12) & 1) != 0) {
46760                                           UnallocatedA32(instr);
46761                                           return;
46762                                         }
46763                                         unsigned rd =
46764                                             ExtractQRegister(instr, 22, 12);
46765                                         unsigned rm =
46766                                             ExtractDRegister(instr, 5, 0);
46767                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46768                                         uint32_t imm = imm6 - dt.GetSize();
46769                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46770                                         vshll(al,
46771                                               dt,
46772                                               QRegister(rd),
46773                                               DRegister(rm),
46774                                               imm);
46775                                         break;
46776                                       }
46777                                       case 0x003b0000: {
46778                                         // 0xf2bb0a10
46779                                         if (((instr & 0x380000) == 0x0) ||
46780                                             ((instr & 0x3f0000) == 0x80000) ||
46781                                             ((instr & 0x3f0000) == 0x100000) ||
46782                                             ((instr & 0x3f0000) == 0x200000)) {
46783                                           UnallocatedA32(instr);
46784                                           return;
46785                                         }
46786                                         DataType dt =
46787                                             Dt_imm6_4_Decode((instr >> 19) &
46788                                                                  0x7,
46789                                                              (instr >> 24) &
46790                                                                  0x1);
46791                                         if (dt.Is(kDataTypeValueInvalid)) {
46792                                           UnallocatedA32(instr);
46793                                           return;
46794                                         }
46795                                         if (((instr >> 12) & 1) != 0) {
46796                                           UnallocatedA32(instr);
46797                                           return;
46798                                         }
46799                                         unsigned rd =
46800                                             ExtractQRegister(instr, 22, 12);
46801                                         unsigned rm =
46802                                             ExtractDRegister(instr, 5, 0);
46803                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46804                                         uint32_t imm = imm6 - dt.GetSize();
46805                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46806                                         vshll(al,
46807                                               dt,
46808                                               QRegister(rd),
46809                                               DRegister(rm),
46810                                               imm);
46811                                         break;
46812                                       }
46813                                       case 0x003c0000: {
46814                                         // 0xf2bc0a10
46815                                         if (((instr & 0x380000) == 0x0) ||
46816                                             ((instr & 0x3f0000) == 0x80000) ||
46817                                             ((instr & 0x3f0000) == 0x100000) ||
46818                                             ((instr & 0x3f0000) == 0x200000)) {
46819                                           UnallocatedA32(instr);
46820                                           return;
46821                                         }
46822                                         DataType dt =
46823                                             Dt_imm6_4_Decode((instr >> 19) &
46824                                                                  0x7,
46825                                                              (instr >> 24) &
46826                                                                  0x1);
46827                                         if (dt.Is(kDataTypeValueInvalid)) {
46828                                           UnallocatedA32(instr);
46829                                           return;
46830                                         }
46831                                         if (((instr >> 12) & 1) != 0) {
46832                                           UnallocatedA32(instr);
46833                                           return;
46834                                         }
46835                                         unsigned rd =
46836                                             ExtractQRegister(instr, 22, 12);
46837                                         unsigned rm =
46838                                             ExtractDRegister(instr, 5, 0);
46839                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46840                                         uint32_t imm = imm6 - dt.GetSize();
46841                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46842                                         vshll(al,
46843                                               dt,
46844                                               QRegister(rd),
46845                                               DRegister(rm),
46846                                               imm);
46847                                         break;
46848                                       }
46849                                       case 0x003d0000: {
46850                                         // 0xf2bd0a10
46851                                         if (((instr & 0x380000) == 0x0) ||
46852                                             ((instr & 0x3f0000) == 0x80000) ||
46853                                             ((instr & 0x3f0000) == 0x100000) ||
46854                                             ((instr & 0x3f0000) == 0x200000)) {
46855                                           UnallocatedA32(instr);
46856                                           return;
46857                                         }
46858                                         DataType dt =
46859                                             Dt_imm6_4_Decode((instr >> 19) &
46860                                                                  0x7,
46861                                                              (instr >> 24) &
46862                                                                  0x1);
46863                                         if (dt.Is(kDataTypeValueInvalid)) {
46864                                           UnallocatedA32(instr);
46865                                           return;
46866                                         }
46867                                         if (((instr >> 12) & 1) != 0) {
46868                                           UnallocatedA32(instr);
46869                                           return;
46870                                         }
46871                                         unsigned rd =
46872                                             ExtractQRegister(instr, 22, 12);
46873                                         unsigned rm =
46874                                             ExtractDRegister(instr, 5, 0);
46875                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46876                                         uint32_t imm = imm6 - dt.GetSize();
46877                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46878                                         vshll(al,
46879                                               dt,
46880                                               QRegister(rd),
46881                                               DRegister(rm),
46882                                               imm);
46883                                         break;
46884                                       }
46885                                       case 0x003e0000: {
46886                                         // 0xf2be0a10
46887                                         if (((instr & 0x380000) == 0x0) ||
46888                                             ((instr & 0x3f0000) == 0x80000) ||
46889                                             ((instr & 0x3f0000) == 0x100000) ||
46890                                             ((instr & 0x3f0000) == 0x200000)) {
46891                                           UnallocatedA32(instr);
46892                                           return;
46893                                         }
46894                                         DataType dt =
46895                                             Dt_imm6_4_Decode((instr >> 19) &
46896                                                                  0x7,
46897                                                              (instr >> 24) &
46898                                                                  0x1);
46899                                         if (dt.Is(kDataTypeValueInvalid)) {
46900                                           UnallocatedA32(instr);
46901                                           return;
46902                                         }
46903                                         if (((instr >> 12) & 1) != 0) {
46904                                           UnallocatedA32(instr);
46905                                           return;
46906                                         }
46907                                         unsigned rd =
46908                                             ExtractQRegister(instr, 22, 12);
46909                                         unsigned rm =
46910                                             ExtractDRegister(instr, 5, 0);
46911                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46912                                         uint32_t imm = imm6 - dt.GetSize();
46913                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46914                                         vshll(al,
46915                                               dt,
46916                                               QRegister(rd),
46917                                               DRegister(rm),
46918                                               imm);
46919                                         break;
46920                                       }
46921                                       case 0x003f0000: {
46922                                         // 0xf2bf0a10
46923                                         if (((instr & 0x380000) == 0x0) ||
46924                                             ((instr & 0x3f0000) == 0x80000) ||
46925                                             ((instr & 0x3f0000) == 0x100000) ||
46926                                             ((instr & 0x3f0000) == 0x200000)) {
46927                                           UnallocatedA32(instr);
46928                                           return;
46929                                         }
46930                                         DataType dt =
46931                                             Dt_imm6_4_Decode((instr >> 19) &
46932                                                                  0x7,
46933                                                              (instr >> 24) &
46934                                                                  0x1);
46935                                         if (dt.Is(kDataTypeValueInvalid)) {
46936                                           UnallocatedA32(instr);
46937                                           return;
46938                                         }
46939                                         if (((instr >> 12) & 1) != 0) {
46940                                           UnallocatedA32(instr);
46941                                           return;
46942                                         }
46943                                         unsigned rd =
46944                                             ExtractQRegister(instr, 22, 12);
46945                                         unsigned rm =
46946                                             ExtractDRegister(instr, 5, 0);
46947                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46948                                         uint32_t imm = imm6 - dt.GetSize();
46949                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46950                                         vshll(al,
46951                                               dt,
46952                                               QRegister(rd),
46953                                               DRegister(rm),
46954                                               imm);
46955                                         break;
46956                                       }
46957                                       default:
46958                                         UnallocatedA32(instr);
46959                                         break;
46960                                     }
46961                                     break;
46962                                   }
46963                                   default: {
46964                                     if (((instr & 0x380000) == 0x0) ||
46965                                         ((instr & 0x3f0000) == 0x80000) ||
46966                                         ((instr & 0x3f0000) == 0x100000) ||
46967                                         ((instr & 0x3f0000) == 0x200000)) {
46968                                       UnallocatedA32(instr);
46969                                       return;
46970                                     }
46971                                     DataType dt =
46972                                         Dt_imm6_4_Decode((instr >> 19) & 0x7,
46973                                                          (instr >> 24) & 0x1);
46974                                     if (dt.Is(kDataTypeValueInvalid)) {
46975                                       UnallocatedA32(instr);
46976                                       return;
46977                                     }
46978                                     if (((instr >> 12) & 1) != 0) {
46979                                       UnallocatedA32(instr);
46980                                       return;
46981                                     }
46982                                     unsigned rd =
46983                                         ExtractQRegister(instr, 22, 12);
46984                                     unsigned rm = ExtractDRegister(instr, 5, 0);
46985                                     uint32_t imm6 = (instr >> 16) & 0x3f;
46986                                     uint32_t imm = imm6 - dt.GetSize();
46987                                     // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46988                                     vshll(al,
46989                                           dt,
46990                                           QRegister(rd),
46991                                           DRegister(rm),
46992                                           imm);
46993                                     break;
46994                                   }
46995                                 }
46996                                 break;
46997                               }
46998                               default:
46999                                 UnallocatedA32(instr);
47000                                 break;
47001                             }
47002                             break;
47003                           }
47004                         }
47005                         break;
47006                       }
47007                       default:
47008                         UnallocatedA32(instr);
47009                         break;
47010                     }
47011                     break;
47012                   }
47013                   case 0x00000c00: {
47014                     // 0xf2800c10
47015                     switch (instr & 0x00000080) {
47016                       case 0x00000000: {
47017                         // 0xf2800c10
47018                         switch (instr & 0x00200000) {
47019                           case 0x00000000: {
47020                             // 0xf2800c10
47021                             switch (instr & 0x00180000) {
47022                               case 0x00000000: {
47023                                 // 0xf2800c10
47024                                 switch (instr & 0x00000300) {
47025                                   case 0x00000200: {
47026                                     // 0xf2800e10
47027                                     if (((instr & 0x920) == 0x100) ||
47028                                         ((instr & 0x520) == 0x100) ||
47029                                         ((instr & 0x820) == 0x20) ||
47030                                         ((instr & 0x420) == 0x20) ||
47031                                         ((instr & 0x220) == 0x20) ||
47032                                         ((instr & 0x120) == 0x120)) {
47033                                       UnallocatedA32(instr);
47034                                       return;
47035                                     }
47036                                     unsigned cmode = ((instr >> 8) & 0xf) |
47037                                                      ((instr >> 1) & 0x10);
47038                                     DataType dt =
47039                                         ImmediateVmov::DecodeDt(cmode);
47040                                     if (dt.Is(kDataTypeValueInvalid)) {
47041                                       UnallocatedA32(instr);
47042                                       return;
47043                                     }
47044                                     unsigned rd =
47045                                         ExtractDRegister(instr, 22, 12);
47046                                     DOperand imm =
47047                                         ImmediateVmov::DecodeImmediate(
47048                                             cmode,
47049                                             (instr & 0xf) |
47050                                                 ((instr >> 12) & 0x70) |
47051                                                 ((instr >> 17) & 0x80));
47052                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47053                                     vmov(al, dt, DRegister(rd), imm);
47054                                     break;
47055                                   }
47056                                   case 0x00000300: {
47057                                     // 0xf2800f10
47058                                     if (((instr & 0x920) == 0x100) ||
47059                                         ((instr & 0x520) == 0x100) ||
47060                                         ((instr & 0x820) == 0x20) ||
47061                                         ((instr & 0x420) == 0x20) ||
47062                                         ((instr & 0x220) == 0x20) ||
47063                                         ((instr & 0x120) == 0x120)) {
47064                                       UnallocatedA32(instr);
47065                                       return;
47066                                     }
47067                                     unsigned cmode = ((instr >> 8) & 0xf) |
47068                                                      ((instr >> 1) & 0x10);
47069                                     DataType dt =
47070                                         ImmediateVmov::DecodeDt(cmode);
47071                                     if (dt.Is(kDataTypeValueInvalid)) {
47072                                       UnallocatedA32(instr);
47073                                       return;
47074                                     }
47075                                     unsigned rd =
47076                                         ExtractDRegister(instr, 22, 12);
47077                                     DOperand imm =
47078                                         ImmediateVmov::DecodeImmediate(
47079                                             cmode,
47080                                             (instr & 0xf) |
47081                                                 ((instr >> 12) & 0x70) |
47082                                                 ((instr >> 17) & 0x80));
47083                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47084                                     vmov(al, dt, DRegister(rd), imm);
47085                                     break;
47086                                   }
47087                                   default: {
47088                                     switch (instr & 0x00000020) {
47089                                       case 0x00000020: {
47090                                         // 0xf2800c30
47091                                         switch (instr & 0x00000f20) {
47092                                           case 0x00000000: {
47093                                             // 0xf2800c10
47094                                             if (((instr & 0x920) == 0x100) ||
47095                                                 ((instr & 0x520) == 0x100) ||
47096                                                 ((instr & 0x820) == 0x20) ||
47097                                                 ((instr & 0x420) == 0x20) ||
47098                                                 ((instr & 0x220) == 0x20) ||
47099                                                 ((instr & 0x120) == 0x120)) {
47100                                               UnallocatedA32(instr);
47101                                               return;
47102                                             }
47103                                             unsigned cmode =
47104                                                 ((instr >> 8) & 0xf) |
47105                                                 ((instr >> 1) & 0x10);
47106                                             DataType dt =
47107                                                 ImmediateVmov::DecodeDt(cmode);
47108                                             if (dt.Is(kDataTypeValueInvalid)) {
47109                                               UnallocatedA32(instr);
47110                                               return;
47111                                             }
47112                                             unsigned rd =
47113                                                 ExtractDRegister(instr, 22, 12);
47114                                             DOperand imm =
47115                                                 ImmediateVmov::DecodeImmediate(
47116                                                     cmode,
47117                                                     (instr & 0xf) |
47118                                                         ((instr >> 12) & 0x70) |
47119                                                         ((instr >> 17) & 0x80));
47120                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47121                                             vmov(al, dt, DRegister(rd), imm);
47122                                             break;
47123                                           }
47124                                           case 0x00000020: {
47125                                             // 0xf2800c30
47126                                             if (((instr & 0xd00) == 0x100) ||
47127                                                 ((instr & 0xd00) == 0x500) ||
47128                                                 ((instr & 0xd00) == 0x900) ||
47129                                                 ((instr & 0xe00) == 0xe00)) {
47130                                               UnallocatedA32(instr);
47131                                               return;
47132                                             }
47133                                             unsigned cmode = (instr >> 8) & 0xf;
47134                                             DataType dt =
47135                                                 ImmediateVmvn::DecodeDt(cmode);
47136                                             if (dt.Is(kDataTypeValueInvalid)) {
47137                                               UnallocatedA32(instr);
47138                                               return;
47139                                             }
47140                                             unsigned rd =
47141                                                 ExtractDRegister(instr, 22, 12);
47142                                             DOperand imm =
47143                                                 ImmediateVmvn::DecodeImmediate(
47144                                                     cmode,
47145                                                     (instr & 0xf) |
47146                                                         ((instr >> 12) & 0x70) |
47147                                                         ((instr >> 17) & 0x80));
47148                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47149                                             vmvn(al, dt, DRegister(rd), imm);
47150                                             break;
47151                                           }
47152                                           case 0x00000200: {
47153                                             // 0xf2800e10
47154                                             if (((instr & 0x920) == 0x100) ||
47155                                                 ((instr & 0x520) == 0x100) ||
47156                                                 ((instr & 0x820) == 0x20) ||
47157                                                 ((instr & 0x420) == 0x20) ||
47158                                                 ((instr & 0x220) == 0x20) ||
47159                                                 ((instr & 0x120) == 0x120)) {
47160                                               UnallocatedA32(instr);
47161                                               return;
47162                                             }
47163                                             unsigned cmode =
47164                                                 ((instr >> 8) & 0xf) |
47165                                                 ((instr >> 1) & 0x10);
47166                                             DataType dt =
47167                                                 ImmediateVmov::DecodeDt(cmode);
47168                                             if (dt.Is(kDataTypeValueInvalid)) {
47169                                               UnallocatedA32(instr);
47170                                               return;
47171                                             }
47172                                             unsigned rd =
47173                                                 ExtractDRegister(instr, 22, 12);
47174                                             DOperand imm =
47175                                                 ImmediateVmov::DecodeImmediate(
47176                                                     cmode,
47177                                                     (instr & 0xf) |
47178                                                         ((instr >> 12) & 0x70) |
47179                                                         ((instr >> 17) & 0x80));
47180                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47181                                             vmov(al, dt, DRegister(rd), imm);
47182                                             break;
47183                                           }
47184                                           case 0x00000220: {
47185                                             // 0xf2800e30
47186                                             if (((instr & 0xd00) == 0x100) ||
47187                                                 ((instr & 0xd00) == 0x500) ||
47188                                                 ((instr & 0xd00) == 0x900) ||
47189                                                 ((instr & 0xe00) == 0xe00)) {
47190                                               UnallocatedA32(instr);
47191                                               return;
47192                                             }
47193                                             unsigned cmode = (instr >> 8) & 0xf;
47194                                             DataType dt =
47195                                                 ImmediateVmvn::DecodeDt(cmode);
47196                                             if (dt.Is(kDataTypeValueInvalid)) {
47197                                               UnallocatedA32(instr);
47198                                               return;
47199                                             }
47200                                             unsigned rd =
47201                                                 ExtractDRegister(instr, 22, 12);
47202                                             DOperand imm =
47203                                                 ImmediateVmvn::DecodeImmediate(
47204                                                     cmode,
47205                                                     (instr & 0xf) |
47206                                                         ((instr >> 12) & 0x70) |
47207                                                         ((instr >> 17) & 0x80));
47208                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47209                                             vmvn(al, dt, DRegister(rd), imm);
47210                                             break;
47211                                           }
47212                                           case 0x00000400: {
47213                                             // 0xf2800c10
47214                                             if (((instr & 0x920) == 0x100) ||
47215                                                 ((instr & 0x520) == 0x100) ||
47216                                                 ((instr & 0x820) == 0x20) ||
47217                                                 ((instr & 0x420) == 0x20) ||
47218                                                 ((instr & 0x220) == 0x20) ||
47219                                                 ((instr & 0x120) == 0x120)) {
47220                                               UnallocatedA32(instr);
47221                                               return;
47222                                             }
47223                                             unsigned cmode =
47224                                                 ((instr >> 8) & 0xf) |
47225                                                 ((instr >> 1) & 0x10);
47226                                             DataType dt =
47227                                                 ImmediateVmov::DecodeDt(cmode);
47228                                             if (dt.Is(kDataTypeValueInvalid)) {
47229                                               UnallocatedA32(instr);
47230                                               return;
47231                                             }
47232                                             unsigned rd =
47233                                                 ExtractDRegister(instr, 22, 12);
47234                                             DOperand imm =
47235                                                 ImmediateVmov::DecodeImmediate(
47236                                                     cmode,
47237                                                     (instr & 0xf) |
47238                                                         ((instr >> 12) & 0x70) |
47239                                                         ((instr >> 17) & 0x80));
47240                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47241                                             vmov(al, dt, DRegister(rd), imm);
47242                                             break;
47243                                           }
47244                                           case 0x00000420: {
47245                                             // 0xf2800c30
47246                                             if (((instr & 0xd00) == 0x100) ||
47247                                                 ((instr & 0xd00) == 0x500) ||
47248                                                 ((instr & 0xd00) == 0x900) ||
47249                                                 ((instr & 0xe00) == 0xe00)) {
47250                                               UnallocatedA32(instr);
47251                                               return;
47252                                             }
47253                                             unsigned cmode = (instr >> 8) & 0xf;
47254                                             DataType dt =
47255                                                 ImmediateVmvn::DecodeDt(cmode);
47256                                             if (dt.Is(kDataTypeValueInvalid)) {
47257                                               UnallocatedA32(instr);
47258                                               return;
47259                                             }
47260                                             unsigned rd =
47261                                                 ExtractDRegister(instr, 22, 12);
47262                                             DOperand imm =
47263                                                 ImmediateVmvn::DecodeImmediate(
47264                                                     cmode,
47265                                                     (instr & 0xf) |
47266                                                         ((instr >> 12) & 0x70) |
47267                                                         ((instr >> 17) & 0x80));
47268                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47269                                             vmvn(al, dt, DRegister(rd), imm);
47270                                             break;
47271                                           }
47272                                           case 0x00000600: {
47273                                             // 0xf2800e10
47274                                             if (((instr & 0x920) == 0x100) ||
47275                                                 ((instr & 0x520) == 0x100) ||
47276                                                 ((instr & 0x820) == 0x20) ||
47277                                                 ((instr & 0x420) == 0x20) ||
47278                                                 ((instr & 0x220) == 0x20) ||
47279                                                 ((instr & 0x120) == 0x120)) {
47280                                               UnallocatedA32(instr);
47281                                               return;
47282                                             }
47283                                             unsigned cmode =
47284                                                 ((instr >> 8) & 0xf) |
47285                                                 ((instr >> 1) & 0x10);
47286                                             DataType dt =
47287                                                 ImmediateVmov::DecodeDt(cmode);
47288                                             if (dt.Is(kDataTypeValueInvalid)) {
47289                                               UnallocatedA32(instr);
47290                                               return;
47291                                             }
47292                                             unsigned rd =
47293                                                 ExtractDRegister(instr, 22, 12);
47294                                             DOperand imm =
47295                                                 ImmediateVmov::DecodeImmediate(
47296                                                     cmode,
47297                                                     (instr & 0xf) |
47298                                                         ((instr >> 12) & 0x70) |
47299                                                         ((instr >> 17) & 0x80));
47300                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47301                                             vmov(al, dt, DRegister(rd), imm);
47302                                             break;
47303                                           }
47304                                           case 0x00000620: {
47305                                             // 0xf2800e30
47306                                             if (((instr & 0xd00) == 0x100) ||
47307                                                 ((instr & 0xd00) == 0x500) ||
47308                                                 ((instr & 0xd00) == 0x900) ||
47309                                                 ((instr & 0xe00) == 0xe00)) {
47310                                               UnallocatedA32(instr);
47311                                               return;
47312                                             }
47313                                             unsigned cmode = (instr >> 8) & 0xf;
47314                                             DataType dt =
47315                                                 ImmediateVmvn::DecodeDt(cmode);
47316                                             if (dt.Is(kDataTypeValueInvalid)) {
47317                                               UnallocatedA32(instr);
47318                                               return;
47319                                             }
47320                                             unsigned rd =
47321                                                 ExtractDRegister(instr, 22, 12);
47322                                             DOperand imm =
47323                                                 ImmediateVmvn::DecodeImmediate(
47324                                                     cmode,
47325                                                     (instr & 0xf) |
47326                                                         ((instr >> 12) & 0x70) |
47327                                                         ((instr >> 17) & 0x80));
47328                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47329                                             vmvn(al, dt, DRegister(rd), imm);
47330                                             break;
47331                                           }
47332                                           case 0x00000800: {
47333                                             // 0xf2800c10
47334                                             if (((instr & 0x920) == 0x100) ||
47335                                                 ((instr & 0x520) == 0x100) ||
47336                                                 ((instr & 0x820) == 0x20) ||
47337                                                 ((instr & 0x420) == 0x20) ||
47338                                                 ((instr & 0x220) == 0x20) ||
47339                                                 ((instr & 0x120) == 0x120)) {
47340                                               UnallocatedA32(instr);
47341                                               return;
47342                                             }
47343                                             unsigned cmode =
47344                                                 ((instr >> 8) & 0xf) |
47345                                                 ((instr >> 1) & 0x10);
47346                                             DataType dt =
47347                                                 ImmediateVmov::DecodeDt(cmode);
47348                                             if (dt.Is(kDataTypeValueInvalid)) {
47349                                               UnallocatedA32(instr);
47350                                               return;
47351                                             }
47352                                             unsigned rd =
47353                                                 ExtractDRegister(instr, 22, 12);
47354                                             DOperand imm =
47355                                                 ImmediateVmov::DecodeImmediate(
47356                                                     cmode,
47357                                                     (instr & 0xf) |
47358                                                         ((instr >> 12) & 0x70) |
47359                                                         ((instr >> 17) & 0x80));
47360                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47361                                             vmov(al, dt, DRegister(rd), imm);
47362                                             break;
47363                                           }
47364                                           case 0x00000820: {
47365                                             // 0xf2800c30
47366                                             if (((instr & 0xd00) == 0x100) ||
47367                                                 ((instr & 0xd00) == 0x500) ||
47368                                                 ((instr & 0xd00) == 0x900) ||
47369                                                 ((instr & 0xe00) == 0xe00)) {
47370                                               UnallocatedA32(instr);
47371                                               return;
47372                                             }
47373                                             unsigned cmode = (instr >> 8) & 0xf;
47374                                             DataType dt =
47375                                                 ImmediateVmvn::DecodeDt(cmode);
47376                                             if (dt.Is(kDataTypeValueInvalid)) {
47377                                               UnallocatedA32(instr);
47378                                               return;
47379                                             }
47380                                             unsigned rd =
47381                                                 ExtractDRegister(instr, 22, 12);
47382                                             DOperand imm =
47383                                                 ImmediateVmvn::DecodeImmediate(
47384                                                     cmode,
47385                                                     (instr & 0xf) |
47386                                                         ((instr >> 12) & 0x70) |
47387                                                         ((instr >> 17) & 0x80));
47388                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47389                                             vmvn(al, dt, DRegister(rd), imm);
47390                                             break;
47391                                           }
47392                                           case 0x00000a00: {
47393                                             // 0xf2800e10
47394                                             if (((instr & 0x920) == 0x100) ||
47395                                                 ((instr & 0x520) == 0x100) ||
47396                                                 ((instr & 0x820) == 0x20) ||
47397                                                 ((instr & 0x420) == 0x20) ||
47398                                                 ((instr & 0x220) == 0x20) ||
47399                                                 ((instr & 0x120) == 0x120)) {
47400                                               UnallocatedA32(instr);
47401                                               return;
47402                                             }
47403                                             unsigned cmode =
47404                                                 ((instr >> 8) & 0xf) |
47405                                                 ((instr >> 1) & 0x10);
47406                                             DataType dt =
47407                                                 ImmediateVmov::DecodeDt(cmode);
47408                                             if (dt.Is(kDataTypeValueInvalid)) {
47409                                               UnallocatedA32(instr);
47410                                               return;
47411                                             }
47412                                             unsigned rd =
47413                                                 ExtractDRegister(instr, 22, 12);
47414                                             DOperand imm =
47415                                                 ImmediateVmov::DecodeImmediate(
47416                                                     cmode,
47417                                                     (instr & 0xf) |
47418                                                         ((instr >> 12) & 0x70) |
47419                                                         ((instr >> 17) & 0x80));
47420                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47421                                             vmov(al, dt, DRegister(rd), imm);
47422                                             break;
47423                                           }
47424                                           case 0x00000a20: {
47425                                             // 0xf2800e30
47426                                             if (((instr & 0xd00) == 0x100) ||
47427                                                 ((instr & 0xd00) == 0x500) ||
47428                                                 ((instr & 0xd00) == 0x900) ||
47429                                                 ((instr & 0xe00) == 0xe00)) {
47430                                               UnallocatedA32(instr);
47431                                               return;
47432                                             }
47433                                             unsigned cmode = (instr >> 8) & 0xf;
47434                                             DataType dt =
47435                                                 ImmediateVmvn::DecodeDt(cmode);
47436                                             if (dt.Is(kDataTypeValueInvalid)) {
47437                                               UnallocatedA32(instr);
47438                                               return;
47439                                             }
47440                                             unsigned rd =
47441                                                 ExtractDRegister(instr, 22, 12);
47442                                             DOperand imm =
47443                                                 ImmediateVmvn::DecodeImmediate(
47444                                                     cmode,
47445                                                     (instr & 0xf) |
47446                                                         ((instr >> 12) & 0x70) |
47447                                                         ((instr >> 17) & 0x80));
47448                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47449                                             vmvn(al, dt, DRegister(rd), imm);
47450                                             break;
47451                                           }
47452                                           case 0x00000c00: {
47453                                             // 0xf2800c10
47454                                             if (((instr & 0x920) == 0x100) ||
47455                                                 ((instr & 0x520) == 0x100) ||
47456                                                 ((instr & 0x820) == 0x20) ||
47457                                                 ((instr & 0x420) == 0x20) ||
47458                                                 ((instr & 0x220) == 0x20) ||
47459                                                 ((instr & 0x120) == 0x120)) {
47460                                               UnallocatedA32(instr);
47461                                               return;
47462                                             }
47463                                             unsigned cmode =
47464                                                 ((instr >> 8) & 0xf) |
47465                                                 ((instr >> 1) & 0x10);
47466                                             DataType dt =
47467                                                 ImmediateVmov::DecodeDt(cmode);
47468                                             if (dt.Is(kDataTypeValueInvalid)) {
47469                                               UnallocatedA32(instr);
47470                                               return;
47471                                             }
47472                                             unsigned rd =
47473                                                 ExtractDRegister(instr, 22, 12);
47474                                             DOperand imm =
47475                                                 ImmediateVmov::DecodeImmediate(
47476                                                     cmode,
47477                                                     (instr & 0xf) |
47478                                                         ((instr >> 12) & 0x70) |
47479                                                         ((instr >> 17) & 0x80));
47480                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47481                                             vmov(al, dt, DRegister(rd), imm);
47482                                             break;
47483                                           }
47484                                           case 0x00000c20: {
47485                                             // 0xf2800c30
47486                                             if (((instr & 0xd00) == 0x100) ||
47487                                                 ((instr & 0xd00) == 0x500) ||
47488                                                 ((instr & 0xd00) == 0x900) ||
47489                                                 ((instr & 0xe00) == 0xe00)) {
47490                                               UnallocatedA32(instr);
47491                                               return;
47492                                             }
47493                                             unsigned cmode = (instr >> 8) & 0xf;
47494                                             DataType dt =
47495                                                 ImmediateVmvn::DecodeDt(cmode);
47496                                             if (dt.Is(kDataTypeValueInvalid)) {
47497                                               UnallocatedA32(instr);
47498                                               return;
47499                                             }
47500                                             unsigned rd =
47501                                                 ExtractDRegister(instr, 22, 12);
47502                                             DOperand imm =
47503                                                 ImmediateVmvn::DecodeImmediate(
47504                                                     cmode,
47505                                                     (instr & 0xf) |
47506                                                         ((instr >> 12) & 0x70) |
47507                                                         ((instr >> 17) & 0x80));
47508                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47509                                             vmvn(al, dt, DRegister(rd), imm);
47510                                             break;
47511                                           }
47512                                           case 0x00000d00: {
47513                                             // 0xf2800d10
47514                                             if (((instr & 0x920) == 0x100) ||
47515                                                 ((instr & 0x520) == 0x100) ||
47516                                                 ((instr & 0x820) == 0x20) ||
47517                                                 ((instr & 0x420) == 0x20) ||
47518                                                 ((instr & 0x220) == 0x20) ||
47519                                                 ((instr & 0x120) == 0x120)) {
47520                                               UnallocatedA32(instr);
47521                                               return;
47522                                             }
47523                                             unsigned cmode =
47524                                                 ((instr >> 8) & 0xf) |
47525                                                 ((instr >> 1) & 0x10);
47526                                             DataType dt =
47527                                                 ImmediateVmov::DecodeDt(cmode);
47528                                             if (dt.Is(kDataTypeValueInvalid)) {
47529                                               UnallocatedA32(instr);
47530                                               return;
47531                                             }
47532                                             unsigned rd =
47533                                                 ExtractDRegister(instr, 22, 12);
47534                                             DOperand imm =
47535                                                 ImmediateVmov::DecodeImmediate(
47536                                                     cmode,
47537                                                     (instr & 0xf) |
47538                                                         ((instr >> 12) & 0x70) |
47539                                                         ((instr >> 17) & 0x80));
47540                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47541                                             vmov(al, dt, DRegister(rd), imm);
47542                                             break;
47543                                           }
47544                                           case 0x00000d20: {
47545                                             // 0xf2800d30
47546                                             if (((instr & 0xd00) == 0x100) ||
47547                                                 ((instr & 0xd00) == 0x500) ||
47548                                                 ((instr & 0xd00) == 0x900) ||
47549                                                 ((instr & 0xe00) == 0xe00)) {
47550                                               UnallocatedA32(instr);
47551                                               return;
47552                                             }
47553                                             unsigned cmode = (instr >> 8) & 0xf;
47554                                             DataType dt =
47555                                                 ImmediateVmvn::DecodeDt(cmode);
47556                                             if (dt.Is(kDataTypeValueInvalid)) {
47557                                               UnallocatedA32(instr);
47558                                               return;
47559                                             }
47560                                             unsigned rd =
47561                                                 ExtractDRegister(instr, 22, 12);
47562                                             DOperand imm =
47563                                                 ImmediateVmvn::DecodeImmediate(
47564                                                     cmode,
47565                                                     (instr & 0xf) |
47566                                                         ((instr >> 12) & 0x70) |
47567                                                         ((instr >> 17) & 0x80));
47568                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47569                                             vmvn(al, dt, DRegister(rd), imm);
47570                                             break;
47571                                           }
47572                                           case 0x00000e00: {
47573                                             // 0xf2800e10
47574                                             if (((instr & 0x920) == 0x100) ||
47575                                                 ((instr & 0x520) == 0x100) ||
47576                                                 ((instr & 0x820) == 0x20) ||
47577                                                 ((instr & 0x420) == 0x20) ||
47578                                                 ((instr & 0x220) == 0x20) ||
47579                                                 ((instr & 0x120) == 0x120)) {
47580                                               UnallocatedA32(instr);
47581                                               return;
47582                                             }
47583                                             unsigned cmode =
47584                                                 ((instr >> 8) & 0xf) |
47585                                                 ((instr >> 1) & 0x10);
47586                                             DataType dt =
47587                                                 ImmediateVmov::DecodeDt(cmode);
47588                                             if (dt.Is(kDataTypeValueInvalid)) {
47589                                               UnallocatedA32(instr);
47590                                               return;
47591                                             }
47592                                             unsigned rd =
47593                                                 ExtractDRegister(instr, 22, 12);
47594                                             DOperand imm =
47595                                                 ImmediateVmov::DecodeImmediate(
47596                                                     cmode,
47597                                                     (instr & 0xf) |
47598                                                         ((instr >> 12) & 0x70) |
47599                                                         ((instr >> 17) & 0x80));
47600                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47601                                             vmov(al, dt, DRegister(rd), imm);
47602                                             break;
47603                                           }
47604                                           case 0x00000e20: {
47605                                             // 0xf2800e30
47606                                             if (((instr & 0x920) == 0x100) ||
47607                                                 ((instr & 0x520) == 0x100) ||
47608                                                 ((instr & 0x820) == 0x20) ||
47609                                                 ((instr & 0x420) == 0x20) ||
47610                                                 ((instr & 0x220) == 0x20) ||
47611                                                 ((instr & 0x120) == 0x120)) {
47612                                               UnallocatedA32(instr);
47613                                               return;
47614                                             }
47615                                             unsigned cmode =
47616                                                 ((instr >> 8) & 0xf) |
47617                                                 ((instr >> 1) & 0x10);
47618                                             DataType dt =
47619                                                 ImmediateVmov::DecodeDt(cmode);
47620                                             if (dt.Is(kDataTypeValueInvalid)) {
47621                                               UnallocatedA32(instr);
47622                                               return;
47623                                             }
47624                                             unsigned rd =
47625                                                 ExtractDRegister(instr, 22, 12);
47626                                             DOperand imm =
47627                                                 ImmediateVmov::DecodeImmediate(
47628                                                     cmode,
47629                                                     (instr & 0xf) |
47630                                                         ((instr >> 12) & 0x70) |
47631                                                         ((instr >> 17) & 0x80));
47632                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47633                                             vmov(al, dt, DRegister(rd), imm);
47634                                             break;
47635                                           }
47636                                           case 0x00000f00: {
47637                                             // 0xf2800f10
47638                                             if (((instr & 0x920) == 0x100) ||
47639                                                 ((instr & 0x520) == 0x100) ||
47640                                                 ((instr & 0x820) == 0x20) ||
47641                                                 ((instr & 0x420) == 0x20) ||
47642                                                 ((instr & 0x220) == 0x20) ||
47643                                                 ((instr & 0x120) == 0x120)) {
47644                                               UnallocatedA32(instr);
47645                                               return;
47646                                             }
47647                                             unsigned cmode =
47648                                                 ((instr >> 8) & 0xf) |
47649                                                 ((instr >> 1) & 0x10);
47650                                             DataType dt =
47651                                                 ImmediateVmov::DecodeDt(cmode);
47652                                             if (dt.Is(kDataTypeValueInvalid)) {
47653                                               UnallocatedA32(instr);
47654                                               return;
47655                                             }
47656                                             unsigned rd =
47657                                                 ExtractDRegister(instr, 22, 12);
47658                                             DOperand imm =
47659                                                 ImmediateVmov::DecodeImmediate(
47660                                                     cmode,
47661                                                     (instr & 0xf) |
47662                                                         ((instr >> 12) & 0x70) |
47663                                                         ((instr >> 17) & 0x80));
47664                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47665                                             vmov(al, dt, DRegister(rd), imm);
47666                                             break;
47667                                           }
47668                                           default:
47669                                             UnallocatedA32(instr);
47670                                             break;
47671                                         }
47672                                         break;
47673                                       }
47674                                       default: {
47675                                         if (((instr & 0x920) == 0x100) ||
47676                                             ((instr & 0x520) == 0x100) ||
47677                                             ((instr & 0x820) == 0x20) ||
47678                                             ((instr & 0x420) == 0x20) ||
47679                                             ((instr & 0x220) == 0x20) ||
47680                                             ((instr & 0x120) == 0x120)) {
47681                                           UnallocatedA32(instr);
47682                                           return;
47683                                         }
47684                                         unsigned cmode = ((instr >> 8) & 0xf) |
47685                                                          ((instr >> 1) & 0x10);
47686                                         DataType dt =
47687                                             ImmediateVmov::DecodeDt(cmode);
47688                                         if (dt.Is(kDataTypeValueInvalid)) {
47689                                           UnallocatedA32(instr);
47690                                           return;
47691                                         }
47692                                         unsigned rd =
47693                                             ExtractDRegister(instr, 22, 12);
47694                                         DOperand imm =
47695                                             ImmediateVmov::DecodeImmediate(
47696                                                 cmode,
47697                                                 (instr & 0xf) |
47698                                                     ((instr >> 12) & 0x70) |
47699                                                     ((instr >> 17) & 0x80));
47700                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47701                                         vmov(al, dt, DRegister(rd), imm);
47702                                         break;
47703                                       }
47704                                     }
47705                                     break;
47706                                   }
47707                                 }
47708                                 break;
47709                               }
47710                               default:
47711                                 UnallocatedA32(instr);
47712                                 break;
47713                             }
47714                             break;
47715                           }
47716                           default: {
47717                             if ((instr & 0x00000200) == 0x00000200) {
47718                               if (((instr & 0x200000) == 0x0)) {
47719                                 UnallocatedA32(instr);
47720                                 return;
47721                               }
47722                               DataType dt1 = Dt_op_U_1_Decode1(
47723                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
47724                               if (dt1.Is(kDataTypeValueInvalid)) {
47725                                 UnallocatedA32(instr);
47726                                 return;
47727                               }
47728                               DataType dt2 = Dt_op_U_1_Decode2(
47729                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
47730                               if (dt2.Is(kDataTypeValueInvalid)) {
47731                                 UnallocatedA32(instr);
47732                                 return;
47733                               }
47734                               unsigned rd = ExtractDRegister(instr, 22, 12);
47735                               unsigned rm = ExtractDRegister(instr, 5, 0);
47736                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
47737                               // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
47738                               vcvt(al,
47739                                    dt1,
47740                                    dt2,
47741                                    DRegister(rd),
47742                                    DRegister(rm),
47743                                    fbits);
47744                             } else {
47745                               UnallocatedA32(instr);
47746                             }
47747                             break;
47748                           }
47749                         }
47750                         break;
47751                       }
47752                       default:
47753                         UnallocatedA32(instr);
47754                         break;
47755                     }
47756                     break;
47757                   }
47758                 }
47759                 break;
47760               }
47761               case 0x00000040: {
47762                 // 0xf2800050
47763                 switch (instr & 0x00000c00) {
47764                   case 0x00000000: {
47765                     // 0xf2800050
47766                     switch (instr & 0x00380080) {
47767                       case 0x00000000: {
47768                         // 0xf2800050
47769                         switch (instr & 0x00000100) {
47770                           case 0x00000000: {
47771                             // 0xf2800050
47772                             switch (instr & 0x00000200) {
47773                               default: {
47774                                 switch (instr & 0x00000020) {
47775                                   case 0x00000020: {
47776                                     // 0xf2800070
47777                                     if (((instr & 0xd00) == 0x100) ||
47778                                         ((instr & 0xd00) == 0x500) ||
47779                                         ((instr & 0xd00) == 0x900) ||
47780                                         ((instr & 0xe00) == 0xe00)) {
47781                                       UnallocatedA32(instr);
47782                                       return;
47783                                     }
47784                                     unsigned cmode = (instr >> 8) & 0xf;
47785                                     DataType dt =
47786                                         ImmediateVmvn::DecodeDt(cmode);
47787                                     if (dt.Is(kDataTypeValueInvalid)) {
47788                                       UnallocatedA32(instr);
47789                                       return;
47790                                     }
47791                                     if (((instr >> 12) & 1) != 0) {
47792                                       UnallocatedA32(instr);
47793                                       return;
47794                                     }
47795                                     unsigned rd =
47796                                         ExtractQRegister(instr, 22, 12);
47797                                     QOperand imm =
47798                                         ImmediateVmvn::DecodeImmediate(
47799                                             cmode,
47800                                             (instr & 0xf) |
47801                                                 ((instr >> 12) & 0x70) |
47802                                                 ((instr >> 17) & 0x80));
47803                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
47804                                     vmvn(al, dt, QRegister(rd), imm);
47805                                     break;
47806                                   }
47807                                   default: {
47808                                     if (((instr & 0x920) == 0x100) ||
47809                                         ((instr & 0x520) == 0x100) ||
47810                                         ((instr & 0x820) == 0x20) ||
47811                                         ((instr & 0x420) == 0x20) ||
47812                                         ((instr & 0x220) == 0x20) ||
47813                                         ((instr & 0x120) == 0x120)) {
47814                                       UnallocatedA32(instr);
47815                                       return;
47816                                     }
47817                                     unsigned cmode = ((instr >> 8) & 0xf) |
47818                                                      ((instr >> 1) & 0x10);
47819                                     DataType dt =
47820                                         ImmediateVmov::DecodeDt(cmode);
47821                                     if (dt.Is(kDataTypeValueInvalid)) {
47822                                       UnallocatedA32(instr);
47823                                       return;
47824                                     }
47825                                     if (((instr >> 12) & 1) != 0) {
47826                                       UnallocatedA32(instr);
47827                                       return;
47828                                     }
47829                                     unsigned rd =
47830                                         ExtractQRegister(instr, 22, 12);
47831                                     QOperand imm =
47832                                         ImmediateVmov::DecodeImmediate(
47833                                             cmode,
47834                                             (instr & 0xf) |
47835                                                 ((instr >> 12) & 0x70) |
47836                                                 ((instr >> 17) & 0x80));
47837                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
47838                                     vmov(al, dt, QRegister(rd), imm);
47839                                     break;
47840                                   }
47841                                 }
47842                                 break;
47843                               }
47844                             }
47845                             break;
47846                           }
47847                           case 0x00000100: {
47848                             // 0xf2800150
47849                             switch (instr & 0x00000020) {
47850                               case 0x00000000: {
47851                                 // 0xf2800150
47852                                 if (((instr & 0x100) == 0x0) ||
47853                                     ((instr & 0xc00) == 0xc00)) {
47854                                   UnallocatedA32(instr);
47855                                   return;
47856                                 }
47857                                 unsigned cmode = (instr >> 8) & 0xf;
47858                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
47859                                 if (dt.Is(kDataTypeValueInvalid)) {
47860                                   UnallocatedA32(instr);
47861                                   return;
47862                                 }
47863                                 if (((instr >> 12) & 1) != 0) {
47864                                   UnallocatedA32(instr);
47865                                   return;
47866                                 }
47867                                 unsigned rd = ExtractQRegister(instr, 22, 12);
47868                                 QOperand imm = ImmediateVorr::DecodeImmediate(
47869                                     cmode,
47870                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
47871                                         ((instr >> 17) & 0x80));
47872                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
47873                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
47874                                 break;
47875                               }
47876                               case 0x00000020: {
47877                                 // 0xf2800170
47878                                 if (((instr & 0x100) == 0x0) ||
47879                                     ((instr & 0xc00) == 0xc00)) {
47880                                   UnallocatedA32(instr);
47881                                   return;
47882                                 }
47883                                 unsigned cmode = (instr >> 8) & 0xf;
47884                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
47885                                 if (dt.Is(kDataTypeValueInvalid)) {
47886                                   UnallocatedA32(instr);
47887                                   return;
47888                                 }
47889                                 if (((instr >> 12) & 1) != 0) {
47890                                   UnallocatedA32(instr);
47891                                   return;
47892                                 }
47893                                 unsigned rd = ExtractQRegister(instr, 22, 12);
47894                                 QOperand imm = ImmediateVbic::DecodeImmediate(
47895                                     cmode,
47896                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
47897                                         ((instr >> 17) & 0x80));
47898                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
47899                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
47900                                 break;
47901                               }
47902                             }
47903                             break;
47904                           }
47905                         }
47906                         break;
47907                       }
47908                       default: {
47909                         switch (instr & 0x00000300) {
47910                           case 0x00000000: {
47911                             // 0xf2800050
47912                             if (((instr & 0x380080) == 0x0)) {
47913                               UnallocatedA32(instr);
47914                               return;
47915                             }
47916                             DataType dt =
47917                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
47918                                                        ((instr >> 4) & 0x8),
47919                                                    (instr >> 24) & 0x1);
47920                             if (dt.Is(kDataTypeValueInvalid)) {
47921                               UnallocatedA32(instr);
47922                               return;
47923                             }
47924                             if (((instr >> 12) & 1) != 0) {
47925                               UnallocatedA32(instr);
47926                               return;
47927                             }
47928                             unsigned rd = ExtractQRegister(instr, 22, 12);
47929                             if ((instr & 1) != 0) {
47930                               UnallocatedA32(instr);
47931                               return;
47932                             }
47933                             unsigned rm = ExtractQRegister(instr, 5, 0);
47934                             uint32_t imm6 = (instr >> 16) & 0x3f;
47935                             uint32_t imm =
47936                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
47937                                 imm6;
47938                             // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47939                             vshr(al, dt, QRegister(rd), QRegister(rm), imm);
47940                             break;
47941                           }
47942                           case 0x00000100: {
47943                             // 0xf2800150
47944                             if (((instr & 0x380080) == 0x0)) {
47945                               UnallocatedA32(instr);
47946                               return;
47947                             }
47948                             DataType dt =
47949                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
47950                                                        ((instr >> 4) & 0x8),
47951                                                    (instr >> 24) & 0x1);
47952                             if (dt.Is(kDataTypeValueInvalid)) {
47953                               UnallocatedA32(instr);
47954                               return;
47955                             }
47956                             if (((instr >> 12) & 1) != 0) {
47957                               UnallocatedA32(instr);
47958                               return;
47959                             }
47960                             unsigned rd = ExtractQRegister(instr, 22, 12);
47961                             if ((instr & 1) != 0) {
47962                               UnallocatedA32(instr);
47963                               return;
47964                             }
47965                             unsigned rm = ExtractQRegister(instr, 5, 0);
47966                             uint32_t imm6 = (instr >> 16) & 0x3f;
47967                             uint32_t imm =
47968                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
47969                                 imm6;
47970                             // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47971                             vsra(al, dt, QRegister(rd), QRegister(rm), imm);
47972                             break;
47973                           }
47974                           case 0x00000200: {
47975                             // 0xf2800250
47976                             if (((instr & 0x380080) == 0x0)) {
47977                               UnallocatedA32(instr);
47978                               return;
47979                             }
47980                             DataType dt =
47981                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
47982                                                        ((instr >> 4) & 0x8),
47983                                                    (instr >> 24) & 0x1);
47984                             if (dt.Is(kDataTypeValueInvalid)) {
47985                               UnallocatedA32(instr);
47986                               return;
47987                             }
47988                             if (((instr >> 12) & 1) != 0) {
47989                               UnallocatedA32(instr);
47990                               return;
47991                             }
47992                             unsigned rd = ExtractQRegister(instr, 22, 12);
47993                             if ((instr & 1) != 0) {
47994                               UnallocatedA32(instr);
47995                               return;
47996                             }
47997                             unsigned rm = ExtractQRegister(instr, 5, 0);
47998                             uint32_t imm6 = (instr >> 16) & 0x3f;
47999                             uint32_t imm =
48000                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48001                                 imm6;
48002                             // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48003                             vrshr(al, dt, QRegister(rd), QRegister(rm), imm);
48004                             break;
48005                           }
48006                           case 0x00000300: {
48007                             // 0xf2800350
48008                             if (((instr & 0x380080) == 0x0)) {
48009                               UnallocatedA32(instr);
48010                               return;
48011                             }
48012                             DataType dt =
48013                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48014                                                        ((instr >> 4) & 0x8),
48015                                                    (instr >> 24) & 0x1);
48016                             if (dt.Is(kDataTypeValueInvalid)) {
48017                               UnallocatedA32(instr);
48018                               return;
48019                             }
48020                             if (((instr >> 12) & 1) != 0) {
48021                               UnallocatedA32(instr);
48022                               return;
48023                             }
48024                             unsigned rd = ExtractQRegister(instr, 22, 12);
48025                             if ((instr & 1) != 0) {
48026                               UnallocatedA32(instr);
48027                               return;
48028                             }
48029                             unsigned rm = ExtractQRegister(instr, 5, 0);
48030                             uint32_t imm6 = (instr >> 16) & 0x3f;
48031                             uint32_t imm =
48032                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48033                                 imm6;
48034                             // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48035                             vrsra(al, dt, QRegister(rd), QRegister(rm), imm);
48036                             break;
48037                           }
48038                         }
48039                         break;
48040                       }
48041                     }
48042                     break;
48043                   }
48044                   case 0x00000400: {
48045                     // 0xf2800450
48046                     switch (instr & 0x00380080) {
48047                       case 0x00000000: {
48048                         // 0xf2800450
48049                         switch (instr & 0x00000100) {
48050                           case 0x00000000: {
48051                             // 0xf2800450
48052                             switch (instr & 0x00000200) {
48053                               default: {
48054                                 switch (instr & 0x00000020) {
48055                                   case 0x00000020: {
48056                                     // 0xf2800470
48057                                     if (((instr & 0xd00) == 0x100) ||
48058                                         ((instr & 0xd00) == 0x500) ||
48059                                         ((instr & 0xd00) == 0x900) ||
48060                                         ((instr & 0xe00) == 0xe00)) {
48061                                       UnallocatedA32(instr);
48062                                       return;
48063                                     }
48064                                     unsigned cmode = (instr >> 8) & 0xf;
48065                                     DataType dt =
48066                                         ImmediateVmvn::DecodeDt(cmode);
48067                                     if (dt.Is(kDataTypeValueInvalid)) {
48068                                       UnallocatedA32(instr);
48069                                       return;
48070                                     }
48071                                     if (((instr >> 12) & 1) != 0) {
48072                                       UnallocatedA32(instr);
48073                                       return;
48074                                     }
48075                                     unsigned rd =
48076                                         ExtractQRegister(instr, 22, 12);
48077                                     QOperand imm =
48078                                         ImmediateVmvn::DecodeImmediate(
48079                                             cmode,
48080                                             (instr & 0xf) |
48081                                                 ((instr >> 12) & 0x70) |
48082                                                 ((instr >> 17) & 0x80));
48083                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48084                                     vmvn(al, dt, QRegister(rd), imm);
48085                                     break;
48086                                   }
48087                                   default: {
48088                                     if (((instr & 0x920) == 0x100) ||
48089                                         ((instr & 0x520) == 0x100) ||
48090                                         ((instr & 0x820) == 0x20) ||
48091                                         ((instr & 0x420) == 0x20) ||
48092                                         ((instr & 0x220) == 0x20) ||
48093                                         ((instr & 0x120) == 0x120)) {
48094                                       UnallocatedA32(instr);
48095                                       return;
48096                                     }
48097                                     unsigned cmode = ((instr >> 8) & 0xf) |
48098                                                      ((instr >> 1) & 0x10);
48099                                     DataType dt =
48100                                         ImmediateVmov::DecodeDt(cmode);
48101                                     if (dt.Is(kDataTypeValueInvalid)) {
48102                                       UnallocatedA32(instr);
48103                                       return;
48104                                     }
48105                                     if (((instr >> 12) & 1) != 0) {
48106                                       UnallocatedA32(instr);
48107                                       return;
48108                                     }
48109                                     unsigned rd =
48110                                         ExtractQRegister(instr, 22, 12);
48111                                     QOperand imm =
48112                                         ImmediateVmov::DecodeImmediate(
48113                                             cmode,
48114                                             (instr & 0xf) |
48115                                                 ((instr >> 12) & 0x70) |
48116                                                 ((instr >> 17) & 0x80));
48117                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48118                                     vmov(al, dt, QRegister(rd), imm);
48119                                     break;
48120                                   }
48121                                 }
48122                                 break;
48123                               }
48124                             }
48125                             break;
48126                           }
48127                           case 0x00000100: {
48128                             // 0xf2800550
48129                             switch (instr & 0x00000020) {
48130                               case 0x00000000: {
48131                                 // 0xf2800550
48132                                 if (((instr & 0x100) == 0x0) ||
48133                                     ((instr & 0xc00) == 0xc00)) {
48134                                   UnallocatedA32(instr);
48135                                   return;
48136                                 }
48137                                 unsigned cmode = (instr >> 8) & 0xf;
48138                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
48139                                 if (dt.Is(kDataTypeValueInvalid)) {
48140                                   UnallocatedA32(instr);
48141                                   return;
48142                                 }
48143                                 if (((instr >> 12) & 1) != 0) {
48144                                   UnallocatedA32(instr);
48145                                   return;
48146                                 }
48147                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48148                                 QOperand imm = ImmediateVorr::DecodeImmediate(
48149                                     cmode,
48150                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
48151                                         ((instr >> 17) & 0x80));
48152                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48153                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
48154                                 break;
48155                               }
48156                               case 0x00000020: {
48157                                 // 0xf2800570
48158                                 if (((instr & 0x100) == 0x0) ||
48159                                     ((instr & 0xc00) == 0xc00)) {
48160                                   UnallocatedA32(instr);
48161                                   return;
48162                                 }
48163                                 unsigned cmode = (instr >> 8) & 0xf;
48164                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
48165                                 if (dt.Is(kDataTypeValueInvalid)) {
48166                                   UnallocatedA32(instr);
48167                                   return;
48168                                 }
48169                                 if (((instr >> 12) & 1) != 0) {
48170                                   UnallocatedA32(instr);
48171                                   return;
48172                                 }
48173                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48174                                 QOperand imm = ImmediateVbic::DecodeImmediate(
48175                                     cmode,
48176                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
48177                                         ((instr >> 17) & 0x80));
48178                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48179                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
48180                                 break;
48181                               }
48182                             }
48183                             break;
48184                           }
48185                         }
48186                         break;
48187                       }
48188                       default: {
48189                         switch (instr & 0x00000300) {
48190                           case 0x00000000: {
48191                             // 0xf2800450
48192                             if ((instr & 0x01000000) == 0x01000000) {
48193                               if (((instr & 0x380080) == 0x0)) {
48194                                 UnallocatedA32(instr);
48195                                 return;
48196                               }
48197                               DataType dt = Dt_L_imm6_4_Decode(
48198                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
48199                               if (dt.Is(kDataTypeValueInvalid)) {
48200                                 UnallocatedA32(instr);
48201                                 return;
48202                               }
48203                               if (((instr >> 12) & 1) != 0) {
48204                                 UnallocatedA32(instr);
48205                                 return;
48206                               }
48207                               unsigned rd = ExtractQRegister(instr, 22, 12);
48208                               if ((instr & 1) != 0) {
48209                                 UnallocatedA32(instr);
48210                                 return;
48211                               }
48212                               unsigned rm = ExtractQRegister(instr, 5, 0);
48213                               uint32_t imm6 = (instr >> 16) & 0x3f;
48214                               uint32_t imm =
48215                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48216                                   imm6;
48217                               // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
48218                               vsri(al, dt, QRegister(rd), QRegister(rm), imm);
48219                             } else {
48220                               UnallocatedA32(instr);
48221                             }
48222                             break;
48223                           }
48224                           case 0x00000100: {
48225                             // 0xf2800550
48226                             switch (instr & 0x01000000) {
48227                               case 0x00000000: {
48228                                 // 0xf2800550
48229                                 if (((instr & 0x380080) == 0x0)) {
48230                                   UnallocatedA32(instr);
48231                                   return;
48232                                 }
48233                                 DataType dt =
48234                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
48235                                                        ((instr >> 4) & 0x8));
48236                                 if (dt.Is(kDataTypeValueInvalid)) {
48237                                   UnallocatedA32(instr);
48238                                   return;
48239                                 }
48240                                 if (((instr >> 12) & 1) != 0) {
48241                                   UnallocatedA32(instr);
48242                                   return;
48243                                 }
48244                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48245                                 if ((instr & 1) != 0) {
48246                                   UnallocatedA32(instr);
48247                                   return;
48248                                 }
48249                                 unsigned rm = ExtractQRegister(instr, 5, 0);
48250                                 uint32_t imm6 = (instr >> 16) & 0x3f;
48251                                 uint32_t imm =
48252                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48253                                 // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48254                                 vshl(al, dt, QRegister(rd), QRegister(rm), imm);
48255                                 break;
48256                               }
48257                               case 0x01000000: {
48258                                 // 0xf3800550
48259                                 if (((instr & 0x380080) == 0x0)) {
48260                                   UnallocatedA32(instr);
48261                                   return;
48262                                 }
48263                                 DataType dt =
48264                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
48265                                                        ((instr >> 4) & 0x8));
48266                                 if (dt.Is(kDataTypeValueInvalid)) {
48267                                   UnallocatedA32(instr);
48268                                   return;
48269                                 }
48270                                 if (((instr >> 12) & 1) != 0) {
48271                                   UnallocatedA32(instr);
48272                                   return;
48273                                 }
48274                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48275                                 if ((instr & 1) != 0) {
48276                                   UnallocatedA32(instr);
48277                                   return;
48278                                 }
48279                                 unsigned rm = ExtractQRegister(instr, 5, 0);
48280                                 uint32_t imm6 = (instr >> 16) & 0x3f;
48281                                 uint32_t imm =
48282                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48283                                 // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
48284                                 vsli(al, dt, QRegister(rd), QRegister(rm), imm);
48285                                 break;
48286                               }
48287                             }
48288                             break;
48289                           }
48290                           case 0x00000200: {
48291                             // 0xf2800650
48292                             if (((instr & 0x380080) == 0x0)) {
48293                               UnallocatedA32(instr);
48294                               return;
48295                             }
48296                             DataType dt =
48297                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
48298                                                        ((instr >> 4) & 0x8),
48299                                                    (instr >> 24) & 0x1);
48300                             if (dt.Is(kDataTypeValueInvalid)) {
48301                               UnallocatedA32(instr);
48302                               return;
48303                             }
48304                             if (((instr >> 12) & 1) != 0) {
48305                               UnallocatedA32(instr);
48306                               return;
48307                             }
48308                             unsigned rd = ExtractQRegister(instr, 22, 12);
48309                             if ((instr & 1) != 0) {
48310                               UnallocatedA32(instr);
48311                               return;
48312                             }
48313                             unsigned rm = ExtractQRegister(instr, 5, 0);
48314                             uint32_t imm6 = (instr >> 16) & 0x3f;
48315                             uint32_t imm =
48316                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48317                             // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48318                             vqshlu(al, dt, QRegister(rd), QRegister(rm), imm);
48319                             break;
48320                           }
48321                           case 0x00000300: {
48322                             // 0xf2800750
48323                             if (((instr & 0x380080) == 0x0)) {
48324                               UnallocatedA32(instr);
48325                               return;
48326                             }
48327                             DataType dt =
48328                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48329                                                        ((instr >> 4) & 0x8),
48330                                                    (instr >> 24) & 0x1);
48331                             if (dt.Is(kDataTypeValueInvalid)) {
48332                               UnallocatedA32(instr);
48333                               return;
48334                             }
48335                             if (((instr >> 12) & 1) != 0) {
48336                               UnallocatedA32(instr);
48337                               return;
48338                             }
48339                             unsigned rd = ExtractQRegister(instr, 22, 12);
48340                             if ((instr & 1) != 0) {
48341                               UnallocatedA32(instr);
48342                               return;
48343                             }
48344                             unsigned rm = ExtractQRegister(instr, 5, 0);
48345                             uint32_t imm6 = (instr >> 16) & 0x3f;
48346                             uint32_t imm =
48347                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48348                             // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48349                             vqshl(al, dt, QRegister(rd), QRegister(rm), imm);
48350                             break;
48351                           }
48352                         }
48353                         break;
48354                       }
48355                     }
48356                     break;
48357                   }
48358                   case 0x00000800: {
48359                     // 0xf2800850
48360                     switch (instr & 0x00000080) {
48361                       case 0x00000000: {
48362                         // 0xf2800850
48363                         switch (instr & 0x00380000) {
48364                           case 0x00000000: {
48365                             // 0xf2800850
48366                             switch (instr & 0x00000100) {
48367                               case 0x00000000: {
48368                                 // 0xf2800850
48369                                 switch (instr & 0x00000200) {
48370                                   default: {
48371                                     switch (instr & 0x00000020) {
48372                                       case 0x00000020: {
48373                                         // 0xf2800870
48374                                         if (((instr & 0xd00) == 0x100) ||
48375                                             ((instr & 0xd00) == 0x500) ||
48376                                             ((instr & 0xd00) == 0x900) ||
48377                                             ((instr & 0xe00) == 0xe00)) {
48378                                           UnallocatedA32(instr);
48379                                           return;
48380                                         }
48381                                         unsigned cmode = (instr >> 8) & 0xf;
48382                                         DataType dt =
48383                                             ImmediateVmvn::DecodeDt(cmode);
48384                                         if (dt.Is(kDataTypeValueInvalid)) {
48385                                           UnallocatedA32(instr);
48386                                           return;
48387                                         }
48388                                         if (((instr >> 12) & 1) != 0) {
48389                                           UnallocatedA32(instr);
48390                                           return;
48391                                         }
48392                                         unsigned rd =
48393                                             ExtractQRegister(instr, 22, 12);
48394                                         QOperand imm =
48395                                             ImmediateVmvn::DecodeImmediate(
48396                                                 cmode,
48397                                                 (instr & 0xf) |
48398                                                     ((instr >> 12) & 0x70) |
48399                                                     ((instr >> 17) & 0x80));
48400                                         // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48401                                         vmvn(al, dt, QRegister(rd), imm);
48402                                         break;
48403                                       }
48404                                       default: {
48405                                         if (((instr & 0x920) == 0x100) ||
48406                                             ((instr & 0x520) == 0x100) ||
48407                                             ((instr & 0x820) == 0x20) ||
48408                                             ((instr & 0x420) == 0x20) ||
48409                                             ((instr & 0x220) == 0x20) ||
48410                                             ((instr & 0x120) == 0x120)) {
48411                                           UnallocatedA32(instr);
48412                                           return;
48413                                         }
48414                                         unsigned cmode = ((instr >> 8) & 0xf) |
48415                                                          ((instr >> 1) & 0x10);
48416                                         DataType dt =
48417                                             ImmediateVmov::DecodeDt(cmode);
48418                                         if (dt.Is(kDataTypeValueInvalid)) {
48419                                           UnallocatedA32(instr);
48420                                           return;
48421                                         }
48422                                         if (((instr >> 12) & 1) != 0) {
48423                                           UnallocatedA32(instr);
48424                                           return;
48425                                         }
48426                                         unsigned rd =
48427                                             ExtractQRegister(instr, 22, 12);
48428                                         QOperand imm =
48429                                             ImmediateVmov::DecodeImmediate(
48430                                                 cmode,
48431                                                 (instr & 0xf) |
48432                                                     ((instr >> 12) & 0x70) |
48433                                                     ((instr >> 17) & 0x80));
48434                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48435                                         vmov(al, dt, QRegister(rd), imm);
48436                                         break;
48437                                       }
48438                                     }
48439                                     break;
48440                                   }
48441                                 }
48442                                 break;
48443                               }
48444                               case 0x00000100: {
48445                                 // 0xf2800950
48446                                 switch (instr & 0x00000020) {
48447                                   case 0x00000000: {
48448                                     // 0xf2800950
48449                                     if (((instr & 0x100) == 0x0) ||
48450                                         ((instr & 0xc00) == 0xc00)) {
48451                                       UnallocatedA32(instr);
48452                                       return;
48453                                     }
48454                                     unsigned cmode = (instr >> 8) & 0xf;
48455                                     DataType dt =
48456                                         ImmediateVorr::DecodeDt(cmode);
48457                                     if (dt.Is(kDataTypeValueInvalid)) {
48458                                       UnallocatedA32(instr);
48459                                       return;
48460                                     }
48461                                     if (((instr >> 12) & 1) != 0) {
48462                                       UnallocatedA32(instr);
48463                                       return;
48464                                     }
48465                                     unsigned rd =
48466                                         ExtractQRegister(instr, 22, 12);
48467                                     QOperand imm =
48468                                         ImmediateVorr::DecodeImmediate(
48469                                             cmode,
48470                                             (instr & 0xf) |
48471                                                 ((instr >> 12) & 0x70) |
48472                                                 ((instr >> 17) & 0x80));
48473                                     // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48474                                     vorr(al,
48475                                          dt,
48476                                          QRegister(rd),
48477                                          QRegister(rd),
48478                                          imm);
48479                                     break;
48480                                   }
48481                                   case 0x00000020: {
48482                                     // 0xf2800970
48483                                     if (((instr & 0x100) == 0x0) ||
48484                                         ((instr & 0xc00) == 0xc00)) {
48485                                       UnallocatedA32(instr);
48486                                       return;
48487                                     }
48488                                     unsigned cmode = (instr >> 8) & 0xf;
48489                                     DataType dt =
48490                                         ImmediateVbic::DecodeDt(cmode);
48491                                     if (dt.Is(kDataTypeValueInvalid)) {
48492                                       UnallocatedA32(instr);
48493                                       return;
48494                                     }
48495                                     if (((instr >> 12) & 1) != 0) {
48496                                       UnallocatedA32(instr);
48497                                       return;
48498                                     }
48499                                     unsigned rd =
48500                                         ExtractQRegister(instr, 22, 12);
48501                                     QOperand imm =
48502                                         ImmediateVbic::DecodeImmediate(
48503                                             cmode,
48504                                             (instr & 0xf) |
48505                                                 ((instr >> 12) & 0x70) |
48506                                                 ((instr >> 17) & 0x80));
48507                                     // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48508                                     vbic(al,
48509                                          dt,
48510                                          QRegister(rd),
48511                                          QRegister(rd),
48512                                          imm);
48513                                     break;
48514                                   }
48515                                 }
48516                                 break;
48517                               }
48518                             }
48519                             break;
48520                           }
48521                           default: {
48522                             switch (instr & 0x00000300) {
48523                               case 0x00000000: {
48524                                 // 0xf2800850
48525                                 switch (instr & 0x01000000) {
48526                                   case 0x00000000: {
48527                                     // 0xf2800850
48528                                     if (((instr & 0x380000) == 0x0)) {
48529                                       UnallocatedA32(instr);
48530                                       return;
48531                                     }
48532                                     DataType dt =
48533                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
48534                                     if (dt.Is(kDataTypeValueInvalid)) {
48535                                       UnallocatedA32(instr);
48536                                       return;
48537                                     }
48538                                     unsigned rd =
48539                                         ExtractDRegister(instr, 22, 12);
48540                                     if ((instr & 1) != 0) {
48541                                       UnallocatedA32(instr);
48542                                       return;
48543                                     }
48544                                     unsigned rm = ExtractQRegister(instr, 5, 0);
48545                                     uint32_t imm6 = (instr >> 16) & 0x3f;
48546                                     uint32_t imm = dt.GetSize() - imm6;
48547                                     // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48548                                     vrshrn(al,
48549                                            dt,
48550                                            DRegister(rd),
48551                                            QRegister(rm),
48552                                            imm);
48553                                     break;
48554                                   }
48555                                   case 0x01000000: {
48556                                     // 0xf3800850
48557                                     if (((instr & 0x380000) == 0x0)) {
48558                                       UnallocatedA32(instr);
48559                                       return;
48560                                     }
48561                                     DataType dt =
48562                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
48563                                                          (instr >> 24) & 0x1);
48564                                     if (dt.Is(kDataTypeValueInvalid)) {
48565                                       UnallocatedA32(instr);
48566                                       return;
48567                                     }
48568                                     unsigned rd =
48569                                         ExtractDRegister(instr, 22, 12);
48570                                     if ((instr & 1) != 0) {
48571                                       UnallocatedA32(instr);
48572                                       return;
48573                                     }
48574                                     unsigned rm = ExtractQRegister(instr, 5, 0);
48575                                     uint32_t imm6 = (instr >> 16) & 0x3f;
48576                                     uint32_t imm = dt.GetSize() - imm6;
48577                                     // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48578                                     vqrshrun(al,
48579                                              dt,
48580                                              DRegister(rd),
48581                                              QRegister(rm),
48582                                              imm);
48583                                     break;
48584                                   }
48585                                 }
48586                                 break;
48587                               }
48588                               case 0x00000100: {
48589                                 // 0xf2800950
48590                                 if (((instr & 0x380000) == 0x0)) {
48591                                   UnallocatedA32(instr);
48592                                   return;
48593                                 }
48594                                 DataType dt =
48595                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
48596                                                      (instr >> 24) & 0x1);
48597                                 if (dt.Is(kDataTypeValueInvalid)) {
48598                                   UnallocatedA32(instr);
48599                                   return;
48600                                 }
48601                                 unsigned rd = ExtractDRegister(instr, 22, 12);
48602                                 if ((instr & 1) != 0) {
48603                                   UnallocatedA32(instr);
48604                                   return;
48605                                 }
48606                                 unsigned rm = ExtractQRegister(instr, 5, 0);
48607                                 uint32_t imm6 = (instr >> 16) & 0x3f;
48608                                 uint32_t imm = dt.GetSize() - imm6;
48609                                 // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48610                                 vqrshrn(al,
48611                                         dt,
48612                                         DRegister(rd),
48613                                         QRegister(rm),
48614                                         imm);
48615                                 break;
48616                               }
48617                               default:
48618                                 UnallocatedA32(instr);
48619                                 break;
48620                             }
48621                             break;
48622                           }
48623                         }
48624                         break;
48625                       }
48626                       default:
48627                         UnallocatedA32(instr);
48628                         break;
48629                     }
48630                     break;
48631                   }
48632                   case 0x00000c00: {
48633                     // 0xf2800c50
48634                     switch (instr & 0x00000080) {
48635                       case 0x00000000: {
48636                         // 0xf2800c50
48637                         switch (instr & 0x00200000) {
48638                           case 0x00000000: {
48639                             // 0xf2800c50
48640                             switch (instr & 0x00180000) {
48641                               case 0x00000000: {
48642                                 // 0xf2800c50
48643                                 switch (instr & 0x00000300) {
48644                                   case 0x00000200: {
48645                                     // 0xf2800e50
48646                                     if (((instr & 0x920) == 0x100) ||
48647                                         ((instr & 0x520) == 0x100) ||
48648                                         ((instr & 0x820) == 0x20) ||
48649                                         ((instr & 0x420) == 0x20) ||
48650                                         ((instr & 0x220) == 0x20) ||
48651                                         ((instr & 0x120) == 0x120)) {
48652                                       UnallocatedA32(instr);
48653                                       return;
48654                                     }
48655                                     unsigned cmode = ((instr >> 8) & 0xf) |
48656                                                      ((instr >> 1) & 0x10);
48657                                     DataType dt =
48658                                         ImmediateVmov::DecodeDt(cmode);
48659                                     if (dt.Is(kDataTypeValueInvalid)) {
48660                                       UnallocatedA32(instr);
48661                                       return;
48662                                     }
48663                                     if (((instr >> 12) & 1) != 0) {
48664                                       UnallocatedA32(instr);
48665                                       return;
48666                                     }
48667                                     unsigned rd =
48668                                         ExtractQRegister(instr, 22, 12);
48669                                     QOperand imm =
48670                                         ImmediateVmov::DecodeImmediate(
48671                                             cmode,
48672                                             (instr & 0xf) |
48673                                                 ((instr >> 12) & 0x70) |
48674                                                 ((instr >> 17) & 0x80));
48675                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48676                                     vmov(al, dt, QRegister(rd), imm);
48677                                     break;
48678                                   }
48679                                   case 0x00000300: {
48680                                     // 0xf2800f50
48681                                     if (((instr & 0x920) == 0x100) ||
48682                                         ((instr & 0x520) == 0x100) ||
48683                                         ((instr & 0x820) == 0x20) ||
48684                                         ((instr & 0x420) == 0x20) ||
48685                                         ((instr & 0x220) == 0x20) ||
48686                                         ((instr & 0x120) == 0x120)) {
48687                                       UnallocatedA32(instr);
48688                                       return;
48689                                     }
48690                                     unsigned cmode = ((instr >> 8) & 0xf) |
48691                                                      ((instr >> 1) & 0x10);
48692                                     DataType dt =
48693                                         ImmediateVmov::DecodeDt(cmode);
48694                                     if (dt.Is(kDataTypeValueInvalid)) {
48695                                       UnallocatedA32(instr);
48696                                       return;
48697                                     }
48698                                     if (((instr >> 12) & 1) != 0) {
48699                                       UnallocatedA32(instr);
48700                                       return;
48701                                     }
48702                                     unsigned rd =
48703                                         ExtractQRegister(instr, 22, 12);
48704                                     QOperand imm =
48705                                         ImmediateVmov::DecodeImmediate(
48706                                             cmode,
48707                                             (instr & 0xf) |
48708                                                 ((instr >> 12) & 0x70) |
48709                                                 ((instr >> 17) & 0x80));
48710                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48711                                     vmov(al, dt, QRegister(rd), imm);
48712                                     break;
48713                                   }
48714                                   default: {
48715                                     switch (instr & 0x00000020) {
48716                                       case 0x00000020: {
48717                                         // 0xf2800c70
48718                                         switch (instr & 0x00000f20) {
48719                                           case 0x00000000: {
48720                                             // 0xf2800c50
48721                                             if (((instr & 0x920) == 0x100) ||
48722                                                 ((instr & 0x520) == 0x100) ||
48723                                                 ((instr & 0x820) == 0x20) ||
48724                                                 ((instr & 0x420) == 0x20) ||
48725                                                 ((instr & 0x220) == 0x20) ||
48726                                                 ((instr & 0x120) == 0x120)) {
48727                                               UnallocatedA32(instr);
48728                                               return;
48729                                             }
48730                                             unsigned cmode =
48731                                                 ((instr >> 8) & 0xf) |
48732                                                 ((instr >> 1) & 0x10);
48733                                             DataType dt =
48734                                                 ImmediateVmov::DecodeDt(cmode);
48735                                             if (dt.Is(kDataTypeValueInvalid)) {
48736                                               UnallocatedA32(instr);
48737                                               return;
48738                                             }
48739                                             if (((instr >> 12) & 1) != 0) {
48740                                               UnallocatedA32(instr);
48741                                               return;
48742                                             }
48743                                             unsigned rd =
48744                                                 ExtractQRegister(instr, 22, 12);
48745                                             QOperand imm =
48746                                                 ImmediateVmov::DecodeImmediate(
48747                                                     cmode,
48748                                                     (instr & 0xf) |
48749                                                         ((instr >> 12) & 0x70) |
48750                                                         ((instr >> 17) & 0x80));
48751                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48752                                             vmov(al, dt, QRegister(rd), imm);
48753                                             break;
48754                                           }
48755                                           case 0x00000020: {
48756                                             // 0xf2800c70
48757                                             if (((instr & 0xd00) == 0x100) ||
48758                                                 ((instr & 0xd00) == 0x500) ||
48759                                                 ((instr & 0xd00) == 0x900) ||
48760                                                 ((instr & 0xe00) == 0xe00)) {
48761                                               UnallocatedA32(instr);
48762                                               return;
48763                                             }
48764                                             unsigned cmode = (instr >> 8) & 0xf;
48765                                             DataType dt =
48766                                                 ImmediateVmvn::DecodeDt(cmode);
48767                                             if (dt.Is(kDataTypeValueInvalid)) {
48768                                               UnallocatedA32(instr);
48769                                               return;
48770                                             }
48771                                             if (((instr >> 12) & 1) != 0) {
48772                                               UnallocatedA32(instr);
48773                                               return;
48774                                             }
48775                                             unsigned rd =
48776                                                 ExtractQRegister(instr, 22, 12);
48777                                             QOperand imm =
48778                                                 ImmediateVmvn::DecodeImmediate(
48779                                                     cmode,
48780                                                     (instr & 0xf) |
48781                                                         ((instr >> 12) & 0x70) |
48782                                                         ((instr >> 17) & 0x80));
48783                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48784                                             vmvn(al, dt, QRegister(rd), imm);
48785                                             break;
48786                                           }
48787                                           case 0x00000200: {
48788                                             // 0xf2800e50
48789                                             if (((instr & 0x920) == 0x100) ||
48790                                                 ((instr & 0x520) == 0x100) ||
48791                                                 ((instr & 0x820) == 0x20) ||
48792                                                 ((instr & 0x420) == 0x20) ||
48793                                                 ((instr & 0x220) == 0x20) ||
48794                                                 ((instr & 0x120) == 0x120)) {
48795                                               UnallocatedA32(instr);
48796                                               return;
48797                                             }
48798                                             unsigned cmode =
48799                                                 ((instr >> 8) & 0xf) |
48800                                                 ((instr >> 1) & 0x10);
48801                                             DataType dt =
48802                                                 ImmediateVmov::DecodeDt(cmode);
48803                                             if (dt.Is(kDataTypeValueInvalid)) {
48804                                               UnallocatedA32(instr);
48805                                               return;
48806                                             }
48807                                             if (((instr >> 12) & 1) != 0) {
48808                                               UnallocatedA32(instr);
48809                                               return;
48810                                             }
48811                                             unsigned rd =
48812                                                 ExtractQRegister(instr, 22, 12);
48813                                             QOperand imm =
48814                                                 ImmediateVmov::DecodeImmediate(
48815                                                     cmode,
48816                                                     (instr & 0xf) |
48817                                                         ((instr >> 12) & 0x70) |
48818                                                         ((instr >> 17) & 0x80));
48819                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48820                                             vmov(al, dt, QRegister(rd), imm);
48821                                             break;
48822                                           }
48823                                           case 0x00000220: {
48824                                             // 0xf2800e70
48825                                             if (((instr & 0xd00) == 0x100) ||
48826                                                 ((instr & 0xd00) == 0x500) ||
48827                                                 ((instr & 0xd00) == 0x900) ||
48828                                                 ((instr & 0xe00) == 0xe00)) {
48829                                               UnallocatedA32(instr);
48830                                               return;
48831                                             }
48832                                             unsigned cmode = (instr >> 8) & 0xf;
48833                                             DataType dt =
48834                                                 ImmediateVmvn::DecodeDt(cmode);
48835                                             if (dt.Is(kDataTypeValueInvalid)) {
48836                                               UnallocatedA32(instr);
48837                                               return;
48838                                             }
48839                                             if (((instr >> 12) & 1) != 0) {
48840                                               UnallocatedA32(instr);
48841                                               return;
48842                                             }
48843                                             unsigned rd =
48844                                                 ExtractQRegister(instr, 22, 12);
48845                                             QOperand imm =
48846                                                 ImmediateVmvn::DecodeImmediate(
48847                                                     cmode,
48848                                                     (instr & 0xf) |
48849                                                         ((instr >> 12) & 0x70) |
48850                                                         ((instr >> 17) & 0x80));
48851                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48852                                             vmvn(al, dt, QRegister(rd), imm);
48853                                             break;
48854                                           }
48855                                           case 0x00000400: {
48856                                             // 0xf2800c50
48857                                             if (((instr & 0x920) == 0x100) ||
48858                                                 ((instr & 0x520) == 0x100) ||
48859                                                 ((instr & 0x820) == 0x20) ||
48860                                                 ((instr & 0x420) == 0x20) ||
48861                                                 ((instr & 0x220) == 0x20) ||
48862                                                 ((instr & 0x120) == 0x120)) {
48863                                               UnallocatedA32(instr);
48864                                               return;
48865                                             }
48866                                             unsigned cmode =
48867                                                 ((instr >> 8) & 0xf) |
48868                                                 ((instr >> 1) & 0x10);
48869                                             DataType dt =
48870                                                 ImmediateVmov::DecodeDt(cmode);
48871                                             if (dt.Is(kDataTypeValueInvalid)) {
48872                                               UnallocatedA32(instr);
48873                                               return;
48874                                             }
48875                                             if (((instr >> 12) & 1) != 0) {
48876                                               UnallocatedA32(instr);
48877                                               return;
48878                                             }
48879                                             unsigned rd =
48880                                                 ExtractQRegister(instr, 22, 12);
48881                                             QOperand imm =
48882                                                 ImmediateVmov::DecodeImmediate(
48883                                                     cmode,
48884                                                     (instr & 0xf) |
48885                                                         ((instr >> 12) & 0x70) |
48886                                                         ((instr >> 17) & 0x80));
48887                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48888                                             vmov(al, dt, QRegister(rd), imm);
48889                                             break;
48890                                           }
48891                                           case 0x00000420: {
48892                                             // 0xf2800c70
48893                                             if (((instr & 0xd00) == 0x100) ||
48894                                                 ((instr & 0xd00) == 0x500) ||
48895                                                 ((instr & 0xd00) == 0x900) ||
48896                                                 ((instr & 0xe00) == 0xe00)) {
48897                                               UnallocatedA32(instr);
48898                                               return;
48899                                             }
48900                                             unsigned cmode = (instr >> 8) & 0xf;
48901                                             DataType dt =
48902                                                 ImmediateVmvn::DecodeDt(cmode);
48903                                             if (dt.Is(kDataTypeValueInvalid)) {
48904                                               UnallocatedA32(instr);
48905                                               return;
48906                                             }
48907                                             if (((instr >> 12) & 1) != 0) {
48908                                               UnallocatedA32(instr);
48909                                               return;
48910                                             }
48911                                             unsigned rd =
48912                                                 ExtractQRegister(instr, 22, 12);
48913                                             QOperand imm =
48914                                                 ImmediateVmvn::DecodeImmediate(
48915                                                     cmode,
48916                                                     (instr & 0xf) |
48917                                                         ((instr >> 12) & 0x70) |
48918                                                         ((instr >> 17) & 0x80));
48919                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48920                                             vmvn(al, dt, QRegister(rd), imm);
48921                                             break;
48922                                           }
48923                                           case 0x00000600: {
48924                                             // 0xf2800e50
48925                                             if (((instr & 0x920) == 0x100) ||
48926                                                 ((instr & 0x520) == 0x100) ||
48927                                                 ((instr & 0x820) == 0x20) ||
48928                                                 ((instr & 0x420) == 0x20) ||
48929                                                 ((instr & 0x220) == 0x20) ||
48930                                                 ((instr & 0x120) == 0x120)) {
48931                                               UnallocatedA32(instr);
48932                                               return;
48933                                             }
48934                                             unsigned cmode =
48935                                                 ((instr >> 8) & 0xf) |
48936                                                 ((instr >> 1) & 0x10);
48937                                             DataType dt =
48938                                                 ImmediateVmov::DecodeDt(cmode);
48939                                             if (dt.Is(kDataTypeValueInvalid)) {
48940                                               UnallocatedA32(instr);
48941                                               return;
48942                                             }
48943                                             if (((instr >> 12) & 1) != 0) {
48944                                               UnallocatedA32(instr);
48945                                               return;
48946                                             }
48947                                             unsigned rd =
48948                                                 ExtractQRegister(instr, 22, 12);
48949                                             QOperand imm =
48950                                                 ImmediateVmov::DecodeImmediate(
48951                                                     cmode,
48952                                                     (instr & 0xf) |
48953                                                         ((instr >> 12) & 0x70) |
48954                                                         ((instr >> 17) & 0x80));
48955                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48956                                             vmov(al, dt, QRegister(rd), imm);
48957                                             break;
48958                                           }
48959                                           case 0x00000620: {
48960                                             // 0xf2800e70
48961                                             if (((instr & 0xd00) == 0x100) ||
48962                                                 ((instr & 0xd00) == 0x500) ||
48963                                                 ((instr & 0xd00) == 0x900) ||
48964                                                 ((instr & 0xe00) == 0xe00)) {
48965                                               UnallocatedA32(instr);
48966                                               return;
48967                                             }
48968                                             unsigned cmode = (instr >> 8) & 0xf;
48969                                             DataType dt =
48970                                                 ImmediateVmvn::DecodeDt(cmode);
48971                                             if (dt.Is(kDataTypeValueInvalid)) {
48972                                               UnallocatedA32(instr);
48973                                               return;
48974                                             }
48975                                             if (((instr >> 12) & 1) != 0) {
48976                                               UnallocatedA32(instr);
48977                                               return;
48978                                             }
48979                                             unsigned rd =
48980                                                 ExtractQRegister(instr, 22, 12);
48981                                             QOperand imm =
48982                                                 ImmediateVmvn::DecodeImmediate(
48983                                                     cmode,
48984                                                     (instr & 0xf) |
48985                                                         ((instr >> 12) & 0x70) |
48986                                                         ((instr >> 17) & 0x80));
48987                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48988                                             vmvn(al, dt, QRegister(rd), imm);
48989                                             break;
48990                                           }
48991                                           case 0x00000800: {
48992                                             // 0xf2800c50
48993                                             if (((instr & 0x920) == 0x100) ||
48994                                                 ((instr & 0x520) == 0x100) ||
48995                                                 ((instr & 0x820) == 0x20) ||
48996                                                 ((instr & 0x420) == 0x20) ||
48997                                                 ((instr & 0x220) == 0x20) ||
48998                                                 ((instr & 0x120) == 0x120)) {
48999                                               UnallocatedA32(instr);
49000                                               return;
49001                                             }
49002                                             unsigned cmode =
49003                                                 ((instr >> 8) & 0xf) |
49004                                                 ((instr >> 1) & 0x10);
49005                                             DataType dt =
49006                                                 ImmediateVmov::DecodeDt(cmode);
49007                                             if (dt.Is(kDataTypeValueInvalid)) {
49008                                               UnallocatedA32(instr);
49009                                               return;
49010                                             }
49011                                             if (((instr >> 12) & 1) != 0) {
49012                                               UnallocatedA32(instr);
49013                                               return;
49014                                             }
49015                                             unsigned rd =
49016                                                 ExtractQRegister(instr, 22, 12);
49017                                             QOperand imm =
49018                                                 ImmediateVmov::DecodeImmediate(
49019                                                     cmode,
49020                                                     (instr & 0xf) |
49021                                                         ((instr >> 12) & 0x70) |
49022                                                         ((instr >> 17) & 0x80));
49023                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49024                                             vmov(al, dt, QRegister(rd), imm);
49025                                             break;
49026                                           }
49027                                           case 0x00000820: {
49028                                             // 0xf2800c70
49029                                             if (((instr & 0xd00) == 0x100) ||
49030                                                 ((instr & 0xd00) == 0x500) ||
49031                                                 ((instr & 0xd00) == 0x900) ||
49032                                                 ((instr & 0xe00) == 0xe00)) {
49033                                               UnallocatedA32(instr);
49034                                               return;
49035                                             }
49036                                             unsigned cmode = (instr >> 8) & 0xf;
49037                                             DataType dt =
49038                                                 ImmediateVmvn::DecodeDt(cmode);
49039                                             if (dt.Is(kDataTypeValueInvalid)) {
49040                                               UnallocatedA32(instr);
49041                                               return;
49042                                             }
49043                                             if (((instr >> 12) & 1) != 0) {
49044                                               UnallocatedA32(instr);
49045                                               return;
49046                                             }
49047                                             unsigned rd =
49048                                                 ExtractQRegister(instr, 22, 12);
49049                                             QOperand imm =
49050                                                 ImmediateVmvn::DecodeImmediate(
49051                                                     cmode,
49052                                                     (instr & 0xf) |
49053                                                         ((instr >> 12) & 0x70) |
49054                                                         ((instr >> 17) & 0x80));
49055                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49056                                             vmvn(al, dt, QRegister(rd), imm);
49057                                             break;
49058                                           }
49059                                           case 0x00000a00: {
49060                                             // 0xf2800e50
49061                                             if (((instr & 0x920) == 0x100) ||
49062                                                 ((instr & 0x520) == 0x100) ||
49063                                                 ((instr & 0x820) == 0x20) ||
49064                                                 ((instr & 0x420) == 0x20) ||
49065                                                 ((instr & 0x220) == 0x20) ||
49066                                                 ((instr & 0x120) == 0x120)) {
49067                                               UnallocatedA32(instr);
49068                                               return;
49069                                             }
49070                                             unsigned cmode =
49071                                                 ((instr >> 8) & 0xf) |
49072                                                 ((instr >> 1) & 0x10);
49073                                             DataType dt =
49074                                                 ImmediateVmov::DecodeDt(cmode);
49075                                             if (dt.Is(kDataTypeValueInvalid)) {
49076                                               UnallocatedA32(instr);
49077                                               return;
49078                                             }
49079                                             if (((instr >> 12) & 1) != 0) {
49080                                               UnallocatedA32(instr);
49081                                               return;
49082                                             }
49083                                             unsigned rd =
49084                                                 ExtractQRegister(instr, 22, 12);
49085                                             QOperand imm =
49086                                                 ImmediateVmov::DecodeImmediate(
49087                                                     cmode,
49088                                                     (instr & 0xf) |
49089                                                         ((instr >> 12) & 0x70) |
49090                                                         ((instr >> 17) & 0x80));
49091                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49092                                             vmov(al, dt, QRegister(rd), imm);
49093                                             break;
49094                                           }
49095                                           case 0x00000a20: {
49096                                             // 0xf2800e70
49097                                             if (((instr & 0xd00) == 0x100) ||
49098                                                 ((instr & 0xd00) == 0x500) ||
49099                                                 ((instr & 0xd00) == 0x900) ||
49100                                                 ((instr & 0xe00) == 0xe00)) {
49101                                               UnallocatedA32(instr);
49102                                               return;
49103                                             }
49104                                             unsigned cmode = (instr >> 8) & 0xf;
49105                                             DataType dt =
49106                                                 ImmediateVmvn::DecodeDt(cmode);
49107                                             if (dt.Is(kDataTypeValueInvalid)) {
49108                                               UnallocatedA32(instr);
49109                                               return;
49110                                             }
49111                                             if (((instr >> 12) & 1) != 0) {
49112                                               UnallocatedA32(instr);
49113                                               return;
49114                                             }
49115                                             unsigned rd =
49116                                                 ExtractQRegister(instr, 22, 12);
49117                                             QOperand imm =
49118                                                 ImmediateVmvn::DecodeImmediate(
49119                                                     cmode,
49120                                                     (instr & 0xf) |
49121                                                         ((instr >> 12) & 0x70) |
49122                                                         ((instr >> 17) & 0x80));
49123                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49124                                             vmvn(al, dt, QRegister(rd), imm);
49125                                             break;
49126                                           }
49127                                           case 0x00000c00: {
49128                                             // 0xf2800c50
49129                                             if (((instr & 0x920) == 0x100) ||
49130                                                 ((instr & 0x520) == 0x100) ||
49131                                                 ((instr & 0x820) == 0x20) ||
49132                                                 ((instr & 0x420) == 0x20) ||
49133                                                 ((instr & 0x220) == 0x20) ||
49134                                                 ((instr & 0x120) == 0x120)) {
49135                                               UnallocatedA32(instr);
49136                                               return;
49137                                             }
49138                                             unsigned cmode =
49139                                                 ((instr >> 8) & 0xf) |
49140                                                 ((instr >> 1) & 0x10);
49141                                             DataType dt =
49142                                                 ImmediateVmov::DecodeDt(cmode);
49143                                             if (dt.Is(kDataTypeValueInvalid)) {
49144                                               UnallocatedA32(instr);
49145                                               return;
49146                                             }
49147                                             if (((instr >> 12) & 1) != 0) {
49148                                               UnallocatedA32(instr);
49149                                               return;
49150                                             }
49151                                             unsigned rd =
49152                                                 ExtractQRegister(instr, 22, 12);
49153                                             QOperand imm =
49154                                                 ImmediateVmov::DecodeImmediate(
49155                                                     cmode,
49156                                                     (instr & 0xf) |
49157                                                         ((instr >> 12) & 0x70) |
49158                                                         ((instr >> 17) & 0x80));
49159                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49160                                             vmov(al, dt, QRegister(rd), imm);
49161                                             break;
49162                                           }
49163                                           case 0x00000c20: {
49164                                             // 0xf2800c70
49165                                             if (((instr & 0xd00) == 0x100) ||
49166                                                 ((instr & 0xd00) == 0x500) ||
49167                                                 ((instr & 0xd00) == 0x900) ||
49168                                                 ((instr & 0xe00) == 0xe00)) {
49169                                               UnallocatedA32(instr);
49170                                               return;
49171                                             }
49172                                             unsigned cmode = (instr >> 8) & 0xf;
49173                                             DataType dt =
49174                                                 ImmediateVmvn::DecodeDt(cmode);
49175                                             if (dt.Is(kDataTypeValueInvalid)) {
49176                                               UnallocatedA32(instr);
49177                                               return;
49178                                             }
49179                                             if (((instr >> 12) & 1) != 0) {
49180                                               UnallocatedA32(instr);
49181                                               return;
49182                                             }
49183                                             unsigned rd =
49184                                                 ExtractQRegister(instr, 22, 12);
49185                                             QOperand imm =
49186                                                 ImmediateVmvn::DecodeImmediate(
49187                                                     cmode,
49188                                                     (instr & 0xf) |
49189                                                         ((instr >> 12) & 0x70) |
49190                                                         ((instr >> 17) & 0x80));
49191                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49192                                             vmvn(al, dt, QRegister(rd), imm);
49193                                             break;
49194                                           }
49195                                           case 0x00000d00: {
49196                                             // 0xf2800d50
49197                                             if (((instr & 0x920) == 0x100) ||
49198                                                 ((instr & 0x520) == 0x100) ||
49199                                                 ((instr & 0x820) == 0x20) ||
49200                                                 ((instr & 0x420) == 0x20) ||
49201                                                 ((instr & 0x220) == 0x20) ||
49202                                                 ((instr & 0x120) == 0x120)) {
49203                                               UnallocatedA32(instr);
49204                                               return;
49205                                             }
49206                                             unsigned cmode =
49207                                                 ((instr >> 8) & 0xf) |
49208                                                 ((instr >> 1) & 0x10);
49209                                             DataType dt =
49210                                                 ImmediateVmov::DecodeDt(cmode);
49211                                             if (dt.Is(kDataTypeValueInvalid)) {
49212                                               UnallocatedA32(instr);
49213                                               return;
49214                                             }
49215                                             if (((instr >> 12) & 1) != 0) {
49216                                               UnallocatedA32(instr);
49217                                               return;
49218                                             }
49219                                             unsigned rd =
49220                                                 ExtractQRegister(instr, 22, 12);
49221                                             QOperand imm =
49222                                                 ImmediateVmov::DecodeImmediate(
49223                                                     cmode,
49224                                                     (instr & 0xf) |
49225                                                         ((instr >> 12) & 0x70) |
49226                                                         ((instr >> 17) & 0x80));
49227                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49228                                             vmov(al, dt, QRegister(rd), imm);
49229                                             break;
49230                                           }
49231                                           case 0x00000d20: {
49232                                             // 0xf2800d70
49233                                             if (((instr & 0xd00) == 0x100) ||
49234                                                 ((instr & 0xd00) == 0x500) ||
49235                                                 ((instr & 0xd00) == 0x900) ||
49236                                                 ((instr & 0xe00) == 0xe00)) {
49237                                               UnallocatedA32(instr);
49238                                               return;
49239                                             }
49240                                             unsigned cmode = (instr >> 8) & 0xf;
49241                                             DataType dt =
49242                                                 ImmediateVmvn::DecodeDt(cmode);
49243                                             if (dt.Is(kDataTypeValueInvalid)) {
49244                                               UnallocatedA32(instr);
49245                                               return;
49246                                             }
49247                                             if (((instr >> 12) & 1) != 0) {
49248                                               UnallocatedA32(instr);
49249                                               return;
49250                                             }
49251                                             unsigned rd =
49252                                                 ExtractQRegister(instr, 22, 12);
49253                                             QOperand imm =
49254                                                 ImmediateVmvn::DecodeImmediate(
49255                                                     cmode,
49256                                                     (instr & 0xf) |
49257                                                         ((instr >> 12) & 0x70) |
49258                                                         ((instr >> 17) & 0x80));
49259                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49260                                             vmvn(al, dt, QRegister(rd), imm);
49261                                             break;
49262                                           }
49263                                           case 0x00000e00: {
49264                                             // 0xf2800e50
49265                                             if (((instr & 0x920) == 0x100) ||
49266                                                 ((instr & 0x520) == 0x100) ||
49267                                                 ((instr & 0x820) == 0x20) ||
49268                                                 ((instr & 0x420) == 0x20) ||
49269                                                 ((instr & 0x220) == 0x20) ||
49270                                                 ((instr & 0x120) == 0x120)) {
49271                                               UnallocatedA32(instr);
49272                                               return;
49273                                             }
49274                                             unsigned cmode =
49275                                                 ((instr >> 8) & 0xf) |
49276                                                 ((instr >> 1) & 0x10);
49277                                             DataType dt =
49278                                                 ImmediateVmov::DecodeDt(cmode);
49279                                             if (dt.Is(kDataTypeValueInvalid)) {
49280                                               UnallocatedA32(instr);
49281                                               return;
49282                                             }
49283                                             if (((instr >> 12) & 1) != 0) {
49284                                               UnallocatedA32(instr);
49285                                               return;
49286                                             }
49287                                             unsigned rd =
49288                                                 ExtractQRegister(instr, 22, 12);
49289                                             QOperand imm =
49290                                                 ImmediateVmov::DecodeImmediate(
49291                                                     cmode,
49292                                                     (instr & 0xf) |
49293                                                         ((instr >> 12) & 0x70) |
49294                                                         ((instr >> 17) & 0x80));
49295                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49296                                             vmov(al, dt, QRegister(rd), imm);
49297                                             break;
49298                                           }
49299                                           case 0x00000e20: {
49300                                             // 0xf2800e70
49301                                             if (((instr & 0x920) == 0x100) ||
49302                                                 ((instr & 0x520) == 0x100) ||
49303                                                 ((instr & 0x820) == 0x20) ||
49304                                                 ((instr & 0x420) == 0x20) ||
49305                                                 ((instr & 0x220) == 0x20) ||
49306                                                 ((instr & 0x120) == 0x120)) {
49307                                               UnallocatedA32(instr);
49308                                               return;
49309                                             }
49310                                             unsigned cmode =
49311                                                 ((instr >> 8) & 0xf) |
49312                                                 ((instr >> 1) & 0x10);
49313                                             DataType dt =
49314                                                 ImmediateVmov::DecodeDt(cmode);
49315                                             if (dt.Is(kDataTypeValueInvalid)) {
49316                                               UnallocatedA32(instr);
49317                                               return;
49318                                             }
49319                                             if (((instr >> 12) & 1) != 0) {
49320                                               UnallocatedA32(instr);
49321                                               return;
49322                                             }
49323                                             unsigned rd =
49324                                                 ExtractQRegister(instr, 22, 12);
49325                                             QOperand imm =
49326                                                 ImmediateVmov::DecodeImmediate(
49327                                                     cmode,
49328                                                     (instr & 0xf) |
49329                                                         ((instr >> 12) & 0x70) |
49330                                                         ((instr >> 17) & 0x80));
49331                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49332                                             vmov(al, dt, QRegister(rd), imm);
49333                                             break;
49334                                           }
49335                                           case 0x00000f00: {
49336                                             // 0xf2800f50
49337                                             if (((instr & 0x920) == 0x100) ||
49338                                                 ((instr & 0x520) == 0x100) ||
49339                                                 ((instr & 0x820) == 0x20) ||
49340                                                 ((instr & 0x420) == 0x20) ||
49341                                                 ((instr & 0x220) == 0x20) ||
49342                                                 ((instr & 0x120) == 0x120)) {
49343                                               UnallocatedA32(instr);
49344                                               return;
49345                                             }
49346                                             unsigned cmode =
49347                                                 ((instr >> 8) & 0xf) |
49348                                                 ((instr >> 1) & 0x10);
49349                                             DataType dt =
49350                                                 ImmediateVmov::DecodeDt(cmode);
49351                                             if (dt.Is(kDataTypeValueInvalid)) {
49352                                               UnallocatedA32(instr);
49353                                               return;
49354                                             }
49355                                             if (((instr >> 12) & 1) != 0) {
49356                                               UnallocatedA32(instr);
49357                                               return;
49358                                             }
49359                                             unsigned rd =
49360                                                 ExtractQRegister(instr, 22, 12);
49361                                             QOperand imm =
49362                                                 ImmediateVmov::DecodeImmediate(
49363                                                     cmode,
49364                                                     (instr & 0xf) |
49365                                                         ((instr >> 12) & 0x70) |
49366                                                         ((instr >> 17) & 0x80));
49367                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49368                                             vmov(al, dt, QRegister(rd), imm);
49369                                             break;
49370                                           }
49371                                           default:
49372                                             UnallocatedA32(instr);
49373                                             break;
49374                                         }
49375                                         break;
49376                                       }
49377                                       default: {
49378                                         if (((instr & 0x920) == 0x100) ||
49379                                             ((instr & 0x520) == 0x100) ||
49380                                             ((instr & 0x820) == 0x20) ||
49381                                             ((instr & 0x420) == 0x20) ||
49382                                             ((instr & 0x220) == 0x20) ||
49383                                             ((instr & 0x120) == 0x120)) {
49384                                           UnallocatedA32(instr);
49385                                           return;
49386                                         }
49387                                         unsigned cmode = ((instr >> 8) & 0xf) |
49388                                                          ((instr >> 1) & 0x10);
49389                                         DataType dt =
49390                                             ImmediateVmov::DecodeDt(cmode);
49391                                         if (dt.Is(kDataTypeValueInvalid)) {
49392                                           UnallocatedA32(instr);
49393                                           return;
49394                                         }
49395                                         if (((instr >> 12) & 1) != 0) {
49396                                           UnallocatedA32(instr);
49397                                           return;
49398                                         }
49399                                         unsigned rd =
49400                                             ExtractQRegister(instr, 22, 12);
49401                                         QOperand imm =
49402                                             ImmediateVmov::DecodeImmediate(
49403                                                 cmode,
49404                                                 (instr & 0xf) |
49405                                                     ((instr >> 12) & 0x70) |
49406                                                     ((instr >> 17) & 0x80));
49407                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
49408                                         vmov(al, dt, QRegister(rd), imm);
49409                                         break;
49410                                       }
49411                                     }
49412                                     break;
49413                                   }
49414                                 }
49415                                 break;
49416                               }
49417                               default:
49418                                 UnallocatedA32(instr);
49419                                 break;
49420                             }
49421                             break;
49422                           }
49423                           default: {
49424                             if ((instr & 0x00000200) == 0x00000200) {
49425                               if (((instr & 0x200000) == 0x0)) {
49426                                 UnallocatedA32(instr);
49427                                 return;
49428                               }
49429                               DataType dt1 = Dt_op_U_1_Decode1(
49430                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
49431                               if (dt1.Is(kDataTypeValueInvalid)) {
49432                                 UnallocatedA32(instr);
49433                                 return;
49434                               }
49435                               DataType dt2 = Dt_op_U_1_Decode2(
49436                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
49437                               if (dt2.Is(kDataTypeValueInvalid)) {
49438                                 UnallocatedA32(instr);
49439                                 return;
49440                               }
49441                               if (((instr >> 12) & 1) != 0) {
49442                                 UnallocatedA32(instr);
49443                                 return;
49444                               }
49445                               unsigned rd = ExtractQRegister(instr, 22, 12);
49446                               if ((instr & 1) != 0) {
49447                                 UnallocatedA32(instr);
49448                                 return;
49449                               }
49450                               unsigned rm = ExtractQRegister(instr, 5, 0);
49451                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
49452                               // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
49453                               vcvt(al,
49454                                    dt1,
49455                                    dt2,
49456                                    QRegister(rd),
49457                                    QRegister(rm),
49458                                    fbits);
49459                             } else {
49460                               UnallocatedA32(instr);
49461                             }
49462                             break;
49463                           }
49464                         }
49465                         break;
49466                       }
49467                       default:
49468                         UnallocatedA32(instr);
49469                         break;
49470                     }
49471                     break;
49472                   }
49473                 }
49474                 break;
49475               }
49476             }
49477             break;
49478           }
49479         }
49480         break;
49481       }
49482       case 0x04000000: {
49483         // 0xf4000000
49484         switch (instr & 0x01300000) {
49485           case 0x00000000: {
49486             // 0xf4000000
49487             switch (instr & 0x00800000) {
49488               case 0x00000000: {
49489                 // 0xf4000000
49490                 switch (instr & 0x0000000d) {
49491                   case 0x0000000d: {
49492                     // 0xf400000d
49493                     switch (instr & 0x00000002) {
49494                       case 0x00000000: {
49495                         // 0xf400000d
49496                         switch (instr & 0x00000f00) {
49497                           case 0x00000000: {
49498                             // 0xf400000d
49499                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49500                             if (dt.Is(kDataTypeValueInvalid)) {
49501                               UnallocatedA32(instr);
49502                               return;
49503                             }
49504                             Alignment align =
49505                                 Align_align_4_Decode((instr >> 4) & 0x3);
49506                             if (dt.Is(kDataTypeValueInvalid) ||
49507                                 align.Is(kBadAlignment)) {
49508                               UnallocatedA32(instr);
49509                               return;
49510                             }
49511                             unsigned first = ExtractDRegister(instr, 22, 12);
49512                             unsigned length;
49513                             SpacingType spacing;
49514                             switch ((instr >> 8) & 0xf) {
49515                               default:
49516                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49517                               case 0x0:
49518                                 length = 4;
49519                                 spacing = kSingle;
49520                                 break;
49521                               case 0x1:
49522                                 length = 4;
49523                                 spacing = kDouble;
49524                                 break;
49525                             }
49526                             unsigned last =
49527                                 first +
49528                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49529                             TransferType transfer = kMultipleLanes;
49530                             unsigned rn = (instr >> 16) & 0xf;
49531                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49532                             vst4(al,
49533                                  dt,
49534                                  NeonRegisterList(DRegister(first),
49535                                                   DRegister(last),
49536                                                   spacing,
49537                                                   transfer),
49538                                  AlignedMemOperand(Register(rn),
49539                                                    align,
49540                                                    PostIndex));
49541                             break;
49542                           }
49543                           case 0x00000100: {
49544                             // 0xf400010d
49545                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49546                             if (dt.Is(kDataTypeValueInvalid)) {
49547                               UnallocatedA32(instr);
49548                               return;
49549                             }
49550                             Alignment align =
49551                                 Align_align_4_Decode((instr >> 4) & 0x3);
49552                             if (dt.Is(kDataTypeValueInvalid) ||
49553                                 align.Is(kBadAlignment)) {
49554                               UnallocatedA32(instr);
49555                               return;
49556                             }
49557                             unsigned first = ExtractDRegister(instr, 22, 12);
49558                             unsigned length;
49559                             SpacingType spacing;
49560                             switch ((instr >> 8) & 0xf) {
49561                               default:
49562                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49563                               case 0x0:
49564                                 length = 4;
49565                                 spacing = kSingle;
49566                                 break;
49567                               case 0x1:
49568                                 length = 4;
49569                                 spacing = kDouble;
49570                                 break;
49571                             }
49572                             unsigned last =
49573                                 first +
49574                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49575                             TransferType transfer = kMultipleLanes;
49576                             unsigned rn = (instr >> 16) & 0xf;
49577                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49578                             vst4(al,
49579                                  dt,
49580                                  NeonRegisterList(DRegister(first),
49581                                                   DRegister(last),
49582                                                   spacing,
49583                                                   transfer),
49584                                  AlignedMemOperand(Register(rn),
49585                                                    align,
49586                                                    PostIndex));
49587                             break;
49588                           }
49589                           case 0x00000200: {
49590                             // 0xf400020d
49591                             if (((instr & 0xe20) == 0x620) ||
49592                                 ((instr & 0xf30) == 0xa30)) {
49593                               UnallocatedA32(instr);
49594                               return;
49595                             }
49596                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
49597                             if (dt.Is(kDataTypeValueInvalid)) {
49598                               UnallocatedA32(instr);
49599                               return;
49600                             }
49601                             Alignment align =
49602                                 Align_align_5_Decode((instr >> 4) & 0x3);
49603                             if (dt.Is(kDataTypeValueInvalid) ||
49604                                 align.Is(kBadAlignment)) {
49605                               UnallocatedA32(instr);
49606                               return;
49607                             }
49608                             unsigned first = ExtractDRegister(instr, 22, 12);
49609                             unsigned length;
49610                             SpacingType spacing = kSingle;
49611                             switch ((instr >> 8) & 0xf) {
49612                               default:
49613                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49614                               case 0x7:
49615                                 length = 1;
49616                                 break;
49617                               case 0xa:
49618                                 length = 2;
49619                                 break;
49620                               case 0x6:
49621                                 length = 3;
49622                                 break;
49623                               case 0x2:
49624                                 length = 4;
49625                                 break;
49626                             }
49627                             unsigned last = first + length - 1;
49628                             TransferType transfer = kMultipleLanes;
49629                             unsigned rn = (instr >> 16) & 0xf;
49630                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49631                             vst1(al,
49632                                  dt,
49633                                  NeonRegisterList(DRegister(first),
49634                                                   DRegister(last),
49635                                                   spacing,
49636                                                   transfer),
49637                                  AlignedMemOperand(Register(rn),
49638                                                    align,
49639                                                    PostIndex));
49640                             break;
49641                           }
49642                           case 0x00000300: {
49643                             // 0xf400030d
49644                             if (((instr & 0xe30) == 0x830)) {
49645                               UnallocatedA32(instr);
49646                               return;
49647                             }
49648                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49649                             if (dt.Is(kDataTypeValueInvalid)) {
49650                               UnallocatedA32(instr);
49651                               return;
49652                             }
49653                             Alignment align =
49654                                 Align_align_2_Decode((instr >> 4) & 0x3);
49655                             if (dt.Is(kDataTypeValueInvalid) ||
49656                                 align.Is(kBadAlignment)) {
49657                               UnallocatedA32(instr);
49658                               return;
49659                             }
49660                             unsigned first = ExtractDRegister(instr, 22, 12);
49661                             unsigned length;
49662                             SpacingType spacing;
49663                             switch ((instr >> 8) & 0xf) {
49664                               default:
49665                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49666                               case 0x8:
49667                                 length = 2;
49668                                 spacing = kSingle;
49669                                 break;
49670                               case 0x9:
49671                                 length = 2;
49672                                 spacing = kDouble;
49673                                 break;
49674                               case 0x3:
49675                                 length = 4;
49676                                 spacing = kSingle;
49677                                 break;
49678                             }
49679                             unsigned last =
49680                                 first +
49681                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49682                             TransferType transfer = kMultipleLanes;
49683                             unsigned rn = (instr >> 16) & 0xf;
49684                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49685                             vst2(al,
49686                                  dt,
49687                                  NeonRegisterList(DRegister(first),
49688                                                   DRegister(last),
49689                                                   spacing,
49690                                                   transfer),
49691                                  AlignedMemOperand(Register(rn),
49692                                                    align,
49693                                                    PostIndex));
49694                             break;
49695                           }
49696                           case 0x00000400: {
49697                             // 0xf400040d
49698                             if (((instr & 0x20) == 0x20)) {
49699                               UnallocatedA32(instr);
49700                               return;
49701                             }
49702                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49703                             if (dt.Is(kDataTypeValueInvalid)) {
49704                               UnallocatedA32(instr);
49705                               return;
49706                             }
49707                             Alignment align =
49708                                 Align_align_3_Decode((instr >> 4) & 0x3);
49709                             if (dt.Is(kDataTypeValueInvalid) ||
49710                                 align.Is(kBadAlignment)) {
49711                               UnallocatedA32(instr);
49712                               return;
49713                             }
49714                             unsigned first = ExtractDRegister(instr, 22, 12);
49715                             unsigned length;
49716                             SpacingType spacing;
49717                             switch ((instr >> 8) & 0xf) {
49718                               default:
49719                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49720                               case 0x4:
49721                                 length = 3;
49722                                 spacing = kSingle;
49723                                 break;
49724                               case 0x5:
49725                                 length = 3;
49726                                 spacing = kDouble;
49727                                 break;
49728                             }
49729                             unsigned last =
49730                                 first +
49731                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49732                             TransferType transfer = kMultipleLanes;
49733                             unsigned rn = (instr >> 16) & 0xf;
49734                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49735                             vst3(al,
49736                                  dt,
49737                                  NeonRegisterList(DRegister(first),
49738                                                   DRegister(last),
49739                                                   spacing,
49740                                                   transfer),
49741                                  AlignedMemOperand(Register(rn),
49742                                                    align,
49743                                                    PostIndex));
49744                             break;
49745                           }
49746                           case 0x00000500: {
49747                             // 0xf400050d
49748                             if (((instr & 0x20) == 0x20)) {
49749                               UnallocatedA32(instr);
49750                               return;
49751                             }
49752                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49753                             if (dt.Is(kDataTypeValueInvalid)) {
49754                               UnallocatedA32(instr);
49755                               return;
49756                             }
49757                             Alignment align =
49758                                 Align_align_3_Decode((instr >> 4) & 0x3);
49759                             if (dt.Is(kDataTypeValueInvalid) ||
49760                                 align.Is(kBadAlignment)) {
49761                               UnallocatedA32(instr);
49762                               return;
49763                             }
49764                             unsigned first = ExtractDRegister(instr, 22, 12);
49765                             unsigned length;
49766                             SpacingType spacing;
49767                             switch ((instr >> 8) & 0xf) {
49768                               default:
49769                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49770                               case 0x4:
49771                                 length = 3;
49772                                 spacing = kSingle;
49773                                 break;
49774                               case 0x5:
49775                                 length = 3;
49776                                 spacing = kDouble;
49777                                 break;
49778                             }
49779                             unsigned last =
49780                                 first +
49781                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49782                             TransferType transfer = kMultipleLanes;
49783                             unsigned rn = (instr >> 16) & 0xf;
49784                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49785                             vst3(al,
49786                                  dt,
49787                                  NeonRegisterList(DRegister(first),
49788                                                   DRegister(last),
49789                                                   spacing,
49790                                                   transfer),
49791                                  AlignedMemOperand(Register(rn),
49792                                                    align,
49793                                                    PostIndex));
49794                             break;
49795                           }
49796                           case 0x00000600: {
49797                             // 0xf400060d
49798                             if (((instr & 0xe20) == 0x620) ||
49799                                 ((instr & 0xf30) == 0xa30)) {
49800                               UnallocatedA32(instr);
49801                               return;
49802                             }
49803                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
49804                             if (dt.Is(kDataTypeValueInvalid)) {
49805                               UnallocatedA32(instr);
49806                               return;
49807                             }
49808                             Alignment align =
49809                                 Align_align_5_Decode((instr >> 4) & 0x3);
49810                             if (dt.Is(kDataTypeValueInvalid) ||
49811                                 align.Is(kBadAlignment)) {
49812                               UnallocatedA32(instr);
49813                               return;
49814                             }
49815                             unsigned first = ExtractDRegister(instr, 22, 12);
49816                             unsigned length;
49817                             SpacingType spacing = kSingle;
49818                             switch ((instr >> 8) & 0xf) {
49819                               default:
49820                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49821                               case 0x7:
49822                                 length = 1;
49823                                 break;
49824                               case 0xa:
49825                                 length = 2;
49826                                 break;
49827                               case 0x6:
49828                                 length = 3;
49829                                 break;
49830                               case 0x2:
49831                                 length = 4;
49832                                 break;
49833                             }
49834                             unsigned last = first + length - 1;
49835                             TransferType transfer = kMultipleLanes;
49836                             unsigned rn = (instr >> 16) & 0xf;
49837                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49838                             vst1(al,
49839                                  dt,
49840                                  NeonRegisterList(DRegister(first),
49841                                                   DRegister(last),
49842                                                   spacing,
49843                                                   transfer),
49844                                  AlignedMemOperand(Register(rn),
49845                                                    align,
49846                                                    PostIndex));
49847                             break;
49848                           }
49849                           case 0x00000700: {
49850                             // 0xf400070d
49851                             if (((instr & 0xe20) == 0x620) ||
49852                                 ((instr & 0xf30) == 0xa30)) {
49853                               UnallocatedA32(instr);
49854                               return;
49855                             }
49856                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
49857                             if (dt.Is(kDataTypeValueInvalid)) {
49858                               UnallocatedA32(instr);
49859                               return;
49860                             }
49861                             Alignment align =
49862                                 Align_align_5_Decode((instr >> 4) & 0x3);
49863                             if (dt.Is(kDataTypeValueInvalid) ||
49864                                 align.Is(kBadAlignment)) {
49865                               UnallocatedA32(instr);
49866                               return;
49867                             }
49868                             unsigned first = ExtractDRegister(instr, 22, 12);
49869                             unsigned length;
49870                             SpacingType spacing = kSingle;
49871                             switch ((instr >> 8) & 0xf) {
49872                               default:
49873                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49874                               case 0x7:
49875                                 length = 1;
49876                                 break;
49877                               case 0xa:
49878                                 length = 2;
49879                                 break;
49880                               case 0x6:
49881                                 length = 3;
49882                                 break;
49883                               case 0x2:
49884                                 length = 4;
49885                                 break;
49886                             }
49887                             unsigned last = first + length - 1;
49888                             TransferType transfer = kMultipleLanes;
49889                             unsigned rn = (instr >> 16) & 0xf;
49890                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49891                             vst1(al,
49892                                  dt,
49893                                  NeonRegisterList(DRegister(first),
49894                                                   DRegister(last),
49895                                                   spacing,
49896                                                   transfer),
49897                                  AlignedMemOperand(Register(rn),
49898                                                    align,
49899                                                    PostIndex));
49900                             break;
49901                           }
49902                           case 0x00000800: {
49903                             // 0xf400080d
49904                             if (((instr & 0xe30) == 0x830)) {
49905                               UnallocatedA32(instr);
49906                               return;
49907                             }
49908                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49909                             if (dt.Is(kDataTypeValueInvalid)) {
49910                               UnallocatedA32(instr);
49911                               return;
49912                             }
49913                             Alignment align =
49914                                 Align_align_2_Decode((instr >> 4) & 0x3);
49915                             if (dt.Is(kDataTypeValueInvalid) ||
49916                                 align.Is(kBadAlignment)) {
49917                               UnallocatedA32(instr);
49918                               return;
49919                             }
49920                             unsigned first = ExtractDRegister(instr, 22, 12);
49921                             unsigned length;
49922                             SpacingType spacing;
49923                             switch ((instr >> 8) & 0xf) {
49924                               default:
49925                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49926                               case 0x8:
49927                                 length = 2;
49928                                 spacing = kSingle;
49929                                 break;
49930                               case 0x9:
49931                                 length = 2;
49932                                 spacing = kDouble;
49933                                 break;
49934                               case 0x3:
49935                                 length = 4;
49936                                 spacing = kSingle;
49937                                 break;
49938                             }
49939                             unsigned last =
49940                                 first +
49941                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49942                             TransferType transfer = kMultipleLanes;
49943                             unsigned rn = (instr >> 16) & 0xf;
49944                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49945                             vst2(al,
49946                                  dt,
49947                                  NeonRegisterList(DRegister(first),
49948                                                   DRegister(last),
49949                                                   spacing,
49950                                                   transfer),
49951                                  AlignedMemOperand(Register(rn),
49952                                                    align,
49953                                                    PostIndex));
49954                             break;
49955                           }
49956                           case 0x00000900: {
49957                             // 0xf400090d
49958                             if (((instr & 0xe30) == 0x830)) {
49959                               UnallocatedA32(instr);
49960                               return;
49961                             }
49962                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49963                             if (dt.Is(kDataTypeValueInvalid)) {
49964                               UnallocatedA32(instr);
49965                               return;
49966                             }
49967                             Alignment align =
49968                                 Align_align_2_Decode((instr >> 4) & 0x3);
49969                             if (dt.Is(kDataTypeValueInvalid) ||
49970                                 align.Is(kBadAlignment)) {
49971                               UnallocatedA32(instr);
49972                               return;
49973                             }
49974                             unsigned first = ExtractDRegister(instr, 22, 12);
49975                             unsigned length;
49976                             SpacingType spacing;
49977                             switch ((instr >> 8) & 0xf) {
49978                               default:
49979                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49980                               case 0x8:
49981                                 length = 2;
49982                                 spacing = kSingle;
49983                                 break;
49984                               case 0x9:
49985                                 length = 2;
49986                                 spacing = kDouble;
49987                                 break;
49988                               case 0x3:
49989                                 length = 4;
49990                                 spacing = kSingle;
49991                                 break;
49992                             }
49993                             unsigned last =
49994                                 first +
49995                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49996                             TransferType transfer = kMultipleLanes;
49997                             unsigned rn = (instr >> 16) & 0xf;
49998                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49999                             vst2(al,
50000                                  dt,
50001                                  NeonRegisterList(DRegister(first),
50002                                                   DRegister(last),
50003                                                   spacing,
50004                                                   transfer),
50005                                  AlignedMemOperand(Register(rn),
50006                                                    align,
50007                                                    PostIndex));
50008                             break;
50009                           }
50010                           case 0x00000a00: {
50011                             // 0xf4000a0d
50012                             if (((instr & 0xe20) == 0x620) ||
50013                                 ((instr & 0xf30) == 0xa30)) {
50014                               UnallocatedA32(instr);
50015                               return;
50016                             }
50017                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50018                             if (dt.Is(kDataTypeValueInvalid)) {
50019                               UnallocatedA32(instr);
50020                               return;
50021                             }
50022                             Alignment align =
50023                                 Align_align_5_Decode((instr >> 4) & 0x3);
50024                             if (dt.Is(kDataTypeValueInvalid) ||
50025                                 align.Is(kBadAlignment)) {
50026                               UnallocatedA32(instr);
50027                               return;
50028                             }
50029                             unsigned first = ExtractDRegister(instr, 22, 12);
50030                             unsigned length;
50031                             SpacingType spacing = kSingle;
50032                             switch ((instr >> 8) & 0xf) {
50033                               default:
50034                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50035                               case 0x7:
50036                                 length = 1;
50037                                 break;
50038                               case 0xa:
50039                                 length = 2;
50040                                 break;
50041                               case 0x6:
50042                                 length = 3;
50043                                 break;
50044                               case 0x2:
50045                                 length = 4;
50046                                 break;
50047                             }
50048                             unsigned last = first + length - 1;
50049                             TransferType transfer = kMultipleLanes;
50050                             unsigned rn = (instr >> 16) & 0xf;
50051                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50052                             vst1(al,
50053                                  dt,
50054                                  NeonRegisterList(DRegister(first),
50055                                                   DRegister(last),
50056                                                   spacing,
50057                                                   transfer),
50058                                  AlignedMemOperand(Register(rn),
50059                                                    align,
50060                                                    PostIndex));
50061                             break;
50062                           }
50063                           default:
50064                             UnallocatedA32(instr);
50065                             break;
50066                         }
50067                         break;
50068                       }
50069                       case 0x00000002: {
50070                         // 0xf400000f
50071                         switch (instr & 0x00000f00) {
50072                           case 0x00000000: {
50073                             // 0xf400000d
50074                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50075                             if (dt.Is(kDataTypeValueInvalid)) {
50076                               UnallocatedA32(instr);
50077                               return;
50078                             }
50079                             Alignment align =
50080                                 Align_align_4_Decode((instr >> 4) & 0x3);
50081                             if (dt.Is(kDataTypeValueInvalid) ||
50082                                 align.Is(kBadAlignment)) {
50083                               UnallocatedA32(instr);
50084                               return;
50085                             }
50086                             unsigned first = ExtractDRegister(instr, 22, 12);
50087                             unsigned length;
50088                             SpacingType spacing;
50089                             switch ((instr >> 8) & 0xf) {
50090                               default:
50091                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50092                               case 0x0:
50093                                 length = 4;
50094                                 spacing = kSingle;
50095                                 break;
50096                               case 0x1:
50097                                 length = 4;
50098                                 spacing = kDouble;
50099                                 break;
50100                             }
50101                             unsigned last =
50102                                 first +
50103                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50104                             TransferType transfer = kMultipleLanes;
50105                             unsigned rn = (instr >> 16) & 0xf;
50106                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50107                             vst4(al,
50108                                  dt,
50109                                  NeonRegisterList(DRegister(first),
50110                                                   DRegister(last),
50111                                                   spacing,
50112                                                   transfer),
50113                                  AlignedMemOperand(Register(rn),
50114                                                    align,
50115                                                    Offset));
50116                             break;
50117                           }
50118                           case 0x00000100: {
50119                             // 0xf400010d
50120                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50121                             if (dt.Is(kDataTypeValueInvalid)) {
50122                               UnallocatedA32(instr);
50123                               return;
50124                             }
50125                             Alignment align =
50126                                 Align_align_4_Decode((instr >> 4) & 0x3);
50127                             if (dt.Is(kDataTypeValueInvalid) ||
50128                                 align.Is(kBadAlignment)) {
50129                               UnallocatedA32(instr);
50130                               return;
50131                             }
50132                             unsigned first = ExtractDRegister(instr, 22, 12);
50133                             unsigned length;
50134                             SpacingType spacing;
50135                             switch ((instr >> 8) & 0xf) {
50136                               default:
50137                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50138                               case 0x0:
50139                                 length = 4;
50140                                 spacing = kSingle;
50141                                 break;
50142                               case 0x1:
50143                                 length = 4;
50144                                 spacing = kDouble;
50145                                 break;
50146                             }
50147                             unsigned last =
50148                                 first +
50149                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50150                             TransferType transfer = kMultipleLanes;
50151                             unsigned rn = (instr >> 16) & 0xf;
50152                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50153                             vst4(al,
50154                                  dt,
50155                                  NeonRegisterList(DRegister(first),
50156                                                   DRegister(last),
50157                                                   spacing,
50158                                                   transfer),
50159                                  AlignedMemOperand(Register(rn),
50160                                                    align,
50161                                                    Offset));
50162                             break;
50163                           }
50164                           case 0x00000200: {
50165                             // 0xf400020d
50166                             if (((instr & 0xe20) == 0x620) ||
50167                                 ((instr & 0xf30) == 0xa30)) {
50168                               UnallocatedA32(instr);
50169                               return;
50170                             }
50171                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50172                             if (dt.Is(kDataTypeValueInvalid)) {
50173                               UnallocatedA32(instr);
50174                               return;
50175                             }
50176                             Alignment align =
50177                                 Align_align_5_Decode((instr >> 4) & 0x3);
50178                             if (dt.Is(kDataTypeValueInvalid) ||
50179                                 align.Is(kBadAlignment)) {
50180                               UnallocatedA32(instr);
50181                               return;
50182                             }
50183                             unsigned first = ExtractDRegister(instr, 22, 12);
50184                             unsigned length;
50185                             SpacingType spacing = kSingle;
50186                             switch ((instr >> 8) & 0xf) {
50187                               default:
50188                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50189                               case 0x7:
50190                                 length = 1;
50191                                 break;
50192                               case 0xa:
50193                                 length = 2;
50194                                 break;
50195                               case 0x6:
50196                                 length = 3;
50197                                 break;
50198                               case 0x2:
50199                                 length = 4;
50200                                 break;
50201                             }
50202                             unsigned last = first + length - 1;
50203                             TransferType transfer = kMultipleLanes;
50204                             unsigned rn = (instr >> 16) & 0xf;
50205                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50206                             vst1(al,
50207                                  dt,
50208                                  NeonRegisterList(DRegister(first),
50209                                                   DRegister(last),
50210                                                   spacing,
50211                                                   transfer),
50212                                  AlignedMemOperand(Register(rn),
50213                                                    align,
50214                                                    Offset));
50215                             break;
50216                           }
50217                           case 0x00000300: {
50218                             // 0xf400030d
50219                             if (((instr & 0xe30) == 0x830)) {
50220                               UnallocatedA32(instr);
50221                               return;
50222                             }
50223                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50224                             if (dt.Is(kDataTypeValueInvalid)) {
50225                               UnallocatedA32(instr);
50226                               return;
50227                             }
50228                             Alignment align =
50229                                 Align_align_2_Decode((instr >> 4) & 0x3);
50230                             if (dt.Is(kDataTypeValueInvalid) ||
50231                                 align.Is(kBadAlignment)) {
50232                               UnallocatedA32(instr);
50233                               return;
50234                             }
50235                             unsigned first = ExtractDRegister(instr, 22, 12);
50236                             unsigned length;
50237                             SpacingType spacing;
50238                             switch ((instr >> 8) & 0xf) {
50239                               default:
50240                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50241                               case 0x8:
50242                                 length = 2;
50243                                 spacing = kSingle;
50244                                 break;
50245                               case 0x9:
50246                                 length = 2;
50247                                 spacing = kDouble;
50248                                 break;
50249                               case 0x3:
50250                                 length = 4;
50251                                 spacing = kSingle;
50252                                 break;
50253                             }
50254                             unsigned last =
50255                                 first +
50256                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50257                             TransferType transfer = kMultipleLanes;
50258                             unsigned rn = (instr >> 16) & 0xf;
50259                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50260                             vst2(al,
50261                                  dt,
50262                                  NeonRegisterList(DRegister(first),
50263                                                   DRegister(last),
50264                                                   spacing,
50265                                                   transfer),
50266                                  AlignedMemOperand(Register(rn),
50267                                                    align,
50268                                                    Offset));
50269                             break;
50270                           }
50271                           case 0x00000400: {
50272                             // 0xf400040d
50273                             if (((instr & 0x20) == 0x20)) {
50274                               UnallocatedA32(instr);
50275                               return;
50276                             }
50277                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50278                             if (dt.Is(kDataTypeValueInvalid)) {
50279                               UnallocatedA32(instr);
50280                               return;
50281                             }
50282                             Alignment align =
50283                                 Align_align_3_Decode((instr >> 4) & 0x3);
50284                             if (dt.Is(kDataTypeValueInvalid) ||
50285                                 align.Is(kBadAlignment)) {
50286                               UnallocatedA32(instr);
50287                               return;
50288                             }
50289                             unsigned first = ExtractDRegister(instr, 22, 12);
50290                             unsigned length;
50291                             SpacingType spacing;
50292                             switch ((instr >> 8) & 0xf) {
50293                               default:
50294                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50295                               case 0x4:
50296                                 length = 3;
50297                                 spacing = kSingle;
50298                                 break;
50299                               case 0x5:
50300                                 length = 3;
50301                                 spacing = kDouble;
50302                                 break;
50303                             }
50304                             unsigned last =
50305                                 first +
50306                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50307                             TransferType transfer = kMultipleLanes;
50308                             unsigned rn = (instr >> 16) & 0xf;
50309                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50310                             vst3(al,
50311                                  dt,
50312                                  NeonRegisterList(DRegister(first),
50313                                                   DRegister(last),
50314                                                   spacing,
50315                                                   transfer),
50316                                  AlignedMemOperand(Register(rn),
50317                                                    align,
50318                                                    Offset));
50319                             break;
50320                           }
50321                           case 0x00000500: {
50322                             // 0xf400050d
50323                             if (((instr & 0x20) == 0x20)) {
50324                               UnallocatedA32(instr);
50325                               return;
50326                             }
50327                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50328                             if (dt.Is(kDataTypeValueInvalid)) {
50329                               UnallocatedA32(instr);
50330                               return;
50331                             }
50332                             Alignment align =
50333                                 Align_align_3_Decode((instr >> 4) & 0x3);
50334                             if (dt.Is(kDataTypeValueInvalid) ||
50335                                 align.Is(kBadAlignment)) {
50336                               UnallocatedA32(instr);
50337                               return;
50338                             }
50339                             unsigned first = ExtractDRegister(instr, 22, 12);
50340                             unsigned length;
50341                             SpacingType spacing;
50342                             switch ((instr >> 8) & 0xf) {
50343                               default:
50344                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50345                               case 0x4:
50346                                 length = 3;
50347                                 spacing = kSingle;
50348                                 break;
50349                               case 0x5:
50350                                 length = 3;
50351                                 spacing = kDouble;
50352                                 break;
50353                             }
50354                             unsigned last =
50355                                 first +
50356                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50357                             TransferType transfer = kMultipleLanes;
50358                             unsigned rn = (instr >> 16) & 0xf;
50359                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50360                             vst3(al,
50361                                  dt,
50362                                  NeonRegisterList(DRegister(first),
50363                                                   DRegister(last),
50364                                                   spacing,
50365                                                   transfer),
50366                                  AlignedMemOperand(Register(rn),
50367                                                    align,
50368                                                    Offset));
50369                             break;
50370                           }
50371                           case 0x00000600: {
50372                             // 0xf400060d
50373                             if (((instr & 0xe20) == 0x620) ||
50374                                 ((instr & 0xf30) == 0xa30)) {
50375                               UnallocatedA32(instr);
50376                               return;
50377                             }
50378                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50379                             if (dt.Is(kDataTypeValueInvalid)) {
50380                               UnallocatedA32(instr);
50381                               return;
50382                             }
50383                             Alignment align =
50384                                 Align_align_5_Decode((instr >> 4) & 0x3);
50385                             if (dt.Is(kDataTypeValueInvalid) ||
50386                                 align.Is(kBadAlignment)) {
50387                               UnallocatedA32(instr);
50388                               return;
50389                             }
50390                             unsigned first = ExtractDRegister(instr, 22, 12);
50391                             unsigned length;
50392                             SpacingType spacing = kSingle;
50393                             switch ((instr >> 8) & 0xf) {
50394                               default:
50395                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50396                               case 0x7:
50397                                 length = 1;
50398                                 break;
50399                               case 0xa:
50400                                 length = 2;
50401                                 break;
50402                               case 0x6:
50403                                 length = 3;
50404                                 break;
50405                               case 0x2:
50406                                 length = 4;
50407                                 break;
50408                             }
50409                             unsigned last = first + length - 1;
50410                             TransferType transfer = kMultipleLanes;
50411                             unsigned rn = (instr >> 16) & 0xf;
50412                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50413                             vst1(al,
50414                                  dt,
50415                                  NeonRegisterList(DRegister(first),
50416                                                   DRegister(last),
50417                                                   spacing,
50418                                                   transfer),
50419                                  AlignedMemOperand(Register(rn),
50420                                                    align,
50421                                                    Offset));
50422                             break;
50423                           }
50424                           case 0x00000700: {
50425                             // 0xf400070d
50426                             if (((instr & 0xe20) == 0x620) ||
50427                                 ((instr & 0xf30) == 0xa30)) {
50428                               UnallocatedA32(instr);
50429                               return;
50430                             }
50431                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50432                             if (dt.Is(kDataTypeValueInvalid)) {
50433                               UnallocatedA32(instr);
50434                               return;
50435                             }
50436                             Alignment align =
50437                                 Align_align_5_Decode((instr >> 4) & 0x3);
50438                             if (dt.Is(kDataTypeValueInvalid) ||
50439                                 align.Is(kBadAlignment)) {
50440                               UnallocatedA32(instr);
50441                               return;
50442                             }
50443                             unsigned first = ExtractDRegister(instr, 22, 12);
50444                             unsigned length;
50445                             SpacingType spacing = kSingle;
50446                             switch ((instr >> 8) & 0xf) {
50447                               default:
50448                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50449                               case 0x7:
50450                                 length = 1;
50451                                 break;
50452                               case 0xa:
50453                                 length = 2;
50454                                 break;
50455                               case 0x6:
50456                                 length = 3;
50457                                 break;
50458                               case 0x2:
50459                                 length = 4;
50460                                 break;
50461                             }
50462                             unsigned last = first + length - 1;
50463                             TransferType transfer = kMultipleLanes;
50464                             unsigned rn = (instr >> 16) & 0xf;
50465                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50466                             vst1(al,
50467                                  dt,
50468                                  NeonRegisterList(DRegister(first),
50469                                                   DRegister(last),
50470                                                   spacing,
50471                                                   transfer),
50472                                  AlignedMemOperand(Register(rn),
50473                                                    align,
50474                                                    Offset));
50475                             break;
50476                           }
50477                           case 0x00000800: {
50478                             // 0xf400080d
50479                             if (((instr & 0xe30) == 0x830)) {
50480                               UnallocatedA32(instr);
50481                               return;
50482                             }
50483                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50484                             if (dt.Is(kDataTypeValueInvalid)) {
50485                               UnallocatedA32(instr);
50486                               return;
50487                             }
50488                             Alignment align =
50489                                 Align_align_2_Decode((instr >> 4) & 0x3);
50490                             if (dt.Is(kDataTypeValueInvalid) ||
50491                                 align.Is(kBadAlignment)) {
50492                               UnallocatedA32(instr);
50493                               return;
50494                             }
50495                             unsigned first = ExtractDRegister(instr, 22, 12);
50496                             unsigned length;
50497                             SpacingType spacing;
50498                             switch ((instr >> 8) & 0xf) {
50499                               default:
50500                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50501                               case 0x8:
50502                                 length = 2;
50503                                 spacing = kSingle;
50504                                 break;
50505                               case 0x9:
50506                                 length = 2;
50507                                 spacing = kDouble;
50508                                 break;
50509                               case 0x3:
50510                                 length = 4;
50511                                 spacing = kSingle;
50512                                 break;
50513                             }
50514                             unsigned last =
50515                                 first +
50516                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50517                             TransferType transfer = kMultipleLanes;
50518                             unsigned rn = (instr >> 16) & 0xf;
50519                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50520                             vst2(al,
50521                                  dt,
50522                                  NeonRegisterList(DRegister(first),
50523                                                   DRegister(last),
50524                                                   spacing,
50525                                                   transfer),
50526                                  AlignedMemOperand(Register(rn),
50527                                                    align,
50528                                                    Offset));
50529                             break;
50530                           }
50531                           case 0x00000900: {
50532                             // 0xf400090d
50533                             if (((instr & 0xe30) == 0x830)) {
50534                               UnallocatedA32(instr);
50535                               return;
50536                             }
50537                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50538                             if (dt.Is(kDataTypeValueInvalid)) {
50539                               UnallocatedA32(instr);
50540                               return;
50541                             }
50542                             Alignment align =
50543                                 Align_align_2_Decode((instr >> 4) & 0x3);
50544                             if (dt.Is(kDataTypeValueInvalid) ||
50545                                 align.Is(kBadAlignment)) {
50546                               UnallocatedA32(instr);
50547                               return;
50548                             }
50549                             unsigned first = ExtractDRegister(instr, 22, 12);
50550                             unsigned length;
50551                             SpacingType spacing;
50552                             switch ((instr >> 8) & 0xf) {
50553                               default:
50554                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50555                               case 0x8:
50556                                 length = 2;
50557                                 spacing = kSingle;
50558                                 break;
50559                               case 0x9:
50560                                 length = 2;
50561                                 spacing = kDouble;
50562                                 break;
50563                               case 0x3:
50564                                 length = 4;
50565                                 spacing = kSingle;
50566                                 break;
50567                             }
50568                             unsigned last =
50569                                 first +
50570                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50571                             TransferType transfer = kMultipleLanes;
50572                             unsigned rn = (instr >> 16) & 0xf;
50573                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50574                             vst2(al,
50575                                  dt,
50576                                  NeonRegisterList(DRegister(first),
50577                                                   DRegister(last),
50578                                                   spacing,
50579                                                   transfer),
50580                                  AlignedMemOperand(Register(rn),
50581                                                    align,
50582                                                    Offset));
50583                             break;
50584                           }
50585                           case 0x00000a00: {
50586                             // 0xf4000a0d
50587                             if (((instr & 0xe20) == 0x620) ||
50588                                 ((instr & 0xf30) == 0xa30)) {
50589                               UnallocatedA32(instr);
50590                               return;
50591                             }
50592                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50593                             if (dt.Is(kDataTypeValueInvalid)) {
50594                               UnallocatedA32(instr);
50595                               return;
50596                             }
50597                             Alignment align =
50598                                 Align_align_5_Decode((instr >> 4) & 0x3);
50599                             if (dt.Is(kDataTypeValueInvalid) ||
50600                                 align.Is(kBadAlignment)) {
50601                               UnallocatedA32(instr);
50602                               return;
50603                             }
50604                             unsigned first = ExtractDRegister(instr, 22, 12);
50605                             unsigned length;
50606                             SpacingType spacing = kSingle;
50607                             switch ((instr >> 8) & 0xf) {
50608                               default:
50609                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50610                               case 0x7:
50611                                 length = 1;
50612                                 break;
50613                               case 0xa:
50614                                 length = 2;
50615                                 break;
50616                               case 0x6:
50617                                 length = 3;
50618                                 break;
50619                               case 0x2:
50620                                 length = 4;
50621                                 break;
50622                             }
50623                             unsigned last = first + length - 1;
50624                             TransferType transfer = kMultipleLanes;
50625                             unsigned rn = (instr >> 16) & 0xf;
50626                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50627                             vst1(al,
50628                                  dt,
50629                                  NeonRegisterList(DRegister(first),
50630                                                   DRegister(last),
50631                                                   spacing,
50632                                                   transfer),
50633                                  AlignedMemOperand(Register(rn),
50634                                                    align,
50635                                                    Offset));
50636                             break;
50637                           }
50638                           default:
50639                             UnallocatedA32(instr);
50640                             break;
50641                         }
50642                         break;
50643                       }
50644                     }
50645                     break;
50646                   }
50647                   default: {
50648                     switch (instr & 0x00000f00) {
50649                       case 0x00000000: {
50650                         // 0xf4000000
50651                         if (((instr & 0xd) == 0xd)) {
50652                           UnallocatedA32(instr);
50653                           return;
50654                         }
50655                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50656                         if (dt.Is(kDataTypeValueInvalid)) {
50657                           UnallocatedA32(instr);
50658                           return;
50659                         }
50660                         Alignment align =
50661                             Align_align_4_Decode((instr >> 4) & 0x3);
50662                         if (dt.Is(kDataTypeValueInvalid) ||
50663                             align.Is(kBadAlignment)) {
50664                           UnallocatedA32(instr);
50665                           return;
50666                         }
50667                         unsigned first = ExtractDRegister(instr, 22, 12);
50668                         unsigned length;
50669                         SpacingType spacing;
50670                         switch ((instr >> 8) & 0xf) {
50671                           default:
50672                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
50673                           case 0x0:
50674                             length = 4;
50675                             spacing = kSingle;
50676                             break;
50677                           case 0x1:
50678                             length = 4;
50679                             spacing = kDouble;
50680                             break;
50681                         }
50682                         unsigned last =
50683                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
50684                         TransferType transfer = kMultipleLanes;
50685                         unsigned rn = (instr >> 16) & 0xf;
50686                         unsigned rm = instr & 0xf;
50687                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50688                         vst4(al,
50689                              dt,
50690                              NeonRegisterList(DRegister(first),
50691                                               DRegister(last),
50692                                               spacing,
50693                                               transfer),
50694                              AlignedMemOperand(Register(rn),
50695                                                align,
50696                                                Register(rm),
50697                                                PostIndex));
50698                         break;
50699                       }
50700                       case 0x00000100: {
50701                         // 0xf4000100
50702                         if (((instr & 0xd) == 0xd)) {
50703                           UnallocatedA32(instr);
50704                           return;
50705                         }
50706                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50707                         if (dt.Is(kDataTypeValueInvalid)) {
50708                           UnallocatedA32(instr);
50709                           return;
50710                         }
50711                         Alignment align =
50712                             Align_align_4_Decode((instr >> 4) & 0x3);
50713                         if (dt.Is(kDataTypeValueInvalid) ||
50714                             align.Is(kBadAlignment)) {
50715                           UnallocatedA32(instr);
50716                           return;
50717                         }
50718                         unsigned first = ExtractDRegister(instr, 22, 12);
50719                         unsigned length;
50720                         SpacingType spacing;
50721                         switch ((instr >> 8) & 0xf) {
50722                           default:
50723                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
50724                           case 0x0:
50725                             length = 4;
50726                             spacing = kSingle;
50727                             break;
50728                           case 0x1:
50729                             length = 4;
50730                             spacing = kDouble;
50731                             break;
50732                         }
50733                         unsigned last =
50734                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
50735                         TransferType transfer = kMultipleLanes;
50736                         unsigned rn = (instr >> 16) & 0xf;
50737                         unsigned rm = instr & 0xf;
50738                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50739                         vst4(al,
50740                              dt,
50741                              NeonRegisterList(DRegister(first),
50742                                               DRegister(last),
50743                                               spacing,
50744                                               transfer),
50745                              AlignedMemOperand(Register(rn),
50746                                                align,
50747                                                Register(rm),
50748                                                PostIndex));
50749                         break;
50750                       }
50751                       case 0x00000200: {
50752                         // 0xf4000200
50753                         if (((instr & 0xd) == 0xd) ||
50754                             ((instr & 0xe20) == 0x620) ||
50755                             ((instr & 0xf30) == 0xa30)) {
50756                           UnallocatedA32(instr);
50757                           return;
50758                         }
50759                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50760                         if (dt.Is(kDataTypeValueInvalid)) {
50761                           UnallocatedA32(instr);
50762                           return;
50763                         }
50764                         Alignment align =
50765                             Align_align_5_Decode((instr >> 4) & 0x3);
50766                         if (dt.Is(kDataTypeValueInvalid) ||
50767                             align.Is(kBadAlignment)) {
50768                           UnallocatedA32(instr);
50769                           return;
50770                         }
50771                         unsigned first = ExtractDRegister(instr, 22, 12);
50772                         unsigned length;
50773                         SpacingType spacing = kSingle;
50774                         switch ((instr >> 8) & 0xf) {
50775                           default:
50776                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
50777                           case 0x7:
50778                             length = 1;
50779                             break;
50780                           case 0xa:
50781                             length = 2;
50782                             break;
50783                           case 0x6:
50784                             length = 3;
50785                             break;
50786                           case 0x2:
50787                             length = 4;
50788                             break;
50789                         }
50790                         unsigned last = first + length - 1;
50791                         TransferType transfer = kMultipleLanes;
50792                         unsigned rn = (instr >> 16) & 0xf;
50793                         unsigned rm = instr & 0xf;
50794                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50795                         vst1(al,
50796                              dt,
50797                              NeonRegisterList(DRegister(first),
50798                                               DRegister(last),
50799                                               spacing,
50800                                               transfer),
50801                              AlignedMemOperand(Register(rn),
50802                                                align,
50803                                                Register(rm),
50804                                                PostIndex));
50805                         break;
50806                       }
50807                       case 0x00000300: {
50808                         // 0xf4000300
50809                         if (((instr & 0xd) == 0xd) ||
50810                             ((instr & 0xe30) == 0x830)) {
50811                           UnallocatedA32(instr);
50812                           return;
50813                         }
50814                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50815                         if (dt.Is(kDataTypeValueInvalid)) {
50816                           UnallocatedA32(instr);
50817                           return;
50818                         }
50819                         Alignment align =
50820                             Align_align_2_Decode((instr >> 4) & 0x3);
50821                         if (dt.Is(kDataTypeValueInvalid) ||
50822                             align.Is(kBadAlignment)) {
50823                           UnallocatedA32(instr);
50824                           return;
50825                         }
50826                         unsigned first = ExtractDRegister(instr, 22, 12);
50827                         unsigned length;
50828                         SpacingType spacing;
50829                         switch ((instr >> 8) & 0xf) {
50830                           default:
50831                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
50832                           case 0x8:
50833                             length = 2;
50834                             spacing = kSingle;
50835                             break;
50836                           case 0x9:
50837                             length = 2;
50838                             spacing = kDouble;
50839                             break;
50840                           case 0x3:
50841                             length = 4;
50842                             spacing = kSingle;
50843                             break;
50844                         }
50845                         unsigned last =
50846                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
50847                         TransferType transfer = kMultipleLanes;
50848                         unsigned rn = (instr >> 16) & 0xf;
50849                         unsigned rm = instr & 0xf;
50850                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50851                         vst2(al,
50852                              dt,
50853                              NeonRegisterList(DRegister(first),
50854                                               DRegister(last),
50855                                               spacing,
50856                                               transfer),
50857                              AlignedMemOperand(Register(rn),
50858                                                align,
50859                                                Register(rm),
50860                                                PostIndex));
50861                         break;
50862                       }
50863                       case 0x00000400: {
50864                         // 0xf4000400
50865                         if (((instr & 0xd) == 0xd) ||
50866                             ((instr & 0x20) == 0x20)) {
50867                           UnallocatedA32(instr);
50868                           return;
50869                         }
50870                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50871                         if (dt.Is(kDataTypeValueInvalid)) {
50872                           UnallocatedA32(instr);
50873                           return;
50874                         }
50875                         Alignment align =
50876                             Align_align_3_Decode((instr >> 4) & 0x3);
50877                         if (dt.Is(kDataTypeValueInvalid) ||
50878                             align.Is(kBadAlignment)) {
50879                           UnallocatedA32(instr);
50880                           return;
50881                         }
50882                         unsigned first = ExtractDRegister(instr, 22, 12);
50883                         unsigned length;
50884                         SpacingType spacing;
50885                         switch ((instr >> 8) & 0xf) {
50886                           default:
50887                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
50888                           case 0x4:
50889                             length = 3;
50890                             spacing = kSingle;
50891                             break;
50892                           case 0x5:
50893                             length = 3;
50894                             spacing = kDouble;
50895                             break;
50896                         }
50897                         unsigned last =
50898                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
50899                         TransferType transfer = kMultipleLanes;
50900                         unsigned rn = (instr >> 16) & 0xf;
50901                         unsigned rm = instr & 0xf;
50902                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50903                         vst3(al,
50904                              dt,
50905                              NeonRegisterList(DRegister(first),
50906                                               DRegister(last),
50907                                               spacing,
50908                                               transfer),
50909                              AlignedMemOperand(Register(rn),
50910                                                align,
50911                                                Register(rm),
50912                                                PostIndex));
50913                         break;
50914                       }
50915                       case 0x00000500: {
50916                         // 0xf4000500
50917                         if (((instr & 0xd) == 0xd) ||
50918                             ((instr & 0x20) == 0x20)) {
50919                           UnallocatedA32(instr);
50920                           return;
50921                         }
50922                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50923                         if (dt.Is(kDataTypeValueInvalid)) {
50924                           UnallocatedA32(instr);
50925                           return;
50926                         }
50927                         Alignment align =
50928                             Align_align_3_Decode((instr >> 4) & 0x3);
50929                         if (dt.Is(kDataTypeValueInvalid) ||
50930                             align.Is(kBadAlignment)) {
50931                           UnallocatedA32(instr);
50932                           return;
50933                         }
50934                         unsigned first = ExtractDRegister(instr, 22, 12);
50935                         unsigned length;
50936                         SpacingType spacing;
50937                         switch ((instr >> 8) & 0xf) {
50938                           default:
50939                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
50940                           case 0x4:
50941                             length = 3;
50942                             spacing = kSingle;
50943                             break;
50944                           case 0x5:
50945                             length = 3;
50946                             spacing = kDouble;
50947                             break;
50948                         }
50949                         unsigned last =
50950                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
50951                         TransferType transfer = kMultipleLanes;
50952                         unsigned rn = (instr >> 16) & 0xf;
50953                         unsigned rm = instr & 0xf;
50954                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50955                         vst3(al,
50956                              dt,
50957                              NeonRegisterList(DRegister(first),
50958                                               DRegister(last),
50959                                               spacing,
50960                                               transfer),
50961                              AlignedMemOperand(Register(rn),
50962                                                align,
50963                                                Register(rm),
50964                                                PostIndex));
50965                         break;
50966                       }
50967                       case 0x00000600: {
50968                         // 0xf4000600
50969                         if (((instr & 0xd) == 0xd) ||
50970                             ((instr & 0xe20) == 0x620) ||
50971                             ((instr & 0xf30) == 0xa30)) {
50972                           UnallocatedA32(instr);
50973                           return;
50974                         }
50975                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50976                         if (dt.Is(kDataTypeValueInvalid)) {
50977                           UnallocatedA32(instr);
50978                           return;
50979                         }
50980                         Alignment align =
50981                             Align_align_5_Decode((instr >> 4) & 0x3);
50982                         if (dt.Is(kDataTypeValueInvalid) ||
50983                             align.Is(kBadAlignment)) {
50984                           UnallocatedA32(instr);
50985                           return;
50986                         }
50987                         unsigned first = ExtractDRegister(instr, 22, 12);
50988                         unsigned length;
50989                         SpacingType spacing = kSingle;
50990                         switch ((instr >> 8) & 0xf) {
50991                           default:
50992                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
50993                           case 0x7:
50994                             length = 1;
50995                             break;
50996                           case 0xa:
50997                             length = 2;
50998                             break;
50999                           case 0x6:
51000                             length = 3;
51001                             break;
51002                           case 0x2:
51003                             length = 4;
51004                             break;
51005                         }
51006                         unsigned last = first + length - 1;
51007                         TransferType transfer = kMultipleLanes;
51008                         unsigned rn = (instr >> 16) & 0xf;
51009                         unsigned rm = instr & 0xf;
51010                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51011                         vst1(al,
51012                              dt,
51013                              NeonRegisterList(DRegister(first),
51014                                               DRegister(last),
51015                                               spacing,
51016                                               transfer),
51017                              AlignedMemOperand(Register(rn),
51018                                                align,
51019                                                Register(rm),
51020                                                PostIndex));
51021                         break;
51022                       }
51023                       case 0x00000700: {
51024                         // 0xf4000700
51025                         if (((instr & 0xd) == 0xd) ||
51026                             ((instr & 0xe20) == 0x620) ||
51027                             ((instr & 0xf30) == 0xa30)) {
51028                           UnallocatedA32(instr);
51029                           return;
51030                         }
51031                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51032                         if (dt.Is(kDataTypeValueInvalid)) {
51033                           UnallocatedA32(instr);
51034                           return;
51035                         }
51036                         Alignment align =
51037                             Align_align_5_Decode((instr >> 4) & 0x3);
51038                         if (dt.Is(kDataTypeValueInvalid) ||
51039                             align.Is(kBadAlignment)) {
51040                           UnallocatedA32(instr);
51041                           return;
51042                         }
51043                         unsigned first = ExtractDRegister(instr, 22, 12);
51044                         unsigned length;
51045                         SpacingType spacing = kSingle;
51046                         switch ((instr >> 8) & 0xf) {
51047                           default:
51048                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51049                           case 0x7:
51050                             length = 1;
51051                             break;
51052                           case 0xa:
51053                             length = 2;
51054                             break;
51055                           case 0x6:
51056                             length = 3;
51057                             break;
51058                           case 0x2:
51059                             length = 4;
51060                             break;
51061                         }
51062                         unsigned last = first + length - 1;
51063                         TransferType transfer = kMultipleLanes;
51064                         unsigned rn = (instr >> 16) & 0xf;
51065                         unsigned rm = instr & 0xf;
51066                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51067                         vst1(al,
51068                              dt,
51069                              NeonRegisterList(DRegister(first),
51070                                               DRegister(last),
51071                                               spacing,
51072                                               transfer),
51073                              AlignedMemOperand(Register(rn),
51074                                                align,
51075                                                Register(rm),
51076                                                PostIndex));
51077                         break;
51078                       }
51079                       case 0x00000800: {
51080                         // 0xf4000800
51081                         if (((instr & 0xd) == 0xd) ||
51082                             ((instr & 0xe30) == 0x830)) {
51083                           UnallocatedA32(instr);
51084                           return;
51085                         }
51086                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51087                         if (dt.Is(kDataTypeValueInvalid)) {
51088                           UnallocatedA32(instr);
51089                           return;
51090                         }
51091                         Alignment align =
51092                             Align_align_2_Decode((instr >> 4) & 0x3);
51093                         if (dt.Is(kDataTypeValueInvalid) ||
51094                             align.Is(kBadAlignment)) {
51095                           UnallocatedA32(instr);
51096                           return;
51097                         }
51098                         unsigned first = ExtractDRegister(instr, 22, 12);
51099                         unsigned length;
51100                         SpacingType spacing;
51101                         switch ((instr >> 8) & 0xf) {
51102                           default:
51103                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51104                           case 0x8:
51105                             length = 2;
51106                             spacing = kSingle;
51107                             break;
51108                           case 0x9:
51109                             length = 2;
51110                             spacing = kDouble;
51111                             break;
51112                           case 0x3:
51113                             length = 4;
51114                             spacing = kSingle;
51115                             break;
51116                         }
51117                         unsigned last =
51118                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51119                         TransferType transfer = kMultipleLanes;
51120                         unsigned rn = (instr >> 16) & 0xf;
51121                         unsigned rm = instr & 0xf;
51122                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51123                         vst2(al,
51124                              dt,
51125                              NeonRegisterList(DRegister(first),
51126                                               DRegister(last),
51127                                               spacing,
51128                                               transfer),
51129                              AlignedMemOperand(Register(rn),
51130                                                align,
51131                                                Register(rm),
51132                                                PostIndex));
51133                         break;
51134                       }
51135                       case 0x00000900: {
51136                         // 0xf4000900
51137                         if (((instr & 0xd) == 0xd) ||
51138                             ((instr & 0xe30) == 0x830)) {
51139                           UnallocatedA32(instr);
51140                           return;
51141                         }
51142                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51143                         if (dt.Is(kDataTypeValueInvalid)) {
51144                           UnallocatedA32(instr);
51145                           return;
51146                         }
51147                         Alignment align =
51148                             Align_align_2_Decode((instr >> 4) & 0x3);
51149                         if (dt.Is(kDataTypeValueInvalid) ||
51150                             align.Is(kBadAlignment)) {
51151                           UnallocatedA32(instr);
51152                           return;
51153                         }
51154                         unsigned first = ExtractDRegister(instr, 22, 12);
51155                         unsigned length;
51156                         SpacingType spacing;
51157                         switch ((instr >> 8) & 0xf) {
51158                           default:
51159                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51160                           case 0x8:
51161                             length = 2;
51162                             spacing = kSingle;
51163                             break;
51164                           case 0x9:
51165                             length = 2;
51166                             spacing = kDouble;
51167                             break;
51168                           case 0x3:
51169                             length = 4;
51170                             spacing = kSingle;
51171                             break;
51172                         }
51173                         unsigned last =
51174                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51175                         TransferType transfer = kMultipleLanes;
51176                         unsigned rn = (instr >> 16) & 0xf;
51177                         unsigned rm = instr & 0xf;
51178                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51179                         vst2(al,
51180                              dt,
51181                              NeonRegisterList(DRegister(first),
51182                                               DRegister(last),
51183                                               spacing,
51184                                               transfer),
51185                              AlignedMemOperand(Register(rn),
51186                                                align,
51187                                                Register(rm),
51188                                                PostIndex));
51189                         break;
51190                       }
51191                       case 0x00000a00: {
51192                         // 0xf4000a00
51193                         if (((instr & 0xd) == 0xd) ||
51194                             ((instr & 0xe20) == 0x620) ||
51195                             ((instr & 0xf30) == 0xa30)) {
51196                           UnallocatedA32(instr);
51197                           return;
51198                         }
51199                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51200                         if (dt.Is(kDataTypeValueInvalid)) {
51201                           UnallocatedA32(instr);
51202                           return;
51203                         }
51204                         Alignment align =
51205                             Align_align_5_Decode((instr >> 4) & 0x3);
51206                         if (dt.Is(kDataTypeValueInvalid) ||
51207                             align.Is(kBadAlignment)) {
51208                           UnallocatedA32(instr);
51209                           return;
51210                         }
51211                         unsigned first = ExtractDRegister(instr, 22, 12);
51212                         unsigned length;
51213                         SpacingType spacing = kSingle;
51214                         switch ((instr >> 8) & 0xf) {
51215                           default:
51216                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51217                           case 0x7:
51218                             length = 1;
51219                             break;
51220                           case 0xa:
51221                             length = 2;
51222                             break;
51223                           case 0x6:
51224                             length = 3;
51225                             break;
51226                           case 0x2:
51227                             length = 4;
51228                             break;
51229                         }
51230                         unsigned last = first + length - 1;
51231                         TransferType transfer = kMultipleLanes;
51232                         unsigned rn = (instr >> 16) & 0xf;
51233                         unsigned rm = instr & 0xf;
51234                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51235                         vst1(al,
51236                              dt,
51237                              NeonRegisterList(DRegister(first),
51238                                               DRegister(last),
51239                                               spacing,
51240                                               transfer),
51241                              AlignedMemOperand(Register(rn),
51242                                                align,
51243                                                Register(rm),
51244                                                PostIndex));
51245                         break;
51246                       }
51247                       default:
51248                         UnallocatedA32(instr);
51249                         break;
51250                     }
51251                     break;
51252                   }
51253                 }
51254                 break;
51255               }
51256               case 0x00800000: {
51257                 // 0xf4800000
51258                 switch (instr & 0x00000300) {
51259                   case 0x00000000: {
51260                     // 0xf4800000
51261                     switch (instr & 0x00000c00) {
51262                       case 0x00000c00: {
51263                         // 0xf4800c00
51264                         UnallocatedA32(instr);
51265                         break;
51266                       }
51267                       default: {
51268                         switch (instr & 0x0000000d) {
51269                           case 0x0000000d: {
51270                             // 0xf480000d
51271                             switch (instr & 0x00000002) {
51272                               case 0x00000000: {
51273                                 // 0xf480000d
51274                                 if (((instr & 0xc00) == 0xc00)) {
51275                                   UnallocatedA32(instr);
51276                                   return;
51277                                 }
51278                                 DataType dt =
51279                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51280                                 if (dt.Is(kDataTypeValueInvalid)) {
51281                                   UnallocatedA32(instr);
51282                                   return;
51283                                 }
51284                                 DecodeNeonAndAlign decode_neon =
51285                                     Align_index_align_1_Decode((instr >> 4) &
51286                                                                    0xf,
51287                                                                dt);
51288                                 if (!decode_neon.IsValid()) {
51289                                   UnallocatedA32(instr);
51290                                   return;
51291                                 }
51292                                 Alignment align = decode_neon.GetAlign();
51293                                 int lane = decode_neon.GetLane();
51294                                 SpacingType spacing = decode_neon.GetSpacing();
51295                                 unsigned first =
51296                                     ExtractDRegister(instr, 22, 12);
51297                                 unsigned length = 1;
51298                                 unsigned last = first + length - 1;
51299                                 unsigned rn = (instr >> 16) & 0xf;
51300                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51301                                 vst1(al,
51302                                      dt,
51303                                      NeonRegisterList(DRegister(first),
51304                                                       DRegister(last),
51305                                                       spacing,
51306                                                       lane),
51307                                      AlignedMemOperand(Register(rn),
51308                                                        align,
51309                                                        PostIndex));
51310                                 break;
51311                               }
51312                               case 0x00000002: {
51313                                 // 0xf480000f
51314                                 if (((instr & 0xc00) == 0xc00)) {
51315                                   UnallocatedA32(instr);
51316                                   return;
51317                                 }
51318                                 DataType dt =
51319                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51320                                 if (dt.Is(kDataTypeValueInvalid)) {
51321                                   UnallocatedA32(instr);
51322                                   return;
51323                                 }
51324                                 DecodeNeonAndAlign decode_neon =
51325                                     Align_index_align_1_Decode((instr >> 4) &
51326                                                                    0xf,
51327                                                                dt);
51328                                 if (!decode_neon.IsValid()) {
51329                                   UnallocatedA32(instr);
51330                                   return;
51331                                 }
51332                                 Alignment align = decode_neon.GetAlign();
51333                                 int lane = decode_neon.GetLane();
51334                                 SpacingType spacing = decode_neon.GetSpacing();
51335                                 unsigned first =
51336                                     ExtractDRegister(instr, 22, 12);
51337                                 unsigned length = 1;
51338                                 unsigned last = first + length - 1;
51339                                 unsigned rn = (instr >> 16) & 0xf;
51340                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51341                                 vst1(al,
51342                                      dt,
51343                                      NeonRegisterList(DRegister(first),
51344                                                       DRegister(last),
51345                                                       spacing,
51346                                                       lane),
51347                                      AlignedMemOperand(Register(rn),
51348                                                        align,
51349                                                        Offset));
51350                                 break;
51351                               }
51352                             }
51353                             break;
51354                           }
51355                           default: {
51356                             if (((instr & 0xc00) == 0xc00) ||
51357                                 ((instr & 0xd) == 0xd)) {
51358                               UnallocatedA32(instr);
51359                               return;
51360                             }
51361                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51362                             if (dt.Is(kDataTypeValueInvalid)) {
51363                               UnallocatedA32(instr);
51364                               return;
51365                             }
51366                             DecodeNeonAndAlign decode_neon =
51367                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
51368                                                            dt);
51369                             if (!decode_neon.IsValid()) {
51370                               UnallocatedA32(instr);
51371                               return;
51372                             }
51373                             Alignment align = decode_neon.GetAlign();
51374                             int lane = decode_neon.GetLane();
51375                             SpacingType spacing = decode_neon.GetSpacing();
51376                             unsigned first = ExtractDRegister(instr, 22, 12);
51377                             unsigned length = 1;
51378                             unsigned last = first + length - 1;
51379                             unsigned rn = (instr >> 16) & 0xf;
51380                             unsigned rm = instr & 0xf;
51381                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51382                             vst1(al,
51383                                  dt,
51384                                  NeonRegisterList(DRegister(first),
51385                                                   DRegister(last),
51386                                                   spacing,
51387                                                   lane),
51388                                  AlignedMemOperand(Register(rn),
51389                                                    align,
51390                                                    Register(rm),
51391                                                    PostIndex));
51392                             break;
51393                           }
51394                         }
51395                         break;
51396                       }
51397                     }
51398                     break;
51399                   }
51400                   case 0x00000100: {
51401                     // 0xf4800100
51402                     switch (instr & 0x00000c00) {
51403                       case 0x00000c00: {
51404                         // 0xf4800d00
51405                         UnallocatedA32(instr);
51406                         break;
51407                       }
51408                       default: {
51409                         switch (instr & 0x0000000d) {
51410                           case 0x0000000d: {
51411                             // 0xf480010d
51412                             switch (instr & 0x00000002) {
51413                               case 0x00000000: {
51414                                 // 0xf480010d
51415                                 if (((instr & 0xc00) == 0xc00)) {
51416                                   UnallocatedA32(instr);
51417                                   return;
51418                                 }
51419                                 DataType dt =
51420                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51421                                 if (dt.Is(kDataTypeValueInvalid)) {
51422                                   UnallocatedA32(instr);
51423                                   return;
51424                                 }
51425                                 DecodeNeonAndAlign decode_neon =
51426                                     Align_index_align_2_Decode((instr >> 4) &
51427                                                                    0xf,
51428                                                                dt);
51429                                 if (!decode_neon.IsValid()) {
51430                                   UnallocatedA32(instr);
51431                                   return;
51432                                 }
51433                                 Alignment align = decode_neon.GetAlign();
51434                                 int lane = decode_neon.GetLane();
51435                                 SpacingType spacing = decode_neon.GetSpacing();
51436                                 unsigned first =
51437                                     ExtractDRegister(instr, 22, 12);
51438                                 unsigned length = 2;
51439                                 unsigned last =
51440                                     first +
51441                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51442                                 unsigned rn = (instr >> 16) & 0xf;
51443                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51444                                 vst2(al,
51445                                      dt,
51446                                      NeonRegisterList(DRegister(first),
51447                                                       DRegister(last),
51448                                                       spacing,
51449                                                       lane),
51450                                      AlignedMemOperand(Register(rn),
51451                                                        align,
51452                                                        PostIndex));
51453                                 break;
51454                               }
51455                               case 0x00000002: {
51456                                 // 0xf480010f
51457                                 if (((instr & 0xc00) == 0xc00)) {
51458                                   UnallocatedA32(instr);
51459                                   return;
51460                                 }
51461                                 DataType dt =
51462                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51463                                 if (dt.Is(kDataTypeValueInvalid)) {
51464                                   UnallocatedA32(instr);
51465                                   return;
51466                                 }
51467                                 DecodeNeonAndAlign decode_neon =
51468                                     Align_index_align_2_Decode((instr >> 4) &
51469                                                                    0xf,
51470                                                                dt);
51471                                 if (!decode_neon.IsValid()) {
51472                                   UnallocatedA32(instr);
51473                                   return;
51474                                 }
51475                                 Alignment align = decode_neon.GetAlign();
51476                                 int lane = decode_neon.GetLane();
51477                                 SpacingType spacing = decode_neon.GetSpacing();
51478                                 unsigned first =
51479                                     ExtractDRegister(instr, 22, 12);
51480                                 unsigned length = 2;
51481                                 unsigned last =
51482                                     first +
51483                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51484                                 unsigned rn = (instr >> 16) & 0xf;
51485                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51486                                 vst2(al,
51487                                      dt,
51488                                      NeonRegisterList(DRegister(first),
51489                                                       DRegister(last),
51490                                                       spacing,
51491                                                       lane),
51492                                      AlignedMemOperand(Register(rn),
51493                                                        align,
51494                                                        Offset));
51495                                 break;
51496                               }
51497                             }
51498                             break;
51499                           }
51500                           default: {
51501                             if (((instr & 0xc00) == 0xc00) ||
51502                                 ((instr & 0xd) == 0xd)) {
51503                               UnallocatedA32(instr);
51504                               return;
51505                             }
51506                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51507                             if (dt.Is(kDataTypeValueInvalid)) {
51508                               UnallocatedA32(instr);
51509                               return;
51510                             }
51511                             DecodeNeonAndAlign decode_neon =
51512                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
51513                                                            dt);
51514                             if (!decode_neon.IsValid()) {
51515                               UnallocatedA32(instr);
51516                               return;
51517                             }
51518                             Alignment align = decode_neon.GetAlign();
51519                             int lane = decode_neon.GetLane();
51520                             SpacingType spacing = decode_neon.GetSpacing();
51521                             unsigned first = ExtractDRegister(instr, 22, 12);
51522                             unsigned length = 2;
51523                             unsigned last =
51524                                 first +
51525                                 (length - 1) * (spacing == kSingle ? 1 : 2);
51526                             unsigned rn = (instr >> 16) & 0xf;
51527                             unsigned rm = instr & 0xf;
51528                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51529                             vst2(al,
51530                                  dt,
51531                                  NeonRegisterList(DRegister(first),
51532                                                   DRegister(last),
51533                                                   spacing,
51534                                                   lane),
51535                                  AlignedMemOperand(Register(rn),
51536                                                    align,
51537                                                    Register(rm),
51538                                                    PostIndex));
51539                             break;
51540                           }
51541                         }
51542                         break;
51543                       }
51544                     }
51545                     break;
51546                   }
51547                   case 0x00000200: {
51548                     // 0xf4800200
51549                     switch (instr & 0x00000c30) {
51550                       case 0x00000010: {
51551                         // 0xf4800210
51552                         UnallocatedA32(instr);
51553                         break;
51554                       }
51555                       case 0x00000030: {
51556                         // 0xf4800230
51557                         UnallocatedA32(instr);
51558                         break;
51559                       }
51560                       case 0x00000410: {
51561                         // 0xf4800610
51562                         UnallocatedA32(instr);
51563                         break;
51564                       }
51565                       case 0x00000430: {
51566                         // 0xf4800630
51567                         UnallocatedA32(instr);
51568                         break;
51569                       }
51570                       case 0x00000810: {
51571                         // 0xf4800a10
51572                         UnallocatedA32(instr);
51573                         break;
51574                       }
51575                       case 0x00000820: {
51576                         // 0xf4800a20
51577                         UnallocatedA32(instr);
51578                         break;
51579                       }
51580                       case 0x00000830: {
51581                         // 0xf4800a30
51582                         UnallocatedA32(instr);
51583                         break;
51584                       }
51585                       case 0x00000c00: {
51586                         // 0xf4800e00
51587                         UnallocatedA32(instr);
51588                         break;
51589                       }
51590                       case 0x00000c10: {
51591                         // 0xf4800e10
51592                         UnallocatedA32(instr);
51593                         break;
51594                       }
51595                       case 0x00000c20: {
51596                         // 0xf4800e20
51597                         UnallocatedA32(instr);
51598                         break;
51599                       }
51600                       case 0x00000c30: {
51601                         // 0xf4800e30
51602                         UnallocatedA32(instr);
51603                         break;
51604                       }
51605                       default: {
51606                         switch (instr & 0x0000000d) {
51607                           case 0x0000000d: {
51608                             // 0xf480020d
51609                             switch (instr & 0x00000002) {
51610                               case 0x00000000: {
51611                                 // 0xf480020d
51612                                 if (((instr & 0xc00) == 0xc00) ||
51613                                     ((instr & 0x810) == 0x10) ||
51614                                     ((instr & 0xc30) == 0x810) ||
51615                                     ((instr & 0xc30) == 0x820) ||
51616                                     ((instr & 0xc30) == 0x830)) {
51617                                   UnallocatedA32(instr);
51618                                   return;
51619                                 }
51620                                 DataType dt =
51621                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51622                                 if (dt.Is(kDataTypeValueInvalid)) {
51623                                   UnallocatedA32(instr);
51624                                   return;
51625                                 }
51626                                 DecodeNeon decode_neon =
51627                                     Index_1_Decode((instr >> 4) & 0xf, dt);
51628                                 if (!decode_neon.IsValid()) {
51629                                   UnallocatedA32(instr);
51630                                   return;
51631                                 }
51632                                 int lane = decode_neon.GetLane();
51633                                 SpacingType spacing = decode_neon.GetSpacing();
51634                                 unsigned first =
51635                                     ExtractDRegister(instr, 22, 12);
51636                                 unsigned length = 3;
51637                                 unsigned last =
51638                                     first +
51639                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51640                                 unsigned rn = (instr >> 16) & 0xf;
51641                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
51642                                 vst3(al,
51643                                      dt,
51644                                      NeonRegisterList(DRegister(first),
51645                                                       DRegister(last),
51646                                                       spacing,
51647                                                       lane),
51648                                      MemOperand(Register(rn), PostIndex));
51649                                 break;
51650                               }
51651                               case 0x00000002: {
51652                                 // 0xf480020f
51653                                 if (((instr & 0xc00) == 0xc00) ||
51654                                     ((instr & 0x810) == 0x10) ||
51655                                     ((instr & 0xc30) == 0x810) ||
51656                                     ((instr & 0xc30) == 0x820) ||
51657                                     ((instr & 0xc30) == 0x830)) {
51658                                   UnallocatedA32(instr);
51659                                   return;
51660                                 }
51661                                 DataType dt =
51662                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51663                                 if (dt.Is(kDataTypeValueInvalid)) {
51664                                   UnallocatedA32(instr);
51665                                   return;
51666                                 }
51667                                 DecodeNeon decode_neon =
51668                                     Index_1_Decode((instr >> 4) & 0xf, dt);
51669                                 if (!decode_neon.IsValid()) {
51670                                   UnallocatedA32(instr);
51671                                   return;
51672                                 }
51673                                 int lane = decode_neon.GetLane();
51674                                 SpacingType spacing = decode_neon.GetSpacing();
51675                                 unsigned first =
51676                                     ExtractDRegister(instr, 22, 12);
51677                                 unsigned length = 3;
51678                                 unsigned last =
51679                                     first +
51680                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51681                                 unsigned rn = (instr >> 16) & 0xf;
51682                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
51683                                 vst3(al,
51684                                      dt,
51685                                      NeonRegisterList(DRegister(first),
51686                                                       DRegister(last),
51687                                                       spacing,
51688                                                       lane),
51689                                      MemOperand(Register(rn), Offset));
51690                                 break;
51691                               }
51692                             }
51693                             break;
51694                           }
51695                           default: {
51696                             if (((instr & 0xc00) == 0xc00) ||
51697                                 ((instr & 0xd) == 0xd) ||
51698                                 ((instr & 0x810) == 0x10) ||
51699                                 ((instr & 0xc30) == 0x810) ||
51700                                 ((instr & 0xc30) == 0x820) ||
51701                                 ((instr & 0xc30) == 0x830)) {
51702                               UnallocatedA32(instr);
51703                               return;
51704                             }
51705                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51706                             if (dt.Is(kDataTypeValueInvalid)) {
51707                               UnallocatedA32(instr);
51708                               return;
51709                             }
51710                             DecodeNeon decode_neon =
51711                                 Index_1_Decode((instr >> 4) & 0xf, dt);
51712                             if (!decode_neon.IsValid()) {
51713                               UnallocatedA32(instr);
51714                               return;
51715                             }
51716                             int lane = decode_neon.GetLane();
51717                             SpacingType spacing = decode_neon.GetSpacing();
51718                             unsigned first = ExtractDRegister(instr, 22, 12);
51719                             unsigned length = 3;
51720                             unsigned last =
51721                                 first +
51722                                 (length - 1) * (spacing == kSingle ? 1 : 2);
51723                             unsigned rn = (instr >> 16) & 0xf;
51724                             Sign sign(plus);
51725                             unsigned rm = instr & 0xf;
51726                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
51727                             vst3(al,
51728                                  dt,
51729                                  NeonRegisterList(DRegister(first),
51730                                                   DRegister(last),
51731                                                   spacing,
51732                                                   lane),
51733                                  MemOperand(Register(rn),
51734                                             sign,
51735                                             Register(rm),
51736                                             PostIndex));
51737                             break;
51738                           }
51739                         }
51740                         break;
51741                       }
51742                     }
51743                     break;
51744                   }
51745                   case 0x00000300: {
51746                     // 0xf4800300
51747                     switch (instr & 0x00000c00) {
51748                       case 0x00000c00: {
51749                         // 0xf4800f00
51750                         UnallocatedA32(instr);
51751                         break;
51752                       }
51753                       default: {
51754                         switch (instr & 0x0000000d) {
51755                           case 0x0000000d: {
51756                             // 0xf480030d
51757                             switch (instr & 0x00000002) {
51758                               case 0x00000000: {
51759                                 // 0xf480030d
51760                                 if (((instr & 0xc00) == 0xc00)) {
51761                                   UnallocatedA32(instr);
51762                                   return;
51763                                 }
51764                                 DataType dt =
51765                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51766                                 if (dt.Is(kDataTypeValueInvalid)) {
51767                                   UnallocatedA32(instr);
51768                                   return;
51769                                 }
51770                                 DecodeNeonAndAlign decode_neon =
51771                                     Align_index_align_3_Decode((instr >> 4) &
51772                                                                    0xf,
51773                                                                dt);
51774                                 if (!decode_neon.IsValid()) {
51775                                   UnallocatedA32(instr);
51776                                   return;
51777                                 }
51778                                 Alignment align = decode_neon.GetAlign();
51779                                 int lane = decode_neon.GetLane();
51780                                 SpacingType spacing = decode_neon.GetSpacing();
51781                                 unsigned first =
51782                                     ExtractDRegister(instr, 22, 12);
51783                                 unsigned length = 4;
51784                                 unsigned last =
51785                                     first +
51786                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51787                                 unsigned rn = (instr >> 16) & 0xf;
51788                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51789                                 vst4(al,
51790                                      dt,
51791                                      NeonRegisterList(DRegister(first),
51792                                                       DRegister(last),
51793                                                       spacing,
51794                                                       lane),
51795                                      AlignedMemOperand(Register(rn),
51796                                                        align,
51797                                                        PostIndex));
51798                                 break;
51799                               }
51800                               case 0x00000002: {
51801                                 // 0xf480030f
51802                                 if (((instr & 0xc00) == 0xc00)) {
51803                                   UnallocatedA32(instr);
51804                                   return;
51805                                 }
51806                                 DataType dt =
51807                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51808                                 if (dt.Is(kDataTypeValueInvalid)) {
51809                                   UnallocatedA32(instr);
51810                                   return;
51811                                 }
51812                                 DecodeNeonAndAlign decode_neon =
51813                                     Align_index_align_3_Decode((instr >> 4) &
51814                                                                    0xf,
51815                                                                dt);
51816                                 if (!decode_neon.IsValid()) {
51817                                   UnallocatedA32(instr);
51818                                   return;
51819                                 }
51820                                 Alignment align = decode_neon.GetAlign();
51821                                 int lane = decode_neon.GetLane();
51822                                 SpacingType spacing = decode_neon.GetSpacing();
51823                                 unsigned first =
51824                                     ExtractDRegister(instr, 22, 12);
51825                                 unsigned length = 4;
51826                                 unsigned last =
51827                                     first +
51828                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51829                                 unsigned rn = (instr >> 16) & 0xf;
51830                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51831                                 vst4(al,
51832                                      dt,
51833                                      NeonRegisterList(DRegister(first),
51834                                                       DRegister(last),
51835                                                       spacing,
51836                                                       lane),
51837                                      AlignedMemOperand(Register(rn),
51838                                                        align,
51839                                                        Offset));
51840                                 break;
51841                               }
51842                             }
51843                             break;
51844                           }
51845                           default: {
51846                             if (((instr & 0xc00) == 0xc00) ||
51847                                 ((instr & 0xd) == 0xd)) {
51848                               UnallocatedA32(instr);
51849                               return;
51850                             }
51851                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51852                             if (dt.Is(kDataTypeValueInvalid)) {
51853                               UnallocatedA32(instr);
51854                               return;
51855                             }
51856                             DecodeNeonAndAlign decode_neon =
51857                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
51858                                                            dt);
51859                             if (!decode_neon.IsValid()) {
51860                               UnallocatedA32(instr);
51861                               return;
51862                             }
51863                             Alignment align = decode_neon.GetAlign();
51864                             int lane = decode_neon.GetLane();
51865                             SpacingType spacing = decode_neon.GetSpacing();
51866                             unsigned first = ExtractDRegister(instr, 22, 12);
51867                             unsigned length = 4;
51868                             unsigned last =
51869                                 first +
51870                                 (length - 1) * (spacing == kSingle ? 1 : 2);
51871                             unsigned rn = (instr >> 16) & 0xf;
51872                             unsigned rm = instr & 0xf;
51873                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51874                             vst4(al,
51875                                  dt,
51876                                  NeonRegisterList(DRegister(first),
51877                                                   DRegister(last),
51878                                                   spacing,
51879                                                   lane),
51880                                  AlignedMemOperand(Register(rn),
51881                                                    align,
51882                                                    Register(rm),
51883                                                    PostIndex));
51884                             break;
51885                           }
51886                         }
51887                         break;
51888                       }
51889                     }
51890                     break;
51891                   }
51892                 }
51893                 break;
51894               }
51895             }
51896             break;
51897           }
51898           case 0x00100000: {
51899             // 0xf4100000
51900             switch (instr & 0x00400000) {
51901               case 0x00400000: {
51902                 // 0xf4500000
51903                 switch (instr & 0x000f0000) {
51904                   case 0x000f0000: {
51905                     // 0xf45f0000
51906                     uint32_t U = (instr >> 23) & 0x1;
51907                     int32_t imm = instr & 0xfff;
51908                     if (U == 0) imm = -imm;
51909                     bool minus_zero = (imm == 0) && (U == 0);
51910                     Location location(imm, kA32PcDelta);
51911                     // PLI{<c>}{<q>} <label> ; A1
51912                     if (minus_zero) {
51913                       pli(al, MemOperand(pc, minus, 0));
51914                     } else {
51915                       pli(al, &location);
51916                     }
51917                     if (((instr & 0xff7ff000) != 0xf45ff000)) {
51918                       UnpredictableA32(instr);
51919                     }
51920                     break;
51921                   }
51922                   default: {
51923                     if (((instr & 0xf0000) == 0xf0000)) {
51924                       UnallocatedA32(instr);
51925                       return;
51926                     }
51927                     unsigned rn = (instr >> 16) & 0xf;
51928                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
51929                     int32_t offset = instr & 0xfff;
51930                     // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1
51931                     pli(al, MemOperand(Register(rn), sign, offset, Offset));
51932                     if (((instr & 0xff70f000) != 0xf450f000)) {
51933                       UnpredictableA32(instr);
51934                     }
51935                     break;
51936                   }
51937                 }
51938                 break;
51939               }
51940               default:
51941                 UnallocatedA32(instr);
51942                 break;
51943             }
51944             break;
51945           }
51946           case 0x00200000: {
51947             // 0xf4200000
51948             switch (instr & 0x00800000) {
51949               case 0x00000000: {
51950                 // 0xf4200000
51951                 switch (instr & 0x0000000d) {
51952                   case 0x0000000d: {
51953                     // 0xf420000d
51954                     switch (instr & 0x00000002) {
51955                       case 0x00000000: {
51956                         // 0xf420000d
51957                         switch (instr & 0x00000f00) {
51958                           case 0x00000000: {
51959                             // 0xf420000d
51960                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51961                             if (dt.Is(kDataTypeValueInvalid)) {
51962                               UnallocatedA32(instr);
51963                               return;
51964                             }
51965                             Alignment align =
51966                                 Align_align_4_Decode((instr >> 4) & 0x3);
51967                             if (dt.Is(kDataTypeValueInvalid) ||
51968                                 align.Is(kBadAlignment)) {
51969                               UnallocatedA32(instr);
51970                               return;
51971                             }
51972                             unsigned first = ExtractDRegister(instr, 22, 12);
51973                             unsigned length;
51974                             SpacingType spacing;
51975                             switch ((instr >> 8) & 0xf) {
51976                               default:
51977                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
51978                               case 0x0:
51979                                 length = 4;
51980                                 spacing = kSingle;
51981                                 break;
51982                               case 0x1:
51983                                 length = 4;
51984                                 spacing = kDouble;
51985                                 break;
51986                             }
51987                             unsigned last =
51988                                 first +
51989                                 (length - 1) * (spacing == kSingle ? 1 : 2);
51990                             TransferType transfer = kMultipleLanes;
51991                             unsigned rn = (instr >> 16) & 0xf;
51992                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51993                             vld4(al,
51994                                  dt,
51995                                  NeonRegisterList(DRegister(first),
51996                                                   DRegister(last),
51997                                                   spacing,
51998                                                   transfer),
51999                                  AlignedMemOperand(Register(rn),
52000                                                    align,
52001                                                    PostIndex));
52002                             break;
52003                           }
52004                           case 0x00000100: {
52005                             // 0xf420010d
52006                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52007                             if (dt.Is(kDataTypeValueInvalid)) {
52008                               UnallocatedA32(instr);
52009                               return;
52010                             }
52011                             Alignment align =
52012                                 Align_align_4_Decode((instr >> 4) & 0x3);
52013                             if (dt.Is(kDataTypeValueInvalid) ||
52014                                 align.Is(kBadAlignment)) {
52015                               UnallocatedA32(instr);
52016                               return;
52017                             }
52018                             unsigned first = ExtractDRegister(instr, 22, 12);
52019                             unsigned length;
52020                             SpacingType spacing;
52021                             switch ((instr >> 8) & 0xf) {
52022                               default:
52023                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52024                               case 0x0:
52025                                 length = 4;
52026                                 spacing = kSingle;
52027                                 break;
52028                               case 0x1:
52029                                 length = 4;
52030                                 spacing = kDouble;
52031                                 break;
52032                             }
52033                             unsigned last =
52034                                 first +
52035                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52036                             TransferType transfer = kMultipleLanes;
52037                             unsigned rn = (instr >> 16) & 0xf;
52038                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52039                             vld4(al,
52040                                  dt,
52041                                  NeonRegisterList(DRegister(first),
52042                                                   DRegister(last),
52043                                                   spacing,
52044                                                   transfer),
52045                                  AlignedMemOperand(Register(rn),
52046                                                    align,
52047                                                    PostIndex));
52048                             break;
52049                           }
52050                           case 0x00000200: {
52051                             // 0xf420020d
52052                             if (((instr & 0xe20) == 0x620) ||
52053                                 ((instr & 0xf30) == 0xa30)) {
52054                               UnallocatedA32(instr);
52055                               return;
52056                             }
52057                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52058                             if (dt.Is(kDataTypeValueInvalid)) {
52059                               UnallocatedA32(instr);
52060                               return;
52061                             }
52062                             Alignment align =
52063                                 Align_align_1_Decode((instr >> 4) & 0x3);
52064                             if (dt.Is(kDataTypeValueInvalid) ||
52065                                 align.Is(kBadAlignment)) {
52066                               UnallocatedA32(instr);
52067                               return;
52068                             }
52069                             unsigned first = ExtractDRegister(instr, 22, 12);
52070                             unsigned length;
52071                             SpacingType spacing = kSingle;
52072                             switch ((instr >> 8) & 0xf) {
52073                               default:
52074                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52075                               case 0x7:
52076                                 length = 1;
52077                                 break;
52078                               case 0xa:
52079                                 length = 2;
52080                                 break;
52081                               case 0x6:
52082                                 length = 3;
52083                                 break;
52084                               case 0x2:
52085                                 length = 4;
52086                                 break;
52087                             }
52088                             unsigned last = first + length - 1;
52089                             TransferType transfer = kMultipleLanes;
52090                             unsigned rn = (instr >> 16) & 0xf;
52091                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52092                             vld1(al,
52093                                  dt,
52094                                  NeonRegisterList(DRegister(first),
52095                                                   DRegister(last),
52096                                                   spacing,
52097                                                   transfer),
52098                                  AlignedMemOperand(Register(rn),
52099                                                    align,
52100                                                    PostIndex));
52101                             break;
52102                           }
52103                           case 0x00000300: {
52104                             // 0xf420030d
52105                             if (((instr & 0xe30) == 0x830)) {
52106                               UnallocatedA32(instr);
52107                               return;
52108                             }
52109                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52110                             if (dt.Is(kDataTypeValueInvalid)) {
52111                               UnallocatedA32(instr);
52112                               return;
52113                             }
52114                             Alignment align =
52115                                 Align_align_2_Decode((instr >> 4) & 0x3);
52116                             if (dt.Is(kDataTypeValueInvalid) ||
52117                                 align.Is(kBadAlignment)) {
52118                               UnallocatedA32(instr);
52119                               return;
52120                             }
52121                             unsigned first = ExtractDRegister(instr, 22, 12);
52122                             unsigned length;
52123                             SpacingType spacing;
52124                             switch ((instr >> 8) & 0xf) {
52125                               default:
52126                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52127                               case 0x8:
52128                                 length = 2;
52129                                 spacing = kSingle;
52130                                 break;
52131                               case 0x9:
52132                                 length = 2;
52133                                 spacing = kDouble;
52134                                 break;
52135                               case 0x3:
52136                                 length = 4;
52137                                 spacing = kSingle;
52138                                 break;
52139                             }
52140                             unsigned last =
52141                                 first +
52142                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52143                             TransferType transfer = kMultipleLanes;
52144                             unsigned rn = (instr >> 16) & 0xf;
52145                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52146                             vld2(al,
52147                                  dt,
52148                                  NeonRegisterList(DRegister(first),
52149                                                   DRegister(last),
52150                                                   spacing,
52151                                                   transfer),
52152                                  AlignedMemOperand(Register(rn),
52153                                                    align,
52154                                                    PostIndex));
52155                             break;
52156                           }
52157                           case 0x00000400: {
52158                             // 0xf420040d
52159                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52160                             if (dt.Is(kDataTypeValueInvalid)) {
52161                               UnallocatedA32(instr);
52162                               return;
52163                             }
52164                             Alignment align =
52165                                 Align_align_3_Decode((instr >> 4) & 0x3);
52166                             if (dt.Is(kDataTypeValueInvalid) ||
52167                                 align.Is(kBadAlignment)) {
52168                               UnallocatedA32(instr);
52169                               return;
52170                             }
52171                             unsigned first = ExtractDRegister(instr, 22, 12);
52172                             unsigned length;
52173                             SpacingType spacing;
52174                             switch ((instr >> 8) & 0xf) {
52175                               default:
52176                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52177                               case 0x4:
52178                                 length = 3;
52179                                 spacing = kSingle;
52180                                 break;
52181                               case 0x5:
52182                                 length = 3;
52183                                 spacing = kDouble;
52184                                 break;
52185                             }
52186                             unsigned last =
52187                                 first +
52188                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52189                             TransferType transfer = kMultipleLanes;
52190                             unsigned rn = (instr >> 16) & 0xf;
52191                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52192                             vld3(al,
52193                                  dt,
52194                                  NeonRegisterList(DRegister(first),
52195                                                   DRegister(last),
52196                                                   spacing,
52197                                                   transfer),
52198                                  AlignedMemOperand(Register(rn),
52199                                                    align,
52200                                                    PostIndex));
52201                             break;
52202                           }
52203                           case 0x00000500: {
52204                             // 0xf420050d
52205                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52206                             if (dt.Is(kDataTypeValueInvalid)) {
52207                               UnallocatedA32(instr);
52208                               return;
52209                             }
52210                             Alignment align =
52211                                 Align_align_3_Decode((instr >> 4) & 0x3);
52212                             if (dt.Is(kDataTypeValueInvalid) ||
52213                                 align.Is(kBadAlignment)) {
52214                               UnallocatedA32(instr);
52215                               return;
52216                             }
52217                             unsigned first = ExtractDRegister(instr, 22, 12);
52218                             unsigned length;
52219                             SpacingType spacing;
52220                             switch ((instr >> 8) & 0xf) {
52221                               default:
52222                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52223                               case 0x4:
52224                                 length = 3;
52225                                 spacing = kSingle;
52226                                 break;
52227                               case 0x5:
52228                                 length = 3;
52229                                 spacing = kDouble;
52230                                 break;
52231                             }
52232                             unsigned last =
52233                                 first +
52234                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52235                             TransferType transfer = kMultipleLanes;
52236                             unsigned rn = (instr >> 16) & 0xf;
52237                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52238                             vld3(al,
52239                                  dt,
52240                                  NeonRegisterList(DRegister(first),
52241                                                   DRegister(last),
52242                                                   spacing,
52243                                                   transfer),
52244                                  AlignedMemOperand(Register(rn),
52245                                                    align,
52246                                                    PostIndex));
52247                             break;
52248                           }
52249                           case 0x00000600: {
52250                             // 0xf420060d
52251                             if (((instr & 0xe20) == 0x620) ||
52252                                 ((instr & 0xf30) == 0xa30)) {
52253                               UnallocatedA32(instr);
52254                               return;
52255                             }
52256                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52257                             if (dt.Is(kDataTypeValueInvalid)) {
52258                               UnallocatedA32(instr);
52259                               return;
52260                             }
52261                             Alignment align =
52262                                 Align_align_1_Decode((instr >> 4) & 0x3);
52263                             if (dt.Is(kDataTypeValueInvalid) ||
52264                                 align.Is(kBadAlignment)) {
52265                               UnallocatedA32(instr);
52266                               return;
52267                             }
52268                             unsigned first = ExtractDRegister(instr, 22, 12);
52269                             unsigned length;
52270                             SpacingType spacing = kSingle;
52271                             switch ((instr >> 8) & 0xf) {
52272                               default:
52273                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52274                               case 0x7:
52275                                 length = 1;
52276                                 break;
52277                               case 0xa:
52278                                 length = 2;
52279                                 break;
52280                               case 0x6:
52281                                 length = 3;
52282                                 break;
52283                               case 0x2:
52284                                 length = 4;
52285                                 break;
52286                             }
52287                             unsigned last = first + length - 1;
52288                             TransferType transfer = kMultipleLanes;
52289                             unsigned rn = (instr >> 16) & 0xf;
52290                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52291                             vld1(al,
52292                                  dt,
52293                                  NeonRegisterList(DRegister(first),
52294                                                   DRegister(last),
52295                                                   spacing,
52296                                                   transfer),
52297                                  AlignedMemOperand(Register(rn),
52298                                                    align,
52299                                                    PostIndex));
52300                             break;
52301                           }
52302                           case 0x00000700: {
52303                             // 0xf420070d
52304                             if (((instr & 0xe20) == 0x620) ||
52305                                 ((instr & 0xf30) == 0xa30)) {
52306                               UnallocatedA32(instr);
52307                               return;
52308                             }
52309                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52310                             if (dt.Is(kDataTypeValueInvalid)) {
52311                               UnallocatedA32(instr);
52312                               return;
52313                             }
52314                             Alignment align =
52315                                 Align_align_1_Decode((instr >> 4) & 0x3);
52316                             if (dt.Is(kDataTypeValueInvalid) ||
52317                                 align.Is(kBadAlignment)) {
52318                               UnallocatedA32(instr);
52319                               return;
52320                             }
52321                             unsigned first = ExtractDRegister(instr, 22, 12);
52322                             unsigned length;
52323                             SpacingType spacing = kSingle;
52324                             switch ((instr >> 8) & 0xf) {
52325                               default:
52326                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52327                               case 0x7:
52328                                 length = 1;
52329                                 break;
52330                               case 0xa:
52331                                 length = 2;
52332                                 break;
52333                               case 0x6:
52334                                 length = 3;
52335                                 break;
52336                               case 0x2:
52337                                 length = 4;
52338                                 break;
52339                             }
52340                             unsigned last = first + length - 1;
52341                             TransferType transfer = kMultipleLanes;
52342                             unsigned rn = (instr >> 16) & 0xf;
52343                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52344                             vld1(al,
52345                                  dt,
52346                                  NeonRegisterList(DRegister(first),
52347                                                   DRegister(last),
52348                                                   spacing,
52349                                                   transfer),
52350                                  AlignedMemOperand(Register(rn),
52351                                                    align,
52352                                                    PostIndex));
52353                             break;
52354                           }
52355                           case 0x00000800: {
52356                             // 0xf420080d
52357                             if (((instr & 0xe30) == 0x830)) {
52358                               UnallocatedA32(instr);
52359                               return;
52360                             }
52361                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52362                             if (dt.Is(kDataTypeValueInvalid)) {
52363                               UnallocatedA32(instr);
52364                               return;
52365                             }
52366                             Alignment align =
52367                                 Align_align_2_Decode((instr >> 4) & 0x3);
52368                             if (dt.Is(kDataTypeValueInvalid) ||
52369                                 align.Is(kBadAlignment)) {
52370                               UnallocatedA32(instr);
52371                               return;
52372                             }
52373                             unsigned first = ExtractDRegister(instr, 22, 12);
52374                             unsigned length;
52375                             SpacingType spacing;
52376                             switch ((instr >> 8) & 0xf) {
52377                               default:
52378                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52379                               case 0x8:
52380                                 length = 2;
52381                                 spacing = kSingle;
52382                                 break;
52383                               case 0x9:
52384                                 length = 2;
52385                                 spacing = kDouble;
52386                                 break;
52387                               case 0x3:
52388                                 length = 4;
52389                                 spacing = kSingle;
52390                                 break;
52391                             }
52392                             unsigned last =
52393                                 first +
52394                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52395                             TransferType transfer = kMultipleLanes;
52396                             unsigned rn = (instr >> 16) & 0xf;
52397                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52398                             vld2(al,
52399                                  dt,
52400                                  NeonRegisterList(DRegister(first),
52401                                                   DRegister(last),
52402                                                   spacing,
52403                                                   transfer),
52404                                  AlignedMemOperand(Register(rn),
52405                                                    align,
52406                                                    PostIndex));
52407                             break;
52408                           }
52409                           case 0x00000900: {
52410                             // 0xf420090d
52411                             if (((instr & 0xe30) == 0x830)) {
52412                               UnallocatedA32(instr);
52413                               return;
52414                             }
52415                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52416                             if (dt.Is(kDataTypeValueInvalid)) {
52417                               UnallocatedA32(instr);
52418                               return;
52419                             }
52420                             Alignment align =
52421                                 Align_align_2_Decode((instr >> 4) & 0x3);
52422                             if (dt.Is(kDataTypeValueInvalid) ||
52423                                 align.Is(kBadAlignment)) {
52424                               UnallocatedA32(instr);
52425                               return;
52426                             }
52427                             unsigned first = ExtractDRegister(instr, 22, 12);
52428                             unsigned length;
52429                             SpacingType spacing;
52430                             switch ((instr >> 8) & 0xf) {
52431                               default:
52432                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52433                               case 0x8:
52434                                 length = 2;
52435                                 spacing = kSingle;
52436                                 break;
52437                               case 0x9:
52438                                 length = 2;
52439                                 spacing = kDouble;
52440                                 break;
52441                               case 0x3:
52442                                 length = 4;
52443                                 spacing = kSingle;
52444                                 break;
52445                             }
52446                             unsigned last =
52447                                 first +
52448                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52449                             TransferType transfer = kMultipleLanes;
52450                             unsigned rn = (instr >> 16) & 0xf;
52451                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52452                             vld2(al,
52453                                  dt,
52454                                  NeonRegisterList(DRegister(first),
52455                                                   DRegister(last),
52456                                                   spacing,
52457                                                   transfer),
52458                                  AlignedMemOperand(Register(rn),
52459                                                    align,
52460                                                    PostIndex));
52461                             break;
52462                           }
52463                           case 0x00000a00: {
52464                             // 0xf4200a0d
52465                             if (((instr & 0xe20) == 0x620) ||
52466                                 ((instr & 0xf30) == 0xa30)) {
52467                               UnallocatedA32(instr);
52468                               return;
52469                             }
52470                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52471                             if (dt.Is(kDataTypeValueInvalid)) {
52472                               UnallocatedA32(instr);
52473                               return;
52474                             }
52475                             Alignment align =
52476                                 Align_align_1_Decode((instr >> 4) & 0x3);
52477                             if (dt.Is(kDataTypeValueInvalid) ||
52478                                 align.Is(kBadAlignment)) {
52479                               UnallocatedA32(instr);
52480                               return;
52481                             }
52482                             unsigned first = ExtractDRegister(instr, 22, 12);
52483                             unsigned length;
52484                             SpacingType spacing = kSingle;
52485                             switch ((instr >> 8) & 0xf) {
52486                               default:
52487                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52488                               case 0x7:
52489                                 length = 1;
52490                                 break;
52491                               case 0xa:
52492                                 length = 2;
52493                                 break;
52494                               case 0x6:
52495                                 length = 3;
52496                                 break;
52497                               case 0x2:
52498                                 length = 4;
52499                                 break;
52500                             }
52501                             unsigned last = first + length - 1;
52502                             TransferType transfer = kMultipleLanes;
52503                             unsigned rn = (instr >> 16) & 0xf;
52504                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52505                             vld1(al,
52506                                  dt,
52507                                  NeonRegisterList(DRegister(first),
52508                                                   DRegister(last),
52509                                                   spacing,
52510                                                   transfer),
52511                                  AlignedMemOperand(Register(rn),
52512                                                    align,
52513                                                    PostIndex));
52514                             break;
52515                           }
52516                           default:
52517                             UnallocatedA32(instr);
52518                             break;
52519                         }
52520                         break;
52521                       }
52522                       case 0x00000002: {
52523                         // 0xf420000f
52524                         switch (instr & 0x00000f00) {
52525                           case 0x00000000: {
52526                             // 0xf420000d
52527                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52528                             if (dt.Is(kDataTypeValueInvalid)) {
52529                               UnallocatedA32(instr);
52530                               return;
52531                             }
52532                             Alignment align =
52533                                 Align_align_4_Decode((instr >> 4) & 0x3);
52534                             if (dt.Is(kDataTypeValueInvalid) ||
52535                                 align.Is(kBadAlignment)) {
52536                               UnallocatedA32(instr);
52537                               return;
52538                             }
52539                             unsigned first = ExtractDRegister(instr, 22, 12);
52540                             unsigned length;
52541                             SpacingType spacing;
52542                             switch ((instr >> 8) & 0xf) {
52543                               default:
52544                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52545                               case 0x0:
52546                                 length = 4;
52547                                 spacing = kSingle;
52548                                 break;
52549                               case 0x1:
52550                                 length = 4;
52551                                 spacing = kDouble;
52552                                 break;
52553                             }
52554                             unsigned last =
52555                                 first +
52556                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52557                             TransferType transfer = kMultipleLanes;
52558                             unsigned rn = (instr >> 16) & 0xf;
52559                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52560                             vld4(al,
52561                                  dt,
52562                                  NeonRegisterList(DRegister(first),
52563                                                   DRegister(last),
52564                                                   spacing,
52565                                                   transfer),
52566                                  AlignedMemOperand(Register(rn),
52567                                                    align,
52568                                                    Offset));
52569                             break;
52570                           }
52571                           case 0x00000100: {
52572                             // 0xf420010d
52573                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52574                             if (dt.Is(kDataTypeValueInvalid)) {
52575                               UnallocatedA32(instr);
52576                               return;
52577                             }
52578                             Alignment align =
52579                                 Align_align_4_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;
52588                             switch ((instr >> 8) & 0xf) {
52589                               default:
52590                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52591                               case 0x0:
52592                                 length = 4;
52593                                 spacing = kSingle;
52594                                 break;
52595                               case 0x1:
52596                                 length = 4;
52597                                 spacing = kDouble;
52598                                 break;
52599                             }
52600                             unsigned last =
52601                                 first +
52602                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52603                             TransferType transfer = kMultipleLanes;
52604                             unsigned rn = (instr >> 16) & 0xf;
52605                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52606                             vld4(al,
52607                                  dt,
52608                                  NeonRegisterList(DRegister(first),
52609                                                   DRegister(last),
52610                                                   spacing,
52611                                                   transfer),
52612                                  AlignedMemOperand(Register(rn),
52613                                                    align,
52614                                                    Offset));
52615                             break;
52616                           }
52617                           case 0x00000200: {
52618                             // 0xf420020d
52619                             if (((instr & 0xe20) == 0x620) ||
52620                                 ((instr & 0xf30) == 0xa30)) {
52621                               UnallocatedA32(instr);
52622                               return;
52623                             }
52624                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52625                             if (dt.Is(kDataTypeValueInvalid)) {
52626                               UnallocatedA32(instr);
52627                               return;
52628                             }
52629                             Alignment align =
52630                                 Align_align_1_Decode((instr >> 4) & 0x3);
52631                             if (dt.Is(kDataTypeValueInvalid) ||
52632                                 align.Is(kBadAlignment)) {
52633                               UnallocatedA32(instr);
52634                               return;
52635                             }
52636                             unsigned first = ExtractDRegister(instr, 22, 12);
52637                             unsigned length;
52638                             SpacingType spacing = kSingle;
52639                             switch ((instr >> 8) & 0xf) {
52640                               default:
52641                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52642                               case 0x7:
52643                                 length = 1;
52644                                 break;
52645                               case 0xa:
52646                                 length = 2;
52647                                 break;
52648                               case 0x6:
52649                                 length = 3;
52650                                 break;
52651                               case 0x2:
52652                                 length = 4;
52653                                 break;
52654                             }
52655                             unsigned last = first + length - 1;
52656                             TransferType transfer = kMultipleLanes;
52657                             unsigned rn = (instr >> 16) & 0xf;
52658                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52659                             vld1(al,
52660                                  dt,
52661                                  NeonRegisterList(DRegister(first),
52662                                                   DRegister(last),
52663                                                   spacing,
52664                                                   transfer),
52665                                  AlignedMemOperand(Register(rn),
52666                                                    align,
52667                                                    Offset));
52668                             break;
52669                           }
52670                           case 0x00000300: {
52671                             // 0xf420030d
52672                             if (((instr & 0xe30) == 0x830)) {
52673                               UnallocatedA32(instr);
52674                               return;
52675                             }
52676                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52677                             if (dt.Is(kDataTypeValueInvalid)) {
52678                               UnallocatedA32(instr);
52679                               return;
52680                             }
52681                             Alignment align =
52682                                 Align_align_2_Decode((instr >> 4) & 0x3);
52683                             if (dt.Is(kDataTypeValueInvalid) ||
52684                                 align.Is(kBadAlignment)) {
52685                               UnallocatedA32(instr);
52686                               return;
52687                             }
52688                             unsigned first = ExtractDRegister(instr, 22, 12);
52689                             unsigned length;
52690                             SpacingType spacing;
52691                             switch ((instr >> 8) & 0xf) {
52692                               default:
52693                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52694                               case 0x8:
52695                                 length = 2;
52696                                 spacing = kSingle;
52697                                 break;
52698                               case 0x9:
52699                                 length = 2;
52700                                 spacing = kDouble;
52701                                 break;
52702                               case 0x3:
52703                                 length = 4;
52704                                 spacing = kSingle;
52705                                 break;
52706                             }
52707                             unsigned last =
52708                                 first +
52709                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52710                             TransferType transfer = kMultipleLanes;
52711                             unsigned rn = (instr >> 16) & 0xf;
52712                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52713                             vld2(al,
52714                                  dt,
52715                                  NeonRegisterList(DRegister(first),
52716                                                   DRegister(last),
52717                                                   spacing,
52718                                                   transfer),
52719                                  AlignedMemOperand(Register(rn),
52720                                                    align,
52721                                                    Offset));
52722                             break;
52723                           }
52724                           case 0x00000400: {
52725                             // 0xf420040d
52726                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52727                             if (dt.Is(kDataTypeValueInvalid)) {
52728                               UnallocatedA32(instr);
52729                               return;
52730                             }
52731                             Alignment align =
52732                                 Align_align_3_Decode((instr >> 4) & 0x3);
52733                             if (dt.Is(kDataTypeValueInvalid) ||
52734                                 align.Is(kBadAlignment)) {
52735                               UnallocatedA32(instr);
52736                               return;
52737                             }
52738                             unsigned first = ExtractDRegister(instr, 22, 12);
52739                             unsigned length;
52740                             SpacingType spacing;
52741                             switch ((instr >> 8) & 0xf) {
52742                               default:
52743                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52744                               case 0x4:
52745                                 length = 3;
52746                                 spacing = kSingle;
52747                                 break;
52748                               case 0x5:
52749                                 length = 3;
52750                                 spacing = kDouble;
52751                                 break;
52752                             }
52753                             unsigned last =
52754                                 first +
52755                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52756                             TransferType transfer = kMultipleLanes;
52757                             unsigned rn = (instr >> 16) & 0xf;
52758                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52759                             vld3(al,
52760                                  dt,
52761                                  NeonRegisterList(DRegister(first),
52762                                                   DRegister(last),
52763                                                   spacing,
52764                                                   transfer),
52765                                  AlignedMemOperand(Register(rn),
52766                                                    align,
52767                                                    Offset));
52768                             break;
52769                           }
52770                           case 0x00000500: {
52771                             // 0xf420050d
52772                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52773                             if (dt.Is(kDataTypeValueInvalid)) {
52774                               UnallocatedA32(instr);
52775                               return;
52776                             }
52777                             Alignment align =
52778                                 Align_align_3_Decode((instr >> 4) & 0x3);
52779                             if (dt.Is(kDataTypeValueInvalid) ||
52780                                 align.Is(kBadAlignment)) {
52781                               UnallocatedA32(instr);
52782                               return;
52783                             }
52784                             unsigned first = ExtractDRegister(instr, 22, 12);
52785                             unsigned length;
52786                             SpacingType spacing;
52787                             switch ((instr >> 8) & 0xf) {
52788                               default:
52789                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52790                               case 0x4:
52791                                 length = 3;
52792                                 spacing = kSingle;
52793                                 break;
52794                               case 0x5:
52795                                 length = 3;
52796                                 spacing = kDouble;
52797                                 break;
52798                             }
52799                             unsigned last =
52800                                 first +
52801                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52802                             TransferType transfer = kMultipleLanes;
52803                             unsigned rn = (instr >> 16) & 0xf;
52804                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52805                             vld3(al,
52806                                  dt,
52807                                  NeonRegisterList(DRegister(first),
52808                                                   DRegister(last),
52809                                                   spacing,
52810                                                   transfer),
52811                                  AlignedMemOperand(Register(rn),
52812                                                    align,
52813                                                    Offset));
52814                             break;
52815                           }
52816                           case 0x00000600: {
52817                             // 0xf420060d
52818                             if (((instr & 0xe20) == 0x620) ||
52819                                 ((instr & 0xf30) == 0xa30)) {
52820                               UnallocatedA32(instr);
52821                               return;
52822                             }
52823                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52824                             if (dt.Is(kDataTypeValueInvalid)) {
52825                               UnallocatedA32(instr);
52826                               return;
52827                             }
52828                             Alignment align =
52829                                 Align_align_1_Decode((instr >> 4) & 0x3);
52830                             if (dt.Is(kDataTypeValueInvalid) ||
52831                                 align.Is(kBadAlignment)) {
52832                               UnallocatedA32(instr);
52833                               return;
52834                             }
52835                             unsigned first = ExtractDRegister(instr, 22, 12);
52836                             unsigned length;
52837                             SpacingType spacing = kSingle;
52838                             switch ((instr >> 8) & 0xf) {
52839                               default:
52840                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52841                               case 0x7:
52842                                 length = 1;
52843                                 break;
52844                               case 0xa:
52845                                 length = 2;
52846                                 break;
52847                               case 0x6:
52848                                 length = 3;
52849                                 break;
52850                               case 0x2:
52851                                 length = 4;
52852                                 break;
52853                             }
52854                             unsigned last = first + length - 1;
52855                             TransferType transfer = kMultipleLanes;
52856                             unsigned rn = (instr >> 16) & 0xf;
52857                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52858                             vld1(al,
52859                                  dt,
52860                                  NeonRegisterList(DRegister(first),
52861                                                   DRegister(last),
52862                                                   spacing,
52863                                                   transfer),
52864                                  AlignedMemOperand(Register(rn),
52865                                                    align,
52866                                                    Offset));
52867                             break;
52868                           }
52869                           case 0x00000700: {
52870                             // 0xf420070d
52871                             if (((instr & 0xe20) == 0x620) ||
52872                                 ((instr & 0xf30) == 0xa30)) {
52873                               UnallocatedA32(instr);
52874                               return;
52875                             }
52876                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52877                             if (dt.Is(kDataTypeValueInvalid)) {
52878                               UnallocatedA32(instr);
52879                               return;
52880                             }
52881                             Alignment align =
52882                                 Align_align_1_Decode((instr >> 4) & 0x3);
52883                             if (dt.Is(kDataTypeValueInvalid) ||
52884                                 align.Is(kBadAlignment)) {
52885                               UnallocatedA32(instr);
52886                               return;
52887                             }
52888                             unsigned first = ExtractDRegister(instr, 22, 12);
52889                             unsigned length;
52890                             SpacingType spacing = kSingle;
52891                             switch ((instr >> 8) & 0xf) {
52892                               default:
52893                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52894                               case 0x7:
52895                                 length = 1;
52896                                 break;
52897                               case 0xa:
52898                                 length = 2;
52899                                 break;
52900                               case 0x6:
52901                                 length = 3;
52902                                 break;
52903                               case 0x2:
52904                                 length = 4;
52905                                 break;
52906                             }
52907                             unsigned last = first + length - 1;
52908                             TransferType transfer = kMultipleLanes;
52909                             unsigned rn = (instr >> 16) & 0xf;
52910                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52911                             vld1(al,
52912                                  dt,
52913                                  NeonRegisterList(DRegister(first),
52914                                                   DRegister(last),
52915                                                   spacing,
52916                                                   transfer),
52917                                  AlignedMemOperand(Register(rn),
52918                                                    align,
52919                                                    Offset));
52920                             break;
52921                           }
52922                           case 0x00000800: {
52923                             // 0xf420080d
52924                             if (((instr & 0xe30) == 0x830)) {
52925                               UnallocatedA32(instr);
52926                               return;
52927                             }
52928                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52929                             if (dt.Is(kDataTypeValueInvalid)) {
52930                               UnallocatedA32(instr);
52931                               return;
52932                             }
52933                             Alignment align =
52934                                 Align_align_2_Decode((instr >> 4) & 0x3);
52935                             if (dt.Is(kDataTypeValueInvalid) ||
52936                                 align.Is(kBadAlignment)) {
52937                               UnallocatedA32(instr);
52938                               return;
52939                             }
52940                             unsigned first = ExtractDRegister(instr, 22, 12);
52941                             unsigned length;
52942                             SpacingType spacing;
52943                             switch ((instr >> 8) & 0xf) {
52944                               default:
52945                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52946                               case 0x8:
52947                                 length = 2;
52948                                 spacing = kSingle;
52949                                 break;
52950                               case 0x9:
52951                                 length = 2;
52952                                 spacing = kDouble;
52953                                 break;
52954                               case 0x3:
52955                                 length = 4;
52956                                 spacing = kSingle;
52957                                 break;
52958                             }
52959                             unsigned last =
52960                                 first +
52961                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52962                             TransferType transfer = kMultipleLanes;
52963                             unsigned rn = (instr >> 16) & 0xf;
52964                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52965                             vld2(al,
52966                                  dt,
52967                                  NeonRegisterList(DRegister(first),
52968                                                   DRegister(last),
52969                                                   spacing,
52970                                                   transfer),
52971                                  AlignedMemOperand(Register(rn),
52972                                                    align,
52973                                                    Offset));
52974                             break;
52975                           }
52976                           case 0x00000900: {
52977                             // 0xf420090d
52978                             if (((instr & 0xe30) == 0x830)) {
52979                               UnallocatedA32(instr);
52980                               return;
52981                             }
52982                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52983                             if (dt.Is(kDataTypeValueInvalid)) {
52984                               UnallocatedA32(instr);
52985                               return;
52986                             }
52987                             Alignment align =
52988                                 Align_align_2_Decode((instr >> 4) & 0x3);
52989                             if (dt.Is(kDataTypeValueInvalid) ||
52990                                 align.Is(kBadAlignment)) {
52991                               UnallocatedA32(instr);
52992                               return;
52993                             }
52994                             unsigned first = ExtractDRegister(instr, 22, 12);
52995                             unsigned length;
52996                             SpacingType spacing;
52997                             switch ((instr >> 8) & 0xf) {
52998                               default:
52999                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53000                               case 0x8:
53001                                 length = 2;
53002                                 spacing = kSingle;
53003                                 break;
53004                               case 0x9:
53005                                 length = 2;
53006                                 spacing = kDouble;
53007                                 break;
53008                               case 0x3:
53009                                 length = 4;
53010                                 spacing = kSingle;
53011                                 break;
53012                             }
53013                             unsigned last =
53014                                 first +
53015                                 (length - 1) * (spacing == kSingle ? 1 : 2);
53016                             TransferType transfer = kMultipleLanes;
53017                             unsigned rn = (instr >> 16) & 0xf;
53018                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53019                             vld2(al,
53020                                  dt,
53021                                  NeonRegisterList(DRegister(first),
53022                                                   DRegister(last),
53023                                                   spacing,
53024                                                   transfer),
53025                                  AlignedMemOperand(Register(rn),
53026                                                    align,
53027                                                    Offset));
53028                             break;
53029                           }
53030                           case 0x00000a00: {
53031                             // 0xf4200a0d
53032                             if (((instr & 0xe20) == 0x620) ||
53033                                 ((instr & 0xf30) == 0xa30)) {
53034                               UnallocatedA32(instr);
53035                               return;
53036                             }
53037                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53038                             if (dt.Is(kDataTypeValueInvalid)) {
53039                               UnallocatedA32(instr);
53040                               return;
53041                             }
53042                             Alignment align =
53043                                 Align_align_1_Decode((instr >> 4) & 0x3);
53044                             if (dt.Is(kDataTypeValueInvalid) ||
53045                                 align.Is(kBadAlignment)) {
53046                               UnallocatedA32(instr);
53047                               return;
53048                             }
53049                             unsigned first = ExtractDRegister(instr, 22, 12);
53050                             unsigned length;
53051                             SpacingType spacing = kSingle;
53052                             switch ((instr >> 8) & 0xf) {
53053                               default:
53054                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53055                               case 0x7:
53056                                 length = 1;
53057                                 break;
53058                               case 0xa:
53059                                 length = 2;
53060                                 break;
53061                               case 0x6:
53062                                 length = 3;
53063                                 break;
53064                               case 0x2:
53065                                 length = 4;
53066                                 break;
53067                             }
53068                             unsigned last = first + length - 1;
53069                             TransferType transfer = kMultipleLanes;
53070                             unsigned rn = (instr >> 16) & 0xf;
53071                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53072                             vld1(al,
53073                                  dt,
53074                                  NeonRegisterList(DRegister(first),
53075                                                   DRegister(last),
53076                                                   spacing,
53077                                                   transfer),
53078                                  AlignedMemOperand(Register(rn),
53079                                                    align,
53080                                                    Offset));
53081                             break;
53082                           }
53083                           default:
53084                             UnallocatedA32(instr);
53085                             break;
53086                         }
53087                         break;
53088                       }
53089                     }
53090                     break;
53091                   }
53092                   default: {
53093                     switch (instr & 0x00000f00) {
53094                       case 0x00000000: {
53095                         // 0xf4200000
53096                         if (((instr & 0xd) == 0xd)) {
53097                           UnallocatedA32(instr);
53098                           return;
53099                         }
53100                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53101                         if (dt.Is(kDataTypeValueInvalid)) {
53102                           UnallocatedA32(instr);
53103                           return;
53104                         }
53105                         Alignment align =
53106                             Align_align_4_Decode((instr >> 4) & 0x3);
53107                         if (dt.Is(kDataTypeValueInvalid) ||
53108                             align.Is(kBadAlignment)) {
53109                           UnallocatedA32(instr);
53110                           return;
53111                         }
53112                         unsigned first = ExtractDRegister(instr, 22, 12);
53113                         unsigned length;
53114                         SpacingType spacing;
53115                         switch ((instr >> 8) & 0xf) {
53116                           default:
53117                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53118                           case 0x0:
53119                             length = 4;
53120                             spacing = kSingle;
53121                             break;
53122                           case 0x1:
53123                             length = 4;
53124                             spacing = kDouble;
53125                             break;
53126                         }
53127                         unsigned last =
53128                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53129                         TransferType transfer = kMultipleLanes;
53130                         unsigned rn = (instr >> 16) & 0xf;
53131                         unsigned rm = instr & 0xf;
53132                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53133                         vld4(al,
53134                              dt,
53135                              NeonRegisterList(DRegister(first),
53136                                               DRegister(last),
53137                                               spacing,
53138                                               transfer),
53139                              AlignedMemOperand(Register(rn),
53140                                                align,
53141                                                Register(rm),
53142                                                PostIndex));
53143                         break;
53144                       }
53145                       case 0x00000100: {
53146                         // 0xf4200100
53147                         if (((instr & 0xd) == 0xd)) {
53148                           UnallocatedA32(instr);
53149                           return;
53150                         }
53151                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53152                         if (dt.Is(kDataTypeValueInvalid)) {
53153                           UnallocatedA32(instr);
53154                           return;
53155                         }
53156                         Alignment align =
53157                             Align_align_4_Decode((instr >> 4) & 0x3);
53158                         if (dt.Is(kDataTypeValueInvalid) ||
53159                             align.Is(kBadAlignment)) {
53160                           UnallocatedA32(instr);
53161                           return;
53162                         }
53163                         unsigned first = ExtractDRegister(instr, 22, 12);
53164                         unsigned length;
53165                         SpacingType spacing;
53166                         switch ((instr >> 8) & 0xf) {
53167                           default:
53168                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53169                           case 0x0:
53170                             length = 4;
53171                             spacing = kSingle;
53172                             break;
53173                           case 0x1:
53174                             length = 4;
53175                             spacing = kDouble;
53176                             break;
53177                         }
53178                         unsigned last =
53179                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53180                         TransferType transfer = kMultipleLanes;
53181                         unsigned rn = (instr >> 16) & 0xf;
53182                         unsigned rm = instr & 0xf;
53183                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53184                         vld4(al,
53185                              dt,
53186                              NeonRegisterList(DRegister(first),
53187                                               DRegister(last),
53188                                               spacing,
53189                                               transfer),
53190                              AlignedMemOperand(Register(rn),
53191                                                align,
53192                                                Register(rm),
53193                                                PostIndex));
53194                         break;
53195                       }
53196                       case 0x00000200: {
53197                         // 0xf4200200
53198                         if (((instr & 0xd) == 0xd) ||
53199                             ((instr & 0xe20) == 0x620) ||
53200                             ((instr & 0xf30) == 0xa30)) {
53201                           UnallocatedA32(instr);
53202                           return;
53203                         }
53204                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53205                         if (dt.Is(kDataTypeValueInvalid)) {
53206                           UnallocatedA32(instr);
53207                           return;
53208                         }
53209                         Alignment align =
53210                             Align_align_1_Decode((instr >> 4) & 0x3);
53211                         if (dt.Is(kDataTypeValueInvalid) ||
53212                             align.Is(kBadAlignment)) {
53213                           UnallocatedA32(instr);
53214                           return;
53215                         }
53216                         unsigned first = ExtractDRegister(instr, 22, 12);
53217                         unsigned length;
53218                         SpacingType spacing = kSingle;
53219                         switch ((instr >> 8) & 0xf) {
53220                           default:
53221                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53222                           case 0x7:
53223                             length = 1;
53224                             break;
53225                           case 0xa:
53226                             length = 2;
53227                             break;
53228                           case 0x6:
53229                             length = 3;
53230                             break;
53231                           case 0x2:
53232                             length = 4;
53233                             break;
53234                         }
53235                         unsigned last = first + length - 1;
53236                         TransferType transfer = kMultipleLanes;
53237                         unsigned rn = (instr >> 16) & 0xf;
53238                         unsigned rm = instr & 0xf;
53239                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53240                         vld1(al,
53241                              dt,
53242                              NeonRegisterList(DRegister(first),
53243                                               DRegister(last),
53244                                               spacing,
53245                                               transfer),
53246                              AlignedMemOperand(Register(rn),
53247                                                align,
53248                                                Register(rm),
53249                                                PostIndex));
53250                         break;
53251                       }
53252                       case 0x00000300: {
53253                         // 0xf4200300
53254                         if (((instr & 0xd) == 0xd) ||
53255                             ((instr & 0xe30) == 0x830)) {
53256                           UnallocatedA32(instr);
53257                           return;
53258                         }
53259                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53260                         if (dt.Is(kDataTypeValueInvalid)) {
53261                           UnallocatedA32(instr);
53262                           return;
53263                         }
53264                         Alignment align =
53265                             Align_align_2_Decode((instr >> 4) & 0x3);
53266                         if (dt.Is(kDataTypeValueInvalid) ||
53267                             align.Is(kBadAlignment)) {
53268                           UnallocatedA32(instr);
53269                           return;
53270                         }
53271                         unsigned first = ExtractDRegister(instr, 22, 12);
53272                         unsigned length;
53273                         SpacingType spacing;
53274                         switch ((instr >> 8) & 0xf) {
53275                           default:
53276                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53277                           case 0x8:
53278                             length = 2;
53279                             spacing = kSingle;
53280                             break;
53281                           case 0x9:
53282                             length = 2;
53283                             spacing = kDouble;
53284                             break;
53285                           case 0x3:
53286                             length = 4;
53287                             spacing = kSingle;
53288                             break;
53289                         }
53290                         unsigned last =
53291                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53292                         TransferType transfer = kMultipleLanes;
53293                         unsigned rn = (instr >> 16) & 0xf;
53294                         unsigned rm = instr & 0xf;
53295                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53296                         vld2(al,
53297                              dt,
53298                              NeonRegisterList(DRegister(first),
53299                                               DRegister(last),
53300                                               spacing,
53301                                               transfer),
53302                              AlignedMemOperand(Register(rn),
53303                                                align,
53304                                                Register(rm),
53305                                                PostIndex));
53306                         break;
53307                       }
53308                       case 0x00000400: {
53309                         // 0xf4200400
53310                         if (((instr & 0xd) == 0xd)) {
53311                           UnallocatedA32(instr);
53312                           return;
53313                         }
53314                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53315                         if (dt.Is(kDataTypeValueInvalid)) {
53316                           UnallocatedA32(instr);
53317                           return;
53318                         }
53319                         Alignment align =
53320                             Align_align_3_Decode((instr >> 4) & 0x3);
53321                         if (dt.Is(kDataTypeValueInvalid) ||
53322                             align.Is(kBadAlignment)) {
53323                           UnallocatedA32(instr);
53324                           return;
53325                         }
53326                         unsigned first = ExtractDRegister(instr, 22, 12);
53327                         unsigned length;
53328                         SpacingType spacing;
53329                         switch ((instr >> 8) & 0xf) {
53330                           default:
53331                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53332                           case 0x4:
53333                             length = 3;
53334                             spacing = kSingle;
53335                             break;
53336                           case 0x5:
53337                             length = 3;
53338                             spacing = kDouble;
53339                             break;
53340                         }
53341                         unsigned last =
53342                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53343                         TransferType transfer = kMultipleLanes;
53344                         unsigned rn = (instr >> 16) & 0xf;
53345                         unsigned rm = instr & 0xf;
53346                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53347                         vld3(al,
53348                              dt,
53349                              NeonRegisterList(DRegister(first),
53350                                               DRegister(last),
53351                                               spacing,
53352                                               transfer),
53353                              AlignedMemOperand(Register(rn),
53354                                                align,
53355                                                Register(rm),
53356                                                PostIndex));
53357                         break;
53358                       }
53359                       case 0x00000500: {
53360                         // 0xf4200500
53361                         if (((instr & 0xd) == 0xd)) {
53362                           UnallocatedA32(instr);
53363                           return;
53364                         }
53365                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53366                         if (dt.Is(kDataTypeValueInvalid)) {
53367                           UnallocatedA32(instr);
53368                           return;
53369                         }
53370                         Alignment align =
53371                             Align_align_3_Decode((instr >> 4) & 0x3);
53372                         if (dt.Is(kDataTypeValueInvalid) ||
53373                             align.Is(kBadAlignment)) {
53374                           UnallocatedA32(instr);
53375                           return;
53376                         }
53377                         unsigned first = ExtractDRegister(instr, 22, 12);
53378                         unsigned length;
53379                         SpacingType spacing;
53380                         switch ((instr >> 8) & 0xf) {
53381                           default:
53382                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53383                           case 0x4:
53384                             length = 3;
53385                             spacing = kSingle;
53386                             break;
53387                           case 0x5:
53388                             length = 3;
53389                             spacing = kDouble;
53390                             break;
53391                         }
53392                         unsigned last =
53393                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53394                         TransferType transfer = kMultipleLanes;
53395                         unsigned rn = (instr >> 16) & 0xf;
53396                         unsigned rm = instr & 0xf;
53397                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53398                         vld3(al,
53399                              dt,
53400                              NeonRegisterList(DRegister(first),
53401                                               DRegister(last),
53402                                               spacing,
53403                                               transfer),
53404                              AlignedMemOperand(Register(rn),
53405                                                align,
53406                                                Register(rm),
53407                                                PostIndex));
53408                         break;
53409                       }
53410                       case 0x00000600: {
53411                         // 0xf4200600
53412                         if (((instr & 0xd) == 0xd) ||
53413                             ((instr & 0xe20) == 0x620) ||
53414                             ((instr & 0xf30) == 0xa30)) {
53415                           UnallocatedA32(instr);
53416                           return;
53417                         }
53418                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53419                         if (dt.Is(kDataTypeValueInvalid)) {
53420                           UnallocatedA32(instr);
53421                           return;
53422                         }
53423                         Alignment align =
53424                             Align_align_1_Decode((instr >> 4) & 0x3);
53425                         if (dt.Is(kDataTypeValueInvalid) ||
53426                             align.Is(kBadAlignment)) {
53427                           UnallocatedA32(instr);
53428                           return;
53429                         }
53430                         unsigned first = ExtractDRegister(instr, 22, 12);
53431                         unsigned length;
53432                         SpacingType spacing = kSingle;
53433                         switch ((instr >> 8) & 0xf) {
53434                           default:
53435                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53436                           case 0x7:
53437                             length = 1;
53438                             break;
53439                           case 0xa:
53440                             length = 2;
53441                             break;
53442                           case 0x6:
53443                             length = 3;
53444                             break;
53445                           case 0x2:
53446                             length = 4;
53447                             break;
53448                         }
53449                         unsigned last = first + length - 1;
53450                         TransferType transfer = kMultipleLanes;
53451                         unsigned rn = (instr >> 16) & 0xf;
53452                         unsigned rm = instr & 0xf;
53453                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53454                         vld1(al,
53455                              dt,
53456                              NeonRegisterList(DRegister(first),
53457                                               DRegister(last),
53458                                               spacing,
53459                                               transfer),
53460                              AlignedMemOperand(Register(rn),
53461                                                align,
53462                                                Register(rm),
53463                                                PostIndex));
53464                         break;
53465                       }
53466                       case 0x00000700: {
53467                         // 0xf4200700
53468                         if (((instr & 0xd) == 0xd) ||
53469                             ((instr & 0xe20) == 0x620) ||
53470                             ((instr & 0xf30) == 0xa30)) {
53471                           UnallocatedA32(instr);
53472                           return;
53473                         }
53474                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53475                         if (dt.Is(kDataTypeValueInvalid)) {
53476                           UnallocatedA32(instr);
53477                           return;
53478                         }
53479                         Alignment align =
53480                             Align_align_1_Decode((instr >> 4) & 0x3);
53481                         if (dt.Is(kDataTypeValueInvalid) ||
53482                             align.Is(kBadAlignment)) {
53483                           UnallocatedA32(instr);
53484                           return;
53485                         }
53486                         unsigned first = ExtractDRegister(instr, 22, 12);
53487                         unsigned length;
53488                         SpacingType spacing = kSingle;
53489                         switch ((instr >> 8) & 0xf) {
53490                           default:
53491                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53492                           case 0x7:
53493                             length = 1;
53494                             break;
53495                           case 0xa:
53496                             length = 2;
53497                             break;
53498                           case 0x6:
53499                             length = 3;
53500                             break;
53501                           case 0x2:
53502                             length = 4;
53503                             break;
53504                         }
53505                         unsigned last = first + length - 1;
53506                         TransferType transfer = kMultipleLanes;
53507                         unsigned rn = (instr >> 16) & 0xf;
53508                         unsigned rm = instr & 0xf;
53509                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53510                         vld1(al,
53511                              dt,
53512                              NeonRegisterList(DRegister(first),
53513                                               DRegister(last),
53514                                               spacing,
53515                                               transfer),
53516                              AlignedMemOperand(Register(rn),
53517                                                align,
53518                                                Register(rm),
53519                                                PostIndex));
53520                         break;
53521                       }
53522                       case 0x00000800: {
53523                         // 0xf4200800
53524                         if (((instr & 0xd) == 0xd) ||
53525                             ((instr & 0xe30) == 0x830)) {
53526                           UnallocatedA32(instr);
53527                           return;
53528                         }
53529                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53530                         if (dt.Is(kDataTypeValueInvalid)) {
53531                           UnallocatedA32(instr);
53532                           return;
53533                         }
53534                         Alignment align =
53535                             Align_align_2_Decode((instr >> 4) & 0x3);
53536                         if (dt.Is(kDataTypeValueInvalid) ||
53537                             align.Is(kBadAlignment)) {
53538                           UnallocatedA32(instr);
53539                           return;
53540                         }
53541                         unsigned first = ExtractDRegister(instr, 22, 12);
53542                         unsigned length;
53543                         SpacingType spacing;
53544                         switch ((instr >> 8) & 0xf) {
53545                           default:
53546                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53547                           case 0x8:
53548                             length = 2;
53549                             spacing = kSingle;
53550                             break;
53551                           case 0x9:
53552                             length = 2;
53553                             spacing = kDouble;
53554                             break;
53555                           case 0x3:
53556                             length = 4;
53557                             spacing = kSingle;
53558                             break;
53559                         }
53560                         unsigned last =
53561                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53562                         TransferType transfer = kMultipleLanes;
53563                         unsigned rn = (instr >> 16) & 0xf;
53564                         unsigned rm = instr & 0xf;
53565                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53566                         vld2(al,
53567                              dt,
53568                              NeonRegisterList(DRegister(first),
53569                                               DRegister(last),
53570                                               spacing,
53571                                               transfer),
53572                              AlignedMemOperand(Register(rn),
53573                                                align,
53574                                                Register(rm),
53575                                                PostIndex));
53576                         break;
53577                       }
53578                       case 0x00000900: {
53579                         // 0xf4200900
53580                         if (((instr & 0xd) == 0xd) ||
53581                             ((instr & 0xe30) == 0x830)) {
53582                           UnallocatedA32(instr);
53583                           return;
53584                         }
53585                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53586                         if (dt.Is(kDataTypeValueInvalid)) {
53587                           UnallocatedA32(instr);
53588                           return;
53589                         }
53590                         Alignment align =
53591                             Align_align_2_Decode((instr >> 4) & 0x3);
53592                         if (dt.Is(kDataTypeValueInvalid) ||
53593                             align.Is(kBadAlignment)) {
53594                           UnallocatedA32(instr);
53595                           return;
53596                         }
53597                         unsigned first = ExtractDRegister(instr, 22, 12);
53598                         unsigned length;
53599                         SpacingType spacing;
53600                         switch ((instr >> 8) & 0xf) {
53601                           default:
53602                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53603                           case 0x8:
53604                             length = 2;
53605                             spacing = kSingle;
53606                             break;
53607                           case 0x9:
53608                             length = 2;
53609                             spacing = kDouble;
53610                             break;
53611                           case 0x3:
53612                             length = 4;
53613                             spacing = kSingle;
53614                             break;
53615                         }
53616                         unsigned last =
53617                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53618                         TransferType transfer = kMultipleLanes;
53619                         unsigned rn = (instr >> 16) & 0xf;
53620                         unsigned rm = instr & 0xf;
53621                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53622                         vld2(al,
53623                              dt,
53624                              NeonRegisterList(DRegister(first),
53625                                               DRegister(last),
53626                                               spacing,
53627                                               transfer),
53628                              AlignedMemOperand(Register(rn),
53629                                                align,
53630                                                Register(rm),
53631                                                PostIndex));
53632                         break;
53633                       }
53634                       case 0x00000a00: {
53635                         // 0xf4200a00
53636                         if (((instr & 0xd) == 0xd) ||
53637                             ((instr & 0xe20) == 0x620) ||
53638                             ((instr & 0xf30) == 0xa30)) {
53639                           UnallocatedA32(instr);
53640                           return;
53641                         }
53642                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53643                         if (dt.Is(kDataTypeValueInvalid)) {
53644                           UnallocatedA32(instr);
53645                           return;
53646                         }
53647                         Alignment align =
53648                             Align_align_1_Decode((instr >> 4) & 0x3);
53649                         if (dt.Is(kDataTypeValueInvalid) ||
53650                             align.Is(kBadAlignment)) {
53651                           UnallocatedA32(instr);
53652                           return;
53653                         }
53654                         unsigned first = ExtractDRegister(instr, 22, 12);
53655                         unsigned length;
53656                         SpacingType spacing = kSingle;
53657                         switch ((instr >> 8) & 0xf) {
53658                           default:
53659                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53660                           case 0x7:
53661                             length = 1;
53662                             break;
53663                           case 0xa:
53664                             length = 2;
53665                             break;
53666                           case 0x6:
53667                             length = 3;
53668                             break;
53669                           case 0x2:
53670                             length = 4;
53671                             break;
53672                         }
53673                         unsigned last = first + length - 1;
53674                         TransferType transfer = kMultipleLanes;
53675                         unsigned rn = (instr >> 16) & 0xf;
53676                         unsigned rm = instr & 0xf;
53677                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53678                         vld1(al,
53679                              dt,
53680                              NeonRegisterList(DRegister(first),
53681                                               DRegister(last),
53682                                               spacing,
53683                                               transfer),
53684                              AlignedMemOperand(Register(rn),
53685                                                align,
53686                                                Register(rm),
53687                                                PostIndex));
53688                         break;
53689                       }
53690                       default:
53691                         UnallocatedA32(instr);
53692                         break;
53693                     }
53694                     break;
53695                   }
53696                 }
53697                 break;
53698               }
53699               case 0x00800000: {
53700                 // 0xf4a00000
53701                 switch (instr & 0x00000300) {
53702                   case 0x00000000: {
53703                     // 0xf4a00000
53704                     switch (instr & 0x00000c00) {
53705                       case 0x00000c00: {
53706                         // 0xf4a00c00
53707                         switch (instr & 0x0000000d) {
53708                           case 0x0000000d: {
53709                             // 0xf4a00c0d
53710                             switch (instr & 0x00000002) {
53711                               case 0x00000000: {
53712                                 // 0xf4a00c0d
53713                                 DataType dt =
53714                                     Dt_size_7_Decode((instr >> 6) & 0x3);
53715                                 if (dt.Is(kDataTypeValueInvalid)) {
53716                                   UnallocatedA32(instr);
53717                                   return;
53718                                 }
53719                                 Alignment align =
53720                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
53721                                 if (dt.Is(kDataTypeValueInvalid) ||
53722                                     align.Is(kBadAlignment)) {
53723                                   UnallocatedA32(instr);
53724                                   return;
53725                                 }
53726                                 unsigned first =
53727                                     ExtractDRegister(instr, 22, 12);
53728                                 unsigned length;
53729                                 SpacingType spacing = kSingle;
53730                                 switch ((instr >> 5) & 0x1) {
53731                                   default:
53732                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
53733                                   case 0x0:
53734                                     length = 1;
53735                                     break;
53736                                   case 0x1:
53737                                     length = 2;
53738                                     break;
53739                                 }
53740                                 unsigned last = first + length - 1;
53741                                 TransferType transfer = kAllLanes;
53742                                 unsigned rn = (instr >> 16) & 0xf;
53743                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
53744                                 vld1(al,
53745                                      dt,
53746                                      NeonRegisterList(DRegister(first),
53747                                                       DRegister(last),
53748                                                       spacing,
53749                                                       transfer),
53750                                      AlignedMemOperand(Register(rn),
53751                                                        align,
53752                                                        PostIndex));
53753                                 break;
53754                               }
53755                               case 0x00000002: {
53756                                 // 0xf4a00c0f
53757                                 DataType dt =
53758                                     Dt_size_7_Decode((instr >> 6) & 0x3);
53759                                 if (dt.Is(kDataTypeValueInvalid)) {
53760                                   UnallocatedA32(instr);
53761                                   return;
53762                                 }
53763                                 Alignment align =
53764                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
53765                                 if (dt.Is(kDataTypeValueInvalid) ||
53766                                     align.Is(kBadAlignment)) {
53767                                   UnallocatedA32(instr);
53768                                   return;
53769                                 }
53770                                 unsigned first =
53771                                     ExtractDRegister(instr, 22, 12);
53772                                 unsigned length;
53773                                 SpacingType spacing = kSingle;
53774                                 switch ((instr >> 5) & 0x1) {
53775                                   default:
53776                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
53777                                   case 0x0:
53778                                     length = 1;
53779                                     break;
53780                                   case 0x1:
53781                                     length = 2;
53782                                     break;
53783                                 }
53784                                 unsigned last = first + length - 1;
53785                                 TransferType transfer = kAllLanes;
53786                                 unsigned rn = (instr >> 16) & 0xf;
53787                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
53788                                 vld1(al,
53789                                      dt,
53790                                      NeonRegisterList(DRegister(first),
53791                                                       DRegister(last),
53792                                                       spacing,
53793                                                       transfer),
53794                                      AlignedMemOperand(Register(rn),
53795                                                        align,
53796                                                        Offset));
53797                                 break;
53798                               }
53799                             }
53800                             break;
53801                           }
53802                           default: {
53803                             if (((instr & 0xd) == 0xd)) {
53804                               UnallocatedA32(instr);
53805                               return;
53806                             }
53807                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53808                             if (dt.Is(kDataTypeValueInvalid)) {
53809                               UnallocatedA32(instr);
53810                               return;
53811                             }
53812                             Alignment align =
53813                                 Align_a_1_Decode((instr >> 4) & 0x1, dt);
53814                             if (dt.Is(kDataTypeValueInvalid) ||
53815                                 align.Is(kBadAlignment)) {
53816                               UnallocatedA32(instr);
53817                               return;
53818                             }
53819                             unsigned first = ExtractDRegister(instr, 22, 12);
53820                             unsigned length;
53821                             SpacingType spacing = kSingle;
53822                             switch ((instr >> 5) & 0x1) {
53823                               default:
53824                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53825                               case 0x0:
53826                                 length = 1;
53827                                 break;
53828                               case 0x1:
53829                                 length = 2;
53830                                 break;
53831                             }
53832                             unsigned last = first + length - 1;
53833                             TransferType transfer = kAllLanes;
53834                             unsigned rn = (instr >> 16) & 0xf;
53835                             unsigned rm = instr & 0xf;
53836                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53837                             vld1(al,
53838                                  dt,
53839                                  NeonRegisterList(DRegister(first),
53840                                                   DRegister(last),
53841                                                   spacing,
53842                                                   transfer),
53843                                  AlignedMemOperand(Register(rn),
53844                                                    align,
53845                                                    Register(rm),
53846                                                    PostIndex));
53847                             break;
53848                           }
53849                         }
53850                         break;
53851                       }
53852                       default: {
53853                         switch (instr & 0x0000000d) {
53854                           case 0x0000000d: {
53855                             // 0xf4a0000d
53856                             switch (instr & 0x00000002) {
53857                               case 0x00000000: {
53858                                 // 0xf4a0000d
53859                                 if (((instr & 0xc00) == 0xc00)) {
53860                                   UnallocatedA32(instr);
53861                                   return;
53862                                 }
53863                                 DataType dt =
53864                                     Dt_size_7_Decode((instr >> 10) & 0x3);
53865                                 if (dt.Is(kDataTypeValueInvalid)) {
53866                                   UnallocatedA32(instr);
53867                                   return;
53868                                 }
53869                                 DecodeNeonAndAlign decode_neon =
53870                                     Align_index_align_1_Decode((instr >> 4) &
53871                                                                    0xf,
53872                                                                dt);
53873                                 if (!decode_neon.IsValid()) {
53874                                   UnallocatedA32(instr);
53875                                   return;
53876                                 }
53877                                 Alignment align = decode_neon.GetAlign();
53878                                 int lane = decode_neon.GetLane();
53879                                 SpacingType spacing = decode_neon.GetSpacing();
53880                                 unsigned first =
53881                                     ExtractDRegister(instr, 22, 12);
53882                                 unsigned length = 1;
53883                                 unsigned last = first + length - 1;
53884                                 unsigned rn = (instr >> 16) & 0xf;
53885                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
53886                                 vld1(al,
53887                                      dt,
53888                                      NeonRegisterList(DRegister(first),
53889                                                       DRegister(last),
53890                                                       spacing,
53891                                                       lane),
53892                                      AlignedMemOperand(Register(rn),
53893                                                        align,
53894                                                        PostIndex));
53895                                 break;
53896                               }
53897                               case 0x00000002: {
53898                                 // 0xf4a0000f
53899                                 if (((instr & 0xc00) == 0xc00)) {
53900                                   UnallocatedA32(instr);
53901                                   return;
53902                                 }
53903                                 DataType dt =
53904                                     Dt_size_7_Decode((instr >> 10) & 0x3);
53905                                 if (dt.Is(kDataTypeValueInvalid)) {
53906                                   UnallocatedA32(instr);
53907                                   return;
53908                                 }
53909                                 DecodeNeonAndAlign decode_neon =
53910                                     Align_index_align_1_Decode((instr >> 4) &
53911                                                                    0xf,
53912                                                                dt);
53913                                 if (!decode_neon.IsValid()) {
53914                                   UnallocatedA32(instr);
53915                                   return;
53916                                 }
53917                                 Alignment align = decode_neon.GetAlign();
53918                                 int lane = decode_neon.GetLane();
53919                                 SpacingType spacing = decode_neon.GetSpacing();
53920                                 unsigned first =
53921                                     ExtractDRegister(instr, 22, 12);
53922                                 unsigned length = 1;
53923                                 unsigned last = first + length - 1;
53924                                 unsigned rn = (instr >> 16) & 0xf;
53925                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
53926                                 vld1(al,
53927                                      dt,
53928                                      NeonRegisterList(DRegister(first),
53929                                                       DRegister(last),
53930                                                       spacing,
53931                                                       lane),
53932                                      AlignedMemOperand(Register(rn),
53933                                                        align,
53934                                                        Offset));
53935                                 break;
53936                               }
53937                             }
53938                             break;
53939                           }
53940                           default: {
53941                             if (((instr & 0xc00) == 0xc00) ||
53942                                 ((instr & 0xd) == 0xd)) {
53943                               UnallocatedA32(instr);
53944                               return;
53945                             }
53946                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
53947                             if (dt.Is(kDataTypeValueInvalid)) {
53948                               UnallocatedA32(instr);
53949                               return;
53950                             }
53951                             DecodeNeonAndAlign decode_neon =
53952                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
53953                                                            dt);
53954                             if (!decode_neon.IsValid()) {
53955                               UnallocatedA32(instr);
53956                               return;
53957                             }
53958                             Alignment align = decode_neon.GetAlign();
53959                             int lane = decode_neon.GetLane();
53960                             SpacingType spacing = decode_neon.GetSpacing();
53961                             unsigned first = ExtractDRegister(instr, 22, 12);
53962                             unsigned length = 1;
53963                             unsigned last = first + length - 1;
53964                             unsigned rn = (instr >> 16) & 0xf;
53965                             unsigned rm = instr & 0xf;
53966                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53967                             vld1(al,
53968                                  dt,
53969                                  NeonRegisterList(DRegister(first),
53970                                                   DRegister(last),
53971                                                   spacing,
53972                                                   lane),
53973                                  AlignedMemOperand(Register(rn),
53974                                                    align,
53975                                                    Register(rm),
53976                                                    PostIndex));
53977                             break;
53978                           }
53979                         }
53980                         break;
53981                       }
53982                     }
53983                     break;
53984                   }
53985                   case 0x00000100: {
53986                     // 0xf4a00100
53987                     switch (instr & 0x00000c00) {
53988                       case 0x00000c00: {
53989                         // 0xf4a00d00
53990                         switch (instr & 0x0000000d) {
53991                           case 0x0000000d: {
53992                             // 0xf4a00d0d
53993                             switch (instr & 0x00000002) {
53994                               case 0x00000000: {
53995                                 // 0xf4a00d0d
53996                                 DataType dt =
53997                                     Dt_size_7_Decode((instr >> 6) & 0x3);
53998                                 if (dt.Is(kDataTypeValueInvalid)) {
53999                                   UnallocatedA32(instr);
54000                                   return;
54001                                 }
54002                                 Alignment align =
54003                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
54004                                 if (dt.Is(kDataTypeValueInvalid) ||
54005                                     align.Is(kBadAlignment)) {
54006                                   UnallocatedA32(instr);
54007                                   return;
54008                                 }
54009                                 unsigned first =
54010                                     ExtractDRegister(instr, 22, 12);
54011                                 unsigned length;
54012                                 SpacingType spacing;
54013                                 switch ((instr >> 5) & 0x1) {
54014                                   default:
54015                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54016                                   case 0x0:
54017                                     length = 2;
54018                                     spacing = kSingle;
54019                                     break;
54020                                   case 0x1:
54021                                     length = 2;
54022                                     spacing = kDouble;
54023                                     break;
54024                                 }
54025                                 unsigned last =
54026                                     first +
54027                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54028                                 TransferType transfer = kAllLanes;
54029                                 unsigned rn = (instr >> 16) & 0xf;
54030                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54031                                 vld2(al,
54032                                      dt,
54033                                      NeonRegisterList(DRegister(first),
54034                                                       DRegister(last),
54035                                                       spacing,
54036                                                       transfer),
54037                                      AlignedMemOperand(Register(rn),
54038                                                        align,
54039                                                        PostIndex));
54040                                 break;
54041                               }
54042                               case 0x00000002: {
54043                                 // 0xf4a00d0f
54044                                 DataType dt =
54045                                     Dt_size_7_Decode((instr >> 6) & 0x3);
54046                                 if (dt.Is(kDataTypeValueInvalid)) {
54047                                   UnallocatedA32(instr);
54048                                   return;
54049                                 }
54050                                 Alignment align =
54051                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
54052                                 if (dt.Is(kDataTypeValueInvalid) ||
54053                                     align.Is(kBadAlignment)) {
54054                                   UnallocatedA32(instr);
54055                                   return;
54056                                 }
54057                                 unsigned first =
54058                                     ExtractDRegister(instr, 22, 12);
54059                                 unsigned length;
54060                                 SpacingType spacing;
54061                                 switch ((instr >> 5) & 0x1) {
54062                                   default:
54063                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54064                                   case 0x0:
54065                                     length = 2;
54066                                     spacing = kSingle;
54067                                     break;
54068                                   case 0x1:
54069                                     length = 2;
54070                                     spacing = kDouble;
54071                                     break;
54072                                 }
54073                                 unsigned last =
54074                                     first +
54075                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54076                                 TransferType transfer = kAllLanes;
54077                                 unsigned rn = (instr >> 16) & 0xf;
54078                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54079                                 vld2(al,
54080                                      dt,
54081                                      NeonRegisterList(DRegister(first),
54082                                                       DRegister(last),
54083                                                       spacing,
54084                                                       transfer),
54085                                      AlignedMemOperand(Register(rn),
54086                                                        align,
54087                                                        Offset));
54088                                 break;
54089                               }
54090                             }
54091                             break;
54092                           }
54093                           default: {
54094                             if (((instr & 0xd) == 0xd)) {
54095                               UnallocatedA32(instr);
54096                               return;
54097                             }
54098                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
54099                             if (dt.Is(kDataTypeValueInvalid)) {
54100                               UnallocatedA32(instr);
54101                               return;
54102                             }
54103                             Alignment align =
54104                                 Align_a_2_Decode((instr >> 4) & 0x1, dt);
54105                             if (dt.Is(kDataTypeValueInvalid) ||
54106                                 align.Is(kBadAlignment)) {
54107                               UnallocatedA32(instr);
54108                               return;
54109                             }
54110                             unsigned first = ExtractDRegister(instr, 22, 12);
54111                             unsigned length;
54112                             SpacingType spacing;
54113                             switch ((instr >> 5) & 0x1) {
54114                               default:
54115                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
54116                               case 0x0:
54117                                 length = 2;
54118                                 spacing = kSingle;
54119                                 break;
54120                               case 0x1:
54121                                 length = 2;
54122                                 spacing = kDouble;
54123                                 break;
54124                             }
54125                             unsigned last =
54126                                 first +
54127                                 (length - 1) * (spacing == kSingle ? 1 : 2);
54128                             TransferType transfer = kAllLanes;
54129                             unsigned rn = (instr >> 16) & 0xf;
54130                             unsigned rm = instr & 0xf;
54131                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54132                             vld2(al,
54133                                  dt,
54134                                  NeonRegisterList(DRegister(first),
54135                                                   DRegister(last),
54136                                                   spacing,
54137                                                   transfer),
54138                                  AlignedMemOperand(Register(rn),
54139                                                    align,
54140                                                    Register(rm),
54141                                                    PostIndex));
54142                             break;
54143                           }
54144                         }
54145                         break;
54146                       }
54147                       default: {
54148                         switch (instr & 0x0000000d) {
54149                           case 0x0000000d: {
54150                             // 0xf4a0010d
54151                             switch (instr & 0x00000002) {
54152                               case 0x00000000: {
54153                                 // 0xf4a0010d
54154                                 if (((instr & 0xc00) == 0xc00)) {
54155                                   UnallocatedA32(instr);
54156                                   return;
54157                                 }
54158                                 DataType dt =
54159                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54160                                 if (dt.Is(kDataTypeValueInvalid)) {
54161                                   UnallocatedA32(instr);
54162                                   return;
54163                                 }
54164                                 DecodeNeonAndAlign decode_neon =
54165                                     Align_index_align_2_Decode((instr >> 4) &
54166                                                                    0xf,
54167                                                                dt);
54168                                 if (!decode_neon.IsValid()) {
54169                                   UnallocatedA32(instr);
54170                                   return;
54171                                 }
54172                                 Alignment align = decode_neon.GetAlign();
54173                                 int lane = decode_neon.GetLane();
54174                                 SpacingType spacing = decode_neon.GetSpacing();
54175                                 unsigned first =
54176                                     ExtractDRegister(instr, 22, 12);
54177                                 unsigned length = 2;
54178                                 unsigned last =
54179                                     first +
54180                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54181                                 unsigned rn = (instr >> 16) & 0xf;
54182                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54183                                 vld2(al,
54184                                      dt,
54185                                      NeonRegisterList(DRegister(first),
54186                                                       DRegister(last),
54187                                                       spacing,
54188                                                       lane),
54189                                      AlignedMemOperand(Register(rn),
54190                                                        align,
54191                                                        PostIndex));
54192                                 break;
54193                               }
54194                               case 0x00000002: {
54195                                 // 0xf4a0010f
54196                                 if (((instr & 0xc00) == 0xc00)) {
54197                                   UnallocatedA32(instr);
54198                                   return;
54199                                 }
54200                                 DataType dt =
54201                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54202                                 if (dt.Is(kDataTypeValueInvalid)) {
54203                                   UnallocatedA32(instr);
54204                                   return;
54205                                 }
54206                                 DecodeNeonAndAlign decode_neon =
54207                                     Align_index_align_2_Decode((instr >> 4) &
54208                                                                    0xf,
54209                                                                dt);
54210                                 if (!decode_neon.IsValid()) {
54211                                   UnallocatedA32(instr);
54212                                   return;
54213                                 }
54214                                 Alignment align = decode_neon.GetAlign();
54215                                 int lane = decode_neon.GetLane();
54216                                 SpacingType spacing = decode_neon.GetSpacing();
54217                                 unsigned first =
54218                                     ExtractDRegister(instr, 22, 12);
54219                                 unsigned length = 2;
54220                                 unsigned last =
54221                                     first +
54222                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54223                                 unsigned rn = (instr >> 16) & 0xf;
54224                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54225                                 vld2(al,
54226                                      dt,
54227                                      NeonRegisterList(DRegister(first),
54228                                                       DRegister(last),
54229                                                       spacing,
54230                                                       lane),
54231                                      AlignedMemOperand(Register(rn),
54232                                                        align,
54233                                                        Offset));
54234                                 break;
54235                               }
54236                             }
54237                             break;
54238                           }
54239                           default: {
54240                             if (((instr & 0xc00) == 0xc00) ||
54241                                 ((instr & 0xd) == 0xd)) {
54242                               UnallocatedA32(instr);
54243                               return;
54244                             }
54245                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54246                             if (dt.Is(kDataTypeValueInvalid)) {
54247                               UnallocatedA32(instr);
54248                               return;
54249                             }
54250                             DecodeNeonAndAlign decode_neon =
54251                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
54252                                                            dt);
54253                             if (!decode_neon.IsValid()) {
54254                               UnallocatedA32(instr);
54255                               return;
54256                             }
54257                             Alignment align = decode_neon.GetAlign();
54258                             int lane = decode_neon.GetLane();
54259                             SpacingType spacing = decode_neon.GetSpacing();
54260                             unsigned first = ExtractDRegister(instr, 22, 12);
54261                             unsigned length = 2;
54262                             unsigned last =
54263                                 first +
54264                                 (length - 1) * (spacing == kSingle ? 1 : 2);
54265                             unsigned rn = (instr >> 16) & 0xf;
54266                             unsigned rm = instr & 0xf;
54267                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54268                             vld2(al,
54269                                  dt,
54270                                  NeonRegisterList(DRegister(first),
54271                                                   DRegister(last),
54272                                                   spacing,
54273                                                   lane),
54274                                  AlignedMemOperand(Register(rn),
54275                                                    align,
54276                                                    Register(rm),
54277                                                    PostIndex));
54278                             break;
54279                           }
54280                         }
54281                         break;
54282                       }
54283                     }
54284                     break;
54285                   }
54286                   case 0x00000200: {
54287                     // 0xf4a00200
54288                     switch (instr & 0x00000c00) {
54289                       case 0x00000c00: {
54290                         // 0xf4a00e00
54291                         switch (instr & 0x00000010) {
54292                           case 0x00000000: {
54293                             // 0xf4a00e00
54294                             switch (instr & 0x0000000d) {
54295                               case 0x0000000d: {
54296                                 // 0xf4a00e0d
54297                                 switch (instr & 0x00000002) {
54298                                   case 0x00000000: {
54299                                     // 0xf4a00e0d
54300                                     DataType dt =
54301                                         Dt_size_7_Decode((instr >> 6) & 0x3);
54302                                     if (dt.Is(kDataTypeValueInvalid)) {
54303                                       UnallocatedA32(instr);
54304                                       return;
54305                                     }
54306                                     unsigned first =
54307                                         ExtractDRegister(instr, 22, 12);
54308                                     unsigned length;
54309                                     SpacingType spacing;
54310                                     switch ((instr >> 5) & 0x1) {
54311                                       default:
54312                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
54313                                       case 0x0:
54314                                         length = 3;
54315                                         spacing = kSingle;
54316                                         break;
54317                                       case 0x1:
54318                                         length = 3;
54319                                         spacing = kDouble;
54320                                         break;
54321                                     }
54322                                     unsigned last =
54323                                         first +
54324                                         (length - 1) *
54325                                             (spacing == kSingle ? 1 : 2);
54326                                     TransferType transfer = kAllLanes;
54327                                     unsigned rn = (instr >> 16) & 0xf;
54328                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
54329                                     vld3(al,
54330                                          dt,
54331                                          NeonRegisterList(DRegister(first),
54332                                                           DRegister(last),
54333                                                           spacing,
54334                                                           transfer),
54335                                          MemOperand(Register(rn), PostIndex));
54336                                     break;
54337                                   }
54338                                   case 0x00000002: {
54339                                     // 0xf4a00e0f
54340                                     DataType dt =
54341                                         Dt_size_7_Decode((instr >> 6) & 0x3);
54342                                     if (dt.Is(kDataTypeValueInvalid)) {
54343                                       UnallocatedA32(instr);
54344                                       return;
54345                                     }
54346                                     unsigned first =
54347                                         ExtractDRegister(instr, 22, 12);
54348                                     unsigned length;
54349                                     SpacingType spacing;
54350                                     switch ((instr >> 5) & 0x1) {
54351                                       default:
54352                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
54353                                       case 0x0:
54354                                         length = 3;
54355                                         spacing = kSingle;
54356                                         break;
54357                                       case 0x1:
54358                                         length = 3;
54359                                         spacing = kDouble;
54360                                         break;
54361                                     }
54362                                     unsigned last =
54363                                         first +
54364                                         (length - 1) *
54365                                             (spacing == kSingle ? 1 : 2);
54366                                     TransferType transfer = kAllLanes;
54367                                     unsigned rn = (instr >> 16) & 0xf;
54368                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
54369                                     vld3(al,
54370                                          dt,
54371                                          NeonRegisterList(DRegister(first),
54372                                                           DRegister(last),
54373                                                           spacing,
54374                                                           transfer),
54375                                          MemOperand(Register(rn), Offset));
54376                                     break;
54377                                   }
54378                                 }
54379                                 break;
54380                               }
54381                               default: {
54382                                 if (((instr & 0xd) == 0xd)) {
54383                                   UnallocatedA32(instr);
54384                                   return;
54385                                 }
54386                                 DataType dt =
54387                                     Dt_size_7_Decode((instr >> 6) & 0x3);
54388                                 if (dt.Is(kDataTypeValueInvalid)) {
54389                                   UnallocatedA32(instr);
54390                                   return;
54391                                 }
54392                                 unsigned first =
54393                                     ExtractDRegister(instr, 22, 12);
54394                                 unsigned length;
54395                                 SpacingType spacing;
54396                                 switch ((instr >> 5) & 0x1) {
54397                                   default:
54398                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54399                                   case 0x0:
54400                                     length = 3;
54401                                     spacing = kSingle;
54402                                     break;
54403                                   case 0x1:
54404                                     length = 3;
54405                                     spacing = kDouble;
54406                                     break;
54407                                 }
54408                                 unsigned last =
54409                                     first +
54410                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54411                                 TransferType transfer = kAllLanes;
54412                                 unsigned rn = (instr >> 16) & 0xf;
54413                                 Sign sign(plus);
54414                                 unsigned rm = instr & 0xf;
54415                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length)
54416                                 vld3(al,
54417                                      dt,
54418                                      NeonRegisterList(DRegister(first),
54419                                                       DRegister(last),
54420                                                       spacing,
54421                                                       transfer),
54422                                      MemOperand(Register(rn),
54423                                                 sign,
54424                                                 Register(rm),
54425                                                 PostIndex));
54426                                 break;
54427                               }
54428                             }
54429                             break;
54430                           }
54431                           default:
54432                             UnallocatedA32(instr);
54433                             break;
54434                         }
54435                         break;
54436                       }
54437                       default: {
54438                         switch (instr & 0x0000000d) {
54439                           case 0x0000000d: {
54440                             // 0xf4a0020d
54441                             switch (instr & 0x00000002) {
54442                               case 0x00000000: {
54443                                 // 0xf4a0020d
54444                                 if (((instr & 0xc00) == 0xc00)) {
54445                                   UnallocatedA32(instr);
54446                                   return;
54447                                 }
54448                                 DataType dt =
54449                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54450                                 if (dt.Is(kDataTypeValueInvalid)) {
54451                                   UnallocatedA32(instr);
54452                                   return;
54453                                 }
54454                                 DecodeNeon decode_neon =
54455                                     Index_1_Decode((instr >> 4) & 0xf, dt);
54456                                 if (!decode_neon.IsValid()) {
54457                                   UnallocatedA32(instr);
54458                                   return;
54459                                 }
54460                                 int lane = decode_neon.GetLane();
54461                                 SpacingType spacing = decode_neon.GetSpacing();
54462                                 unsigned first =
54463                                     ExtractDRegister(instr, 22, 12);
54464                                 unsigned length = 3;
54465                                 unsigned last =
54466                                     first +
54467                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54468                                 unsigned rn = (instr >> 16) & 0xf;
54469                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
54470                                 vld3(al,
54471                                      dt,
54472                                      NeonRegisterList(DRegister(first),
54473                                                       DRegister(last),
54474                                                       spacing,
54475                                                       lane),
54476                                      MemOperand(Register(rn), PostIndex));
54477                                 break;
54478                               }
54479                               case 0x00000002: {
54480                                 // 0xf4a0020f
54481                                 if (((instr & 0xc00) == 0xc00)) {
54482                                   UnallocatedA32(instr);
54483                                   return;
54484                                 }
54485                                 DataType dt =
54486                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54487                                 if (dt.Is(kDataTypeValueInvalid)) {
54488                                   UnallocatedA32(instr);
54489                                   return;
54490                                 }
54491                                 DecodeNeon decode_neon =
54492                                     Index_1_Decode((instr >> 4) & 0xf, dt);
54493                                 if (!decode_neon.IsValid()) {
54494                                   UnallocatedA32(instr);
54495                                   return;
54496                                 }
54497                                 int lane = decode_neon.GetLane();
54498                                 SpacingType spacing = decode_neon.GetSpacing();
54499                                 unsigned first =
54500                                     ExtractDRegister(instr, 22, 12);
54501                                 unsigned length = 3;
54502                                 unsigned last =
54503                                     first +
54504                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54505                                 unsigned rn = (instr >> 16) & 0xf;
54506                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
54507                                 vld3(al,
54508                                      dt,
54509                                      NeonRegisterList(DRegister(first),
54510                                                       DRegister(last),
54511                                                       spacing,
54512                                                       lane),
54513                                      MemOperand(Register(rn), Offset));
54514                                 break;
54515                               }
54516                             }
54517                             break;
54518                           }
54519                           default: {
54520                             if (((instr & 0xc00) == 0xc00) ||
54521                                 ((instr & 0xd) == 0xd)) {
54522                               UnallocatedA32(instr);
54523                               return;
54524                             }
54525                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54526                             if (dt.Is(kDataTypeValueInvalid)) {
54527                               UnallocatedA32(instr);
54528                               return;
54529                             }
54530                             DecodeNeon decode_neon =
54531                                 Index_1_Decode((instr >> 4) & 0xf, dt);
54532                             if (!decode_neon.IsValid()) {
54533                               UnallocatedA32(instr);
54534                               return;
54535                             }
54536                             int lane = decode_neon.GetLane();
54537                             SpacingType spacing = decode_neon.GetSpacing();
54538                             unsigned first = ExtractDRegister(instr, 22, 12);
54539                             unsigned length = 3;
54540                             unsigned last =
54541                                 first +
54542                                 (length - 1) * (spacing == kSingle ? 1 : 2);
54543                             unsigned rn = (instr >> 16) & 0xf;
54544                             Sign sign(plus);
54545                             unsigned rm = instr & 0xf;
54546                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
54547                             vld3(al,
54548                                  dt,
54549                                  NeonRegisterList(DRegister(first),
54550                                                   DRegister(last),
54551                                                   spacing,
54552                                                   lane),
54553                                  MemOperand(Register(rn),
54554                                             sign,
54555                                             Register(rm),
54556                                             PostIndex));
54557                             break;
54558                           }
54559                         }
54560                         break;
54561                       }
54562                     }
54563                     break;
54564                   }
54565                   case 0x00000300: {
54566                     // 0xf4a00300
54567                     switch (instr & 0x00000c00) {
54568                       case 0x00000c00: {
54569                         // 0xf4a00f00
54570                         switch (instr & 0x0000000d) {
54571                           case 0x0000000d: {
54572                             // 0xf4a00f0d
54573                             switch (instr & 0x00000002) {
54574                               case 0x00000000: {
54575                                 // 0xf4a00f0d
54576                                 DataType dt =
54577                                     Dt_size_8_Decode((instr >> 6) & 0x3);
54578                                 if (dt.Is(kDataTypeValueInvalid)) {
54579                                   UnallocatedA32(instr);
54580                                   return;
54581                                 }
54582                                 Alignment align =
54583                                     Align_a_3_Decode((instr >> 4) & 0x1,
54584                                                      dt,
54585                                                      (instr >> 6) & 0x3);
54586                                 if (dt.Is(kDataTypeValueInvalid) ||
54587                                     align.Is(kBadAlignment)) {
54588                                   UnallocatedA32(instr);
54589                                   return;
54590                                 }
54591                                 unsigned first =
54592                                     ExtractDRegister(instr, 22, 12);
54593                                 unsigned length;
54594                                 SpacingType spacing;
54595                                 switch ((instr >> 5) & 0x1) {
54596                                   default:
54597                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54598                                   case 0x0:
54599                                     length = 4;
54600                                     spacing = kSingle;
54601                                     break;
54602                                   case 0x1:
54603                                     length = 4;
54604                                     spacing = kDouble;
54605                                     break;
54606                                 }
54607                                 unsigned last =
54608                                     first +
54609                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54610                                 TransferType transfer = kAllLanes;
54611                                 unsigned rn = (instr >> 16) & 0xf;
54612                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54613                                 vld4(al,
54614                                      dt,
54615                                      NeonRegisterList(DRegister(first),
54616                                                       DRegister(last),
54617                                                       spacing,
54618                                                       transfer),
54619                                      AlignedMemOperand(Register(rn),
54620                                                        align,
54621                                                        PostIndex));
54622                                 break;
54623                               }
54624                               case 0x00000002: {
54625                                 // 0xf4a00f0f
54626                                 DataType dt =
54627                                     Dt_size_8_Decode((instr >> 6) & 0x3);
54628                                 if (dt.Is(kDataTypeValueInvalid)) {
54629                                   UnallocatedA32(instr);
54630                                   return;
54631                                 }
54632                                 Alignment align =
54633                                     Align_a_3_Decode((instr >> 4) & 0x1,
54634                                                      dt,
54635                                                      (instr >> 6) & 0x3);
54636                                 if (dt.Is(kDataTypeValueInvalid) ||
54637                                     align.Is(kBadAlignment)) {
54638                                   UnallocatedA32(instr);
54639                                   return;
54640                                 }
54641                                 unsigned first =
54642                                     ExtractDRegister(instr, 22, 12);
54643                                 unsigned length;
54644                                 SpacingType spacing;
54645                                 switch ((instr >> 5) & 0x1) {
54646                                   default:
54647                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54648                                   case 0x0:
54649                                     length = 4;
54650                                     spacing = kSingle;
54651                                     break;
54652                                   case 0x1:
54653                                     length = 4;
54654                                     spacing = kDouble;
54655                                     break;
54656                                 }
54657                                 unsigned last =
54658                                     first +
54659                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54660                                 TransferType transfer = kAllLanes;
54661                                 unsigned rn = (instr >> 16) & 0xf;
54662                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54663                                 vld4(al,
54664                                      dt,
54665                                      NeonRegisterList(DRegister(first),
54666                                                       DRegister(last),
54667                                                       spacing,
54668                                                       transfer),
54669                                      AlignedMemOperand(Register(rn),
54670                                                        align,
54671                                                        Offset));
54672                                 break;
54673                               }
54674                             }
54675                             break;
54676                           }
54677                           default: {
54678                             if (((instr & 0xd) == 0xd)) {
54679                               UnallocatedA32(instr);
54680                               return;
54681                             }
54682                             DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3);
54683                             if (dt.Is(kDataTypeValueInvalid)) {
54684                               UnallocatedA32(instr);
54685                               return;
54686                             }
54687                             Alignment align =
54688                                 Align_a_3_Decode((instr >> 4) & 0x1,
54689                                                  dt,
54690                                                  (instr >> 6) & 0x3);
54691                             if (dt.Is(kDataTypeValueInvalid) ||
54692                                 align.Is(kBadAlignment)) {
54693                               UnallocatedA32(instr);
54694                               return;
54695                             }
54696                             unsigned first = ExtractDRegister(instr, 22, 12);
54697                             unsigned length;
54698                             SpacingType spacing;
54699                             switch ((instr >> 5) & 0x1) {
54700                               default:
54701                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
54702                               case 0x0:
54703                                 length = 4;
54704                                 spacing = kSingle;
54705                                 break;
54706                               case 0x1:
54707                                 length = 4;
54708                                 spacing = kDouble;
54709                                 break;
54710                             }
54711                             unsigned last =
54712                                 first +
54713                                 (length - 1) * (spacing == kSingle ? 1 : 2);
54714                             TransferType transfer = kAllLanes;
54715                             unsigned rn = (instr >> 16) & 0xf;
54716                             unsigned rm = instr & 0xf;
54717                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54718                             vld4(al,
54719                                  dt,
54720                                  NeonRegisterList(DRegister(first),
54721                                                   DRegister(last),
54722                                                   spacing,
54723                                                   transfer),
54724                                  AlignedMemOperand(Register(rn),
54725                                                    align,
54726                                                    Register(rm),
54727                                                    PostIndex));
54728                             break;
54729                           }
54730                         }
54731                         break;
54732                       }
54733                       default: {
54734                         switch (instr & 0x0000000d) {
54735                           case 0x0000000d: {
54736                             // 0xf4a0030d
54737                             switch (instr & 0x00000002) {
54738                               case 0x00000000: {
54739                                 // 0xf4a0030d
54740                                 if (((instr & 0xc00) == 0xc00)) {
54741                                   UnallocatedA32(instr);
54742                                   return;
54743                                 }
54744                                 DataType dt =
54745                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54746                                 if (dt.Is(kDataTypeValueInvalid)) {
54747                                   UnallocatedA32(instr);
54748                                   return;
54749                                 }
54750                                 DecodeNeonAndAlign decode_neon =
54751                                     Align_index_align_3_Decode((instr >> 4) &
54752                                                                    0xf,
54753                                                                dt);
54754                                 if (!decode_neon.IsValid()) {
54755                                   UnallocatedA32(instr);
54756                                   return;
54757                                 }
54758                                 Alignment align = decode_neon.GetAlign();
54759                                 int lane = decode_neon.GetLane();
54760                                 SpacingType spacing = decode_neon.GetSpacing();
54761                                 unsigned first =
54762                                     ExtractDRegister(instr, 22, 12);
54763                                 unsigned length = 4;
54764                                 unsigned last =
54765                                     first +
54766                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54767                                 unsigned rn = (instr >> 16) & 0xf;
54768                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54769                                 vld4(al,
54770                                      dt,
54771                                      NeonRegisterList(DRegister(first),
54772                                                       DRegister(last),
54773                                                       spacing,
54774                                                       lane),
54775                                      AlignedMemOperand(Register(rn),
54776                                                        align,
54777                                                        PostIndex));
54778                                 break;
54779                               }
54780                               case 0x00000002: {
54781                                 // 0xf4a0030f
54782                                 if (((instr & 0xc00) == 0xc00)) {
54783                                   UnallocatedA32(instr);
54784                                   return;
54785                                 }
54786                                 DataType dt =
54787                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54788                                 if (dt.Is(kDataTypeValueInvalid)) {
54789                                   UnallocatedA32(instr);
54790                                   return;
54791                                 }
54792                                 DecodeNeonAndAlign decode_neon =
54793                                     Align_index_align_3_Decode((instr >> 4) &
54794                                                                    0xf,
54795                                                                dt);
54796                                 if (!decode_neon.IsValid()) {
54797                                   UnallocatedA32(instr);
54798                                   return;
54799                                 }
54800                                 Alignment align = decode_neon.GetAlign();
54801                                 int lane = decode_neon.GetLane();
54802                                 SpacingType spacing = decode_neon.GetSpacing();
54803                                 unsigned first =
54804                                     ExtractDRegister(instr, 22, 12);
54805                                 unsigned length = 4;
54806                                 unsigned last =
54807                                     first +
54808                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54809                                 unsigned rn = (instr >> 16) & 0xf;
54810                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54811                                 vld4(al,
54812                                      dt,
54813                                      NeonRegisterList(DRegister(first),
54814                                                       DRegister(last),
54815                                                       spacing,
54816                                                       lane),
54817                                      AlignedMemOperand(Register(rn),
54818                                                        align,
54819                                                        Offset));
54820                                 break;
54821                               }
54822                             }
54823                             break;
54824                           }
54825                           default: {
54826                             if (((instr & 0xc00) == 0xc00) ||
54827                                 ((instr & 0xd) == 0xd)) {
54828                               UnallocatedA32(instr);
54829                               return;
54830                             }
54831                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54832                             if (dt.Is(kDataTypeValueInvalid)) {
54833                               UnallocatedA32(instr);
54834                               return;
54835                             }
54836                             DecodeNeonAndAlign decode_neon =
54837                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
54838                                                            dt);
54839                             if (!decode_neon.IsValid()) {
54840                               UnallocatedA32(instr);
54841                               return;
54842                             }
54843                             Alignment align = decode_neon.GetAlign();
54844                             int lane = decode_neon.GetLane();
54845                             SpacingType spacing = decode_neon.GetSpacing();
54846                             unsigned first = ExtractDRegister(instr, 22, 12);
54847                             unsigned length = 4;
54848                             unsigned last =
54849                                 first +
54850                                 (length - 1) * (spacing == kSingle ? 1 : 2);
54851                             unsigned rn = (instr >> 16) & 0xf;
54852                             unsigned rm = instr & 0xf;
54853                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54854                             vld4(al,
54855                                  dt,
54856                                  NeonRegisterList(DRegister(first),
54857                                                   DRegister(last),
54858                                                   spacing,
54859                                                   lane),
54860                                  AlignedMemOperand(Register(rn),
54861                                                    align,
54862                                                    Register(rm),
54863                                                    PostIndex));
54864                             break;
54865                           }
54866                         }
54867                         break;
54868                       }
54869                     }
54870                     break;
54871                   }
54872                 }
54873                 break;
54874               }
54875             }
54876             break;
54877           }
54878           case 0x01100000: {
54879             // 0xf5100000
54880             switch (instr & 0x000f0000) {
54881               case 0x000f0000: {
54882                 // 0xf51f0000
54883                 uint32_t U = (instr >> 23) & 0x1;
54884                 int32_t imm = instr & 0xfff;
54885                 if (U == 0) imm = -imm;
54886                 bool minus_zero = (imm == 0) && (U == 0);
54887                 Location location(imm, kA32PcDelta);
54888                 // PLD{<c>}{<q>} <label> ; A1
54889                 if (minus_zero) {
54890                   pld(al, MemOperand(pc, minus, 0));
54891                 } else {
54892                   pld(al, &location);
54893                 }
54894                 if (((instr & 0xff7ff000) != 0xf55ff000)) {
54895                   UnpredictableA32(instr);
54896                 }
54897                 break;
54898               }
54899               default: {
54900                 switch (instr & 0x00400000) {
54901                   case 0x00000000: {
54902                     // 0xf5100000
54903                     if (((instr & 0xf0000) == 0xf0000)) {
54904                       UnallocatedA32(instr);
54905                       return;
54906                     }
54907                     unsigned rn = (instr >> 16) & 0xf;
54908                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
54909                     int32_t offset = instr & 0xfff;
54910                     // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
54911                     pldw(al, MemOperand(Register(rn), sign, offset, Offset));
54912                     if (((instr & 0xff70f000) != 0xf510f000)) {
54913                       UnpredictableA32(instr);
54914                     }
54915                     break;
54916                   }
54917                   case 0x00400000: {
54918                     // 0xf5500000
54919                     if (((instr & 0xf0000) == 0xf0000)) {
54920                       UnallocatedA32(instr);
54921                       return;
54922                     }
54923                     unsigned rn = (instr >> 16) & 0xf;
54924                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
54925                     int32_t offset = instr & 0xfff;
54926                     // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
54927                     pld(al, MemOperand(Register(rn), sign, offset, Offset));
54928                     if (((instr & 0xff70f000) != 0xf550f000)) {
54929                       UnpredictableA32(instr);
54930                     }
54931                     break;
54932                   }
54933                 }
54934                 break;
54935               }
54936             }
54937             break;
54938           }
54939           case 0x01300000: {
54940             // 0xf5300000
54941             switch (instr & 0x00c000f0) {
54942               case 0x00400010: {
54943                 // 0xf5700010
54944                 // CLREX{<c>}{<q>} ; A1
54945                 clrex(al);
54946                 if (((instr & 0xffffffff) != 0xf57ff01f)) {
54947                   UnpredictableA32(instr);
54948                 }
54949                 break;
54950               }
54951               case 0x00400040: {
54952                 // 0xf5700040
54953                 MemoryBarrier option(instr & 0xf);
54954                 // DSB{<c>}{<q>} {<option>} ; A1
54955                 dsb(al, option);
54956                 if (((instr & 0xfffffff0) != 0xf57ff040)) {
54957                   UnpredictableA32(instr);
54958                 }
54959                 break;
54960               }
54961               case 0x00400050: {
54962                 // 0xf5700050
54963                 MemoryBarrier option(instr & 0xf);
54964                 // DMB{<c>}{<q>} {<option>} ; A1
54965                 dmb(al, option);
54966                 if (((instr & 0xfffffff0) != 0xf57ff050)) {
54967                   UnpredictableA32(instr);
54968                 }
54969                 break;
54970               }
54971               case 0x00400060: {
54972                 // 0xf5700060
54973                 MemoryBarrier option(instr & 0xf);
54974                 // ISB{<c>}{<q>} {<option>} ; A1
54975                 isb(al, option);
54976                 if (((instr & 0xfffffff0) != 0xf57ff060)) {
54977                   UnpredictableA32(instr);
54978                 }
54979                 break;
54980               }
54981               default:
54982                 UnallocatedA32(instr);
54983                 break;
54984             }
54985             break;
54986           }
54987           default:
54988             UnallocatedA32(instr);
54989             break;
54990         }
54991         break;
54992       }
54993       case 0x06000000: {
54994         // 0xf6000000
54995         switch (instr & 0x01700010) {
54996           case 0x00500000: {
54997             // 0xf6500000
54998             switch (instr & 0x00000fe0) {
54999               case 0x00000060: {
55000                 // 0xf6500060
55001                 unsigned rn = (instr >> 16) & 0xf;
55002                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55003                 unsigned rm = instr & 0xf;
55004                 Shift shift = RRX;
55005                 uint32_t amount = 0;
55006                 AddrMode addrmode = Offset;
55007                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55008                 pli(al,
55009                     MemOperand(Register(rn),
55010                                sign,
55011                                Register(rm),
55012                                shift,
55013                                amount,
55014                                addrmode));
55015                 if (((instr & 0xff70fff0) != 0xf650f060)) {
55016                   UnpredictableA32(instr);
55017                 }
55018                 break;
55019               }
55020               default: {
55021                 if (((instr & 0xfe0) == 0x60)) {
55022                   UnallocatedA32(instr);
55023                   return;
55024                 }
55025                 unsigned rn = (instr >> 16) & 0xf;
55026                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55027                 unsigned rm = instr & 0xf;
55028                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55029                                                     (instr >> 7) & 0x1f);
55030                 Shift shift = shift_operand.GetShift();
55031                 uint32_t amount = shift_operand.GetAmount();
55032                 AddrMode addrmode = Offset;
55033                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55034                 pli(al,
55035                     MemOperand(Register(rn),
55036                                sign,
55037                                Register(rm),
55038                                shift,
55039                                amount,
55040                                addrmode));
55041                 if (((instr & 0xff70f010) != 0xf650f000)) {
55042                   UnpredictableA32(instr);
55043                 }
55044                 break;
55045               }
55046             }
55047             break;
55048           }
55049           case 0x01100000: {
55050             // 0xf7100000
55051             switch (instr & 0x00000fe0) {
55052               case 0x00000060: {
55053                 // 0xf7100060
55054                 unsigned rn = (instr >> 16) & 0xf;
55055                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55056                 unsigned rm = instr & 0xf;
55057                 Shift shift = RRX;
55058                 uint32_t amount = 0;
55059                 AddrMode addrmode = Offset;
55060                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55061                 pldw(al,
55062                      MemOperand(Register(rn),
55063                                 sign,
55064                                 Register(rm),
55065                                 shift,
55066                                 amount,
55067                                 addrmode));
55068                 if (((instr & 0xff70fff0) != 0xf710f060)) {
55069                   UnpredictableA32(instr);
55070                 }
55071                 break;
55072               }
55073               default: {
55074                 if (((instr & 0xfe0) == 0x60)) {
55075                   UnallocatedA32(instr);
55076                   return;
55077                 }
55078                 unsigned rn = (instr >> 16) & 0xf;
55079                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55080                 unsigned rm = instr & 0xf;
55081                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55082                                                     (instr >> 7) & 0x1f);
55083                 Shift shift = shift_operand.GetShift();
55084                 uint32_t amount = shift_operand.GetAmount();
55085                 AddrMode addrmode = Offset;
55086                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55087                 pldw(al,
55088                      MemOperand(Register(rn),
55089                                 sign,
55090                                 Register(rm),
55091                                 shift,
55092                                 amount,
55093                                 addrmode));
55094                 if (((instr & 0xff70f010) != 0xf710f000)) {
55095                   UnpredictableA32(instr);
55096                 }
55097                 break;
55098               }
55099             }
55100             break;
55101           }
55102           case 0x01500000: {
55103             // 0xf7500000
55104             switch (instr & 0x00000fe0) {
55105               case 0x00000060: {
55106                 // 0xf7500060
55107                 unsigned rn = (instr >> 16) & 0xf;
55108                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55109                 unsigned rm = instr & 0xf;
55110                 Shift shift = RRX;
55111                 uint32_t amount = 0;
55112                 AddrMode addrmode = Offset;
55113                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55114                 pld(al,
55115                     MemOperand(Register(rn),
55116                                sign,
55117                                Register(rm),
55118                                shift,
55119                                amount,
55120                                addrmode));
55121                 if (((instr & 0xff70fff0) != 0xf750f060)) {
55122                   UnpredictableA32(instr);
55123                 }
55124                 break;
55125               }
55126               default: {
55127                 if (((instr & 0xfe0) == 0x60)) {
55128                   UnallocatedA32(instr);
55129                   return;
55130                 }
55131                 unsigned rn = (instr >> 16) & 0xf;
55132                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55133                 unsigned rm = instr & 0xf;
55134                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55135                                                     (instr >> 7) & 0x1f);
55136                 Shift shift = shift_operand.GetShift();
55137                 uint32_t amount = shift_operand.GetAmount();
55138                 AddrMode addrmode = Offset;
55139                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55140                 pld(al,
55141                     MemOperand(Register(rn),
55142                                sign,
55143                                Register(rm),
55144                                shift,
55145                                amount,
55146                                addrmode));
55147                 if (((instr & 0xff70f010) != 0xf750f000)) {
55148                   UnpredictableA32(instr);
55149                 }
55150                 break;
55151               }
55152             }
55153             break;
55154           }
55155           default:
55156             UnallocatedA32(instr);
55157             break;
55158         }
55159         break;
55160       }
55161       case 0x08000000: {
55162         // 0xf8000000
55163         switch (instr & 0x01d00000) {
55164           case 0x00100000: {
55165             // 0xf8100000
55166             UnimplementedA32("RFEDA", instr);
55167             break;
55168           }
55169           case 0x00400000: {
55170             // 0xf8400000
55171             UnimplementedA32("SRSDA", instr);
55172             break;
55173           }
55174           case 0x00900000: {
55175             // 0xf8900000
55176             UnimplementedA32("RFE{IA}", instr);
55177             break;
55178           }
55179           case 0x00c00000: {
55180             // 0xf8c00000
55181             UnimplementedA32("SRS{IA}", instr);
55182             break;
55183           }
55184           case 0x01100000: {
55185             // 0xf9100000
55186             UnimplementedA32("RFEDB", instr);
55187             break;
55188           }
55189           case 0x01400000: {
55190             // 0xf9400000
55191             UnimplementedA32("SRSDB", instr);
55192             break;
55193           }
55194           case 0x01900000: {
55195             // 0xf9900000
55196             UnimplementedA32("RFEIB", instr);
55197             break;
55198           }
55199           case 0x01c00000: {
55200             // 0xf9c00000
55201             UnimplementedA32("SRSIB", instr);
55202             break;
55203           }
55204           default:
55205             UnallocatedA32(instr);
55206             break;
55207         }
55208         break;
55209       }
55210       case 0x0a000000: {
55211         // 0xfa000000
55212         int32_t imm = SignExtend<int32_t>((((instr >> 24) & 0x1) |
55213                                            ((instr << 1) & 0x1fffffe))
55214                                               << 1,
55215                                           26);
55216         Location location(imm, kA32PcDelta);
55217         // BLX{<c>}{<q>} <label> ; A2
55218         blx(al, &location);
55219         break;
55220       }
55221       case 0x0e000000: {
55222         // 0xfe000000
55223         switch (instr & 0x01b00f50) {
55224           case 0x00000a00: {
55225             // 0xfe000a00
55226             unsigned rd = ExtractSRegister(instr, 22, 12);
55227             unsigned rn = ExtractSRegister(instr, 7, 16);
55228             unsigned rm = ExtractSRegister(instr, 5, 0);
55229             // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1
55230             vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55231             break;
55232           }
55233           case 0x00000b00: {
55234             // 0xfe000b00
55235             unsigned rd = ExtractDRegister(instr, 22, 12);
55236             unsigned rn = ExtractDRegister(instr, 7, 16);
55237             unsigned rm = ExtractDRegister(instr, 5, 0);
55238             // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1
55239             vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55240             break;
55241           }
55242           case 0x00100a00: {
55243             // 0xfe100a00
55244             unsigned rd = ExtractSRegister(instr, 22, 12);
55245             unsigned rn = ExtractSRegister(instr, 7, 16);
55246             unsigned rm = ExtractSRegister(instr, 5, 0);
55247             // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1
55248             vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55249             break;
55250           }
55251           case 0x00100b00: {
55252             // 0xfe100b00
55253             unsigned rd = ExtractDRegister(instr, 22, 12);
55254             unsigned rn = ExtractDRegister(instr, 7, 16);
55255             unsigned rm = ExtractDRegister(instr, 5, 0);
55256             // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1
55257             vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55258             break;
55259           }
55260           case 0x00200a00: {
55261             // 0xfe200a00
55262             unsigned rd = ExtractSRegister(instr, 22, 12);
55263             unsigned rn = ExtractSRegister(instr, 7, 16);
55264             unsigned rm = ExtractSRegister(instr, 5, 0);
55265             // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1
55266             vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55267             break;
55268           }
55269           case 0x00200b00: {
55270             // 0xfe200b00
55271             unsigned rd = ExtractDRegister(instr, 22, 12);
55272             unsigned rn = ExtractDRegister(instr, 7, 16);
55273             unsigned rm = ExtractDRegister(instr, 5, 0);
55274             // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1
55275             vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55276             break;
55277           }
55278           case 0x00300a00: {
55279             // 0xfe300a00
55280             unsigned rd = ExtractSRegister(instr, 22, 12);
55281             unsigned rn = ExtractSRegister(instr, 7, 16);
55282             unsigned rm = ExtractSRegister(instr, 5, 0);
55283             // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1
55284             vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55285             break;
55286           }
55287           case 0x00300b00: {
55288             // 0xfe300b00
55289             unsigned rd = ExtractDRegister(instr, 22, 12);
55290             unsigned rn = ExtractDRegister(instr, 7, 16);
55291             unsigned rm = ExtractDRegister(instr, 5, 0);
55292             // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1
55293             vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55294             break;
55295           }
55296           case 0x00800a00: {
55297             // 0xfe800a00
55298             unsigned rd = ExtractSRegister(instr, 22, 12);
55299             unsigned rn = ExtractSRegister(instr, 7, 16);
55300             unsigned rm = ExtractSRegister(instr, 5, 0);
55301             // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
55302             vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55303             break;
55304           }
55305           case 0x00800a40: {
55306             // 0xfe800a40
55307             unsigned rd = ExtractSRegister(instr, 22, 12);
55308             unsigned rn = ExtractSRegister(instr, 7, 16);
55309             unsigned rm = ExtractSRegister(instr, 5, 0);
55310             // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
55311             vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55312             break;
55313           }
55314           case 0x00800b00: {
55315             // 0xfe800b00
55316             unsigned rd = ExtractDRegister(instr, 22, 12);
55317             unsigned rn = ExtractDRegister(instr, 7, 16);
55318             unsigned rm = ExtractDRegister(instr, 5, 0);
55319             // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
55320             vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55321             break;
55322           }
55323           case 0x00800b40: {
55324             // 0xfe800b40
55325             unsigned rd = ExtractDRegister(instr, 22, 12);
55326             unsigned rn = ExtractDRegister(instr, 7, 16);
55327             unsigned rm = ExtractDRegister(instr, 5, 0);
55328             // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
55329             vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55330             break;
55331           }
55332           case 0x00b00a40: {
55333             // 0xfeb00a40
55334             switch (instr & 0x000f0000) {
55335               case 0x00080000: {
55336                 // 0xfeb80a40
55337                 if ((instr & 0x00000080) == 0x00000000) {
55338                   unsigned rd = ExtractSRegister(instr, 22, 12);
55339                   unsigned rm = ExtractSRegister(instr, 5, 0);
55340                   // VRINTA{<q>}.F32 <Sd>, <Sm> ; A1
55341                   vrinta(F32, SRegister(rd), SRegister(rm));
55342                 } else {
55343                   UnallocatedA32(instr);
55344                 }
55345                 break;
55346               }
55347               case 0x00090000: {
55348                 // 0xfeb90a40
55349                 if ((instr & 0x00000080) == 0x00000000) {
55350                   unsigned rd = ExtractSRegister(instr, 22, 12);
55351                   unsigned rm = ExtractSRegister(instr, 5, 0);
55352                   // VRINTN{<q>}.F32 <Sd>, <Sm> ; A1
55353                   vrintn(F32, SRegister(rd), SRegister(rm));
55354                 } else {
55355                   UnallocatedA32(instr);
55356                 }
55357                 break;
55358               }
55359               case 0x000a0000: {
55360                 // 0xfeba0a40
55361                 if ((instr & 0x00000080) == 0x00000000) {
55362                   unsigned rd = ExtractSRegister(instr, 22, 12);
55363                   unsigned rm = ExtractSRegister(instr, 5, 0);
55364                   // VRINTP{<q>}.F32 <Sd>, <Sm> ; A1
55365                   vrintp(F32, SRegister(rd), SRegister(rm));
55366                 } else {
55367                   UnallocatedA32(instr);
55368                 }
55369                 break;
55370               }
55371               case 0x000b0000: {
55372                 // 0xfebb0a40
55373                 if ((instr & 0x00000080) == 0x00000000) {
55374                   unsigned rd = ExtractSRegister(instr, 22, 12);
55375                   unsigned rm = ExtractSRegister(instr, 5, 0);
55376                   // VRINTM{<q>}.F32 <Sd>, <Sm> ; A1
55377                   vrintm(F32, SRegister(rd), SRegister(rm));
55378                 } else {
55379                   UnallocatedA32(instr);
55380                 }
55381                 break;
55382               }
55383               case 0x000c0000: {
55384                 // 0xfebc0a40
55385                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55386                 if (dt.Is(kDataTypeValueInvalid)) {
55387                   UnallocatedA32(instr);
55388                   return;
55389                 }
55390                 unsigned rd = ExtractSRegister(instr, 22, 12);
55391                 unsigned rm = ExtractSRegister(instr, 5, 0);
55392                 // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55393                 vcvta(dt, F32, SRegister(rd), SRegister(rm));
55394                 break;
55395               }
55396               case 0x000d0000: {
55397                 // 0xfebd0a40
55398                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55399                 if (dt.Is(kDataTypeValueInvalid)) {
55400                   UnallocatedA32(instr);
55401                   return;
55402                 }
55403                 unsigned rd = ExtractSRegister(instr, 22, 12);
55404                 unsigned rm = ExtractSRegister(instr, 5, 0);
55405                 // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55406                 vcvtn(dt, F32, SRegister(rd), SRegister(rm));
55407                 break;
55408               }
55409               case 0x000e0000: {
55410                 // 0xfebe0a40
55411                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55412                 if (dt.Is(kDataTypeValueInvalid)) {
55413                   UnallocatedA32(instr);
55414                   return;
55415                 }
55416                 unsigned rd = ExtractSRegister(instr, 22, 12);
55417                 unsigned rm = ExtractSRegister(instr, 5, 0);
55418                 // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55419                 vcvtp(dt, F32, SRegister(rd), SRegister(rm));
55420                 break;
55421               }
55422               case 0x000f0000: {
55423                 // 0xfebf0a40
55424                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55425                 if (dt.Is(kDataTypeValueInvalid)) {
55426                   UnallocatedA32(instr);
55427                   return;
55428                 }
55429                 unsigned rd = ExtractSRegister(instr, 22, 12);
55430                 unsigned rm = ExtractSRegister(instr, 5, 0);
55431                 // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55432                 vcvtm(dt, F32, SRegister(rd), SRegister(rm));
55433                 break;
55434               }
55435               default:
55436                 UnallocatedA32(instr);
55437                 break;
55438             }
55439             break;
55440           }
55441           case 0x00b00b40: {
55442             // 0xfeb00b40
55443             switch (instr & 0x000f0000) {
55444               case 0x00080000: {
55445                 // 0xfeb80b40
55446                 if ((instr & 0x00000080) == 0x00000000) {
55447                   unsigned rd = ExtractDRegister(instr, 22, 12);
55448                   unsigned rm = ExtractDRegister(instr, 5, 0);
55449                   // VRINTA{<q>}.F64 <Dd>, <Dm> ; A1
55450                   vrinta(F64, DRegister(rd), DRegister(rm));
55451                 } else {
55452                   UnallocatedA32(instr);
55453                 }
55454                 break;
55455               }
55456               case 0x00090000: {
55457                 // 0xfeb90b40
55458                 if ((instr & 0x00000080) == 0x00000000) {
55459                   unsigned rd = ExtractDRegister(instr, 22, 12);
55460                   unsigned rm = ExtractDRegister(instr, 5, 0);
55461                   // VRINTN{<q>}.F64 <Dd>, <Dm> ; A1
55462                   vrintn(F64, DRegister(rd), DRegister(rm));
55463                 } else {
55464                   UnallocatedA32(instr);
55465                 }
55466                 break;
55467               }
55468               case 0x000a0000: {
55469                 // 0xfeba0b40
55470                 if ((instr & 0x00000080) == 0x00000000) {
55471                   unsigned rd = ExtractDRegister(instr, 22, 12);
55472                   unsigned rm = ExtractDRegister(instr, 5, 0);
55473                   // VRINTP{<q>}.F64 <Dd>, <Dm> ; A1
55474                   vrintp(F64, DRegister(rd), DRegister(rm));
55475                 } else {
55476                   UnallocatedA32(instr);
55477                 }
55478                 break;
55479               }
55480               case 0x000b0000: {
55481                 // 0xfebb0b40
55482                 if ((instr & 0x00000080) == 0x00000000) {
55483                   unsigned rd = ExtractDRegister(instr, 22, 12);
55484                   unsigned rm = ExtractDRegister(instr, 5, 0);
55485                   // VRINTM{<q>}.F64 <Dd>, <Dm> ; A1
55486                   vrintm(F64, DRegister(rd), DRegister(rm));
55487                 } else {
55488                   UnallocatedA32(instr);
55489                 }
55490                 break;
55491               }
55492               case 0x000c0000: {
55493                 // 0xfebc0b40
55494                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55495                 if (dt.Is(kDataTypeValueInvalid)) {
55496                   UnallocatedA32(instr);
55497                   return;
55498                 }
55499                 unsigned rd = ExtractSRegister(instr, 22, 12);
55500                 unsigned rm = ExtractDRegister(instr, 5, 0);
55501                 // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55502                 vcvta(dt, F64, SRegister(rd), DRegister(rm));
55503                 break;
55504               }
55505               case 0x000d0000: {
55506                 // 0xfebd0b40
55507                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55508                 if (dt.Is(kDataTypeValueInvalid)) {
55509                   UnallocatedA32(instr);
55510                   return;
55511                 }
55512                 unsigned rd = ExtractSRegister(instr, 22, 12);
55513                 unsigned rm = ExtractDRegister(instr, 5, 0);
55514                 // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55515                 vcvtn(dt, F64, SRegister(rd), DRegister(rm));
55516                 break;
55517               }
55518               case 0x000e0000: {
55519                 // 0xfebe0b40
55520                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55521                 if (dt.Is(kDataTypeValueInvalid)) {
55522                   UnallocatedA32(instr);
55523                   return;
55524                 }
55525                 unsigned rd = ExtractSRegister(instr, 22, 12);
55526                 unsigned rm = ExtractDRegister(instr, 5, 0);
55527                 // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55528                 vcvtp(dt, F64, SRegister(rd), DRegister(rm));
55529                 break;
55530               }
55531               case 0x000f0000: {
55532                 // 0xfebf0b40
55533                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55534                 if (dt.Is(kDataTypeValueInvalid)) {
55535                   UnallocatedA32(instr);
55536                   return;
55537                 }
55538                 unsigned rd = ExtractSRegister(instr, 22, 12);
55539                 unsigned rm = ExtractDRegister(instr, 5, 0);
55540                 // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55541                 vcvtm(dt, F64, SRegister(rd), DRegister(rm));
55542                 break;
55543               }
55544               default:
55545                 UnallocatedA32(instr);
55546                 break;
55547             }
55548             break;
55549           }
55550           default:
55551             UnallocatedA32(instr);
55552             break;
55553         }
55554         break;
55555       }
55556       default:
55557         UnallocatedA32(instr);
55558         break;
55559     }
55560   } else {
55561     switch (instr & 0x0e000000) {
55562       case 0x00000000: {
55563         // 0x00000000
55564         switch (instr & 0x00100010) {
55565           case 0x00000000: {
55566             // 0x00000000
55567             switch (instr & 0x01a00000) {
55568               case 0x00000000: {
55569                 // 0x00000000
55570                 switch (instr & 0x00400000) {
55571                   case 0x00000000: {
55572                     // 0x00000000
55573                     switch (instr & 0x00000fe0) {
55574                       case 0x00000060: {
55575                         // 0x00000060
55576                         if (((instr & 0xf0000000) == 0xf0000000)) {
55577                           UnallocatedA32(instr);
55578                           return;
55579                         }
55580                         Condition condition((instr >> 28) & 0xf);
55581                         unsigned rd = (instr >> 12) & 0xf;
55582                         unsigned rn = (instr >> 16) & 0xf;
55583                         unsigned rm = instr & 0xf;
55584                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55585                         and_(condition,
55586                              Best,
55587                              Register(rd),
55588                              Register(rn),
55589                              Operand(Register(rm), RRX));
55590                         break;
55591                       }
55592                       default: {
55593                         if (((instr & 0xf0000000) == 0xf0000000) ||
55594                             ((instr & 0xfe0) == 0x60)) {
55595                           UnallocatedA32(instr);
55596                           return;
55597                         }
55598                         Condition condition((instr >> 28) & 0xf);
55599                         unsigned rd = (instr >> 12) & 0xf;
55600                         unsigned rn = (instr >> 16) & 0xf;
55601                         unsigned rm = instr & 0xf;
55602                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55603                                                             (instr >> 7) &
55604                                                                 0x1f);
55605                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55606                         and_(condition,
55607                              Best,
55608                              Register(rd),
55609                              Register(rn),
55610                              Operand(Register(rm),
55611                                      shift_operand.GetType(),
55612                                      shift_operand.GetAmount()));
55613                         break;
55614                       }
55615                     }
55616                     break;
55617                   }
55618                   case 0x00400000: {
55619                     // 0x00400000
55620                     switch (instr & 0x000f0000) {
55621                       case 0x000d0000: {
55622                         // 0x004d0000
55623                         switch (instr & 0x00000fe0) {
55624                           case 0x00000060: {
55625                             // 0x004d0060
55626                             if (((instr & 0xf0000000) == 0xf0000000)) {
55627                               UnallocatedA32(instr);
55628                               return;
55629                             }
55630                             Condition condition((instr >> 28) & 0xf);
55631                             unsigned rd = (instr >> 12) & 0xf;
55632                             unsigned rm = instr & 0xf;
55633                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
55634                             sub(condition,
55635                                 Best,
55636                                 Register(rd),
55637                                 sp,
55638                                 Operand(Register(rm), RRX));
55639                             break;
55640                           }
55641                           default: {
55642                             if (((instr & 0xf0000000) == 0xf0000000) ||
55643                                 ((instr & 0xfe0) == 0x60)) {
55644                               UnallocatedA32(instr);
55645                               return;
55646                             }
55647                             Condition condition((instr >> 28) & 0xf);
55648                             unsigned rd = (instr >> 12) & 0xf;
55649                             unsigned rm = instr & 0xf;
55650                             ImmediateShiftOperand shift_operand((instr >> 5) &
55651                                                                     0x3,
55652                                                                 (instr >> 7) &
55653                                                                     0x1f);
55654                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55655                             sub(condition,
55656                                 Best,
55657                                 Register(rd),
55658                                 sp,
55659                                 Operand(Register(rm),
55660                                         shift_operand.GetType(),
55661                                         shift_operand.GetAmount()));
55662                             break;
55663                           }
55664                         }
55665                         break;
55666                       }
55667                       default: {
55668                         switch (instr & 0x00000fe0) {
55669                           case 0x00000060: {
55670                             // 0x00400060
55671                             if (((instr & 0xf0000000) == 0xf0000000) ||
55672                                 ((instr & 0xf0000) == 0xd0000)) {
55673                               UnallocatedA32(instr);
55674                               return;
55675                             }
55676                             Condition condition((instr >> 28) & 0xf);
55677                             unsigned rd = (instr >> 12) & 0xf;
55678                             unsigned rn = (instr >> 16) & 0xf;
55679                             unsigned rm = instr & 0xf;
55680                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55681                             sub(condition,
55682                                 Best,
55683                                 Register(rd),
55684                                 Register(rn),
55685                                 Operand(Register(rm), RRX));
55686                             break;
55687                           }
55688                           default: {
55689                             if (((instr & 0xf0000000) == 0xf0000000) ||
55690                                 ((instr & 0xf0000) == 0xd0000) ||
55691                                 ((instr & 0xfe0) == 0x60)) {
55692                               UnallocatedA32(instr);
55693                               return;
55694                             }
55695                             Condition condition((instr >> 28) & 0xf);
55696                             unsigned rd = (instr >> 12) & 0xf;
55697                             unsigned rn = (instr >> 16) & 0xf;
55698                             unsigned rm = instr & 0xf;
55699                             ImmediateShiftOperand shift_operand((instr >> 5) &
55700                                                                     0x3,
55701                                                                 (instr >> 7) &
55702                                                                     0x1f);
55703                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55704                             sub(condition,
55705                                 Best,
55706                                 Register(rd),
55707                                 Register(rn),
55708                                 Operand(Register(rm),
55709                                         shift_operand.GetType(),
55710                                         shift_operand.GetAmount()));
55711                             break;
55712                           }
55713                         }
55714                         break;
55715                       }
55716                     }
55717                     break;
55718                   }
55719                 }
55720                 break;
55721               }
55722               case 0x00200000: {
55723                 // 0x00200000
55724                 switch (instr & 0x00400000) {
55725                   case 0x00000000: {
55726                     // 0x00200000
55727                     switch (instr & 0x00000fe0) {
55728                       case 0x00000060: {
55729                         // 0x00200060
55730                         if (((instr & 0xf0000000) == 0xf0000000)) {
55731                           UnallocatedA32(instr);
55732                           return;
55733                         }
55734                         Condition condition((instr >> 28) & 0xf);
55735                         unsigned rd = (instr >> 12) & 0xf;
55736                         unsigned rn = (instr >> 16) & 0xf;
55737                         unsigned rm = instr & 0xf;
55738                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55739                         eor(condition,
55740                             Best,
55741                             Register(rd),
55742                             Register(rn),
55743                             Operand(Register(rm), RRX));
55744                         break;
55745                       }
55746                       default: {
55747                         if (((instr & 0xf0000000) == 0xf0000000) ||
55748                             ((instr & 0xfe0) == 0x60)) {
55749                           UnallocatedA32(instr);
55750                           return;
55751                         }
55752                         Condition condition((instr >> 28) & 0xf);
55753                         unsigned rd = (instr >> 12) & 0xf;
55754                         unsigned rn = (instr >> 16) & 0xf;
55755                         unsigned rm = instr & 0xf;
55756                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55757                                                             (instr >> 7) &
55758                                                                 0x1f);
55759                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55760                         eor(condition,
55761                             Best,
55762                             Register(rd),
55763                             Register(rn),
55764                             Operand(Register(rm),
55765                                     shift_operand.GetType(),
55766                                     shift_operand.GetAmount()));
55767                         break;
55768                       }
55769                     }
55770                     break;
55771                   }
55772                   case 0x00400000: {
55773                     // 0x00600000
55774                     switch (instr & 0x00000fe0) {
55775                       case 0x00000060: {
55776                         // 0x00600060
55777                         if (((instr & 0xf0000000) == 0xf0000000)) {
55778                           UnallocatedA32(instr);
55779                           return;
55780                         }
55781                         Condition condition((instr >> 28) & 0xf);
55782                         unsigned rd = (instr >> 12) & 0xf;
55783                         unsigned rn = (instr >> 16) & 0xf;
55784                         unsigned rm = instr & 0xf;
55785                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55786                         rsb(condition,
55787                             Best,
55788                             Register(rd),
55789                             Register(rn),
55790                             Operand(Register(rm), RRX));
55791                         break;
55792                       }
55793                       default: {
55794                         if (((instr & 0xf0000000) == 0xf0000000) ||
55795                             ((instr & 0xfe0) == 0x60)) {
55796                           UnallocatedA32(instr);
55797                           return;
55798                         }
55799                         Condition condition((instr >> 28) & 0xf);
55800                         unsigned rd = (instr >> 12) & 0xf;
55801                         unsigned rn = (instr >> 16) & 0xf;
55802                         unsigned rm = instr & 0xf;
55803                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55804                                                             (instr >> 7) &
55805                                                                 0x1f);
55806                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55807                         rsb(condition,
55808                             Best,
55809                             Register(rd),
55810                             Register(rn),
55811                             Operand(Register(rm),
55812                                     shift_operand.GetType(),
55813                                     shift_operand.GetAmount()));
55814                         break;
55815                       }
55816                     }
55817                     break;
55818                   }
55819                 }
55820                 break;
55821               }
55822               case 0x00800000: {
55823                 // 0x00800000
55824                 switch (instr & 0x00400000) {
55825                   case 0x00000000: {
55826                     // 0x00800000
55827                     switch (instr & 0x000f0000) {
55828                       case 0x000d0000: {
55829                         // 0x008d0000
55830                         switch (instr & 0x00000fe0) {
55831                           case 0x00000060: {
55832                             // 0x008d0060
55833                             if (((instr & 0xf0000000) == 0xf0000000)) {
55834                               UnallocatedA32(instr);
55835                               return;
55836                             }
55837                             Condition condition((instr >> 28) & 0xf);
55838                             unsigned rd = (instr >> 12) & 0xf;
55839                             unsigned rm = instr & 0xf;
55840                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
55841                             add(condition,
55842                                 Best,
55843                                 Register(rd),
55844                                 sp,
55845                                 Operand(Register(rm), RRX));
55846                             break;
55847                           }
55848                           default: {
55849                             if (((instr & 0xf0000000) == 0xf0000000) ||
55850                                 ((instr & 0xfe0) == 0x60)) {
55851                               UnallocatedA32(instr);
55852                               return;
55853                             }
55854                             Condition condition((instr >> 28) & 0xf);
55855                             unsigned rd = (instr >> 12) & 0xf;
55856                             unsigned rm = instr & 0xf;
55857                             ImmediateShiftOperand shift_operand((instr >> 5) &
55858                                                                     0x3,
55859                                                                 (instr >> 7) &
55860                                                                     0x1f);
55861                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55862                             add(condition,
55863                                 Best,
55864                                 Register(rd),
55865                                 sp,
55866                                 Operand(Register(rm),
55867                                         shift_operand.GetType(),
55868                                         shift_operand.GetAmount()));
55869                             break;
55870                           }
55871                         }
55872                         break;
55873                       }
55874                       default: {
55875                         switch (instr & 0x00000fe0) {
55876                           case 0x00000060: {
55877                             // 0x00800060
55878                             if (((instr & 0xf0000000) == 0xf0000000) ||
55879                                 ((instr & 0xf0000) == 0xd0000)) {
55880                               UnallocatedA32(instr);
55881                               return;
55882                             }
55883                             Condition condition((instr >> 28) & 0xf);
55884                             unsigned rd = (instr >> 12) & 0xf;
55885                             unsigned rn = (instr >> 16) & 0xf;
55886                             unsigned rm = instr & 0xf;
55887                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55888                             add(condition,
55889                                 Best,
55890                                 Register(rd),
55891                                 Register(rn),
55892                                 Operand(Register(rm), RRX));
55893                             break;
55894                           }
55895                           default: {
55896                             if (((instr & 0xf0000000) == 0xf0000000) ||
55897                                 ((instr & 0xf0000) == 0xd0000) ||
55898                                 ((instr & 0xfe0) == 0x60)) {
55899                               UnallocatedA32(instr);
55900                               return;
55901                             }
55902                             Condition condition((instr >> 28) & 0xf);
55903                             unsigned rd = (instr >> 12) & 0xf;
55904                             unsigned rn = (instr >> 16) & 0xf;
55905                             unsigned rm = instr & 0xf;
55906                             ImmediateShiftOperand shift_operand((instr >> 5) &
55907                                                                     0x3,
55908                                                                 (instr >> 7) &
55909                                                                     0x1f);
55910                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55911                             add(condition,
55912                                 Best,
55913                                 Register(rd),
55914                                 Register(rn),
55915                                 Operand(Register(rm),
55916                                         shift_operand.GetType(),
55917                                         shift_operand.GetAmount()));
55918                             break;
55919                           }
55920                         }
55921                         break;
55922                       }
55923                     }
55924                     break;
55925                   }
55926                   case 0x00400000: {
55927                     // 0x00c00000
55928                     switch (instr & 0x00000fe0) {
55929                       case 0x00000060: {
55930                         // 0x00c00060
55931                         if (((instr & 0xf0000000) == 0xf0000000)) {
55932                           UnallocatedA32(instr);
55933                           return;
55934                         }
55935                         Condition condition((instr >> 28) & 0xf);
55936                         unsigned rd = (instr >> 12) & 0xf;
55937                         unsigned rn = (instr >> 16) & 0xf;
55938                         unsigned rm = instr & 0xf;
55939                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55940                         sbc(condition,
55941                             Best,
55942                             Register(rd),
55943                             Register(rn),
55944                             Operand(Register(rm), RRX));
55945                         break;
55946                       }
55947                       default: {
55948                         if (((instr & 0xf0000000) == 0xf0000000) ||
55949                             ((instr & 0xfe0) == 0x60)) {
55950                           UnallocatedA32(instr);
55951                           return;
55952                         }
55953                         Condition condition((instr >> 28) & 0xf);
55954                         unsigned rd = (instr >> 12) & 0xf;
55955                         unsigned rn = (instr >> 16) & 0xf;
55956                         unsigned rm = instr & 0xf;
55957                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55958                                                             (instr >> 7) &
55959                                                                 0x1f);
55960                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55961                         sbc(condition,
55962                             Best,
55963                             Register(rd),
55964                             Register(rn),
55965                             Operand(Register(rm),
55966                                     shift_operand.GetType(),
55967                                     shift_operand.GetAmount()));
55968                         break;
55969                       }
55970                     }
55971                     break;
55972                   }
55973                 }
55974                 break;
55975               }
55976               case 0x00a00000: {
55977                 // 0x00a00000
55978                 switch (instr & 0x00400000) {
55979                   case 0x00000000: {
55980                     // 0x00a00000
55981                     switch (instr & 0x00000fe0) {
55982                       case 0x00000060: {
55983                         // 0x00a00060
55984                         if (((instr & 0xf0000000) == 0xf0000000)) {
55985                           UnallocatedA32(instr);
55986                           return;
55987                         }
55988                         Condition condition((instr >> 28) & 0xf);
55989                         unsigned rd = (instr >> 12) & 0xf;
55990                         unsigned rn = (instr >> 16) & 0xf;
55991                         unsigned rm = instr & 0xf;
55992                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55993                         adc(condition,
55994                             Best,
55995                             Register(rd),
55996                             Register(rn),
55997                             Operand(Register(rm), RRX));
55998                         break;
55999                       }
56000                       default: {
56001                         if (((instr & 0xf0000000) == 0xf0000000) ||
56002                             ((instr & 0xfe0) == 0x60)) {
56003                           UnallocatedA32(instr);
56004                           return;
56005                         }
56006                         Condition condition((instr >> 28) & 0xf);
56007                         unsigned rd = (instr >> 12) & 0xf;
56008                         unsigned rn = (instr >> 16) & 0xf;
56009                         unsigned rm = instr & 0xf;
56010                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56011                                                             (instr >> 7) &
56012                                                                 0x1f);
56013                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56014                         adc(condition,
56015                             Best,
56016                             Register(rd),
56017                             Register(rn),
56018                             Operand(Register(rm),
56019                                     shift_operand.GetType(),
56020                                     shift_operand.GetAmount()));
56021                         break;
56022                       }
56023                     }
56024                     break;
56025                   }
56026                   case 0x00400000: {
56027                     // 0x00e00000
56028                     switch (instr & 0x00000fe0) {
56029                       case 0x00000060: {
56030                         // 0x00e00060
56031                         if (((instr & 0xf0000000) == 0xf0000000)) {
56032                           UnallocatedA32(instr);
56033                           return;
56034                         }
56035                         Condition condition((instr >> 28) & 0xf);
56036                         unsigned rd = (instr >> 12) & 0xf;
56037                         unsigned rn = (instr >> 16) & 0xf;
56038                         unsigned rm = instr & 0xf;
56039                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56040                         rsc(condition,
56041                             Register(rd),
56042                             Register(rn),
56043                             Operand(Register(rm), RRX));
56044                         break;
56045                       }
56046                       default: {
56047                         if (((instr & 0xf0000000) == 0xf0000000) ||
56048                             ((instr & 0xfe0) == 0x60)) {
56049                           UnallocatedA32(instr);
56050                           return;
56051                         }
56052                         Condition condition((instr >> 28) & 0xf);
56053                         unsigned rd = (instr >> 12) & 0xf;
56054                         unsigned rn = (instr >> 16) & 0xf;
56055                         unsigned rm = instr & 0xf;
56056                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56057                                                             (instr >> 7) &
56058                                                                 0x1f);
56059                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56060                         rsc(condition,
56061                             Register(rd),
56062                             Register(rn),
56063                             Operand(Register(rm),
56064                                     shift_operand.GetType(),
56065                                     shift_operand.GetAmount()));
56066                         break;
56067                       }
56068                     }
56069                     break;
56070                   }
56071                 }
56072                 break;
56073               }
56074               case 0x01000000: {
56075                 // 0x01000000
56076                 switch (instr & 0x000000e0) {
56077                   case 0x00000000: {
56078                     // 0x01000000
56079                     switch (instr & 0x00000200) {
56080                       case 0x00000000: {
56081                         // 0x01000000
56082                         if (((instr & 0xf0000000) == 0xf0000000)) {
56083                           UnallocatedA32(instr);
56084                           return;
56085                         }
56086                         Condition condition((instr >> 28) & 0xf);
56087                         unsigned rd = (instr >> 12) & 0xf;
56088                         unsigned spec_reg = (instr >> 22) & 0x1;
56089                         // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1
56090                         mrs(condition, Register(rd), SpecialRegister(spec_reg));
56091                         if (((instr & 0xfbf0fff) != 0x10f0000)) {
56092                           UnpredictableA32(instr);
56093                         }
56094                         break;
56095                       }
56096                       case 0x00000200: {
56097                         // 0x01000200
56098                         if (((instr & 0xf0000000) == 0xf0000000)) {
56099                           UnallocatedA32(instr);
56100                           return;
56101                         }
56102                         UnimplementedA32("MRS", instr);
56103                         break;
56104                       }
56105                     }
56106                     break;
56107                   }
56108                   case 0x00000040: {
56109                     // 0x01000040
56110                     switch (instr & 0x00400200) {
56111                       case 0x00000000: {
56112                         // 0x01000040
56113                         if (((instr & 0xf0000000) == 0xf0000000)) {
56114                           UnallocatedA32(instr);
56115                           return;
56116                         }
56117                         unsigned rd = (instr >> 12) & 0xf;
56118                         unsigned rn = (instr >> 16) & 0xf;
56119                         unsigned rm = instr & 0xf;
56120                         // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1
56121                         crc32b(al, Register(rd), Register(rn), Register(rm));
56122                         if (((instr & 0xff00ff0) != 0x1000040)) {
56123                           UnpredictableA32(instr);
56124                         }
56125                         break;
56126                       }
56127                       case 0x00000200: {
56128                         // 0x01000240
56129                         if (((instr & 0xf0000000) == 0xf0000000)) {
56130                           UnallocatedA32(instr);
56131                           return;
56132                         }
56133                         unsigned rd = (instr >> 12) & 0xf;
56134                         unsigned rn = (instr >> 16) & 0xf;
56135                         unsigned rm = instr & 0xf;
56136                         // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1
56137                         crc32cb(al, Register(rd), Register(rn), Register(rm));
56138                         if (((instr & 0xff00ff0) != 0x1000240)) {
56139                           UnpredictableA32(instr);
56140                         }
56141                         break;
56142                       }
56143                       case 0x00400000: {
56144                         // 0x01400040
56145                         if (((instr & 0xf0000000) == 0xf0000000)) {
56146                           UnallocatedA32(instr);
56147                           return;
56148                         }
56149                         unsigned rd = (instr >> 12) & 0xf;
56150                         unsigned rn = (instr >> 16) & 0xf;
56151                         unsigned rm = instr & 0xf;
56152                         // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1
56153                         crc32w(al, Register(rd), Register(rn), Register(rm));
56154                         if (((instr & 0xff00ff0) != 0x1400040)) {
56155                           UnpredictableA32(instr);
56156                         }
56157                         break;
56158                       }
56159                       case 0x00400200: {
56160                         // 0x01400240
56161                         if (((instr & 0xf0000000) == 0xf0000000)) {
56162                           UnallocatedA32(instr);
56163                           return;
56164                         }
56165                         unsigned rd = (instr >> 12) & 0xf;
56166                         unsigned rn = (instr >> 16) & 0xf;
56167                         unsigned rm = instr & 0xf;
56168                         // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1
56169                         crc32cw(al, Register(rd), Register(rn), Register(rm));
56170                         if (((instr & 0xff00ff0) != 0x1400240)) {
56171                           UnpredictableA32(instr);
56172                         }
56173                         break;
56174                       }
56175                     }
56176                     break;
56177                   }
56178                   case 0x00000080: {
56179                     // 0x01000080
56180                     switch (instr & 0x00400000) {
56181                       case 0x00000000: {
56182                         // 0x01000080
56183                         if (((instr & 0xf0000000) == 0xf0000000)) {
56184                           UnallocatedA32(instr);
56185                           return;
56186                         }
56187                         Condition condition((instr >> 28) & 0xf);
56188                         unsigned rd = (instr >> 16) & 0xf;
56189                         unsigned rn = instr & 0xf;
56190                         unsigned rm = (instr >> 8) & 0xf;
56191                         unsigned ra = (instr >> 12) & 0xf;
56192                         // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56193                         smlabb(condition,
56194                                Register(rd),
56195                                Register(rn),
56196                                Register(rm),
56197                                Register(ra));
56198                         break;
56199                       }
56200                       case 0x00400000: {
56201                         // 0x01400080
56202                         if (((instr & 0xf0000000) == 0xf0000000)) {
56203                           UnallocatedA32(instr);
56204                           return;
56205                         }
56206                         Condition condition((instr >> 28) & 0xf);
56207                         unsigned rdlo = (instr >> 12) & 0xf;
56208                         unsigned rdhi = (instr >> 16) & 0xf;
56209                         unsigned rn = instr & 0xf;
56210                         unsigned rm = (instr >> 8) & 0xf;
56211                         // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56212                         smlalbb(condition,
56213                                 Register(rdlo),
56214                                 Register(rdhi),
56215                                 Register(rn),
56216                                 Register(rm));
56217                         break;
56218                       }
56219                     }
56220                     break;
56221                   }
56222                   case 0x000000a0: {
56223                     // 0x010000a0
56224                     switch (instr & 0x00400000) {
56225                       case 0x00000000: {
56226                         // 0x010000a0
56227                         if (((instr & 0xf0000000) == 0xf0000000)) {
56228                           UnallocatedA32(instr);
56229                           return;
56230                         }
56231                         Condition condition((instr >> 28) & 0xf);
56232                         unsigned rd = (instr >> 16) & 0xf;
56233                         unsigned rn = instr & 0xf;
56234                         unsigned rm = (instr >> 8) & 0xf;
56235                         unsigned ra = (instr >> 12) & 0xf;
56236                         // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56237                         smlatb(condition,
56238                                Register(rd),
56239                                Register(rn),
56240                                Register(rm),
56241                                Register(ra));
56242                         break;
56243                       }
56244                       case 0x00400000: {
56245                         // 0x014000a0
56246                         if (((instr & 0xf0000000) == 0xf0000000)) {
56247                           UnallocatedA32(instr);
56248                           return;
56249                         }
56250                         Condition condition((instr >> 28) & 0xf);
56251                         unsigned rdlo = (instr >> 12) & 0xf;
56252                         unsigned rdhi = (instr >> 16) & 0xf;
56253                         unsigned rn = instr & 0xf;
56254                         unsigned rm = (instr >> 8) & 0xf;
56255                         // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56256                         smlaltb(condition,
56257                                 Register(rdlo),
56258                                 Register(rdhi),
56259                                 Register(rn),
56260                                 Register(rm));
56261                         break;
56262                       }
56263                     }
56264                     break;
56265                   }
56266                   case 0x000000c0: {
56267                     // 0x010000c0
56268                     switch (instr & 0x00400000) {
56269                       case 0x00000000: {
56270                         // 0x010000c0
56271                         if (((instr & 0xf0000000) == 0xf0000000)) {
56272                           UnallocatedA32(instr);
56273                           return;
56274                         }
56275                         Condition condition((instr >> 28) & 0xf);
56276                         unsigned rd = (instr >> 16) & 0xf;
56277                         unsigned rn = instr & 0xf;
56278                         unsigned rm = (instr >> 8) & 0xf;
56279                         unsigned ra = (instr >> 12) & 0xf;
56280                         // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56281                         smlabt(condition,
56282                                Register(rd),
56283                                Register(rn),
56284                                Register(rm),
56285                                Register(ra));
56286                         break;
56287                       }
56288                       case 0x00400000: {
56289                         // 0x014000c0
56290                         if (((instr & 0xf0000000) == 0xf0000000)) {
56291                           UnallocatedA32(instr);
56292                           return;
56293                         }
56294                         Condition condition((instr >> 28) & 0xf);
56295                         unsigned rdlo = (instr >> 12) & 0xf;
56296                         unsigned rdhi = (instr >> 16) & 0xf;
56297                         unsigned rn = instr & 0xf;
56298                         unsigned rm = (instr >> 8) & 0xf;
56299                         // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56300                         smlalbt(condition,
56301                                 Register(rdlo),
56302                                 Register(rdhi),
56303                                 Register(rn),
56304                                 Register(rm));
56305                         break;
56306                       }
56307                     }
56308                     break;
56309                   }
56310                   case 0x000000e0: {
56311                     // 0x010000e0
56312                     switch (instr & 0x00400000) {
56313                       case 0x00000000: {
56314                         // 0x010000e0
56315                         if (((instr & 0xf0000000) == 0xf0000000)) {
56316                           UnallocatedA32(instr);
56317                           return;
56318                         }
56319                         Condition condition((instr >> 28) & 0xf);
56320                         unsigned rd = (instr >> 16) & 0xf;
56321                         unsigned rn = instr & 0xf;
56322                         unsigned rm = (instr >> 8) & 0xf;
56323                         unsigned ra = (instr >> 12) & 0xf;
56324                         // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56325                         smlatt(condition,
56326                                Register(rd),
56327                                Register(rn),
56328                                Register(rm),
56329                                Register(ra));
56330                         break;
56331                       }
56332                       case 0x00400000: {
56333                         // 0x014000e0
56334                         if (((instr & 0xf0000000) == 0xf0000000)) {
56335                           UnallocatedA32(instr);
56336                           return;
56337                         }
56338                         Condition condition((instr >> 28) & 0xf);
56339                         unsigned rdlo = (instr >> 12) & 0xf;
56340                         unsigned rdhi = (instr >> 16) & 0xf;
56341                         unsigned rn = instr & 0xf;
56342                         unsigned rm = (instr >> 8) & 0xf;
56343                         // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56344                         smlaltt(condition,
56345                                 Register(rdlo),
56346                                 Register(rdhi),
56347                                 Register(rn),
56348                                 Register(rm));
56349                         break;
56350                       }
56351                     }
56352                     break;
56353                   }
56354                   default:
56355                     UnallocatedA32(instr);
56356                     break;
56357                 }
56358                 break;
56359               }
56360               case 0x01200000: {
56361                 // 0x01200000
56362                 switch (instr & 0x000000e0) {
56363                   case 0x00000000: {
56364                     // 0x01200000
56365                     switch (instr & 0x00000200) {
56366                       case 0x00000000: {
56367                         // 0x01200000
56368                         if (((instr & 0xf0000000) == 0xf0000000)) {
56369                           UnallocatedA32(instr);
56370                           return;
56371                         }
56372                         Condition condition((instr >> 28) & 0xf);
56373                         unsigned spec_reg =
56374                             ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
56375                         unsigned rn = instr & 0xf;
56376                         // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1
56377                         msr(condition,
56378                             MaskedSpecialRegister(spec_reg),
56379                             Register(rn));
56380                         if (((instr & 0xfb0fff0) != 0x120f000)) {
56381                           UnpredictableA32(instr);
56382                         }
56383                         break;
56384                       }
56385                       case 0x00000200: {
56386                         // 0x01200200
56387                         if (((instr & 0xf0000000) == 0xf0000000)) {
56388                           UnallocatedA32(instr);
56389                           return;
56390                         }
56391                         UnimplementedA32("MSR", instr);
56392                         break;
56393                       }
56394                     }
56395                     break;
56396                   }
56397                   case 0x00000020: {
56398                     // 0x01200020
56399                     if ((instr & 0x00400000) == 0x00000000) {
56400                       if (((instr & 0xf0000000) == 0xf0000000)) {
56401                         UnallocatedA32(instr);
56402                         return;
56403                       }
56404                       Condition condition((instr >> 28) & 0xf);
56405                       unsigned rm = instr & 0xf;
56406                       // BXJ{<c>}{<q>} <Rm> ; A1
56407                       bxj(condition, Register(rm));
56408                       if (((instr & 0xffffff0) != 0x12fff20)) {
56409                         UnpredictableA32(instr);
56410                       }
56411                     } else {
56412                       UnallocatedA32(instr);
56413                     }
56414                     break;
56415                   }
56416                   case 0x00000040: {
56417                     // 0x01200040
56418                     switch (instr & 0x00400200) {
56419                       case 0x00000000: {
56420                         // 0x01200040
56421                         if (((instr & 0xf0000000) == 0xf0000000)) {
56422                           UnallocatedA32(instr);
56423                           return;
56424                         }
56425                         unsigned rd = (instr >> 12) & 0xf;
56426                         unsigned rn = (instr >> 16) & 0xf;
56427                         unsigned rm = instr & 0xf;
56428                         // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1
56429                         crc32h(al, Register(rd), Register(rn), Register(rm));
56430                         if (((instr & 0xff00ff0) != 0x1200040)) {
56431                           UnpredictableA32(instr);
56432                         }
56433                         break;
56434                       }
56435                       case 0x00000200: {
56436                         // 0x01200240
56437                         if (((instr & 0xf0000000) == 0xf0000000)) {
56438                           UnallocatedA32(instr);
56439                           return;
56440                         }
56441                         unsigned rd = (instr >> 12) & 0xf;
56442                         unsigned rn = (instr >> 16) & 0xf;
56443                         unsigned rm = instr & 0xf;
56444                         // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1
56445                         crc32ch(al, Register(rd), Register(rn), Register(rm));
56446                         if (((instr & 0xff00ff0) != 0x1200240)) {
56447                           UnpredictableA32(instr);
56448                         }
56449                         break;
56450                       }
56451                       default:
56452                         UnallocatedA32(instr);
56453                         break;
56454                     }
56455                     break;
56456                   }
56457                   case 0x00000060: {
56458                     // 0x01200060
56459                     if ((instr & 0x00400000) == 0x00400000) {
56460                       if (((instr & 0xf0000000) == 0xf0000000)) {
56461                         UnallocatedA32(instr);
56462                         return;
56463                       }
56464                       UnimplementedA32("ERET", instr);
56465                     } else {
56466                       UnallocatedA32(instr);
56467                     }
56468                     break;
56469                   }
56470                   case 0x00000080: {
56471                     // 0x01200080
56472                     switch (instr & 0x00400000) {
56473                       case 0x00000000: {
56474                         // 0x01200080
56475                         if (((instr & 0xf0000000) == 0xf0000000)) {
56476                           UnallocatedA32(instr);
56477                           return;
56478                         }
56479                         Condition condition((instr >> 28) & 0xf);
56480                         unsigned rd = (instr >> 16) & 0xf;
56481                         unsigned rn = instr & 0xf;
56482                         unsigned rm = (instr >> 8) & 0xf;
56483                         unsigned ra = (instr >> 12) & 0xf;
56484                         // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56485                         smlawb(condition,
56486                                Register(rd),
56487                                Register(rn),
56488                                Register(rm),
56489                                Register(ra));
56490                         break;
56491                       }
56492                       case 0x00400000: {
56493                         // 0x01600080
56494                         if (((instr & 0xf0000000) == 0xf0000000)) {
56495                           UnallocatedA32(instr);
56496                           return;
56497                         }
56498                         Condition condition((instr >> 28) & 0xf);
56499                         unsigned rd = (instr >> 16) & 0xf;
56500                         unsigned rn = instr & 0xf;
56501                         unsigned rm = (instr >> 8) & 0xf;
56502                         // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56503                         smulbb(condition,
56504                                Register(rd),
56505                                Register(rn),
56506                                Register(rm));
56507                         if (((instr & 0xff0f0f0) != 0x1600080)) {
56508                           UnpredictableA32(instr);
56509                         }
56510                         break;
56511                       }
56512                     }
56513                     break;
56514                   }
56515                   case 0x000000a0: {
56516                     // 0x012000a0
56517                     switch (instr & 0x00400000) {
56518                       case 0x00000000: {
56519                         // 0x012000a0
56520                         if (((instr & 0xf0000000) == 0xf0000000)) {
56521                           UnallocatedA32(instr);
56522                           return;
56523                         }
56524                         Condition condition((instr >> 28) & 0xf);
56525                         unsigned rd = (instr >> 16) & 0xf;
56526                         unsigned rn = instr & 0xf;
56527                         unsigned rm = (instr >> 8) & 0xf;
56528                         // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56529                         smulwb(condition,
56530                                Register(rd),
56531                                Register(rn),
56532                                Register(rm));
56533                         if (((instr & 0xff0f0f0) != 0x12000a0)) {
56534                           UnpredictableA32(instr);
56535                         }
56536                         break;
56537                       }
56538                       case 0x00400000: {
56539                         // 0x016000a0
56540                         if (((instr & 0xf0000000) == 0xf0000000)) {
56541                           UnallocatedA32(instr);
56542                           return;
56543                         }
56544                         Condition condition((instr >> 28) & 0xf);
56545                         unsigned rd = (instr >> 16) & 0xf;
56546                         unsigned rn = instr & 0xf;
56547                         unsigned rm = (instr >> 8) & 0xf;
56548                         // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56549                         smultb(condition,
56550                                Register(rd),
56551                                Register(rn),
56552                                Register(rm));
56553                         if (((instr & 0xff0f0f0) != 0x16000a0)) {
56554                           UnpredictableA32(instr);
56555                         }
56556                         break;
56557                       }
56558                     }
56559                     break;
56560                   }
56561                   case 0x000000c0: {
56562                     // 0x012000c0
56563                     switch (instr & 0x00400000) {
56564                       case 0x00000000: {
56565                         // 0x012000c0
56566                         if (((instr & 0xf0000000) == 0xf0000000)) {
56567                           UnallocatedA32(instr);
56568                           return;
56569                         }
56570                         Condition condition((instr >> 28) & 0xf);
56571                         unsigned rd = (instr >> 16) & 0xf;
56572                         unsigned rn = instr & 0xf;
56573                         unsigned rm = (instr >> 8) & 0xf;
56574                         unsigned ra = (instr >> 12) & 0xf;
56575                         // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56576                         smlawt(condition,
56577                                Register(rd),
56578                                Register(rn),
56579                                Register(rm),
56580                                Register(ra));
56581                         break;
56582                       }
56583                       case 0x00400000: {
56584                         // 0x016000c0
56585                         if (((instr & 0xf0000000) == 0xf0000000)) {
56586                           UnallocatedA32(instr);
56587                           return;
56588                         }
56589                         Condition condition((instr >> 28) & 0xf);
56590                         unsigned rd = (instr >> 16) & 0xf;
56591                         unsigned rn = instr & 0xf;
56592                         unsigned rm = (instr >> 8) & 0xf;
56593                         // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56594                         smulbt(condition,
56595                                Register(rd),
56596                                Register(rn),
56597                                Register(rm));
56598                         if (((instr & 0xff0f0f0) != 0x16000c0)) {
56599                           UnpredictableA32(instr);
56600                         }
56601                         break;
56602                       }
56603                     }
56604                     break;
56605                   }
56606                   case 0x000000e0: {
56607                     // 0x012000e0
56608                     switch (instr & 0x00400000) {
56609                       case 0x00000000: {
56610                         // 0x012000e0
56611                         if (((instr & 0xf0000000) == 0xf0000000)) {
56612                           UnallocatedA32(instr);
56613                           return;
56614                         }
56615                         Condition condition((instr >> 28) & 0xf);
56616                         unsigned rd = (instr >> 16) & 0xf;
56617                         unsigned rn = instr & 0xf;
56618                         unsigned rm = (instr >> 8) & 0xf;
56619                         // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56620                         smulwt(condition,
56621                                Register(rd),
56622                                Register(rn),
56623                                Register(rm));
56624                         if (((instr & 0xff0f0f0) != 0x12000e0)) {
56625                           UnpredictableA32(instr);
56626                         }
56627                         break;
56628                       }
56629                       case 0x00400000: {
56630                         // 0x016000e0
56631                         if (((instr & 0xf0000000) == 0xf0000000)) {
56632                           UnallocatedA32(instr);
56633                           return;
56634                         }
56635                         Condition condition((instr >> 28) & 0xf);
56636                         unsigned rd = (instr >> 16) & 0xf;
56637                         unsigned rn = instr & 0xf;
56638                         unsigned rm = (instr >> 8) & 0xf;
56639                         // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56640                         smultt(condition,
56641                                Register(rd),
56642                                Register(rn),
56643                                Register(rm));
56644                         if (((instr & 0xff0f0f0) != 0x16000e0)) {
56645                           UnpredictableA32(instr);
56646                         }
56647                         break;
56648                       }
56649                     }
56650                     break;
56651                   }
56652                 }
56653                 break;
56654               }
56655               case 0x01800000: {
56656                 // 0x01800000
56657                 switch (instr & 0x00400000) {
56658                   case 0x00000000: {
56659                     // 0x01800000
56660                     switch (instr & 0x00000fe0) {
56661                       case 0x00000060: {
56662                         // 0x01800060
56663                         if (((instr & 0xf0000000) == 0xf0000000)) {
56664                           UnallocatedA32(instr);
56665                           return;
56666                         }
56667                         Condition condition((instr >> 28) & 0xf);
56668                         unsigned rd = (instr >> 12) & 0xf;
56669                         unsigned rn = (instr >> 16) & 0xf;
56670                         unsigned rm = instr & 0xf;
56671                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56672                         orr(condition,
56673                             Best,
56674                             Register(rd),
56675                             Register(rn),
56676                             Operand(Register(rm), RRX));
56677                         break;
56678                       }
56679                       default: {
56680                         if (((instr & 0xf0000000) == 0xf0000000) ||
56681                             ((instr & 0xfe0) == 0x60)) {
56682                           UnallocatedA32(instr);
56683                           return;
56684                         }
56685                         Condition condition((instr >> 28) & 0xf);
56686                         unsigned rd = (instr >> 12) & 0xf;
56687                         unsigned rn = (instr >> 16) & 0xf;
56688                         unsigned rm = instr & 0xf;
56689                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56690                                                             (instr >> 7) &
56691                                                                 0x1f);
56692                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56693                         orr(condition,
56694                             Best,
56695                             Register(rd),
56696                             Register(rn),
56697                             Operand(Register(rm),
56698                                     shift_operand.GetType(),
56699                                     shift_operand.GetAmount()));
56700                         break;
56701                       }
56702                     }
56703                     break;
56704                   }
56705                   case 0x00400000: {
56706                     // 0x01c00000
56707                     switch (instr & 0x00000fe0) {
56708                       case 0x00000060: {
56709                         // 0x01c00060
56710                         if (((instr & 0xf0000000) == 0xf0000000)) {
56711                           UnallocatedA32(instr);
56712                           return;
56713                         }
56714                         Condition condition((instr >> 28) & 0xf);
56715                         unsigned rd = (instr >> 12) & 0xf;
56716                         unsigned rn = (instr >> 16) & 0xf;
56717                         unsigned rm = instr & 0xf;
56718                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56719                         bic(condition,
56720                             Best,
56721                             Register(rd),
56722                             Register(rn),
56723                             Operand(Register(rm), RRX));
56724                         break;
56725                       }
56726                       default: {
56727                         if (((instr & 0xf0000000) == 0xf0000000) ||
56728                             ((instr & 0xfe0) == 0x60)) {
56729                           UnallocatedA32(instr);
56730                           return;
56731                         }
56732                         Condition condition((instr >> 28) & 0xf);
56733                         unsigned rd = (instr >> 12) & 0xf;
56734                         unsigned rn = (instr >> 16) & 0xf;
56735                         unsigned rm = instr & 0xf;
56736                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56737                                                             (instr >> 7) &
56738                                                                 0x1f);
56739                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56740                         bic(condition,
56741                             Best,
56742                             Register(rd),
56743                             Register(rn),
56744                             Operand(Register(rm),
56745                                     shift_operand.GetType(),
56746                                     shift_operand.GetAmount()));
56747                         break;
56748                       }
56749                     }
56750                     break;
56751                   }
56752                 }
56753                 break;
56754               }
56755               case 0x01a00000: {
56756                 // 0x01a00000
56757                 switch (instr & 0x00400000) {
56758                   case 0x00000000: {
56759                     // 0x01a00000
56760                     switch (instr & 0x00000fe0) {
56761                       case 0x00000060: {
56762                         // 0x01a00060
56763                         if (((instr & 0xf0000000) == 0xf0000000)) {
56764                           UnallocatedA32(instr);
56765                           return;
56766                         }
56767                         if (((instr & 0xf0000000) != 0xf0000000)) {
56768                           Condition condition((instr >> 28) & 0xf);
56769                           unsigned rd = (instr >> 12) & 0xf;
56770                           unsigned rm = instr & 0xf;
56771                           // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1
56772                           rrx(condition, Register(rd), Register(rm));
56773                           if (((instr & 0xfff0ff0) != 0x1a00060)) {
56774                             UnpredictableA32(instr);
56775                           }
56776                           return;
56777                         }
56778                         Condition condition((instr >> 28) & 0xf);
56779                         unsigned rd = (instr >> 12) & 0xf;
56780                         unsigned rm = instr & 0xf;
56781                         // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
56782                         mov(condition,
56783                             Best,
56784                             Register(rd),
56785                             Operand(Register(rm), RRX));
56786                         if (((instr & 0xfff0ff0) != 0x1a00060)) {
56787                           UnpredictableA32(instr);
56788                         }
56789                         break;
56790                       }
56791                       default: {
56792                         if (((instr & 0xf0000000) == 0xf0000000) ||
56793                             ((instr & 0xfe0) == 0x60)) {
56794                           UnallocatedA32(instr);
56795                           return;
56796                         }
56797                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
56798                              Uint32(0x2)) &&
56799                             ((instr & 0xf0000000) != 0xf0000000)) {
56800                           Condition condition((instr >> 28) & 0xf);
56801                           unsigned rd = (instr >> 12) & 0xf;
56802                           unsigned rm = instr & 0xf;
56803                           uint32_t amount = (instr >> 7) & 0x1f;
56804                           if (amount == 0) amount = 32;
56805                           // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
56806                           asr(condition,
56807                               Best,
56808                               Register(rd),
56809                               Register(rm),
56810                               amount);
56811                           if (((instr & 0xfff0070) != 0x1a00040)) {
56812                             UnpredictableA32(instr);
56813                           }
56814                           return;
56815                         }
56816                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
56817                              Uint32(0x0)) &&
56818                             ((instr & 0xf0000000) != 0xf0000000) &&
56819                             ((instr & 0x00000f80) != 0x00000000)) {
56820                           Condition condition((instr >> 28) & 0xf);
56821                           unsigned rd = (instr >> 12) & 0xf;
56822                           unsigned rm = instr & 0xf;
56823                           uint32_t amount = (instr >> 7) & 0x1f;
56824                           // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
56825                           lsl(condition,
56826                               Best,
56827                               Register(rd),
56828                               Register(rm),
56829                               amount);
56830                           if (((instr & 0xfff0070) != 0x1a00000)) {
56831                             UnpredictableA32(instr);
56832                           }
56833                           return;
56834                         }
56835                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
56836                              Uint32(0x1)) &&
56837                             ((instr & 0xf0000000) != 0xf0000000)) {
56838                           Condition condition((instr >> 28) & 0xf);
56839                           unsigned rd = (instr >> 12) & 0xf;
56840                           unsigned rm = instr & 0xf;
56841                           uint32_t amount = (instr >> 7) & 0x1f;
56842                           if (amount == 0) amount = 32;
56843                           // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
56844                           lsr(condition,
56845                               Best,
56846                               Register(rd),
56847                               Register(rm),
56848                               amount);
56849                           if (((instr & 0xfff0070) != 0x1a00020)) {
56850                             UnpredictableA32(instr);
56851                           }
56852                           return;
56853                         }
56854                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
56855                              Uint32(0x3)) &&
56856                             ((instr & 0xf0000000) != 0xf0000000) &&
56857                             ((instr & 0x00000f80) != 0x00000000)) {
56858                           Condition condition((instr >> 28) & 0xf);
56859                           unsigned rd = (instr >> 12) & 0xf;
56860                           unsigned rm = instr & 0xf;
56861                           uint32_t amount = (instr >> 7) & 0x1f;
56862                           // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
56863                           ror(condition,
56864                               Best,
56865                               Register(rd),
56866                               Register(rm),
56867                               amount);
56868                           if (((instr & 0xfff0070) != 0x1a00060)) {
56869                             UnpredictableA32(instr);
56870                           }
56871                           return;
56872                         }
56873                         Condition condition((instr >> 28) & 0xf);
56874                         unsigned rd = (instr >> 12) & 0xf;
56875                         unsigned rm = instr & 0xf;
56876                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56877                                                             (instr >> 7) &
56878                                                                 0x1f);
56879                         // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
56880                         mov(condition,
56881                             Best,
56882                             Register(rd),
56883                             Operand(Register(rm),
56884                                     shift_operand.GetType(),
56885                                     shift_operand.GetAmount()));
56886                         if (((instr & 0xfff0010) != 0x1a00000)) {
56887                           UnpredictableA32(instr);
56888                         }
56889                         break;
56890                       }
56891                     }
56892                     break;
56893                   }
56894                   case 0x00400000: {
56895                     // 0x01e00000
56896                     switch (instr & 0x00000fe0) {
56897                       case 0x00000060: {
56898                         // 0x01e00060
56899                         if (((instr & 0xf0000000) == 0xf0000000)) {
56900                           UnallocatedA32(instr);
56901                           return;
56902                         }
56903                         Condition condition((instr >> 28) & 0xf);
56904                         unsigned rd = (instr >> 12) & 0xf;
56905                         unsigned rm = instr & 0xf;
56906                         // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
56907                         mvn(condition,
56908                             Best,
56909                             Register(rd),
56910                             Operand(Register(rm), RRX));
56911                         if (((instr & 0xfff0ff0) != 0x1e00060)) {
56912                           UnpredictableA32(instr);
56913                         }
56914                         break;
56915                       }
56916                       default: {
56917                         if (((instr & 0xf0000000) == 0xf0000000) ||
56918                             ((instr & 0xfe0) == 0x60)) {
56919                           UnallocatedA32(instr);
56920                           return;
56921                         }
56922                         Condition condition((instr >> 28) & 0xf);
56923                         unsigned rd = (instr >> 12) & 0xf;
56924                         unsigned rm = instr & 0xf;
56925                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56926                                                             (instr >> 7) &
56927                                                                 0x1f);
56928                         // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
56929                         mvn(condition,
56930                             Best,
56931                             Register(rd),
56932                             Operand(Register(rm),
56933                                     shift_operand.GetType(),
56934                                     shift_operand.GetAmount()));
56935                         if (((instr & 0xfff0010) != 0x1e00000)) {
56936                           UnpredictableA32(instr);
56937                         }
56938                         break;
56939                       }
56940                     }
56941                     break;
56942                   }
56943                 }
56944                 break;
56945               }
56946             }
56947             break;
56948           }
56949           case 0x00000010: {
56950             // 0x00000010
56951             switch (instr & 0x00400080) {
56952               case 0x00000000: {
56953                 // 0x00000010
56954                 switch (instr & 0x01a00000) {
56955                   case 0x00000000: {
56956                     // 0x00000010
56957                     if (((instr & 0xf0000000) == 0xf0000000)) {
56958                       UnallocatedA32(instr);
56959                       return;
56960                     }
56961                     Condition condition((instr >> 28) & 0xf);
56962                     unsigned rd = (instr >> 12) & 0xf;
56963                     unsigned rn = (instr >> 16) & 0xf;
56964                     unsigned rm = instr & 0xf;
56965                     Shift shift((instr >> 5) & 0x3);
56966                     unsigned rs = (instr >> 8) & 0xf;
56967                     // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
56968                     and_(condition,
56969                          Best,
56970                          Register(rd),
56971                          Register(rn),
56972                          Operand(Register(rm), shift.GetType(), Register(rs)));
56973                     break;
56974                   }
56975                   case 0x00200000: {
56976                     // 0x00200010
56977                     if (((instr & 0xf0000000) == 0xf0000000)) {
56978                       UnallocatedA32(instr);
56979                       return;
56980                     }
56981                     Condition condition((instr >> 28) & 0xf);
56982                     unsigned rd = (instr >> 12) & 0xf;
56983                     unsigned rn = (instr >> 16) & 0xf;
56984                     unsigned rm = instr & 0xf;
56985                     Shift shift((instr >> 5) & 0x3);
56986                     unsigned rs = (instr >> 8) & 0xf;
56987                     // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
56988                     eor(condition,
56989                         Best,
56990                         Register(rd),
56991                         Register(rn),
56992                         Operand(Register(rm), shift.GetType(), Register(rs)));
56993                     break;
56994                   }
56995                   case 0x00800000: {
56996                     // 0x00800010
56997                     if (((instr & 0xf0000000) == 0xf0000000)) {
56998                       UnallocatedA32(instr);
56999                       return;
57000                     }
57001                     Condition condition((instr >> 28) & 0xf);
57002                     unsigned rd = (instr >> 12) & 0xf;
57003                     unsigned rn = (instr >> 16) & 0xf;
57004                     unsigned rm = instr & 0xf;
57005                     Shift shift((instr >> 5) & 0x3);
57006                     unsigned rs = (instr >> 8) & 0xf;
57007                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57008                     add(condition,
57009                         Best,
57010                         Register(rd),
57011                         Register(rn),
57012                         Operand(Register(rm), shift.GetType(), Register(rs)));
57013                     break;
57014                   }
57015                   case 0x00a00000: {
57016                     // 0x00a00010
57017                     if (((instr & 0xf0000000) == 0xf0000000)) {
57018                       UnallocatedA32(instr);
57019                       return;
57020                     }
57021                     Condition condition((instr >> 28) & 0xf);
57022                     unsigned rd = (instr >> 12) & 0xf;
57023                     unsigned rn = (instr >> 16) & 0xf;
57024                     unsigned rm = instr & 0xf;
57025                     Shift shift((instr >> 5) & 0x3);
57026                     unsigned rs = (instr >> 8) & 0xf;
57027                     // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57028                     adc(condition,
57029                         Best,
57030                         Register(rd),
57031                         Register(rn),
57032                         Operand(Register(rm), shift.GetType(), Register(rs)));
57033                     break;
57034                   }
57035                   case 0x01000000: {
57036                     // 0x01000010
57037                     switch (instr & 0x00000060) {
57038                       case 0x00000040: {
57039                         // 0x01000050
57040                         if (((instr & 0xf0000000) == 0xf0000000)) {
57041                           UnallocatedA32(instr);
57042                           return;
57043                         }
57044                         Condition condition((instr >> 28) & 0xf);
57045                         unsigned rd = (instr >> 12) & 0xf;
57046                         unsigned rm = instr & 0xf;
57047                         unsigned rn = (instr >> 16) & 0xf;
57048                         // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57049                         qadd(condition,
57050                              Register(rd),
57051                              Register(rm),
57052                              Register(rn));
57053                         if (((instr & 0xff00ff0) != 0x1000050)) {
57054                           UnpredictableA32(instr);
57055                         }
57056                         break;
57057                       }
57058                       case 0x00000060: {
57059                         // 0x01000070
57060                         if (((instr & 0xf0000000) == 0xf0000000)) {
57061                           UnallocatedA32(instr);
57062                           return;
57063                         }
57064                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57065                         // HLT{<q>} {#}<imm> ; A1
57066                         hlt(al, imm);
57067                         break;
57068                       }
57069                       default:
57070                         UnallocatedA32(instr);
57071                         break;
57072                     }
57073                     break;
57074                   }
57075                   case 0x01200000: {
57076                     // 0x01200010
57077                     switch (instr & 0x00000060) {
57078                       case 0x00000000: {
57079                         // 0x01200010
57080                         if (((instr & 0xf0000000) == 0xf0000000)) {
57081                           UnallocatedA32(instr);
57082                           return;
57083                         }
57084                         Condition condition((instr >> 28) & 0xf);
57085                         unsigned rm = instr & 0xf;
57086                         // BX{<c>}{<q>} <Rm> ; A1
57087                         bx(condition, Register(rm));
57088                         if (((instr & 0xffffff0) != 0x12fff10)) {
57089                           UnpredictableA32(instr);
57090                         }
57091                         break;
57092                       }
57093                       case 0x00000020: {
57094                         // 0x01200030
57095                         if (((instr & 0xf0000000) == 0xf0000000)) {
57096                           UnallocatedA32(instr);
57097                           return;
57098                         }
57099                         Condition condition((instr >> 28) & 0xf);
57100                         unsigned rm = instr & 0xf;
57101                         // BLX{<c>}{<q>} <Rm> ; A1
57102                         blx(condition, Register(rm));
57103                         if (((instr & 0xffffff0) != 0x12fff30)) {
57104                           UnpredictableA32(instr);
57105                         }
57106                         break;
57107                       }
57108                       case 0x00000040: {
57109                         // 0x01200050
57110                         if (((instr & 0xf0000000) == 0xf0000000)) {
57111                           UnallocatedA32(instr);
57112                           return;
57113                         }
57114                         Condition condition((instr >> 28) & 0xf);
57115                         unsigned rd = (instr >> 12) & 0xf;
57116                         unsigned rm = instr & 0xf;
57117                         unsigned rn = (instr >> 16) & 0xf;
57118                         // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57119                         qsub(condition,
57120                              Register(rd),
57121                              Register(rm),
57122                              Register(rn));
57123                         if (((instr & 0xff00ff0) != 0x1200050)) {
57124                           UnpredictableA32(instr);
57125                         }
57126                         break;
57127                       }
57128                       case 0x00000060: {
57129                         // 0x01200070
57130                         if (((instr & 0xf0000000) == 0xf0000000)) {
57131                           UnallocatedA32(instr);
57132                           return;
57133                         }
57134                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57135                         // BKPT{<q>} {#}<imm> ; A1
57136                         bkpt(al, imm);
57137                         break;
57138                       }
57139                     }
57140                     break;
57141                   }
57142                   case 0x01800000: {
57143                     // 0x01800010
57144                     if (((instr & 0xf0000000) == 0xf0000000)) {
57145                       UnallocatedA32(instr);
57146                       return;
57147                     }
57148                     Condition condition((instr >> 28) & 0xf);
57149                     unsigned rd = (instr >> 12) & 0xf;
57150                     unsigned rn = (instr >> 16) & 0xf;
57151                     unsigned rm = instr & 0xf;
57152                     Shift shift((instr >> 5) & 0x3);
57153                     unsigned rs = (instr >> 8) & 0xf;
57154                     // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57155                     orr(condition,
57156                         Best,
57157                         Register(rd),
57158                         Register(rn),
57159                         Operand(Register(rm), shift.GetType(), Register(rs)));
57160                     break;
57161                   }
57162                   case 0x01a00000: {
57163                     // 0x01a00010
57164                     if (((instr & 0xf0000000) == 0xf0000000)) {
57165                       UnallocatedA32(instr);
57166                       return;
57167                     }
57168                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
57169                         ((instr & 0xf0000000) != 0xf0000000)) {
57170                       Condition condition((instr >> 28) & 0xf);
57171                       unsigned rd = (instr >> 12) & 0xf;
57172                       unsigned rm = instr & 0xf;
57173                       unsigned rs = (instr >> 8) & 0xf;
57174                       // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57175                       asr(condition,
57176                           Best,
57177                           Register(rd),
57178                           Register(rm),
57179                           Register(rs));
57180                       if (((instr & 0xfff00f0) != 0x1a00050)) {
57181                         UnpredictableA32(instr);
57182                       }
57183                       return;
57184                     }
57185                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
57186                         ((instr & 0xf0000000) != 0xf0000000)) {
57187                       Condition condition((instr >> 28) & 0xf);
57188                       unsigned rd = (instr >> 12) & 0xf;
57189                       unsigned rm = instr & 0xf;
57190                       unsigned rs = (instr >> 8) & 0xf;
57191                       // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57192                       lsl(condition,
57193                           Best,
57194                           Register(rd),
57195                           Register(rm),
57196                           Register(rs));
57197                       if (((instr & 0xfff00f0) != 0x1a00010)) {
57198                         UnpredictableA32(instr);
57199                       }
57200                       return;
57201                     }
57202                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
57203                         ((instr & 0xf0000000) != 0xf0000000)) {
57204                       Condition condition((instr >> 28) & 0xf);
57205                       unsigned rd = (instr >> 12) & 0xf;
57206                       unsigned rm = instr & 0xf;
57207                       unsigned rs = (instr >> 8) & 0xf;
57208                       // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57209                       lsr(condition,
57210                           Best,
57211                           Register(rd),
57212                           Register(rm),
57213                           Register(rs));
57214                       if (((instr & 0xfff00f0) != 0x1a00030)) {
57215                         UnpredictableA32(instr);
57216                       }
57217                       return;
57218                     }
57219                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
57220                         ((instr & 0xf0000000) != 0xf0000000)) {
57221                       Condition condition((instr >> 28) & 0xf);
57222                       unsigned rd = (instr >> 12) & 0xf;
57223                       unsigned rm = instr & 0xf;
57224                       unsigned rs = (instr >> 8) & 0xf;
57225                       // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57226                       ror(condition,
57227                           Best,
57228                           Register(rd),
57229                           Register(rm),
57230                           Register(rs));
57231                       if (((instr & 0xfff00f0) != 0x1a00070)) {
57232                         UnpredictableA32(instr);
57233                       }
57234                       return;
57235                     }
57236                     Condition condition((instr >> 28) & 0xf);
57237                     unsigned rd = (instr >> 12) & 0xf;
57238                     unsigned rm = instr & 0xf;
57239                     Shift shift((instr >> 5) & 0x3);
57240                     unsigned rs = (instr >> 8) & 0xf;
57241                     // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
57242                     mov(condition,
57243                         Best,
57244                         Register(rd),
57245                         Operand(Register(rm), shift.GetType(), Register(rs)));
57246                     if (((instr & 0xfff0090) != 0x1a00010)) {
57247                       UnpredictableA32(instr);
57248                     }
57249                     break;
57250                   }
57251                 }
57252                 break;
57253               }
57254               case 0x00000080: {
57255                 // 0x00000090
57256                 switch (instr & 0x01200060) {
57257                   case 0x00000000: {
57258                     // 0x00000090
57259                     switch (instr & 0x00800000) {
57260                       case 0x00000000: {
57261                         // 0x00000090
57262                         if (((instr & 0xf0000000) == 0xf0000000)) {
57263                           UnallocatedA32(instr);
57264                           return;
57265                         }
57266                         Condition condition((instr >> 28) & 0xf);
57267                         unsigned rd = (instr >> 16) & 0xf;
57268                         unsigned rn = instr & 0xf;
57269                         unsigned rm = (instr >> 8) & 0xf;
57270                         // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
57271                         mul(condition,
57272                             Best,
57273                             Register(rd),
57274                             Register(rn),
57275                             Register(rm));
57276                         if (((instr & 0xff0f0f0) != 0x90)) {
57277                           UnpredictableA32(instr);
57278                         }
57279                         break;
57280                       }
57281                       case 0x00800000: {
57282                         // 0x00800090
57283                         if (((instr & 0xf0000000) == 0xf0000000)) {
57284                           UnallocatedA32(instr);
57285                           return;
57286                         }
57287                         Condition condition((instr >> 28) & 0xf);
57288                         unsigned rdlo = (instr >> 12) & 0xf;
57289                         unsigned rdhi = (instr >> 16) & 0xf;
57290                         unsigned rn = instr & 0xf;
57291                         unsigned rm = (instr >> 8) & 0xf;
57292                         // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57293                         umull(condition,
57294                               Register(rdlo),
57295                               Register(rdhi),
57296                               Register(rn),
57297                               Register(rm));
57298                         break;
57299                       }
57300                     }
57301                     break;
57302                   }
57303                   case 0x00000020: {
57304                     // 0x000000b0
57305                     if (((instr & 0xf0000000) == 0xf0000000)) {
57306                       UnallocatedA32(instr);
57307                       return;
57308                     }
57309                     Condition condition((instr >> 28) & 0xf);
57310                     unsigned rt = (instr >> 12) & 0xf;
57311                     unsigned rn = (instr >> 16) & 0xf;
57312                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57313                     unsigned rm = instr & 0xf;
57314                     // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
57315                     strh(condition,
57316                          Best,
57317                          Register(rt),
57318                          MemOperand(Register(rn),
57319                                     sign,
57320                                     Register(rm),
57321                                     PostIndex));
57322                     if (((instr & 0xf700ff0) != 0xb0)) {
57323                       UnpredictableA32(instr);
57324                     }
57325                     break;
57326                   }
57327                   case 0x00000040: {
57328                     // 0x000000d0
57329                     if (((instr & 0xf0000000) == 0xf0000000)) {
57330                       UnallocatedA32(instr);
57331                       return;
57332                     }
57333                     Condition condition((instr >> 28) & 0xf);
57334                     unsigned rt = (instr >> 12) & 0xf;
57335                     unsigned rn = (instr >> 16) & 0xf;
57336                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57337                     unsigned rm = instr & 0xf;
57338                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
57339                     ldrd(condition,
57340                          Register(rt),
57341                          Register(rt + 1),
57342                          MemOperand(Register(rn),
57343                                     sign,
57344                                     Register(rm),
57345                                     PostIndex));
57346                     if (((instr & 0xf700ff0) != 0xd0)) {
57347                       UnpredictableA32(instr);
57348                     }
57349                     break;
57350                   }
57351                   case 0x00000060: {
57352                     // 0x000000f0
57353                     if (((instr & 0xf0000000) == 0xf0000000)) {
57354                       UnallocatedA32(instr);
57355                       return;
57356                     }
57357                     Condition condition((instr >> 28) & 0xf);
57358                     unsigned rt = (instr >> 12) & 0xf;
57359                     unsigned rn = (instr >> 16) & 0xf;
57360                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57361                     unsigned rm = instr & 0xf;
57362                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
57363                     strd(condition,
57364                          Register(rt),
57365                          Register(rt + 1),
57366                          MemOperand(Register(rn),
57367                                     sign,
57368                                     Register(rm),
57369                                     PostIndex));
57370                     if (((instr & 0xf700ff0) != 0xf0)) {
57371                       UnpredictableA32(instr);
57372                     }
57373                     break;
57374                   }
57375                   case 0x00200000: {
57376                     // 0x00200090
57377                     switch (instr & 0x00800000) {
57378                       case 0x00000000: {
57379                         // 0x00200090
57380                         if (((instr & 0xf0000000) == 0xf0000000)) {
57381                           UnallocatedA32(instr);
57382                           return;
57383                         }
57384                         Condition condition((instr >> 28) & 0xf);
57385                         unsigned rd = (instr >> 16) & 0xf;
57386                         unsigned rn = instr & 0xf;
57387                         unsigned rm = (instr >> 8) & 0xf;
57388                         unsigned ra = (instr >> 12) & 0xf;
57389                         // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57390                         mla(condition,
57391                             Register(rd),
57392                             Register(rn),
57393                             Register(rm),
57394                             Register(ra));
57395                         break;
57396                       }
57397                       case 0x00800000: {
57398                         // 0x00a00090
57399                         if (((instr & 0xf0000000) == 0xf0000000)) {
57400                           UnallocatedA32(instr);
57401                           return;
57402                         }
57403                         Condition condition((instr >> 28) & 0xf);
57404                         unsigned rdlo = (instr >> 12) & 0xf;
57405                         unsigned rdhi = (instr >> 16) & 0xf;
57406                         unsigned rn = instr & 0xf;
57407                         unsigned rm = (instr >> 8) & 0xf;
57408                         // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57409                         umlal(condition,
57410                               Register(rdlo),
57411                               Register(rdhi),
57412                               Register(rn),
57413                               Register(rm));
57414                         break;
57415                       }
57416                     }
57417                     break;
57418                   }
57419                   case 0x00200020: {
57420                     // 0x002000b0
57421                     if (((instr & 0xf0000000) == 0xf0000000)) {
57422                       UnallocatedA32(instr);
57423                       return;
57424                     }
57425                     UnimplementedA32("STRHT", instr);
57426                     break;
57427                   }
57428                   case 0x01000000: {
57429                     // 0x01000090
57430                     switch (instr & 0x00800300) {
57431                       case 0x00800000: {
57432                         // 0x01800090
57433                         if (((instr & 0xf0000000) == 0xf0000000)) {
57434                           UnallocatedA32(instr);
57435                           return;
57436                         }
57437                         Condition condition((instr >> 28) & 0xf);
57438                         unsigned rt = instr & 0xf;
57439                         unsigned rn = (instr >> 16) & 0xf;
57440                         // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1
57441                         stl(condition,
57442                             Register(rt),
57443                             MemOperand(Register(rn), Offset));
57444                         if (((instr & 0xff0fff0) != 0x180fc90)) {
57445                           UnpredictableA32(instr);
57446                         }
57447                         break;
57448                       }
57449                       case 0x00800200: {
57450                         // 0x01800290
57451                         if (((instr & 0xf0000000) == 0xf0000000)) {
57452                           UnallocatedA32(instr);
57453                           return;
57454                         }
57455                         Condition condition((instr >> 28) & 0xf);
57456                         unsigned rd = (instr >> 12) & 0xf;
57457                         unsigned rt = instr & 0xf;
57458                         unsigned rn = (instr >> 16) & 0xf;
57459                         // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
57460                         stlex(condition,
57461                               Register(rd),
57462                               Register(rt),
57463                               MemOperand(Register(rn), Offset));
57464                         if (((instr & 0xff00ff0) != 0x1800e90)) {
57465                           UnpredictableA32(instr);
57466                         }
57467                         break;
57468                       }
57469                       case 0x00800300: {
57470                         // 0x01800390
57471                         if (((instr & 0xf0000000) == 0xf0000000)) {
57472                           UnallocatedA32(instr);
57473                           return;
57474                         }
57475                         Condition condition((instr >> 28) & 0xf);
57476                         unsigned rd = (instr >> 12) & 0xf;
57477                         unsigned rt = instr & 0xf;
57478                         unsigned rn = (instr >> 16) & 0xf;
57479                         // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1
57480                         strex(condition,
57481                               Register(rd),
57482                               Register(rt),
57483                               MemOperand(Register(rn), plus, 0, Offset));
57484                         if (((instr & 0xff00ff0) != 0x1800f90)) {
57485                           UnpredictableA32(instr);
57486                         }
57487                         break;
57488                       }
57489                       default:
57490                         UnallocatedA32(instr);
57491                         break;
57492                     }
57493                     break;
57494                   }
57495                   case 0x01000020: {
57496                     // 0x010000b0
57497                     if (((instr & 0xf0000000) == 0xf0000000)) {
57498                       UnallocatedA32(instr);
57499                       return;
57500                     }
57501                     Condition condition((instr >> 28) & 0xf);
57502                     unsigned rt = (instr >> 12) & 0xf;
57503                     unsigned rn = (instr >> 16) & 0xf;
57504                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57505                     unsigned rm = instr & 0xf;
57506                     AddrMode addrmode = Offset;
57507                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
57508                     strh(condition,
57509                          Best,
57510                          Register(rt),
57511                          MemOperand(Register(rn),
57512                                     sign,
57513                                     Register(rm),
57514                                     addrmode));
57515                     if (((instr & 0xf700ff0) != 0x10000b0)) {
57516                       UnpredictableA32(instr);
57517                     }
57518                     break;
57519                   }
57520                   case 0x01000040: {
57521                     // 0x010000d0
57522                     if (((instr & 0xf0000000) == 0xf0000000)) {
57523                       UnallocatedA32(instr);
57524                       return;
57525                     }
57526                     Condition condition((instr >> 28) & 0xf);
57527                     unsigned rt = (instr >> 12) & 0xf;
57528                     unsigned rn = (instr >> 16) & 0xf;
57529                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57530                     unsigned rm = instr & 0xf;
57531                     AddrMode addrmode = Offset;
57532                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
57533                     ldrd(condition,
57534                          Register(rt),
57535                          Register(rt + 1),
57536                          MemOperand(Register(rn),
57537                                     sign,
57538                                     Register(rm),
57539                                     addrmode));
57540                     if (((instr & 0xf700ff0) != 0x10000d0)) {
57541                       UnpredictableA32(instr);
57542                     }
57543                     break;
57544                   }
57545                   case 0x01000060: {
57546                     // 0x010000f0
57547                     if (((instr & 0xf0000000) == 0xf0000000)) {
57548                       UnallocatedA32(instr);
57549                       return;
57550                     }
57551                     Condition condition((instr >> 28) & 0xf);
57552                     unsigned rt = (instr >> 12) & 0xf;
57553                     unsigned rn = (instr >> 16) & 0xf;
57554                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57555                     unsigned rm = instr & 0xf;
57556                     AddrMode addrmode = Offset;
57557                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
57558                     strd(condition,
57559                          Register(rt),
57560                          Register(rt + 1),
57561                          MemOperand(Register(rn),
57562                                     sign,
57563                                     Register(rm),
57564                                     addrmode));
57565                     if (((instr & 0xf700ff0) != 0x10000f0)) {
57566                       UnpredictableA32(instr);
57567                     }
57568                     break;
57569                   }
57570                   case 0x01200000: {
57571                     // 0x01200090
57572                     switch (instr & 0x00800300) {
57573                       case 0x00800200: {
57574                         // 0x01a00290
57575                         if (((instr & 0xf0000000) == 0xf0000000)) {
57576                           UnallocatedA32(instr);
57577                           return;
57578                         }
57579                         Condition condition((instr >> 28) & 0xf);
57580                         unsigned rd = (instr >> 12) & 0xf;
57581                         unsigned rt = instr & 0xf;
57582                         unsigned rn = (instr >> 16) & 0xf;
57583                         // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
57584                         stlexd(condition,
57585                                Register(rd),
57586                                Register(rt),
57587                                Register(rt + 1),
57588                                MemOperand(Register(rn), Offset));
57589                         if (((instr & 0xff00ff0) != 0x1a00e90)) {
57590                           UnpredictableA32(instr);
57591                         }
57592                         break;
57593                       }
57594                       case 0x00800300: {
57595                         // 0x01a00390
57596                         if (((instr & 0xf0000000) == 0xf0000000)) {
57597                           UnallocatedA32(instr);
57598                           return;
57599                         }
57600                         Condition condition((instr >> 28) & 0xf);
57601                         unsigned rd = (instr >> 12) & 0xf;
57602                         unsigned rt = instr & 0xf;
57603                         unsigned rn = (instr >> 16) & 0xf;
57604                         // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
57605                         strexd(condition,
57606                                Register(rd),
57607                                Register(rt),
57608                                Register(rt + 1),
57609                                MemOperand(Register(rn), Offset));
57610                         if (((instr & 0xff00ff0) != 0x1a00f90)) {
57611                           UnpredictableA32(instr);
57612                         }
57613                         break;
57614                       }
57615                       default:
57616                         UnallocatedA32(instr);
57617                         break;
57618                     }
57619                     break;
57620                   }
57621                   case 0x01200020: {
57622                     // 0x012000b0
57623                     if (((instr & 0xf0000000) == 0xf0000000)) {
57624                       UnallocatedA32(instr);
57625                       return;
57626                     }
57627                     Condition condition((instr >> 28) & 0xf);
57628                     unsigned rt = (instr >> 12) & 0xf;
57629                     unsigned rn = (instr >> 16) & 0xf;
57630                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57631                     unsigned rm = instr & 0xf;
57632                     AddrMode addrmode = PreIndex;
57633                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
57634                     strh(condition,
57635                          Best,
57636                          Register(rt),
57637                          MemOperand(Register(rn),
57638                                     sign,
57639                                     Register(rm),
57640                                     addrmode));
57641                     if (((instr & 0xf700ff0) != 0x12000b0)) {
57642                       UnpredictableA32(instr);
57643                     }
57644                     break;
57645                   }
57646                   case 0x01200040: {
57647                     // 0x012000d0
57648                     if (((instr & 0xf0000000) == 0xf0000000)) {
57649                       UnallocatedA32(instr);
57650                       return;
57651                     }
57652                     Condition condition((instr >> 28) & 0xf);
57653                     unsigned rt = (instr >> 12) & 0xf;
57654                     unsigned rn = (instr >> 16) & 0xf;
57655                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57656                     unsigned rm = instr & 0xf;
57657                     AddrMode addrmode = PreIndex;
57658                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
57659                     ldrd(condition,
57660                          Register(rt),
57661                          Register(rt + 1),
57662                          MemOperand(Register(rn),
57663                                     sign,
57664                                     Register(rm),
57665                                     addrmode));
57666                     if (((instr & 0xf700ff0) != 0x12000d0)) {
57667                       UnpredictableA32(instr);
57668                     }
57669                     break;
57670                   }
57671                   case 0x01200060: {
57672                     // 0x012000f0
57673                     if (((instr & 0xf0000000) == 0xf0000000)) {
57674                       UnallocatedA32(instr);
57675                       return;
57676                     }
57677                     Condition condition((instr >> 28) & 0xf);
57678                     unsigned rt = (instr >> 12) & 0xf;
57679                     unsigned rn = (instr >> 16) & 0xf;
57680                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57681                     unsigned rm = instr & 0xf;
57682                     AddrMode addrmode = PreIndex;
57683                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
57684                     strd(condition,
57685                          Register(rt),
57686                          Register(rt + 1),
57687                          MemOperand(Register(rn),
57688                                     sign,
57689                                     Register(rm),
57690                                     addrmode));
57691                     if (((instr & 0xf700ff0) != 0x12000f0)) {
57692                       UnpredictableA32(instr);
57693                     }
57694                     break;
57695                   }
57696                   default:
57697                     UnallocatedA32(instr);
57698                     break;
57699                 }
57700                 break;
57701               }
57702               case 0x00400000: {
57703                 // 0x00400010
57704                 switch (instr & 0x01a00000) {
57705                   case 0x00000000: {
57706                     // 0x00400010
57707                     if (((instr & 0xf0000000) == 0xf0000000)) {
57708                       UnallocatedA32(instr);
57709                       return;
57710                     }
57711                     Condition condition((instr >> 28) & 0xf);
57712                     unsigned rd = (instr >> 12) & 0xf;
57713                     unsigned rn = (instr >> 16) & 0xf;
57714                     unsigned rm = instr & 0xf;
57715                     Shift shift((instr >> 5) & 0x3);
57716                     unsigned rs = (instr >> 8) & 0xf;
57717                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57718                     sub(condition,
57719                         Best,
57720                         Register(rd),
57721                         Register(rn),
57722                         Operand(Register(rm), shift.GetType(), Register(rs)));
57723                     break;
57724                   }
57725                   case 0x00200000: {
57726                     // 0x00600010
57727                     if (((instr & 0xf0000000) == 0xf0000000)) {
57728                       UnallocatedA32(instr);
57729                       return;
57730                     }
57731                     Condition condition((instr >> 28) & 0xf);
57732                     unsigned rd = (instr >> 12) & 0xf;
57733                     unsigned rn = (instr >> 16) & 0xf;
57734                     unsigned rm = instr & 0xf;
57735                     Shift shift((instr >> 5) & 0x3);
57736                     unsigned rs = (instr >> 8) & 0xf;
57737                     // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57738                     rsb(condition,
57739                         Best,
57740                         Register(rd),
57741                         Register(rn),
57742                         Operand(Register(rm), shift.GetType(), Register(rs)));
57743                     break;
57744                   }
57745                   case 0x00800000: {
57746                     // 0x00c00010
57747                     if (((instr & 0xf0000000) == 0xf0000000)) {
57748                       UnallocatedA32(instr);
57749                       return;
57750                     }
57751                     Condition condition((instr >> 28) & 0xf);
57752                     unsigned rd = (instr >> 12) & 0xf;
57753                     unsigned rn = (instr >> 16) & 0xf;
57754                     unsigned rm = instr & 0xf;
57755                     Shift shift((instr >> 5) & 0x3);
57756                     unsigned rs = (instr >> 8) & 0xf;
57757                     // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57758                     sbc(condition,
57759                         Best,
57760                         Register(rd),
57761                         Register(rn),
57762                         Operand(Register(rm), shift.GetType(), Register(rs)));
57763                     break;
57764                   }
57765                   case 0x00a00000: {
57766                     // 0x00e00010
57767                     if (((instr & 0xf0000000) == 0xf0000000)) {
57768                       UnallocatedA32(instr);
57769                       return;
57770                     }
57771                     Condition condition((instr >> 28) & 0xf);
57772                     unsigned rd = (instr >> 12) & 0xf;
57773                     unsigned rn = (instr >> 16) & 0xf;
57774                     unsigned rm = instr & 0xf;
57775                     Shift shift((instr >> 5) & 0x3);
57776                     unsigned rs = (instr >> 8) & 0xf;
57777                     // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57778                     rsc(condition,
57779                         Register(rd),
57780                         Register(rn),
57781                         Operand(Register(rm), shift.GetType(), Register(rs)));
57782                     break;
57783                   }
57784                   case 0x01000000: {
57785                     // 0x01400010
57786                     switch (instr & 0x00000060) {
57787                       case 0x00000040: {
57788                         // 0x01400050
57789                         if (((instr & 0xf0000000) == 0xf0000000)) {
57790                           UnallocatedA32(instr);
57791                           return;
57792                         }
57793                         Condition condition((instr >> 28) & 0xf);
57794                         unsigned rd = (instr >> 12) & 0xf;
57795                         unsigned rm = instr & 0xf;
57796                         unsigned rn = (instr >> 16) & 0xf;
57797                         // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57798                         qdadd(condition,
57799                               Register(rd),
57800                               Register(rm),
57801                               Register(rn));
57802                         if (((instr & 0xff00ff0) != 0x1400050)) {
57803                           UnpredictableA32(instr);
57804                         }
57805                         break;
57806                       }
57807                       case 0x00000060: {
57808                         // 0x01400070
57809                         if (((instr & 0xf0000000) == 0xf0000000)) {
57810                           UnallocatedA32(instr);
57811                           return;
57812                         }
57813                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57814                         // HVC{<q>} {#}<imm16> ; A1
57815                         hvc(al, imm);
57816                         break;
57817                       }
57818                       default:
57819                         UnallocatedA32(instr);
57820                         break;
57821                     }
57822                     break;
57823                   }
57824                   case 0x01200000: {
57825                     // 0x01600010
57826                     switch (instr & 0x00000060) {
57827                       case 0x00000000: {
57828                         // 0x01600010
57829                         if (((instr & 0xf0000000) == 0xf0000000)) {
57830                           UnallocatedA32(instr);
57831                           return;
57832                         }
57833                         Condition condition((instr >> 28) & 0xf);
57834                         unsigned rd = (instr >> 12) & 0xf;
57835                         unsigned rm = instr & 0xf;
57836                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1
57837                         clz(condition, Register(rd), Register(rm));
57838                         if (((instr & 0xfff0ff0) != 0x16f0f10)) {
57839                           UnpredictableA32(instr);
57840                         }
57841                         break;
57842                       }
57843                       case 0x00000040: {
57844                         // 0x01600050
57845                         if (((instr & 0xf0000000) == 0xf0000000)) {
57846                           UnallocatedA32(instr);
57847                           return;
57848                         }
57849                         Condition condition((instr >> 28) & 0xf);
57850                         unsigned rd = (instr >> 12) & 0xf;
57851                         unsigned rm = instr & 0xf;
57852                         unsigned rn = (instr >> 16) & 0xf;
57853                         // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57854                         qdsub(condition,
57855                               Register(rd),
57856                               Register(rm),
57857                               Register(rn));
57858                         if (((instr & 0xff00ff0) != 0x1600050)) {
57859                           UnpredictableA32(instr);
57860                         }
57861                         break;
57862                       }
57863                       case 0x00000060: {
57864                         // 0x01600070
57865                         if (((instr & 0xf0000000) == 0xf0000000)) {
57866                           UnallocatedA32(instr);
57867                           return;
57868                         }
57869                         UnimplementedA32("SMC", instr);
57870                         break;
57871                       }
57872                       default:
57873                         UnallocatedA32(instr);
57874                         break;
57875                     }
57876                     break;
57877                   }
57878                   case 0x01800000: {
57879                     // 0x01c00010
57880                     if (((instr & 0xf0000000) == 0xf0000000)) {
57881                       UnallocatedA32(instr);
57882                       return;
57883                     }
57884                     Condition condition((instr >> 28) & 0xf);
57885                     unsigned rd = (instr >> 12) & 0xf;
57886                     unsigned rn = (instr >> 16) & 0xf;
57887                     unsigned rm = instr & 0xf;
57888                     Shift shift((instr >> 5) & 0x3);
57889                     unsigned rs = (instr >> 8) & 0xf;
57890                     // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57891                     bic(condition,
57892                         Best,
57893                         Register(rd),
57894                         Register(rn),
57895                         Operand(Register(rm), shift.GetType(), Register(rs)));
57896                     break;
57897                   }
57898                   case 0x01a00000: {
57899                     // 0x01e00010
57900                     if (((instr & 0xf0000000) == 0xf0000000)) {
57901                       UnallocatedA32(instr);
57902                       return;
57903                     }
57904                     Condition condition((instr >> 28) & 0xf);
57905                     unsigned rd = (instr >> 12) & 0xf;
57906                     unsigned rm = instr & 0xf;
57907                     Shift shift((instr >> 5) & 0x3);
57908                     unsigned rs = (instr >> 8) & 0xf;
57909                     // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
57910                     mvn(condition,
57911                         Best,
57912                         Register(rd),
57913                         Operand(Register(rm), shift.GetType(), Register(rs)));
57914                     if (((instr & 0xfff0090) != 0x1e00010)) {
57915                       UnpredictableA32(instr);
57916                     }
57917                     break;
57918                   }
57919                 }
57920                 break;
57921               }
57922               case 0x00400080: {
57923                 // 0x00400090
57924                 switch (instr & 0x00000060) {
57925                   case 0x00000000: {
57926                     // 0x00400090
57927                     switch (instr & 0x01a00000) {
57928                       case 0x00000000: {
57929                         // 0x00400090
57930                         if (((instr & 0xf0000000) == 0xf0000000)) {
57931                           UnallocatedA32(instr);
57932                           return;
57933                         }
57934                         Condition condition((instr >> 28) & 0xf);
57935                         unsigned rdlo = (instr >> 12) & 0xf;
57936                         unsigned rdhi = (instr >> 16) & 0xf;
57937                         unsigned rn = instr & 0xf;
57938                         unsigned rm = (instr >> 8) & 0xf;
57939                         // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57940                         umaal(condition,
57941                               Register(rdlo),
57942                               Register(rdhi),
57943                               Register(rn),
57944                               Register(rm));
57945                         break;
57946                       }
57947                       case 0x00200000: {
57948                         // 0x00600090
57949                         if (((instr & 0xf0000000) == 0xf0000000)) {
57950                           UnallocatedA32(instr);
57951                           return;
57952                         }
57953                         Condition condition((instr >> 28) & 0xf);
57954                         unsigned rd = (instr >> 16) & 0xf;
57955                         unsigned rn = instr & 0xf;
57956                         unsigned rm = (instr >> 8) & 0xf;
57957                         unsigned ra = (instr >> 12) & 0xf;
57958                         // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57959                         mls(condition,
57960                             Register(rd),
57961                             Register(rn),
57962                             Register(rm),
57963                             Register(ra));
57964                         break;
57965                       }
57966                       case 0x00800000: {
57967                         // 0x00c00090
57968                         if (((instr & 0xf0000000) == 0xf0000000)) {
57969                           UnallocatedA32(instr);
57970                           return;
57971                         }
57972                         Condition condition((instr >> 28) & 0xf);
57973                         unsigned rdlo = (instr >> 12) & 0xf;
57974                         unsigned rdhi = (instr >> 16) & 0xf;
57975                         unsigned rn = instr & 0xf;
57976                         unsigned rm = (instr >> 8) & 0xf;
57977                         // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57978                         smull(condition,
57979                               Register(rdlo),
57980                               Register(rdhi),
57981                               Register(rn),
57982                               Register(rm));
57983                         break;
57984                       }
57985                       case 0x00a00000: {
57986                         // 0x00e00090
57987                         if (((instr & 0xf0000000) == 0xf0000000)) {
57988                           UnallocatedA32(instr);
57989                           return;
57990                         }
57991                         Condition condition((instr >> 28) & 0xf);
57992                         unsigned rdlo = (instr >> 12) & 0xf;
57993                         unsigned rdhi = (instr >> 16) & 0xf;
57994                         unsigned rn = instr & 0xf;
57995                         unsigned rm = (instr >> 8) & 0xf;
57996                         // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57997                         smlal(condition,
57998                               Register(rdlo),
57999                               Register(rdhi),
58000                               Register(rn),
58001                               Register(rm));
58002                         break;
58003                       }
58004                       case 0x01800000: {
58005                         // 0x01c00090
58006                         switch (instr & 0x00000300) {
58007                           case 0x00000000: {
58008                             // 0x01c00090
58009                             if (((instr & 0xf0000000) == 0xf0000000)) {
58010                               UnallocatedA32(instr);
58011                               return;
58012                             }
58013                             Condition condition((instr >> 28) & 0xf);
58014                             unsigned rt = instr & 0xf;
58015                             unsigned rn = (instr >> 16) & 0xf;
58016                             // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1
58017                             stlb(condition,
58018                                  Register(rt),
58019                                  MemOperand(Register(rn), Offset));
58020                             if (((instr & 0xff0fff0) != 0x1c0fc90)) {
58021                               UnpredictableA32(instr);
58022                             }
58023                             break;
58024                           }
58025                           case 0x00000200: {
58026                             // 0x01c00290
58027                             if (((instr & 0xf0000000) == 0xf0000000)) {
58028                               UnallocatedA32(instr);
58029                               return;
58030                             }
58031                             Condition condition((instr >> 28) & 0xf);
58032                             unsigned rd = (instr >> 12) & 0xf;
58033                             unsigned rt = instr & 0xf;
58034                             unsigned rn = (instr >> 16) & 0xf;
58035                             // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58036                             stlexb(condition,
58037                                    Register(rd),
58038                                    Register(rt),
58039                                    MemOperand(Register(rn), Offset));
58040                             if (((instr & 0xff00ff0) != 0x1c00e90)) {
58041                               UnpredictableA32(instr);
58042                             }
58043                             break;
58044                           }
58045                           case 0x00000300: {
58046                             // 0x01c00390
58047                             if (((instr & 0xf0000000) == 0xf0000000)) {
58048                               UnallocatedA32(instr);
58049                               return;
58050                             }
58051                             Condition condition((instr >> 28) & 0xf);
58052                             unsigned rd = (instr >> 12) & 0xf;
58053                             unsigned rt = instr & 0xf;
58054                             unsigned rn = (instr >> 16) & 0xf;
58055                             // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58056                             strexb(condition,
58057                                    Register(rd),
58058                                    Register(rt),
58059                                    MemOperand(Register(rn), Offset));
58060                             if (((instr & 0xff00ff0) != 0x1c00f90)) {
58061                               UnpredictableA32(instr);
58062                             }
58063                             break;
58064                           }
58065                           default:
58066                             UnallocatedA32(instr);
58067                             break;
58068                         }
58069                         break;
58070                       }
58071                       case 0x01a00000: {
58072                         // 0x01e00090
58073                         switch (instr & 0x00000300) {
58074                           case 0x00000000: {
58075                             // 0x01e00090
58076                             if (((instr & 0xf0000000) == 0xf0000000)) {
58077                               UnallocatedA32(instr);
58078                               return;
58079                             }
58080                             Condition condition((instr >> 28) & 0xf);
58081                             unsigned rt = instr & 0xf;
58082                             unsigned rn = (instr >> 16) & 0xf;
58083                             // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1
58084                             stlh(condition,
58085                                  Register(rt),
58086                                  MemOperand(Register(rn), Offset));
58087                             if (((instr & 0xff0fff0) != 0x1e0fc90)) {
58088                               UnpredictableA32(instr);
58089                             }
58090                             break;
58091                           }
58092                           case 0x00000200: {
58093                             // 0x01e00290
58094                             if (((instr & 0xf0000000) == 0xf0000000)) {
58095                               UnallocatedA32(instr);
58096                               return;
58097                             }
58098                             Condition condition((instr >> 28) & 0xf);
58099                             unsigned rd = (instr >> 12) & 0xf;
58100                             unsigned rt = instr & 0xf;
58101                             unsigned rn = (instr >> 16) & 0xf;
58102                             // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58103                             stlexh(condition,
58104                                    Register(rd),
58105                                    Register(rt),
58106                                    MemOperand(Register(rn), Offset));
58107                             if (((instr & 0xff00ff0) != 0x1e00e90)) {
58108                               UnpredictableA32(instr);
58109                             }
58110                             break;
58111                           }
58112                           case 0x00000300: {
58113                             // 0x01e00390
58114                             if (((instr & 0xf0000000) == 0xf0000000)) {
58115                               UnallocatedA32(instr);
58116                               return;
58117                             }
58118                             Condition condition((instr >> 28) & 0xf);
58119                             unsigned rd = (instr >> 12) & 0xf;
58120                             unsigned rt = instr & 0xf;
58121                             unsigned rn = (instr >> 16) & 0xf;
58122                             // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58123                             strexh(condition,
58124                                    Register(rd),
58125                                    Register(rt),
58126                                    MemOperand(Register(rn), Offset));
58127                             if (((instr & 0xff00ff0) != 0x1e00f90)) {
58128                               UnpredictableA32(instr);
58129                             }
58130                             break;
58131                           }
58132                           default:
58133                             UnallocatedA32(instr);
58134                             break;
58135                         }
58136                         break;
58137                       }
58138                       default:
58139                         UnallocatedA32(instr);
58140                         break;
58141                     }
58142                     break;
58143                   }
58144                   case 0x00000020: {
58145                     // 0x004000b0
58146                     switch (instr & 0x01200000) {
58147                       case 0x00000000: {
58148                         // 0x004000b0
58149                         if (((instr & 0xf0000000) == 0xf0000000)) {
58150                           UnallocatedA32(instr);
58151                           return;
58152                         }
58153                         Condition condition((instr >> 28) & 0xf);
58154                         unsigned rt = (instr >> 12) & 0xf;
58155                         unsigned rn = (instr >> 16) & 0xf;
58156                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58157                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58158                         // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
58159                         strh(condition,
58160                              Best,
58161                              Register(rt),
58162                              MemOperand(Register(rn), sign, offset, PostIndex));
58163                         break;
58164                       }
58165                       case 0x00200000: {
58166                         // 0x006000b0
58167                         if (((instr & 0xf0000000) == 0xf0000000)) {
58168                           UnallocatedA32(instr);
58169                           return;
58170                         }
58171                         UnimplementedA32("STRHT", instr);
58172                         break;
58173                       }
58174                       case 0x01000000: {
58175                         // 0x014000b0
58176                         if (((instr & 0xf0000000) == 0xf0000000)) {
58177                           UnallocatedA32(instr);
58178                           return;
58179                         }
58180                         Condition condition((instr >> 28) & 0xf);
58181                         unsigned rt = (instr >> 12) & 0xf;
58182                         unsigned rn = (instr >> 16) & 0xf;
58183                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58184                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58185                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
58186                         strh(condition,
58187                              Best,
58188                              Register(rt),
58189                              MemOperand(Register(rn), sign, offset, Offset));
58190                         break;
58191                       }
58192                       case 0x01200000: {
58193                         // 0x016000b0
58194                         if (((instr & 0xf0000000) == 0xf0000000)) {
58195                           UnallocatedA32(instr);
58196                           return;
58197                         }
58198                         Condition condition((instr >> 28) & 0xf);
58199                         unsigned rt = (instr >> 12) & 0xf;
58200                         unsigned rn = (instr >> 16) & 0xf;
58201                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58202                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58203                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
58204                         strh(condition,
58205                              Best,
58206                              Register(rt),
58207                              MemOperand(Register(rn), sign, offset, PreIndex));
58208                         break;
58209                       }
58210                     }
58211                     break;
58212                   }
58213                   case 0x00000040: {
58214                     // 0x004000d0
58215                     switch (instr & 0x000f0000) {
58216                       case 0x000f0000: {
58217                         // 0x004f00d0
58218                         if (((instr & 0xf0000000) == 0xf0000000)) {
58219                           UnallocatedA32(instr);
58220                           return;
58221                         }
58222                         Condition condition((instr >> 28) & 0xf);
58223                         unsigned rt = (instr >> 12) & 0xf;
58224                         uint32_t U = (instr >> 23) & 0x1;
58225                         int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
58226                         if (U == 0) imm = -imm;
58227                         bool minus_zero = (imm == 0) && (U == 0);
58228                         Location location(imm, kA32PcDelta);
58229                         // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1
58230                         if (minus_zero) {
58231                           ldrd(condition,
58232                                Register(rt),
58233                                Register(rt + 1),
58234                                MemOperand(pc, minus, 0));
58235                         } else {
58236                           ldrd(condition,
58237                                Register(rt),
58238                                Register(rt + 1),
58239                                &location);
58240                         }
58241                         if (((instr & 0xf7f00f0) != 0x14f00d0)) {
58242                           UnpredictableA32(instr);
58243                         }
58244                         break;
58245                       }
58246                       default: {
58247                         switch (instr & 0x01200000) {
58248                           case 0x00000000: {
58249                             // 0x004000d0
58250                             if (((instr & 0xf0000000) == 0xf0000000) ||
58251                                 ((instr & 0xf0000) == 0xf0000)) {
58252                               UnallocatedA32(instr);
58253                               return;
58254                             }
58255                             Condition condition((instr >> 28) & 0xf);
58256                             unsigned rt = (instr >> 12) & 0xf;
58257                             unsigned rn = (instr >> 16) & 0xf;
58258                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58259                                                                    : plus);
58260                             int32_t offset =
58261                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
58262                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
58263                             ldrd(condition,
58264                                  Register(rt),
58265                                  Register(rt + 1),
58266                                  MemOperand(Register(rn),
58267                                             sign,
58268                                             offset,
58269                                             PostIndex));
58270                             break;
58271                           }
58272                           case 0x01000000: {
58273                             // 0x014000d0
58274                             if (((instr & 0xf0000000) == 0xf0000000) ||
58275                                 ((instr & 0xf0000) == 0xf0000)) {
58276                               UnallocatedA32(instr);
58277                               return;
58278                             }
58279                             Condition condition((instr >> 28) & 0xf);
58280                             unsigned rt = (instr >> 12) & 0xf;
58281                             unsigned rn = (instr >> 16) & 0xf;
58282                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58283                                                                    : plus);
58284                             int32_t offset =
58285                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
58286                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
58287                             ldrd(condition,
58288                                  Register(rt),
58289                                  Register(rt + 1),
58290                                  MemOperand(Register(rn),
58291                                             sign,
58292                                             offset,
58293                                             Offset));
58294                             break;
58295                           }
58296                           case 0x01200000: {
58297                             // 0x016000d0
58298                             if (((instr & 0xf0000000) == 0xf0000000) ||
58299                                 ((instr & 0xf0000) == 0xf0000)) {
58300                               UnallocatedA32(instr);
58301                               return;
58302                             }
58303                             Condition condition((instr >> 28) & 0xf);
58304                             unsigned rt = (instr >> 12) & 0xf;
58305                             unsigned rn = (instr >> 16) & 0xf;
58306                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58307                                                                    : plus);
58308                             int32_t offset =
58309                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
58310                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
58311                             ldrd(condition,
58312                                  Register(rt),
58313                                  Register(rt + 1),
58314                                  MemOperand(Register(rn),
58315                                             sign,
58316                                             offset,
58317                                             PreIndex));
58318                             break;
58319                           }
58320                           default:
58321                             UnallocatedA32(instr);
58322                             break;
58323                         }
58324                         break;
58325                       }
58326                     }
58327                     break;
58328                   }
58329                   case 0x00000060: {
58330                     // 0x004000f0
58331                     switch (instr & 0x01200000) {
58332                       case 0x00000000: {
58333                         // 0x004000f0
58334                         if (((instr & 0xf0000000) == 0xf0000000)) {
58335                           UnallocatedA32(instr);
58336                           return;
58337                         }
58338                         Condition condition((instr >> 28) & 0xf);
58339                         unsigned rt = (instr >> 12) & 0xf;
58340                         unsigned rn = (instr >> 16) & 0xf;
58341                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58342                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58343                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
58344                         strd(condition,
58345                              Register(rt),
58346                              Register(rt + 1),
58347                              MemOperand(Register(rn), sign, offset, PostIndex));
58348                         break;
58349                       }
58350                       case 0x01000000: {
58351                         // 0x014000f0
58352                         if (((instr & 0xf0000000) == 0xf0000000)) {
58353                           UnallocatedA32(instr);
58354                           return;
58355                         }
58356                         Condition condition((instr >> 28) & 0xf);
58357                         unsigned rt = (instr >> 12) & 0xf;
58358                         unsigned rn = (instr >> 16) & 0xf;
58359                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58360                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58361                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
58362                         strd(condition,
58363                              Register(rt),
58364                              Register(rt + 1),
58365                              MemOperand(Register(rn), sign, offset, Offset));
58366                         break;
58367                       }
58368                       case 0x01200000: {
58369                         // 0x016000f0
58370                         if (((instr & 0xf0000000) == 0xf0000000)) {
58371                           UnallocatedA32(instr);
58372                           return;
58373                         }
58374                         Condition condition((instr >> 28) & 0xf);
58375                         unsigned rt = (instr >> 12) & 0xf;
58376                         unsigned rn = (instr >> 16) & 0xf;
58377                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58378                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58379                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
58380                         strd(condition,
58381                              Register(rt),
58382                              Register(rt + 1),
58383                              MemOperand(Register(rn), sign, offset, PreIndex));
58384                         break;
58385                       }
58386                       default:
58387                         UnallocatedA32(instr);
58388                         break;
58389                     }
58390                     break;
58391                   }
58392                 }
58393                 break;
58394               }
58395             }
58396             break;
58397           }
58398           case 0x00100000: {
58399             // 0x00100000
58400             switch (instr & 0x01e00000) {
58401               case 0x00000000: {
58402                 // 0x00100000
58403                 switch (instr & 0x00000fe0) {
58404                   case 0x00000060: {
58405                     // 0x00100060
58406                     if (((instr & 0xf0000000) == 0xf0000000)) {
58407                       UnallocatedA32(instr);
58408                       return;
58409                     }
58410                     Condition condition((instr >> 28) & 0xf);
58411                     unsigned rd = (instr >> 12) & 0xf;
58412                     unsigned rn = (instr >> 16) & 0xf;
58413                     unsigned rm = instr & 0xf;
58414                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58415                     ands(condition,
58416                          Best,
58417                          Register(rd),
58418                          Register(rn),
58419                          Operand(Register(rm), RRX));
58420                     break;
58421                   }
58422                   default: {
58423                     if (((instr & 0xf0000000) == 0xf0000000) ||
58424                         ((instr & 0xfe0) == 0x60)) {
58425                       UnallocatedA32(instr);
58426                       return;
58427                     }
58428                     Condition condition((instr >> 28) & 0xf);
58429                     unsigned rd = (instr >> 12) & 0xf;
58430                     unsigned rn = (instr >> 16) & 0xf;
58431                     unsigned rm = instr & 0xf;
58432                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58433                                                         (instr >> 7) & 0x1f);
58434                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58435                     ands(condition,
58436                          Best,
58437                          Register(rd),
58438                          Register(rn),
58439                          Operand(Register(rm),
58440                                  shift_operand.GetType(),
58441                                  shift_operand.GetAmount()));
58442                     break;
58443                   }
58444                 }
58445                 break;
58446               }
58447               case 0x00200000: {
58448                 // 0x00300000
58449                 switch (instr & 0x00000fe0) {
58450                   case 0x00000060: {
58451                     // 0x00300060
58452                     if (((instr & 0xf0000000) == 0xf0000000)) {
58453                       UnallocatedA32(instr);
58454                       return;
58455                     }
58456                     Condition condition((instr >> 28) & 0xf);
58457                     unsigned rd = (instr >> 12) & 0xf;
58458                     unsigned rn = (instr >> 16) & 0xf;
58459                     unsigned rm = instr & 0xf;
58460                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58461                     eors(condition,
58462                          Best,
58463                          Register(rd),
58464                          Register(rn),
58465                          Operand(Register(rm), RRX));
58466                     break;
58467                   }
58468                   default: {
58469                     if (((instr & 0xf0000000) == 0xf0000000) ||
58470                         ((instr & 0xfe0) == 0x60)) {
58471                       UnallocatedA32(instr);
58472                       return;
58473                     }
58474                     Condition condition((instr >> 28) & 0xf);
58475                     unsigned rd = (instr >> 12) & 0xf;
58476                     unsigned rn = (instr >> 16) & 0xf;
58477                     unsigned rm = instr & 0xf;
58478                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58479                                                         (instr >> 7) & 0x1f);
58480                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58481                     eors(condition,
58482                          Best,
58483                          Register(rd),
58484                          Register(rn),
58485                          Operand(Register(rm),
58486                                  shift_operand.GetType(),
58487                                  shift_operand.GetAmount()));
58488                     break;
58489                   }
58490                 }
58491                 break;
58492               }
58493               case 0x00400000: {
58494                 // 0x00500000
58495                 switch (instr & 0x000f0000) {
58496                   case 0x000d0000: {
58497                     // 0x005d0000
58498                     switch (instr & 0x00000fe0) {
58499                       case 0x00000060: {
58500                         // 0x005d0060
58501                         if (((instr & 0xf0000000) == 0xf0000000)) {
58502                           UnallocatedA32(instr);
58503                           return;
58504                         }
58505                         Condition condition((instr >> 28) & 0xf);
58506                         unsigned rd = (instr >> 12) & 0xf;
58507                         unsigned rm = instr & 0xf;
58508                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
58509                         subs(condition,
58510                              Best,
58511                              Register(rd),
58512                              sp,
58513                              Operand(Register(rm), RRX));
58514                         break;
58515                       }
58516                       default: {
58517                         if (((instr & 0xf0000000) == 0xf0000000) ||
58518                             ((instr & 0xfe0) == 0x60)) {
58519                           UnallocatedA32(instr);
58520                           return;
58521                         }
58522                         Condition condition((instr >> 28) & 0xf);
58523                         unsigned rd = (instr >> 12) & 0xf;
58524                         unsigned rm = instr & 0xf;
58525                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58526                                                             (instr >> 7) &
58527                                                                 0x1f);
58528                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58529                         subs(condition,
58530                              Best,
58531                              Register(rd),
58532                              sp,
58533                              Operand(Register(rm),
58534                                      shift_operand.GetType(),
58535                                      shift_operand.GetAmount()));
58536                         break;
58537                       }
58538                     }
58539                     break;
58540                   }
58541                   default: {
58542                     switch (instr & 0x00000fe0) {
58543                       case 0x00000060: {
58544                         // 0x00500060
58545                         if (((instr & 0xf0000000) == 0xf0000000) ||
58546                             ((instr & 0xf0000) == 0xd0000)) {
58547                           UnallocatedA32(instr);
58548                           return;
58549                         }
58550                         Condition condition((instr >> 28) & 0xf);
58551                         unsigned rd = (instr >> 12) & 0xf;
58552                         unsigned rn = (instr >> 16) & 0xf;
58553                         unsigned rm = instr & 0xf;
58554                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58555                         subs(condition,
58556                              Best,
58557                              Register(rd),
58558                              Register(rn),
58559                              Operand(Register(rm), RRX));
58560                         break;
58561                       }
58562                       default: {
58563                         if (((instr & 0xf0000000) == 0xf0000000) ||
58564                             ((instr & 0xf0000) == 0xd0000) ||
58565                             ((instr & 0xfe0) == 0x60)) {
58566                           UnallocatedA32(instr);
58567                           return;
58568                         }
58569                         Condition condition((instr >> 28) & 0xf);
58570                         unsigned rd = (instr >> 12) & 0xf;
58571                         unsigned rn = (instr >> 16) & 0xf;
58572                         unsigned rm = instr & 0xf;
58573                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58574                                                             (instr >> 7) &
58575                                                                 0x1f);
58576                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58577                         subs(condition,
58578                              Best,
58579                              Register(rd),
58580                              Register(rn),
58581                              Operand(Register(rm),
58582                                      shift_operand.GetType(),
58583                                      shift_operand.GetAmount()));
58584                         break;
58585                       }
58586                     }
58587                     break;
58588                   }
58589                 }
58590                 break;
58591               }
58592               case 0x00600000: {
58593                 // 0x00700000
58594                 switch (instr & 0x00000fe0) {
58595                   case 0x00000060: {
58596                     // 0x00700060
58597                     if (((instr & 0xf0000000) == 0xf0000000)) {
58598                       UnallocatedA32(instr);
58599                       return;
58600                     }
58601                     Condition condition((instr >> 28) & 0xf);
58602                     unsigned rd = (instr >> 12) & 0xf;
58603                     unsigned rn = (instr >> 16) & 0xf;
58604                     unsigned rm = instr & 0xf;
58605                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58606                     rsbs(condition,
58607                          Best,
58608                          Register(rd),
58609                          Register(rn),
58610                          Operand(Register(rm), RRX));
58611                     break;
58612                   }
58613                   default: {
58614                     if (((instr & 0xf0000000) == 0xf0000000) ||
58615                         ((instr & 0xfe0) == 0x60)) {
58616                       UnallocatedA32(instr);
58617                       return;
58618                     }
58619                     Condition condition((instr >> 28) & 0xf);
58620                     unsigned rd = (instr >> 12) & 0xf;
58621                     unsigned rn = (instr >> 16) & 0xf;
58622                     unsigned rm = instr & 0xf;
58623                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58624                                                         (instr >> 7) & 0x1f);
58625                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58626                     rsbs(condition,
58627                          Best,
58628                          Register(rd),
58629                          Register(rn),
58630                          Operand(Register(rm),
58631                                  shift_operand.GetType(),
58632                                  shift_operand.GetAmount()));
58633                     break;
58634                   }
58635                 }
58636                 break;
58637               }
58638               case 0x00800000: {
58639                 // 0x00900000
58640                 switch (instr & 0x000f0000) {
58641                   case 0x000d0000: {
58642                     // 0x009d0000
58643                     switch (instr & 0x00000fe0) {
58644                       case 0x00000060: {
58645                         // 0x009d0060
58646                         if (((instr & 0xf0000000) == 0xf0000000)) {
58647                           UnallocatedA32(instr);
58648                           return;
58649                         }
58650                         Condition condition((instr >> 28) & 0xf);
58651                         unsigned rd = (instr >> 12) & 0xf;
58652                         unsigned rm = instr & 0xf;
58653                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
58654                         adds(condition,
58655                              Best,
58656                              Register(rd),
58657                              sp,
58658                              Operand(Register(rm), RRX));
58659                         break;
58660                       }
58661                       default: {
58662                         if (((instr & 0xf0000000) == 0xf0000000) ||
58663                             ((instr & 0xfe0) == 0x60)) {
58664                           UnallocatedA32(instr);
58665                           return;
58666                         }
58667                         Condition condition((instr >> 28) & 0xf);
58668                         unsigned rd = (instr >> 12) & 0xf;
58669                         unsigned rm = instr & 0xf;
58670                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58671                                                             (instr >> 7) &
58672                                                                 0x1f);
58673                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58674                         adds(condition,
58675                              Best,
58676                              Register(rd),
58677                              sp,
58678                              Operand(Register(rm),
58679                                      shift_operand.GetType(),
58680                                      shift_operand.GetAmount()));
58681                         break;
58682                       }
58683                     }
58684                     break;
58685                   }
58686                   default: {
58687                     switch (instr & 0x00000fe0) {
58688                       case 0x00000060: {
58689                         // 0x00900060
58690                         if (((instr & 0xf0000000) == 0xf0000000) ||
58691                             ((instr & 0xf0000) == 0xd0000)) {
58692                           UnallocatedA32(instr);
58693                           return;
58694                         }
58695                         Condition condition((instr >> 28) & 0xf);
58696                         unsigned rd = (instr >> 12) & 0xf;
58697                         unsigned rn = (instr >> 16) & 0xf;
58698                         unsigned rm = instr & 0xf;
58699                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58700                         adds(condition,
58701                              Best,
58702                              Register(rd),
58703                              Register(rn),
58704                              Operand(Register(rm), RRX));
58705                         break;
58706                       }
58707                       default: {
58708                         if (((instr & 0xf0000000) == 0xf0000000) ||
58709                             ((instr & 0xf0000) == 0xd0000) ||
58710                             ((instr & 0xfe0) == 0x60)) {
58711                           UnallocatedA32(instr);
58712                           return;
58713                         }
58714                         Condition condition((instr >> 28) & 0xf);
58715                         unsigned rd = (instr >> 12) & 0xf;
58716                         unsigned rn = (instr >> 16) & 0xf;
58717                         unsigned rm = instr & 0xf;
58718                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58719                                                             (instr >> 7) &
58720                                                                 0x1f);
58721                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58722                         adds(condition,
58723                              Best,
58724                              Register(rd),
58725                              Register(rn),
58726                              Operand(Register(rm),
58727                                      shift_operand.GetType(),
58728                                      shift_operand.GetAmount()));
58729                         break;
58730                       }
58731                     }
58732                     break;
58733                   }
58734                 }
58735                 break;
58736               }
58737               case 0x00a00000: {
58738                 // 0x00b00000
58739                 switch (instr & 0x00000fe0) {
58740                   case 0x00000060: {
58741                     // 0x00b00060
58742                     if (((instr & 0xf0000000) == 0xf0000000)) {
58743                       UnallocatedA32(instr);
58744                       return;
58745                     }
58746                     Condition condition((instr >> 28) & 0xf);
58747                     unsigned rd = (instr >> 12) & 0xf;
58748                     unsigned rn = (instr >> 16) & 0xf;
58749                     unsigned rm = instr & 0xf;
58750                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58751                     adcs(condition,
58752                          Best,
58753                          Register(rd),
58754                          Register(rn),
58755                          Operand(Register(rm), RRX));
58756                     break;
58757                   }
58758                   default: {
58759                     if (((instr & 0xf0000000) == 0xf0000000) ||
58760                         ((instr & 0xfe0) == 0x60)) {
58761                       UnallocatedA32(instr);
58762                       return;
58763                     }
58764                     Condition condition((instr >> 28) & 0xf);
58765                     unsigned rd = (instr >> 12) & 0xf;
58766                     unsigned rn = (instr >> 16) & 0xf;
58767                     unsigned rm = instr & 0xf;
58768                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58769                                                         (instr >> 7) & 0x1f);
58770                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58771                     adcs(condition,
58772                          Best,
58773                          Register(rd),
58774                          Register(rn),
58775                          Operand(Register(rm),
58776                                  shift_operand.GetType(),
58777                                  shift_operand.GetAmount()));
58778                     break;
58779                   }
58780                 }
58781                 break;
58782               }
58783               case 0x00c00000: {
58784                 // 0x00d00000
58785                 switch (instr & 0x00000fe0) {
58786                   case 0x00000060: {
58787                     // 0x00d00060
58788                     if (((instr & 0xf0000000) == 0xf0000000)) {
58789                       UnallocatedA32(instr);
58790                       return;
58791                     }
58792                     Condition condition((instr >> 28) & 0xf);
58793                     unsigned rd = (instr >> 12) & 0xf;
58794                     unsigned rn = (instr >> 16) & 0xf;
58795                     unsigned rm = instr & 0xf;
58796                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58797                     sbcs(condition,
58798                          Best,
58799                          Register(rd),
58800                          Register(rn),
58801                          Operand(Register(rm), RRX));
58802                     break;
58803                   }
58804                   default: {
58805                     if (((instr & 0xf0000000) == 0xf0000000) ||
58806                         ((instr & 0xfe0) == 0x60)) {
58807                       UnallocatedA32(instr);
58808                       return;
58809                     }
58810                     Condition condition((instr >> 28) & 0xf);
58811                     unsigned rd = (instr >> 12) & 0xf;
58812                     unsigned rn = (instr >> 16) & 0xf;
58813                     unsigned rm = instr & 0xf;
58814                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58815                                                         (instr >> 7) & 0x1f);
58816                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58817                     sbcs(condition,
58818                          Best,
58819                          Register(rd),
58820                          Register(rn),
58821                          Operand(Register(rm),
58822                                  shift_operand.GetType(),
58823                                  shift_operand.GetAmount()));
58824                     break;
58825                   }
58826                 }
58827                 break;
58828               }
58829               case 0x00e00000: {
58830                 // 0x00f00000
58831                 switch (instr & 0x00000fe0) {
58832                   case 0x00000060: {
58833                     // 0x00f00060
58834                     if (((instr & 0xf0000000) == 0xf0000000)) {
58835                       UnallocatedA32(instr);
58836                       return;
58837                     }
58838                     Condition condition((instr >> 28) & 0xf);
58839                     unsigned rd = (instr >> 12) & 0xf;
58840                     unsigned rn = (instr >> 16) & 0xf;
58841                     unsigned rm = instr & 0xf;
58842                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58843                     rscs(condition,
58844                          Register(rd),
58845                          Register(rn),
58846                          Operand(Register(rm), RRX));
58847                     break;
58848                   }
58849                   default: {
58850                     if (((instr & 0xf0000000) == 0xf0000000) ||
58851                         ((instr & 0xfe0) == 0x60)) {
58852                       UnallocatedA32(instr);
58853                       return;
58854                     }
58855                     Condition condition((instr >> 28) & 0xf);
58856                     unsigned rd = (instr >> 12) & 0xf;
58857                     unsigned rn = (instr >> 16) & 0xf;
58858                     unsigned rm = instr & 0xf;
58859                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58860                                                         (instr >> 7) & 0x1f);
58861                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58862                     rscs(condition,
58863                          Register(rd),
58864                          Register(rn),
58865                          Operand(Register(rm),
58866                                  shift_operand.GetType(),
58867                                  shift_operand.GetAmount()));
58868                     break;
58869                   }
58870                 }
58871                 break;
58872               }
58873               case 0x01000000: {
58874                 // 0x01100000
58875                 switch (instr & 0x00000fe0) {
58876                   case 0x00000060: {
58877                     // 0x01100060
58878                     if (((instr & 0xf0000000) == 0xf0000000)) {
58879                       UnallocatedA32(instr);
58880                       return;
58881                     }
58882                     Condition condition((instr >> 28) & 0xf);
58883                     unsigned rn = (instr >> 16) & 0xf;
58884                     unsigned rm = instr & 0xf;
58885                     // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
58886                     tst(condition,
58887                         Best,
58888                         Register(rn),
58889                         Operand(Register(rm), RRX));
58890                     if (((instr & 0xff0fff0) != 0x1100060)) {
58891                       UnpredictableA32(instr);
58892                     }
58893                     break;
58894                   }
58895                   default: {
58896                     if (((instr & 0xf0000000) == 0xf0000000) ||
58897                         ((instr & 0xfe0) == 0x60)) {
58898                       UnallocatedA32(instr);
58899                       return;
58900                     }
58901                     Condition condition((instr >> 28) & 0xf);
58902                     unsigned rn = (instr >> 16) & 0xf;
58903                     unsigned rm = instr & 0xf;
58904                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58905                                                         (instr >> 7) & 0x1f);
58906                     // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
58907                     tst(condition,
58908                         Best,
58909                         Register(rn),
58910                         Operand(Register(rm),
58911                                 shift_operand.GetType(),
58912                                 shift_operand.GetAmount()));
58913                     if (((instr & 0xff0f010) != 0x1100000)) {
58914                       UnpredictableA32(instr);
58915                     }
58916                     break;
58917                   }
58918                 }
58919                 break;
58920               }
58921               case 0x01200000: {
58922                 // 0x01300000
58923                 switch (instr & 0x00000fe0) {
58924                   case 0x00000060: {
58925                     // 0x01300060
58926                     if (((instr & 0xf0000000) == 0xf0000000)) {
58927                       UnallocatedA32(instr);
58928                       return;
58929                     }
58930                     Condition condition((instr >> 28) & 0xf);
58931                     unsigned rn = (instr >> 16) & 0xf;
58932                     unsigned rm = instr & 0xf;
58933                     // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
58934                     teq(condition, Register(rn), Operand(Register(rm), RRX));
58935                     if (((instr & 0xff0fff0) != 0x1300060)) {
58936                       UnpredictableA32(instr);
58937                     }
58938                     break;
58939                   }
58940                   default: {
58941                     if (((instr & 0xf0000000) == 0xf0000000) ||
58942                         ((instr & 0xfe0) == 0x60)) {
58943                       UnallocatedA32(instr);
58944                       return;
58945                     }
58946                     Condition condition((instr >> 28) & 0xf);
58947                     unsigned rn = (instr >> 16) & 0xf;
58948                     unsigned rm = instr & 0xf;
58949                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58950                                                         (instr >> 7) & 0x1f);
58951                     // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
58952                     teq(condition,
58953                         Register(rn),
58954                         Operand(Register(rm),
58955                                 shift_operand.GetType(),
58956                                 shift_operand.GetAmount()));
58957                     if (((instr & 0xff0f010) != 0x1300000)) {
58958                       UnpredictableA32(instr);
58959                     }
58960                     break;
58961                   }
58962                 }
58963                 break;
58964               }
58965               case 0x01400000: {
58966                 // 0x01500000
58967                 switch (instr & 0x00000fe0) {
58968                   case 0x00000060: {
58969                     // 0x01500060
58970                     if (((instr & 0xf0000000) == 0xf0000000)) {
58971                       UnallocatedA32(instr);
58972                       return;
58973                     }
58974                     Condition condition((instr >> 28) & 0xf);
58975                     unsigned rn = (instr >> 16) & 0xf;
58976                     unsigned rm = instr & 0xf;
58977                     // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
58978                     cmp(condition,
58979                         Best,
58980                         Register(rn),
58981                         Operand(Register(rm), RRX));
58982                     if (((instr & 0xff0fff0) != 0x1500060)) {
58983                       UnpredictableA32(instr);
58984                     }
58985                     break;
58986                   }
58987                   default: {
58988                     if (((instr & 0xf0000000) == 0xf0000000) ||
58989                         ((instr & 0xfe0) == 0x60)) {
58990                       UnallocatedA32(instr);
58991                       return;
58992                     }
58993                     Condition condition((instr >> 28) & 0xf);
58994                     unsigned rn = (instr >> 16) & 0xf;
58995                     unsigned rm = instr & 0xf;
58996                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58997                                                         (instr >> 7) & 0x1f);
58998                     // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
58999                     cmp(condition,
59000                         Best,
59001                         Register(rn),
59002                         Operand(Register(rm),
59003                                 shift_operand.GetType(),
59004                                 shift_operand.GetAmount()));
59005                     if (((instr & 0xff0f010) != 0x1500000)) {
59006                       UnpredictableA32(instr);
59007                     }
59008                     break;
59009                   }
59010                 }
59011                 break;
59012               }
59013               case 0x01600000: {
59014                 // 0x01700000
59015                 switch (instr & 0x00000fe0) {
59016                   case 0x00000060: {
59017                     // 0x01700060
59018                     if (((instr & 0xf0000000) == 0xf0000000)) {
59019                       UnallocatedA32(instr);
59020                       return;
59021                     }
59022                     Condition condition((instr >> 28) & 0xf);
59023                     unsigned rn = (instr >> 16) & 0xf;
59024                     unsigned rm = instr & 0xf;
59025                     // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59026                     cmn(condition,
59027                         Best,
59028                         Register(rn),
59029                         Operand(Register(rm), RRX));
59030                     if (((instr & 0xff0fff0) != 0x1700060)) {
59031                       UnpredictableA32(instr);
59032                     }
59033                     break;
59034                   }
59035                   default: {
59036                     if (((instr & 0xf0000000) == 0xf0000000) ||
59037                         ((instr & 0xfe0) == 0x60)) {
59038                       UnallocatedA32(instr);
59039                       return;
59040                     }
59041                     Condition condition((instr >> 28) & 0xf);
59042                     unsigned rn = (instr >> 16) & 0xf;
59043                     unsigned rm = instr & 0xf;
59044                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59045                                                         (instr >> 7) & 0x1f);
59046                     // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59047                     cmn(condition,
59048                         Best,
59049                         Register(rn),
59050                         Operand(Register(rm),
59051                                 shift_operand.GetType(),
59052                                 shift_operand.GetAmount()));
59053                     if (((instr & 0xff0f010) != 0x1700000)) {
59054                       UnpredictableA32(instr);
59055                     }
59056                     break;
59057                   }
59058                 }
59059                 break;
59060               }
59061               case 0x01800000: {
59062                 // 0x01900000
59063                 switch (instr & 0x00000fe0) {
59064                   case 0x00000060: {
59065                     // 0x01900060
59066                     if (((instr & 0xf0000000) == 0xf0000000)) {
59067                       UnallocatedA32(instr);
59068                       return;
59069                     }
59070                     Condition condition((instr >> 28) & 0xf);
59071                     unsigned rd = (instr >> 12) & 0xf;
59072                     unsigned rn = (instr >> 16) & 0xf;
59073                     unsigned rm = instr & 0xf;
59074                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59075                     orrs(condition,
59076                          Best,
59077                          Register(rd),
59078                          Register(rn),
59079                          Operand(Register(rm), RRX));
59080                     break;
59081                   }
59082                   default: {
59083                     if (((instr & 0xf0000000) == 0xf0000000) ||
59084                         ((instr & 0xfe0) == 0x60)) {
59085                       UnallocatedA32(instr);
59086                       return;
59087                     }
59088                     Condition condition((instr >> 28) & 0xf);
59089                     unsigned rd = (instr >> 12) & 0xf;
59090                     unsigned rn = (instr >> 16) & 0xf;
59091                     unsigned rm = instr & 0xf;
59092                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59093                                                         (instr >> 7) & 0x1f);
59094                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59095                     orrs(condition,
59096                          Best,
59097                          Register(rd),
59098                          Register(rn),
59099                          Operand(Register(rm),
59100                                  shift_operand.GetType(),
59101                                  shift_operand.GetAmount()));
59102                     break;
59103                   }
59104                 }
59105                 break;
59106               }
59107               case 0x01a00000: {
59108                 // 0x01b00000
59109                 switch (instr & 0x00000fe0) {
59110                   case 0x00000060: {
59111                     // 0x01b00060
59112                     if (((instr & 0xf0000000) == 0xf0000000)) {
59113                       UnallocatedA32(instr);
59114                       return;
59115                     }
59116                     if (((instr & 0xf0000000) != 0xf0000000)) {
59117                       Condition condition((instr >> 28) & 0xf);
59118                       unsigned rd = (instr >> 12) & 0xf;
59119                       unsigned rm = instr & 0xf;
59120                       // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1
59121                       rrxs(condition, Register(rd), Register(rm));
59122                       if (((instr & 0xfff0ff0) != 0x1b00060)) {
59123                         UnpredictableA32(instr);
59124                       }
59125                       return;
59126                     }
59127                     Condition condition((instr >> 28) & 0xf);
59128                     unsigned rd = (instr >> 12) & 0xf;
59129                     unsigned rm = instr & 0xf;
59130                     // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
59131                     movs(condition,
59132                          Best,
59133                          Register(rd),
59134                          Operand(Register(rm), RRX));
59135                     if (((instr & 0xfff0ff0) != 0x1b00060)) {
59136                       UnpredictableA32(instr);
59137                     }
59138                     break;
59139                   }
59140                   default: {
59141                     if (((instr & 0xf0000000) == 0xf0000000) ||
59142                         ((instr & 0xfe0) == 0x60)) {
59143                       UnallocatedA32(instr);
59144                       return;
59145                     }
59146                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
59147                         ((instr & 0xf0000000) != 0xf0000000)) {
59148                       Condition condition((instr >> 28) & 0xf);
59149                       unsigned rd = (instr >> 12) & 0xf;
59150                       unsigned rm = instr & 0xf;
59151                       uint32_t amount = (instr >> 7) & 0x1f;
59152                       if (amount == 0) amount = 32;
59153                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59154                       asrs(condition, Best, Register(rd), Register(rm), amount);
59155                       if (((instr & 0xfff0070) != 0x1b00040)) {
59156                         UnpredictableA32(instr);
59157                       }
59158                       return;
59159                     }
59160                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
59161                         ((instr & 0xf0000000) != 0xf0000000) &&
59162                         ((instr & 0x00000f80) != 0x00000000)) {
59163                       Condition condition((instr >> 28) & 0xf);
59164                       unsigned rd = (instr >> 12) & 0xf;
59165                       unsigned rm = instr & 0xf;
59166                       uint32_t amount = (instr >> 7) & 0x1f;
59167                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59168                       lsls(condition, Best, Register(rd), Register(rm), amount);
59169                       if (((instr & 0xfff0070) != 0x1b00000)) {
59170                         UnpredictableA32(instr);
59171                       }
59172                       return;
59173                     }
59174                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
59175                         ((instr & 0xf0000000) != 0xf0000000)) {
59176                       Condition condition((instr >> 28) & 0xf);
59177                       unsigned rd = (instr >> 12) & 0xf;
59178                       unsigned rm = instr & 0xf;
59179                       uint32_t amount = (instr >> 7) & 0x1f;
59180                       if (amount == 0) amount = 32;
59181                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59182                       lsrs(condition, Best, Register(rd), Register(rm), amount);
59183                       if (((instr & 0xfff0070) != 0x1b00020)) {
59184                         UnpredictableA32(instr);
59185                       }
59186                       return;
59187                     }
59188                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
59189                         ((instr & 0xf0000000) != 0xf0000000) &&
59190                         ((instr & 0x00000f80) != 0x00000000)) {
59191                       Condition condition((instr >> 28) & 0xf);
59192                       unsigned rd = (instr >> 12) & 0xf;
59193                       unsigned rm = instr & 0xf;
59194                       uint32_t amount = (instr >> 7) & 0x1f;
59195                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59196                       rors(condition, Best, Register(rd), Register(rm), amount);
59197                       if (((instr & 0xfff0070) != 0x1b00060)) {
59198                         UnpredictableA32(instr);
59199                       }
59200                       return;
59201                     }
59202                     Condition condition((instr >> 28) & 0xf);
59203                     unsigned rd = (instr >> 12) & 0xf;
59204                     unsigned rm = instr & 0xf;
59205                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59206                                                         (instr >> 7) & 0x1f);
59207                     // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
59208                     movs(condition,
59209                          Best,
59210                          Register(rd),
59211                          Operand(Register(rm),
59212                                  shift_operand.GetType(),
59213                                  shift_operand.GetAmount()));
59214                     if (((instr & 0xfff0010) != 0x1b00000)) {
59215                       UnpredictableA32(instr);
59216                     }
59217                     break;
59218                   }
59219                 }
59220                 break;
59221               }
59222               case 0x01c00000: {
59223                 // 0x01d00000
59224                 switch (instr & 0x00000fe0) {
59225                   case 0x00000060: {
59226                     // 0x01d00060
59227                     if (((instr & 0xf0000000) == 0xf0000000)) {
59228                       UnallocatedA32(instr);
59229                       return;
59230                     }
59231                     Condition condition((instr >> 28) & 0xf);
59232                     unsigned rd = (instr >> 12) & 0xf;
59233                     unsigned rn = (instr >> 16) & 0xf;
59234                     unsigned rm = instr & 0xf;
59235                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59236                     bics(condition,
59237                          Best,
59238                          Register(rd),
59239                          Register(rn),
59240                          Operand(Register(rm), RRX));
59241                     break;
59242                   }
59243                   default: {
59244                     if (((instr & 0xf0000000) == 0xf0000000) ||
59245                         ((instr & 0xfe0) == 0x60)) {
59246                       UnallocatedA32(instr);
59247                       return;
59248                     }
59249                     Condition condition((instr >> 28) & 0xf);
59250                     unsigned rd = (instr >> 12) & 0xf;
59251                     unsigned rn = (instr >> 16) & 0xf;
59252                     unsigned rm = instr & 0xf;
59253                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59254                                                         (instr >> 7) & 0x1f);
59255                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59256                     bics(condition,
59257                          Best,
59258                          Register(rd),
59259                          Register(rn),
59260                          Operand(Register(rm),
59261                                  shift_operand.GetType(),
59262                                  shift_operand.GetAmount()));
59263                     break;
59264                   }
59265                 }
59266                 break;
59267               }
59268               case 0x01e00000: {
59269                 // 0x01f00000
59270                 switch (instr & 0x00000fe0) {
59271                   case 0x00000060: {
59272                     // 0x01f00060
59273                     if (((instr & 0xf0000000) == 0xf0000000)) {
59274                       UnallocatedA32(instr);
59275                       return;
59276                     }
59277                     Condition condition((instr >> 28) & 0xf);
59278                     unsigned rd = (instr >> 12) & 0xf;
59279                     unsigned rm = instr & 0xf;
59280                     // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
59281                     mvns(condition,
59282                          Best,
59283                          Register(rd),
59284                          Operand(Register(rm), RRX));
59285                     if (((instr & 0xfff0ff0) != 0x1f00060)) {
59286                       UnpredictableA32(instr);
59287                     }
59288                     break;
59289                   }
59290                   default: {
59291                     if (((instr & 0xf0000000) == 0xf0000000) ||
59292                         ((instr & 0xfe0) == 0x60)) {
59293                       UnallocatedA32(instr);
59294                       return;
59295                     }
59296                     Condition condition((instr >> 28) & 0xf);
59297                     unsigned rd = (instr >> 12) & 0xf;
59298                     unsigned rm = instr & 0xf;
59299                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59300                                                         (instr >> 7) & 0x1f);
59301                     // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
59302                     mvns(condition,
59303                          Best,
59304                          Register(rd),
59305                          Operand(Register(rm),
59306                                  shift_operand.GetType(),
59307                                  shift_operand.GetAmount()));
59308                     if (((instr & 0xfff0010) != 0x1f00000)) {
59309                       UnpredictableA32(instr);
59310                     }
59311                     break;
59312                   }
59313                 }
59314                 break;
59315               }
59316             }
59317             break;
59318           }
59319           case 0x00100010: {
59320             // 0x00100010
59321             switch (instr & 0x00400080) {
59322               case 0x00000000: {
59323                 // 0x00100010
59324                 switch (instr & 0x01a00000) {
59325                   case 0x00000000: {
59326                     // 0x00100010
59327                     if (((instr & 0xf0000000) == 0xf0000000)) {
59328                       UnallocatedA32(instr);
59329                       return;
59330                     }
59331                     Condition condition((instr >> 28) & 0xf);
59332                     unsigned rd = (instr >> 12) & 0xf;
59333                     unsigned rn = (instr >> 16) & 0xf;
59334                     unsigned rm = instr & 0xf;
59335                     Shift shift((instr >> 5) & 0x3);
59336                     unsigned rs = (instr >> 8) & 0xf;
59337                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59338                     ands(condition,
59339                          Best,
59340                          Register(rd),
59341                          Register(rn),
59342                          Operand(Register(rm), shift.GetType(), Register(rs)));
59343                     break;
59344                   }
59345                   case 0x00200000: {
59346                     // 0x00300010
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                     Shift shift((instr >> 5) & 0x3);
59356                     unsigned rs = (instr >> 8) & 0xf;
59357                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59358                     eors(condition,
59359                          Best,
59360                          Register(rd),
59361                          Register(rn),
59362                          Operand(Register(rm), shift.GetType(), Register(rs)));
59363                     break;
59364                   }
59365                   case 0x00800000: {
59366                     // 0x00900010
59367                     if (((instr & 0xf0000000) == 0xf0000000)) {
59368                       UnallocatedA32(instr);
59369                       return;
59370                     }
59371                     Condition condition((instr >> 28) & 0xf);
59372                     unsigned rd = (instr >> 12) & 0xf;
59373                     unsigned rn = (instr >> 16) & 0xf;
59374                     unsigned rm = instr & 0xf;
59375                     Shift shift((instr >> 5) & 0x3);
59376                     unsigned rs = (instr >> 8) & 0xf;
59377                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59378                     adds(condition,
59379                          Best,
59380                          Register(rd),
59381                          Register(rn),
59382                          Operand(Register(rm), shift.GetType(), Register(rs)));
59383                     break;
59384                   }
59385                   case 0x00a00000: {
59386                     // 0x00b00010
59387                     if (((instr & 0xf0000000) == 0xf0000000)) {
59388                       UnallocatedA32(instr);
59389                       return;
59390                     }
59391                     Condition condition((instr >> 28) & 0xf);
59392                     unsigned rd = (instr >> 12) & 0xf;
59393                     unsigned rn = (instr >> 16) & 0xf;
59394                     unsigned rm = instr & 0xf;
59395                     Shift shift((instr >> 5) & 0x3);
59396                     unsigned rs = (instr >> 8) & 0xf;
59397                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59398                     adcs(condition,
59399                          Best,
59400                          Register(rd),
59401                          Register(rn),
59402                          Operand(Register(rm), shift.GetType(), Register(rs)));
59403                     break;
59404                   }
59405                   case 0x01000000: {
59406                     // 0x01100010
59407                     if (((instr & 0xf0000000) == 0xf0000000)) {
59408                       UnallocatedA32(instr);
59409                       return;
59410                     }
59411                     Condition condition((instr >> 28) & 0xf);
59412                     unsigned rn = (instr >> 16) & 0xf;
59413                     unsigned rm = instr & 0xf;
59414                     Shift shift((instr >> 5) & 0x3);
59415                     unsigned rs = (instr >> 8) & 0xf;
59416                     // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
59417                     tst(condition,
59418                         Best,
59419                         Register(rn),
59420                         Operand(Register(rm), shift.GetType(), Register(rs)));
59421                     if (((instr & 0xff0f090) != 0x1100010)) {
59422                       UnpredictableA32(instr);
59423                     }
59424                     break;
59425                   }
59426                   case 0x01200000: {
59427                     // 0x01300010
59428                     if (((instr & 0xf0000000) == 0xf0000000)) {
59429                       UnallocatedA32(instr);
59430                       return;
59431                     }
59432                     Condition condition((instr >> 28) & 0xf);
59433                     unsigned rn = (instr >> 16) & 0xf;
59434                     unsigned rm = instr & 0xf;
59435                     Shift shift((instr >> 5) & 0x3);
59436                     unsigned rs = (instr >> 8) & 0xf;
59437                     // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
59438                     teq(condition,
59439                         Register(rn),
59440                         Operand(Register(rm), shift.GetType(), Register(rs)));
59441                     if (((instr & 0xff0f090) != 0x1300010)) {
59442                       UnpredictableA32(instr);
59443                     }
59444                     break;
59445                   }
59446                   case 0x01800000: {
59447                     // 0x01900010
59448                     if (((instr & 0xf0000000) == 0xf0000000)) {
59449                       UnallocatedA32(instr);
59450                       return;
59451                     }
59452                     Condition condition((instr >> 28) & 0xf);
59453                     unsigned rd = (instr >> 12) & 0xf;
59454                     unsigned rn = (instr >> 16) & 0xf;
59455                     unsigned rm = instr & 0xf;
59456                     Shift shift((instr >> 5) & 0x3);
59457                     unsigned rs = (instr >> 8) & 0xf;
59458                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59459                     orrs(condition,
59460                          Best,
59461                          Register(rd),
59462                          Register(rn),
59463                          Operand(Register(rm), shift.GetType(), Register(rs)));
59464                     break;
59465                   }
59466                   case 0x01a00000: {
59467                     // 0x01b00010
59468                     if (((instr & 0xf0000000) == 0xf0000000)) {
59469                       UnallocatedA32(instr);
59470                       return;
59471                     }
59472                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
59473                         ((instr & 0xf0000000) != 0xf0000000)) {
59474                       Condition condition((instr >> 28) & 0xf);
59475                       unsigned rd = (instr >> 12) & 0xf;
59476                       unsigned rm = instr & 0xf;
59477                       unsigned rs = (instr >> 8) & 0xf;
59478                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59479                       asrs(condition,
59480                            Best,
59481                            Register(rd),
59482                            Register(rm),
59483                            Register(rs));
59484                       if (((instr & 0xfff00f0) != 0x1b00050)) {
59485                         UnpredictableA32(instr);
59486                       }
59487                       return;
59488                     }
59489                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
59490                         ((instr & 0xf0000000) != 0xf0000000)) {
59491                       Condition condition((instr >> 28) & 0xf);
59492                       unsigned rd = (instr >> 12) & 0xf;
59493                       unsigned rm = instr & 0xf;
59494                       unsigned rs = (instr >> 8) & 0xf;
59495                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59496                       lsls(condition,
59497                            Best,
59498                            Register(rd),
59499                            Register(rm),
59500                            Register(rs));
59501                       if (((instr & 0xfff00f0) != 0x1b00010)) {
59502                         UnpredictableA32(instr);
59503                       }
59504                       return;
59505                     }
59506                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
59507                         ((instr & 0xf0000000) != 0xf0000000)) {
59508                       Condition condition((instr >> 28) & 0xf);
59509                       unsigned rd = (instr >> 12) & 0xf;
59510                       unsigned rm = instr & 0xf;
59511                       unsigned rs = (instr >> 8) & 0xf;
59512                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59513                       lsrs(condition,
59514                            Best,
59515                            Register(rd),
59516                            Register(rm),
59517                            Register(rs));
59518                       if (((instr & 0xfff00f0) != 0x1b00030)) {
59519                         UnpredictableA32(instr);
59520                       }
59521                       return;
59522                     }
59523                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
59524                         ((instr & 0xf0000000) != 0xf0000000)) {
59525                       Condition condition((instr >> 28) & 0xf);
59526                       unsigned rd = (instr >> 12) & 0xf;
59527                       unsigned rm = instr & 0xf;
59528                       unsigned rs = (instr >> 8) & 0xf;
59529                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59530                       rors(condition,
59531                            Best,
59532                            Register(rd),
59533                            Register(rm),
59534                            Register(rs));
59535                       if (((instr & 0xfff00f0) != 0x1b00070)) {
59536                         UnpredictableA32(instr);
59537                       }
59538                       return;
59539                     }
59540                     Condition condition((instr >> 28) & 0xf);
59541                     unsigned rd = (instr >> 12) & 0xf;
59542                     unsigned rm = instr & 0xf;
59543                     Shift shift((instr >> 5) & 0x3);
59544                     unsigned rs = (instr >> 8) & 0xf;
59545                     // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
59546                     movs(condition,
59547                          Best,
59548                          Register(rd),
59549                          Operand(Register(rm), shift.GetType(), Register(rs)));
59550                     if (((instr & 0xfff0090) != 0x1b00010)) {
59551                       UnpredictableA32(instr);
59552                     }
59553                     break;
59554                   }
59555                 }
59556                 break;
59557               }
59558               case 0x00000080: {
59559                 // 0x00100090
59560                 switch (instr & 0x01200060) {
59561                   case 0x00000000: {
59562                     // 0x00100090
59563                     switch (instr & 0x00800000) {
59564                       case 0x00000000: {
59565                         // 0x00100090
59566                         if (((instr & 0xf0000000) == 0xf0000000)) {
59567                           UnallocatedA32(instr);
59568                           return;
59569                         }
59570                         Condition condition((instr >> 28) & 0xf);
59571                         unsigned rd = (instr >> 16) & 0xf;
59572                         unsigned rn = instr & 0xf;
59573                         unsigned rm = (instr >> 8) & 0xf;
59574                         // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
59575                         muls(condition,
59576                              Register(rd),
59577                              Register(rn),
59578                              Register(rm));
59579                         if (((instr & 0xff0f0f0) != 0x100090)) {
59580                           UnpredictableA32(instr);
59581                         }
59582                         break;
59583                       }
59584                       case 0x00800000: {
59585                         // 0x00900090
59586                         if (((instr & 0xf0000000) == 0xf0000000)) {
59587                           UnallocatedA32(instr);
59588                           return;
59589                         }
59590                         Condition condition((instr >> 28) & 0xf);
59591                         unsigned rdlo = (instr >> 12) & 0xf;
59592                         unsigned rdhi = (instr >> 16) & 0xf;
59593                         unsigned rn = instr & 0xf;
59594                         unsigned rm = (instr >> 8) & 0xf;
59595                         // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
59596                         umulls(condition,
59597                                Register(rdlo),
59598                                Register(rdhi),
59599                                Register(rn),
59600                                Register(rm));
59601                         break;
59602                       }
59603                     }
59604                     break;
59605                   }
59606                   case 0x00000020: {
59607                     // 0x001000b0
59608                     if (((instr & 0xf0000000) == 0xf0000000)) {
59609                       UnallocatedA32(instr);
59610                       return;
59611                     }
59612                     Condition condition((instr >> 28) & 0xf);
59613                     unsigned rt = (instr >> 12) & 0xf;
59614                     unsigned rn = (instr >> 16) & 0xf;
59615                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59616                     unsigned rm = instr & 0xf;
59617                     // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
59618                     ldrh(condition,
59619                          Best,
59620                          Register(rt),
59621                          MemOperand(Register(rn),
59622                                     sign,
59623                                     Register(rm),
59624                                     PostIndex));
59625                     if (((instr & 0xf700ff0) != 0x1000b0)) {
59626                       UnpredictableA32(instr);
59627                     }
59628                     break;
59629                   }
59630                   case 0x00000040: {
59631                     // 0x001000d0
59632                     if (((instr & 0xf0000000) == 0xf0000000)) {
59633                       UnallocatedA32(instr);
59634                       return;
59635                     }
59636                     Condition condition((instr >> 28) & 0xf);
59637                     unsigned rt = (instr >> 12) & 0xf;
59638                     unsigned rn = (instr >> 16) & 0xf;
59639                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59640                     unsigned rm = instr & 0xf;
59641                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
59642                     ldrsb(condition,
59643                           Best,
59644                           Register(rt),
59645                           MemOperand(Register(rn),
59646                                      sign,
59647                                      Register(rm),
59648                                      PostIndex));
59649                     if (((instr & 0xf700ff0) != 0x1000d0)) {
59650                       UnpredictableA32(instr);
59651                     }
59652                     break;
59653                   }
59654                   case 0x00000060: {
59655                     // 0x001000f0
59656                     if (((instr & 0xf0000000) == 0xf0000000)) {
59657                       UnallocatedA32(instr);
59658                       return;
59659                     }
59660                     Condition condition((instr >> 28) & 0xf);
59661                     unsigned rt = (instr >> 12) & 0xf;
59662                     unsigned rn = (instr >> 16) & 0xf;
59663                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59664                     unsigned rm = instr & 0xf;
59665                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
59666                     ldrsh(condition,
59667                           Best,
59668                           Register(rt),
59669                           MemOperand(Register(rn),
59670                                      sign,
59671                                      Register(rm),
59672                                      PostIndex));
59673                     if (((instr & 0xf700ff0) != 0x1000f0)) {
59674                       UnpredictableA32(instr);
59675                     }
59676                     break;
59677                   }
59678                   case 0x00200000: {
59679                     // 0x00300090
59680                     switch (instr & 0x00800000) {
59681                       case 0x00000000: {
59682                         // 0x00300090
59683                         if (((instr & 0xf0000000) == 0xf0000000)) {
59684                           UnallocatedA32(instr);
59685                           return;
59686                         }
59687                         Condition condition((instr >> 28) & 0xf);
59688                         unsigned rd = (instr >> 16) & 0xf;
59689                         unsigned rn = instr & 0xf;
59690                         unsigned rm = (instr >> 8) & 0xf;
59691                         unsigned ra = (instr >> 12) & 0xf;
59692                         // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
59693                         mlas(condition,
59694                              Register(rd),
59695                              Register(rn),
59696                              Register(rm),
59697                              Register(ra));
59698                         break;
59699                       }
59700                       case 0x00800000: {
59701                         // 0x00b00090
59702                         if (((instr & 0xf0000000) == 0xf0000000)) {
59703                           UnallocatedA32(instr);
59704                           return;
59705                         }
59706                         Condition condition((instr >> 28) & 0xf);
59707                         unsigned rdlo = (instr >> 12) & 0xf;
59708                         unsigned rdhi = (instr >> 16) & 0xf;
59709                         unsigned rn = instr & 0xf;
59710                         unsigned rm = (instr >> 8) & 0xf;
59711                         // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
59712                         umlals(condition,
59713                                Register(rdlo),
59714                                Register(rdhi),
59715                                Register(rn),
59716                                Register(rm));
59717                         break;
59718                       }
59719                     }
59720                     break;
59721                   }
59722                   case 0x00200020: {
59723                     // 0x003000b0
59724                     if (((instr & 0xf0000000) == 0xf0000000)) {
59725                       UnallocatedA32(instr);
59726                       return;
59727                     }
59728                     UnimplementedA32("LDRHT", instr);
59729                     break;
59730                   }
59731                   case 0x00200040: {
59732                     // 0x003000d0
59733                     if (((instr & 0xf0000000) == 0xf0000000)) {
59734                       UnallocatedA32(instr);
59735                       return;
59736                     }
59737                     UnimplementedA32("LDRSBT", instr);
59738                     break;
59739                   }
59740                   case 0x00200060: {
59741                     // 0x003000f0
59742                     if (((instr & 0xf0000000) == 0xf0000000)) {
59743                       UnallocatedA32(instr);
59744                       return;
59745                     }
59746                     UnimplementedA32("LDRSHT", instr);
59747                     break;
59748                   }
59749                   case 0x01000000: {
59750                     // 0x01100090
59751                     switch (instr & 0x00800300) {
59752                       case 0x00800000: {
59753                         // 0x01900090
59754                         if (((instr & 0xf0000000) == 0xf0000000)) {
59755                           UnallocatedA32(instr);
59756                           return;
59757                         }
59758                         Condition condition((instr >> 28) & 0xf);
59759                         unsigned rt = (instr >> 12) & 0xf;
59760                         unsigned rn = (instr >> 16) & 0xf;
59761                         // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1
59762                         lda(condition,
59763                             Register(rt),
59764                             MemOperand(Register(rn), Offset));
59765                         if (((instr & 0xff00fff) != 0x1900c9f)) {
59766                           UnpredictableA32(instr);
59767                         }
59768                         break;
59769                       }
59770                       case 0x00800200: {
59771                         // 0x01900290
59772                         if (((instr & 0xf0000000) == 0xf0000000)) {
59773                           UnallocatedA32(instr);
59774                           return;
59775                         }
59776                         Condition condition((instr >> 28) & 0xf);
59777                         unsigned rt = (instr >> 12) & 0xf;
59778                         unsigned rn = (instr >> 16) & 0xf;
59779                         // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1
59780                         ldaex(condition,
59781                               Register(rt),
59782                               MemOperand(Register(rn), Offset));
59783                         if (((instr & 0xff00fff) != 0x1900e9f)) {
59784                           UnpredictableA32(instr);
59785                         }
59786                         break;
59787                       }
59788                       case 0x00800300: {
59789                         // 0x01900390
59790                         if (((instr & 0xf0000000) == 0xf0000000)) {
59791                           UnallocatedA32(instr);
59792                           return;
59793                         }
59794                         Condition condition((instr >> 28) & 0xf);
59795                         unsigned rt = (instr >> 12) & 0xf;
59796                         unsigned rn = (instr >> 16) & 0xf;
59797                         // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1
59798                         ldrex(condition,
59799                               Register(rt),
59800                               MemOperand(Register(rn), plus, 0, Offset));
59801                         if (((instr & 0xff00fff) != 0x1900f9f)) {
59802                           UnpredictableA32(instr);
59803                         }
59804                         break;
59805                       }
59806                       default:
59807                         UnallocatedA32(instr);
59808                         break;
59809                     }
59810                     break;
59811                   }
59812                   case 0x01000020: {
59813                     // 0x011000b0
59814                     if (((instr & 0xf0000000) == 0xf0000000)) {
59815                       UnallocatedA32(instr);
59816                       return;
59817                     }
59818                     Condition condition((instr >> 28) & 0xf);
59819                     unsigned rt = (instr >> 12) & 0xf;
59820                     unsigned rn = (instr >> 16) & 0xf;
59821                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59822                     unsigned rm = instr & 0xf;
59823                     AddrMode addrmode = Offset;
59824                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
59825                     ldrh(condition,
59826                          Best,
59827                          Register(rt),
59828                          MemOperand(Register(rn),
59829                                     sign,
59830                                     Register(rm),
59831                                     addrmode));
59832                     if (((instr & 0xf700ff0) != 0x11000b0)) {
59833                       UnpredictableA32(instr);
59834                     }
59835                     break;
59836                   }
59837                   case 0x01000040: {
59838                     // 0x011000d0
59839                     if (((instr & 0xf0000000) == 0xf0000000)) {
59840                       UnallocatedA32(instr);
59841                       return;
59842                     }
59843                     Condition condition((instr >> 28) & 0xf);
59844                     unsigned rt = (instr >> 12) & 0xf;
59845                     unsigned rn = (instr >> 16) & 0xf;
59846                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59847                     unsigned rm = instr & 0xf;
59848                     AddrMode addrmode = Offset;
59849                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
59850                     ldrsb(condition,
59851                           Best,
59852                           Register(rt),
59853                           MemOperand(Register(rn),
59854                                      sign,
59855                                      Register(rm),
59856                                      addrmode));
59857                     if (((instr & 0xf700ff0) != 0x11000d0)) {
59858                       UnpredictableA32(instr);
59859                     }
59860                     break;
59861                   }
59862                   case 0x01000060: {
59863                     // 0x011000f0
59864                     if (((instr & 0xf0000000) == 0xf0000000)) {
59865                       UnallocatedA32(instr);
59866                       return;
59867                     }
59868                     Condition condition((instr >> 28) & 0xf);
59869                     unsigned rt = (instr >> 12) & 0xf;
59870                     unsigned rn = (instr >> 16) & 0xf;
59871                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59872                     unsigned rm = instr & 0xf;
59873                     AddrMode addrmode = Offset;
59874                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
59875                     ldrsh(condition,
59876                           Best,
59877                           Register(rt),
59878                           MemOperand(Register(rn),
59879                                      sign,
59880                                      Register(rm),
59881                                      addrmode));
59882                     if (((instr & 0xf700ff0) != 0x11000f0)) {
59883                       UnpredictableA32(instr);
59884                     }
59885                     break;
59886                   }
59887                   case 0x01200000: {
59888                     // 0x01300090
59889                     switch (instr & 0x00800300) {
59890                       case 0x00800200: {
59891                         // 0x01b00290
59892                         if (((instr & 0xf0000000) == 0xf0000000)) {
59893                           UnallocatedA32(instr);
59894                           return;
59895                         }
59896                         Condition condition((instr >> 28) & 0xf);
59897                         unsigned rt = (instr >> 12) & 0xf;
59898                         unsigned rn = (instr >> 16) & 0xf;
59899                         // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
59900                         ldaexd(condition,
59901                                Register(rt),
59902                                Register(rt + 1),
59903                                MemOperand(Register(rn), Offset));
59904                         if (((instr & 0xff00fff) != 0x1b00e9f)) {
59905                           UnpredictableA32(instr);
59906                         }
59907                         break;
59908                       }
59909                       case 0x00800300: {
59910                         // 0x01b00390
59911                         if (((instr & 0xf0000000) == 0xf0000000)) {
59912                           UnallocatedA32(instr);
59913                           return;
59914                         }
59915                         Condition condition((instr >> 28) & 0xf);
59916                         unsigned rt = (instr >> 12) & 0xf;
59917                         unsigned rn = (instr >> 16) & 0xf;
59918                         // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
59919                         ldrexd(condition,
59920                                Register(rt),
59921                                Register(rt + 1),
59922                                MemOperand(Register(rn), Offset));
59923                         if (((instr & 0xff00fff) != 0x1b00f9f)) {
59924                           UnpredictableA32(instr);
59925                         }
59926                         break;
59927                       }
59928                       default:
59929                         UnallocatedA32(instr);
59930                         break;
59931                     }
59932                     break;
59933                   }
59934                   case 0x01200020: {
59935                     // 0x013000b0
59936                     if (((instr & 0xf0000000) == 0xf0000000)) {
59937                       UnallocatedA32(instr);
59938                       return;
59939                     }
59940                     Condition condition((instr >> 28) & 0xf);
59941                     unsigned rt = (instr >> 12) & 0xf;
59942                     unsigned rn = (instr >> 16) & 0xf;
59943                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59944                     unsigned rm = instr & 0xf;
59945                     AddrMode addrmode = PreIndex;
59946                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
59947                     ldrh(condition,
59948                          Best,
59949                          Register(rt),
59950                          MemOperand(Register(rn),
59951                                     sign,
59952                                     Register(rm),
59953                                     addrmode));
59954                     if (((instr & 0xf700ff0) != 0x13000b0)) {
59955                       UnpredictableA32(instr);
59956                     }
59957                     break;
59958                   }
59959                   case 0x01200040: {
59960                     // 0x013000d0
59961                     if (((instr & 0xf0000000) == 0xf0000000)) {
59962                       UnallocatedA32(instr);
59963                       return;
59964                     }
59965                     Condition condition((instr >> 28) & 0xf);
59966                     unsigned rt = (instr >> 12) & 0xf;
59967                     unsigned rn = (instr >> 16) & 0xf;
59968                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59969                     unsigned rm = instr & 0xf;
59970                     AddrMode addrmode = PreIndex;
59971                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
59972                     ldrsb(condition,
59973                           Best,
59974                           Register(rt),
59975                           MemOperand(Register(rn),
59976                                      sign,
59977                                      Register(rm),
59978                                      addrmode));
59979                     if (((instr & 0xf700ff0) != 0x13000d0)) {
59980                       UnpredictableA32(instr);
59981                     }
59982                     break;
59983                   }
59984                   case 0x01200060: {
59985                     // 0x013000f0
59986                     if (((instr & 0xf0000000) == 0xf0000000)) {
59987                       UnallocatedA32(instr);
59988                       return;
59989                     }
59990                     Condition condition((instr >> 28) & 0xf);
59991                     unsigned rt = (instr >> 12) & 0xf;
59992                     unsigned rn = (instr >> 16) & 0xf;
59993                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59994                     unsigned rm = instr & 0xf;
59995                     AddrMode addrmode = PreIndex;
59996                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
59997                     ldrsh(condition,
59998                           Best,
59999                           Register(rt),
60000                           MemOperand(Register(rn),
60001                                      sign,
60002                                      Register(rm),
60003                                      addrmode));
60004                     if (((instr & 0xf700ff0) != 0x13000f0)) {
60005                       UnpredictableA32(instr);
60006                     }
60007                     break;
60008                   }
60009                 }
60010                 break;
60011               }
60012               case 0x00400000: {
60013                 // 0x00500010
60014                 switch (instr & 0x01a00000) {
60015                   case 0x00000000: {
60016                     // 0x00500010
60017                     if (((instr & 0xf0000000) == 0xf0000000)) {
60018                       UnallocatedA32(instr);
60019                       return;
60020                     }
60021                     Condition condition((instr >> 28) & 0xf);
60022                     unsigned rd = (instr >> 12) & 0xf;
60023                     unsigned rn = (instr >> 16) & 0xf;
60024                     unsigned rm = instr & 0xf;
60025                     Shift shift((instr >> 5) & 0x3);
60026                     unsigned rs = (instr >> 8) & 0xf;
60027                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60028                     subs(condition,
60029                          Best,
60030                          Register(rd),
60031                          Register(rn),
60032                          Operand(Register(rm), shift.GetType(), Register(rs)));
60033                     break;
60034                   }
60035                   case 0x00200000: {
60036                     // 0x00700010
60037                     if (((instr & 0xf0000000) == 0xf0000000)) {
60038                       UnallocatedA32(instr);
60039                       return;
60040                     }
60041                     Condition condition((instr >> 28) & 0xf);
60042                     unsigned rd = (instr >> 12) & 0xf;
60043                     unsigned rn = (instr >> 16) & 0xf;
60044                     unsigned rm = instr & 0xf;
60045                     Shift shift((instr >> 5) & 0x3);
60046                     unsigned rs = (instr >> 8) & 0xf;
60047                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60048                     rsbs(condition,
60049                          Best,
60050                          Register(rd),
60051                          Register(rn),
60052                          Operand(Register(rm), shift.GetType(), Register(rs)));
60053                     break;
60054                   }
60055                   case 0x00800000: {
60056                     // 0x00d00010
60057                     if (((instr & 0xf0000000) == 0xf0000000)) {
60058                       UnallocatedA32(instr);
60059                       return;
60060                     }
60061                     Condition condition((instr >> 28) & 0xf);
60062                     unsigned rd = (instr >> 12) & 0xf;
60063                     unsigned rn = (instr >> 16) & 0xf;
60064                     unsigned rm = instr & 0xf;
60065                     Shift shift((instr >> 5) & 0x3);
60066                     unsigned rs = (instr >> 8) & 0xf;
60067                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60068                     sbcs(condition,
60069                          Best,
60070                          Register(rd),
60071                          Register(rn),
60072                          Operand(Register(rm), shift.GetType(), Register(rs)));
60073                     break;
60074                   }
60075                   case 0x00a00000: {
60076                     // 0x00f00010
60077                     if (((instr & 0xf0000000) == 0xf0000000)) {
60078                       UnallocatedA32(instr);
60079                       return;
60080                     }
60081                     Condition condition((instr >> 28) & 0xf);
60082                     unsigned rd = (instr >> 12) & 0xf;
60083                     unsigned rn = (instr >> 16) & 0xf;
60084                     unsigned rm = instr & 0xf;
60085                     Shift shift((instr >> 5) & 0x3);
60086                     unsigned rs = (instr >> 8) & 0xf;
60087                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60088                     rscs(condition,
60089                          Register(rd),
60090                          Register(rn),
60091                          Operand(Register(rm), shift.GetType(), Register(rs)));
60092                     break;
60093                   }
60094                   case 0x01000000: {
60095                     // 0x01500010
60096                     if (((instr & 0xf0000000) == 0xf0000000)) {
60097                       UnallocatedA32(instr);
60098                       return;
60099                     }
60100                     Condition condition((instr >> 28) & 0xf);
60101                     unsigned rn = (instr >> 16) & 0xf;
60102                     unsigned rm = instr & 0xf;
60103                     Shift shift((instr >> 5) & 0x3);
60104                     unsigned rs = (instr >> 8) & 0xf;
60105                     // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60106                     cmp(condition,
60107                         Best,
60108                         Register(rn),
60109                         Operand(Register(rm), shift.GetType(), Register(rs)));
60110                     if (((instr & 0xff0f090) != 0x1500010)) {
60111                       UnpredictableA32(instr);
60112                     }
60113                     break;
60114                   }
60115                   case 0x01200000: {
60116                     // 0x01700010
60117                     if (((instr & 0xf0000000) == 0xf0000000)) {
60118                       UnallocatedA32(instr);
60119                       return;
60120                     }
60121                     Condition condition((instr >> 28) & 0xf);
60122                     unsigned rn = (instr >> 16) & 0xf;
60123                     unsigned rm = instr & 0xf;
60124                     Shift shift((instr >> 5) & 0x3);
60125                     unsigned rs = (instr >> 8) & 0xf;
60126                     // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60127                     cmn(condition,
60128                         Best,
60129                         Register(rn),
60130                         Operand(Register(rm), shift.GetType(), Register(rs)));
60131                     if (((instr & 0xff0f090) != 0x1700010)) {
60132                       UnpredictableA32(instr);
60133                     }
60134                     break;
60135                   }
60136                   case 0x01800000: {
60137                     // 0x01d00010
60138                     if (((instr & 0xf0000000) == 0xf0000000)) {
60139                       UnallocatedA32(instr);
60140                       return;
60141                     }
60142                     Condition condition((instr >> 28) & 0xf);
60143                     unsigned rd = (instr >> 12) & 0xf;
60144                     unsigned rn = (instr >> 16) & 0xf;
60145                     unsigned rm = instr & 0xf;
60146                     Shift shift((instr >> 5) & 0x3);
60147                     unsigned rs = (instr >> 8) & 0xf;
60148                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60149                     bics(condition,
60150                          Best,
60151                          Register(rd),
60152                          Register(rn),
60153                          Operand(Register(rm), shift.GetType(), Register(rs)));
60154                     break;
60155                   }
60156                   case 0x01a00000: {
60157                     // 0x01f00010
60158                     if (((instr & 0xf0000000) == 0xf0000000)) {
60159                       UnallocatedA32(instr);
60160                       return;
60161                     }
60162                     Condition condition((instr >> 28) & 0xf);
60163                     unsigned rd = (instr >> 12) & 0xf;
60164                     unsigned rm = instr & 0xf;
60165                     Shift shift((instr >> 5) & 0x3);
60166                     unsigned rs = (instr >> 8) & 0xf;
60167                     // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
60168                     mvns(condition,
60169                          Best,
60170                          Register(rd),
60171                          Operand(Register(rm), shift.GetType(), Register(rs)));
60172                     if (((instr & 0xfff0090) != 0x1f00010)) {
60173                       UnpredictableA32(instr);
60174                     }
60175                     break;
60176                   }
60177                 }
60178                 break;
60179               }
60180               case 0x00400080: {
60181                 // 0x00500090
60182                 switch (instr & 0x00000060) {
60183                   case 0x00000000: {
60184                     // 0x00500090
60185                     switch (instr & 0x01a00000) {
60186                       case 0x00800000: {
60187                         // 0x00d00090
60188                         if (((instr & 0xf0000000) == 0xf0000000)) {
60189                           UnallocatedA32(instr);
60190                           return;
60191                         }
60192                         Condition condition((instr >> 28) & 0xf);
60193                         unsigned rdlo = (instr >> 12) & 0xf;
60194                         unsigned rdhi = (instr >> 16) & 0xf;
60195                         unsigned rn = instr & 0xf;
60196                         unsigned rm = (instr >> 8) & 0xf;
60197                         // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60198                         smulls(condition,
60199                                Register(rdlo),
60200                                Register(rdhi),
60201                                Register(rn),
60202                                Register(rm));
60203                         break;
60204                       }
60205                       case 0x00a00000: {
60206                         // 0x00f00090
60207                         if (((instr & 0xf0000000) == 0xf0000000)) {
60208                           UnallocatedA32(instr);
60209                           return;
60210                         }
60211                         Condition condition((instr >> 28) & 0xf);
60212                         unsigned rdlo = (instr >> 12) & 0xf;
60213                         unsigned rdhi = (instr >> 16) & 0xf;
60214                         unsigned rn = instr & 0xf;
60215                         unsigned rm = (instr >> 8) & 0xf;
60216                         // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60217                         smlals(condition,
60218                                Register(rdlo),
60219                                Register(rdhi),
60220                                Register(rn),
60221                                Register(rm));
60222                         break;
60223                       }
60224                       case 0x01800000: {
60225                         // 0x01d00090
60226                         switch (instr & 0x00000300) {
60227                           case 0x00000000: {
60228                             // 0x01d00090
60229                             if (((instr & 0xf0000000) == 0xf0000000)) {
60230                               UnallocatedA32(instr);
60231                               return;
60232                             }
60233                             Condition condition((instr >> 28) & 0xf);
60234                             unsigned rt = (instr >> 12) & 0xf;
60235                             unsigned rn = (instr >> 16) & 0xf;
60236                             // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60237                             ldab(condition,
60238                                  Register(rt),
60239                                  MemOperand(Register(rn), Offset));
60240                             if (((instr & 0xff00fff) != 0x1d00c9f)) {
60241                               UnpredictableA32(instr);
60242                             }
60243                             break;
60244                           }
60245                           case 0x00000200: {
60246                             // 0x01d00290
60247                             if (((instr & 0xf0000000) == 0xf0000000)) {
60248                               UnallocatedA32(instr);
60249                               return;
60250                             }
60251                             Condition condition((instr >> 28) & 0xf);
60252                             unsigned rt = (instr >> 12) & 0xf;
60253                             unsigned rn = (instr >> 16) & 0xf;
60254                             // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60255                             ldaexb(condition,
60256                                    Register(rt),
60257                                    MemOperand(Register(rn), Offset));
60258                             if (((instr & 0xff00fff) != 0x1d00e9f)) {
60259                               UnpredictableA32(instr);
60260                             }
60261                             break;
60262                           }
60263                           case 0x00000300: {
60264                             // 0x01d00390
60265                             if (((instr & 0xf0000000) == 0xf0000000)) {
60266                               UnallocatedA32(instr);
60267                               return;
60268                             }
60269                             Condition condition((instr >> 28) & 0xf);
60270                             unsigned rt = (instr >> 12) & 0xf;
60271                             unsigned rn = (instr >> 16) & 0xf;
60272                             // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60273                             ldrexb(condition,
60274                                    Register(rt),
60275                                    MemOperand(Register(rn), Offset));
60276                             if (((instr & 0xff00fff) != 0x1d00f9f)) {
60277                               UnpredictableA32(instr);
60278                             }
60279                             break;
60280                           }
60281                           default:
60282                             UnallocatedA32(instr);
60283                             break;
60284                         }
60285                         break;
60286                       }
60287                       case 0x01a00000: {
60288                         // 0x01f00090
60289                         switch (instr & 0x00000300) {
60290                           case 0x00000000: {
60291                             // 0x01f00090
60292                             if (((instr & 0xf0000000) == 0xf0000000)) {
60293                               UnallocatedA32(instr);
60294                               return;
60295                             }
60296                             Condition condition((instr >> 28) & 0xf);
60297                             unsigned rt = (instr >> 12) & 0xf;
60298                             unsigned rn = (instr >> 16) & 0xf;
60299                             // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60300                             ldah(condition,
60301                                  Register(rt),
60302                                  MemOperand(Register(rn), Offset));
60303                             if (((instr & 0xff00fff) != 0x1f00c9f)) {
60304                               UnpredictableA32(instr);
60305                             }
60306                             break;
60307                           }
60308                           case 0x00000200: {
60309                             // 0x01f00290
60310                             if (((instr & 0xf0000000) == 0xf0000000)) {
60311                               UnallocatedA32(instr);
60312                               return;
60313                             }
60314                             Condition condition((instr >> 28) & 0xf);
60315                             unsigned rt = (instr >> 12) & 0xf;
60316                             unsigned rn = (instr >> 16) & 0xf;
60317                             // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60318                             ldaexh(condition,
60319                                    Register(rt),
60320                                    MemOperand(Register(rn), Offset));
60321                             if (((instr & 0xff00fff) != 0x1f00e9f)) {
60322                               UnpredictableA32(instr);
60323                             }
60324                             break;
60325                           }
60326                           case 0x00000300: {
60327                             // 0x01f00390
60328                             if (((instr & 0xf0000000) == 0xf0000000)) {
60329                               UnallocatedA32(instr);
60330                               return;
60331                             }
60332                             Condition condition((instr >> 28) & 0xf);
60333                             unsigned rt = (instr >> 12) & 0xf;
60334                             unsigned rn = (instr >> 16) & 0xf;
60335                             // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60336                             ldrexh(condition,
60337                                    Register(rt),
60338                                    MemOperand(Register(rn), Offset));
60339                             if (((instr & 0xff00fff) != 0x1f00f9f)) {
60340                               UnpredictableA32(instr);
60341                             }
60342                             break;
60343                           }
60344                           default:
60345                             UnallocatedA32(instr);
60346                             break;
60347                         }
60348                         break;
60349                       }
60350                       default:
60351                         UnallocatedA32(instr);
60352                         break;
60353                     }
60354                     break;
60355                   }
60356                   case 0x00000020: {
60357                     // 0x005000b0
60358                     switch (instr & 0x01200000) {
60359                       case 0x00000000: {
60360                         // 0x005000b0
60361                         switch (instr & 0x000f0000) {
60362                           case 0x000f0000: {
60363                             // 0x005f00b0
60364                             if (((instr & 0xf0000000) == 0xf0000000) ||
60365                                 ((instr & 0x1200000) == 0x200000)) {
60366                               UnallocatedA32(instr);
60367                               return;
60368                             }
60369                             Condition condition((instr >> 28) & 0xf);
60370                             unsigned rt = (instr >> 12) & 0xf;
60371                             uint32_t U = (instr >> 23) & 0x1;
60372                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60373                             if (U == 0) imm = -imm;
60374                             bool minus_zero = (imm == 0) && (U == 0);
60375                             Location location(imm, kA32PcDelta);
60376                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60377                             if (minus_zero) {
60378                               ldrh(condition,
60379                                    Best,
60380                                    Register(rt),
60381                                    MemOperand(pc, minus, 0));
60382                             } else {
60383                               ldrh(condition, Register(rt), &location);
60384                             }
60385                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
60386                               UnpredictableA32(instr);
60387                             }
60388                             break;
60389                           }
60390                           default: {
60391                             if (((instr & 0xf0000000) == 0xf0000000) ||
60392                                 ((instr & 0xf0000) == 0xf0000)) {
60393                               UnallocatedA32(instr);
60394                               return;
60395                             }
60396                             Condition condition((instr >> 28) & 0xf);
60397                             unsigned rt = (instr >> 12) & 0xf;
60398                             unsigned rn = (instr >> 16) & 0xf;
60399                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60400                                                                    : plus);
60401                             int32_t offset =
60402                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60403                             // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
60404                             ldrh(condition,
60405                                  Best,
60406                                  Register(rt),
60407                                  MemOperand(Register(rn),
60408                                             sign,
60409                                             offset,
60410                                             PostIndex));
60411                             break;
60412                           }
60413                         }
60414                         break;
60415                       }
60416                       case 0x00200000: {
60417                         // 0x007000b0
60418                         if (((instr & 0xf0000000) == 0xf0000000)) {
60419                           UnallocatedA32(instr);
60420                           return;
60421                         }
60422                         UnimplementedA32("LDRHT", instr);
60423                         break;
60424                       }
60425                       case 0x01000000: {
60426                         // 0x015000b0
60427                         switch (instr & 0x000f0000) {
60428                           case 0x000f0000: {
60429                             // 0x015f00b0
60430                             if (((instr & 0xf0000000) == 0xf0000000) ||
60431                                 ((instr & 0x1200000) == 0x200000)) {
60432                               UnallocatedA32(instr);
60433                               return;
60434                             }
60435                             Condition condition((instr >> 28) & 0xf);
60436                             unsigned rt = (instr >> 12) & 0xf;
60437                             uint32_t U = (instr >> 23) & 0x1;
60438                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60439                             if (U == 0) imm = -imm;
60440                             bool minus_zero = (imm == 0) && (U == 0);
60441                             Location location(imm, kA32PcDelta);
60442                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60443                             if (minus_zero) {
60444                               ldrh(condition,
60445                                    Best,
60446                                    Register(rt),
60447                                    MemOperand(pc, minus, 0));
60448                             } else {
60449                               ldrh(condition, Register(rt), &location);
60450                             }
60451                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
60452                               UnpredictableA32(instr);
60453                             }
60454                             break;
60455                           }
60456                           default: {
60457                             if (((instr & 0xf0000000) == 0xf0000000) ||
60458                                 ((instr & 0xf0000) == 0xf0000)) {
60459                               UnallocatedA32(instr);
60460                               return;
60461                             }
60462                             Condition condition((instr >> 28) & 0xf);
60463                             unsigned rt = (instr >> 12) & 0xf;
60464                             unsigned rn = (instr >> 16) & 0xf;
60465                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60466                                                                    : plus);
60467                             int32_t offset =
60468                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60469                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
60470                             ldrh(condition,
60471                                  Best,
60472                                  Register(rt),
60473                                  MemOperand(Register(rn),
60474                                             sign,
60475                                             offset,
60476                                             Offset));
60477                             break;
60478                           }
60479                         }
60480                         break;
60481                       }
60482                       case 0x01200000: {
60483                         // 0x017000b0
60484                         switch (instr & 0x000f0000) {
60485                           case 0x000f0000: {
60486                             // 0x017f00b0
60487                             if (((instr & 0xf0000000) == 0xf0000000) ||
60488                                 ((instr & 0x1200000) == 0x200000)) {
60489                               UnallocatedA32(instr);
60490                               return;
60491                             }
60492                             Condition condition((instr >> 28) & 0xf);
60493                             unsigned rt = (instr >> 12) & 0xf;
60494                             uint32_t U = (instr >> 23) & 0x1;
60495                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60496                             if (U == 0) imm = -imm;
60497                             bool minus_zero = (imm == 0) && (U == 0);
60498                             Location location(imm, kA32PcDelta);
60499                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60500                             if (minus_zero) {
60501                               ldrh(condition,
60502                                    Best,
60503                                    Register(rt),
60504                                    MemOperand(pc, minus, 0));
60505                             } else {
60506                               ldrh(condition, Register(rt), &location);
60507                             }
60508                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
60509                               UnpredictableA32(instr);
60510                             }
60511                             break;
60512                           }
60513                           default: {
60514                             if (((instr & 0xf0000000) == 0xf0000000) ||
60515                                 ((instr & 0xf0000) == 0xf0000)) {
60516                               UnallocatedA32(instr);
60517                               return;
60518                             }
60519                             Condition condition((instr >> 28) & 0xf);
60520                             unsigned rt = (instr >> 12) & 0xf;
60521                             unsigned rn = (instr >> 16) & 0xf;
60522                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60523                                                                    : plus);
60524                             int32_t offset =
60525                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60526                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length)
60527                             ldrh(condition,
60528                                  Best,
60529                                  Register(rt),
60530                                  MemOperand(Register(rn),
60531                                             sign,
60532                                             offset,
60533                                             PreIndex));
60534                             break;
60535                           }
60536                         }
60537                         break;
60538                       }
60539                     }
60540                     break;
60541                   }
60542                   case 0x00000040: {
60543                     // 0x005000d0
60544                     switch (instr & 0x01200000) {
60545                       case 0x00000000: {
60546                         // 0x005000d0
60547                         switch (instr & 0x000f0000) {
60548                           case 0x000f0000: {
60549                             // 0x005f00d0
60550                             if (((instr & 0xf0000000) == 0xf0000000) ||
60551                                 ((instr & 0x1200000) == 0x200000)) {
60552                               UnallocatedA32(instr);
60553                               return;
60554                             }
60555                             Condition condition((instr >> 28) & 0xf);
60556                             unsigned rt = (instr >> 12) & 0xf;
60557                             uint32_t U = (instr >> 23) & 0x1;
60558                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60559                             if (U == 0) imm = -imm;
60560                             bool minus_zero = (imm == 0) && (U == 0);
60561                             Location location(imm, kA32PcDelta);
60562                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
60563                             if (minus_zero) {
60564                               ldrsb(condition,
60565                                     Best,
60566                                     Register(rt),
60567                                     MemOperand(pc, minus, 0));
60568                             } else {
60569                               ldrsb(condition, Register(rt), &location);
60570                             }
60571                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
60572                               UnpredictableA32(instr);
60573                             }
60574                             break;
60575                           }
60576                           default: {
60577                             if (((instr & 0xf0000000) == 0xf0000000) ||
60578                                 ((instr & 0xf0000) == 0xf0000)) {
60579                               UnallocatedA32(instr);
60580                               return;
60581                             }
60582                             Condition condition((instr >> 28) & 0xf);
60583                             unsigned rt = (instr >> 12) & 0xf;
60584                             unsigned rn = (instr >> 16) & 0xf;
60585                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60586                                                                    : plus);
60587                             int32_t offset =
60588                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60589                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
60590                             ldrsb(condition,
60591                                   Best,
60592                                   Register(rt),
60593                                   MemOperand(Register(rn),
60594                                              sign,
60595                                              offset,
60596                                              PostIndex));
60597                             break;
60598                           }
60599                         }
60600                         break;
60601                       }
60602                       case 0x00200000: {
60603                         // 0x007000d0
60604                         if (((instr & 0xf0000000) == 0xf0000000)) {
60605                           UnallocatedA32(instr);
60606                           return;
60607                         }
60608                         UnimplementedA32("LDRSBT", instr);
60609                         break;
60610                       }
60611                       case 0x01000000: {
60612                         // 0x015000d0
60613                         switch (instr & 0x000f0000) {
60614                           case 0x000f0000: {
60615                             // 0x015f00d0
60616                             if (((instr & 0xf0000000) == 0xf0000000) ||
60617                                 ((instr & 0x1200000) == 0x200000)) {
60618                               UnallocatedA32(instr);
60619                               return;
60620                             }
60621                             Condition condition((instr >> 28) & 0xf);
60622                             unsigned rt = (instr >> 12) & 0xf;
60623                             uint32_t U = (instr >> 23) & 0x1;
60624                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60625                             if (U == 0) imm = -imm;
60626                             bool minus_zero = (imm == 0) && (U == 0);
60627                             Location location(imm, kA32PcDelta);
60628                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
60629                             if (minus_zero) {
60630                               ldrsb(condition,
60631                                     Best,
60632                                     Register(rt),
60633                                     MemOperand(pc, minus, 0));
60634                             } else {
60635                               ldrsb(condition, Register(rt), &location);
60636                             }
60637                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
60638                               UnpredictableA32(instr);
60639                             }
60640                             break;
60641                           }
60642                           default: {
60643                             if (((instr & 0xf0000000) == 0xf0000000) ||
60644                                 ((instr & 0xf0000) == 0xf0000)) {
60645                               UnallocatedA32(instr);
60646                               return;
60647                             }
60648                             Condition condition((instr >> 28) & 0xf);
60649                             unsigned rt = (instr >> 12) & 0xf;
60650                             unsigned rn = (instr >> 16) & 0xf;
60651                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60652                                                                    : plus);
60653                             int32_t offset =
60654                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60655                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
60656                             ldrsb(condition,
60657                                   Best,
60658                                   Register(rt),
60659                                   MemOperand(Register(rn),
60660                                              sign,
60661                                              offset,
60662                                              Offset));
60663                             break;
60664                           }
60665                         }
60666                         break;
60667                       }
60668                       case 0x01200000: {
60669                         // 0x017000d0
60670                         switch (instr & 0x000f0000) {
60671                           case 0x000f0000: {
60672                             // 0x017f00d0
60673                             if (((instr & 0xf0000000) == 0xf0000000) ||
60674                                 ((instr & 0x1200000) == 0x200000)) {
60675                               UnallocatedA32(instr);
60676                               return;
60677                             }
60678                             Condition condition((instr >> 28) & 0xf);
60679                             unsigned rt = (instr >> 12) & 0xf;
60680                             uint32_t U = (instr >> 23) & 0x1;
60681                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60682                             if (U == 0) imm = -imm;
60683                             bool minus_zero = (imm == 0) && (U == 0);
60684                             Location location(imm, kA32PcDelta);
60685                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
60686                             if (minus_zero) {
60687                               ldrsb(condition,
60688                                     Best,
60689                                     Register(rt),
60690                                     MemOperand(pc, minus, 0));
60691                             } else {
60692                               ldrsb(condition, Register(rt), &location);
60693                             }
60694                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
60695                               UnpredictableA32(instr);
60696                             }
60697                             break;
60698                           }
60699                           default: {
60700                             if (((instr & 0xf0000000) == 0xf0000000) ||
60701                                 ((instr & 0xf0000) == 0xf0000)) {
60702                               UnallocatedA32(instr);
60703                               return;
60704                             }
60705                             Condition condition((instr >> 28) & 0xf);
60706                             unsigned rt = (instr >> 12) & 0xf;
60707                             unsigned rn = (instr >> 16) & 0xf;
60708                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60709                                                                    : plus);
60710                             int32_t offset =
60711                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60712                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
60713                             ldrsb(condition,
60714                                   Best,
60715                                   Register(rt),
60716                                   MemOperand(Register(rn),
60717                                              sign,
60718                                              offset,
60719                                              PreIndex));
60720                             break;
60721                           }
60722                         }
60723                         break;
60724                       }
60725                     }
60726                     break;
60727                   }
60728                   case 0x00000060: {
60729                     // 0x005000f0
60730                     switch (instr & 0x01200000) {
60731                       case 0x00000000: {
60732                         // 0x005000f0
60733                         switch (instr & 0x000f0000) {
60734                           case 0x000f0000: {
60735                             // 0x005f00f0
60736                             if (((instr & 0xf0000000) == 0xf0000000) ||
60737                                 ((instr & 0x1200000) == 0x200000)) {
60738                               UnallocatedA32(instr);
60739                               return;
60740                             }
60741                             Condition condition((instr >> 28) & 0xf);
60742                             unsigned rt = (instr >> 12) & 0xf;
60743                             uint32_t U = (instr >> 23) & 0x1;
60744                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60745                             if (U == 0) imm = -imm;
60746                             bool minus_zero = (imm == 0) && (U == 0);
60747                             Location location(imm, kA32PcDelta);
60748                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
60749                             if (minus_zero) {
60750                               ldrsh(condition,
60751                                     Best,
60752                                     Register(rt),
60753                                     MemOperand(pc, minus, 0));
60754                             } else {
60755                               ldrsh(condition, Register(rt), &location);
60756                             }
60757                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
60758                               UnpredictableA32(instr);
60759                             }
60760                             break;
60761                           }
60762                           default: {
60763                             if (((instr & 0xf0000000) == 0xf0000000) ||
60764                                 ((instr & 0xf0000) == 0xf0000)) {
60765                               UnallocatedA32(instr);
60766                               return;
60767                             }
60768                             Condition condition((instr >> 28) & 0xf);
60769                             unsigned rt = (instr >> 12) & 0xf;
60770                             unsigned rn = (instr >> 16) & 0xf;
60771                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60772                                                                    : plus);
60773                             int32_t offset =
60774                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60775                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
60776                             ldrsh(condition,
60777                                   Best,
60778                                   Register(rt),
60779                                   MemOperand(Register(rn),
60780                                              sign,
60781                                              offset,
60782                                              PostIndex));
60783                             break;
60784                           }
60785                         }
60786                         break;
60787                       }
60788                       case 0x00200000: {
60789                         // 0x007000f0
60790                         if (((instr & 0xf0000000) == 0xf0000000)) {
60791                           UnallocatedA32(instr);
60792                           return;
60793                         }
60794                         UnimplementedA32("LDRSHT", instr);
60795                         break;
60796                       }
60797                       case 0x01000000: {
60798                         // 0x015000f0
60799                         switch (instr & 0x000f0000) {
60800                           case 0x000f0000: {
60801                             // 0x015f00f0
60802                             if (((instr & 0xf0000000) == 0xf0000000) ||
60803                                 ((instr & 0x1200000) == 0x200000)) {
60804                               UnallocatedA32(instr);
60805                               return;
60806                             }
60807                             Condition condition((instr >> 28) & 0xf);
60808                             unsigned rt = (instr >> 12) & 0xf;
60809                             uint32_t U = (instr >> 23) & 0x1;
60810                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60811                             if (U == 0) imm = -imm;
60812                             bool minus_zero = (imm == 0) && (U == 0);
60813                             Location location(imm, kA32PcDelta);
60814                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
60815                             if (minus_zero) {
60816                               ldrsh(condition,
60817                                     Best,
60818                                     Register(rt),
60819                                     MemOperand(pc, minus, 0));
60820                             } else {
60821                               ldrsh(condition, Register(rt), &location);
60822                             }
60823                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
60824                               UnpredictableA32(instr);
60825                             }
60826                             break;
60827                           }
60828                           default: {
60829                             if (((instr & 0xf0000000) == 0xf0000000) ||
60830                                 ((instr & 0xf0000) == 0xf0000)) {
60831                               UnallocatedA32(instr);
60832                               return;
60833                             }
60834                             Condition condition((instr >> 28) & 0xf);
60835                             unsigned rt = (instr >> 12) & 0xf;
60836                             unsigned rn = (instr >> 16) & 0xf;
60837                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60838                                                                    : plus);
60839                             int32_t offset =
60840                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60841                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
60842                             ldrsh(condition,
60843                                   Best,
60844                                   Register(rt),
60845                                   MemOperand(Register(rn),
60846                                              sign,
60847                                              offset,
60848                                              Offset));
60849                             break;
60850                           }
60851                         }
60852                         break;
60853                       }
60854                       case 0x01200000: {
60855                         // 0x017000f0
60856                         switch (instr & 0x000f0000) {
60857                           case 0x000f0000: {
60858                             // 0x017f00f0
60859                             if (((instr & 0xf0000000) == 0xf0000000) ||
60860                                 ((instr & 0x1200000) == 0x200000)) {
60861                               UnallocatedA32(instr);
60862                               return;
60863                             }
60864                             Condition condition((instr >> 28) & 0xf);
60865                             unsigned rt = (instr >> 12) & 0xf;
60866                             uint32_t U = (instr >> 23) & 0x1;
60867                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60868                             if (U == 0) imm = -imm;
60869                             bool minus_zero = (imm == 0) && (U == 0);
60870                             Location location(imm, kA32PcDelta);
60871                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
60872                             if (minus_zero) {
60873                               ldrsh(condition,
60874                                     Best,
60875                                     Register(rt),
60876                                     MemOperand(pc, minus, 0));
60877                             } else {
60878                               ldrsh(condition, Register(rt), &location);
60879                             }
60880                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
60881                               UnpredictableA32(instr);
60882                             }
60883                             break;
60884                           }
60885                           default: {
60886                             if (((instr & 0xf0000000) == 0xf0000000) ||
60887                                 ((instr & 0xf0000) == 0xf0000)) {
60888                               UnallocatedA32(instr);
60889                               return;
60890                             }
60891                             Condition condition((instr >> 28) & 0xf);
60892                             unsigned rt = (instr >> 12) & 0xf;
60893                             unsigned rn = (instr >> 16) & 0xf;
60894                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60895                                                                    : plus);
60896                             int32_t offset =
60897                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60898                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
60899                             ldrsh(condition,
60900                                   Best,
60901                                   Register(rt),
60902                                   MemOperand(Register(rn),
60903                                              sign,
60904                                              offset,
60905                                              PreIndex));
60906                             break;
60907                           }
60908                         }
60909                         break;
60910                       }
60911                     }
60912                     break;
60913                   }
60914                 }
60915                 break;
60916               }
60917             }
60918             break;
60919           }
60920         }
60921         break;
60922       }
60923       case 0x02000000: {
60924         // 0x02000000
60925         switch (instr & 0x01b00000) {
60926           case 0x00000000: {
60927             // 0x02000000
60928             switch (instr & 0x00400000) {
60929               case 0x00000000: {
60930                 // 0x02000000
60931                 if (((instr & 0xf0000000) == 0xf0000000)) {
60932                   UnallocatedA32(instr);
60933                   return;
60934                 }
60935                 Condition condition((instr >> 28) & 0xf);
60936                 unsigned rd = (instr >> 12) & 0xf;
60937                 unsigned rn = (instr >> 16) & 0xf;
60938                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60939                 // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
60940                 and_(condition, Best, Register(rd), Register(rn), imm);
60941                 break;
60942               }
60943               case 0x00400000: {
60944                 // 0x02400000
60945                 switch (instr & 0x000d0000) {
60946                   case 0x000d0000: {
60947                     // 0x024d0000
60948                     switch (instr & 0x00020000) {
60949                       case 0x00000000: {
60950                         // 0x024d0000
60951                         if (((instr & 0xf0000000) == 0xf0000000)) {
60952                           UnallocatedA32(instr);
60953                           return;
60954                         }
60955                         Condition condition((instr >> 28) & 0xf);
60956                         unsigned rd = (instr >> 12) & 0xf;
60957                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60958                         // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
60959                         sub(condition, Best, Register(rd), sp, imm);
60960                         break;
60961                       }
60962                       case 0x00020000: {
60963                         // 0x024f0000
60964                         if (((instr & 0xf0000000) == 0xf0000000)) {
60965                           UnallocatedA32(instr);
60966                           return;
60967                         }
60968                         if (((instr & 0xf0000000) != 0xf0000000) &&
60969                             ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) {
60970                           Condition condition((instr >> 28) & 0xf);
60971                           unsigned rd = (instr >> 12) & 0xf;
60972                           uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60973                           // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2
60974                           sub(condition, Best, Register(rd), pc, imm);
60975                           return;
60976                         }
60977                         Condition condition((instr >> 28) & 0xf);
60978                         unsigned rd = (instr >> 12) & 0xf;
60979                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60980                         Location location(-imm, kA32PcDelta);
60981                         // ADR{<c>}{<q>} <Rd>, <label> ; A2
60982                         adr(condition, Best, Register(rd), &location);
60983                         break;
60984                       }
60985                     }
60986                     break;
60987                   }
60988                   default: {
60989                     if (((instr & 0xf0000000) == 0xf0000000) ||
60990                         ((instr & 0xd0000) == 0xd0000)) {
60991                       UnallocatedA32(instr);
60992                       return;
60993                     }
60994                     Condition condition((instr >> 28) & 0xf);
60995                     unsigned rd = (instr >> 12) & 0xf;
60996                     unsigned rn = (instr >> 16) & 0xf;
60997                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60998                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
60999                     sub(condition, Best, Register(rd), Register(rn), imm);
61000                     break;
61001                   }
61002                 }
61003                 break;
61004               }
61005             }
61006             break;
61007           }
61008           case 0x00100000: {
61009             // 0x02100000
61010             switch (instr & 0x00400000) {
61011               case 0x00000000: {
61012                 // 0x02100000
61013                 if (((instr & 0xf0000000) == 0xf0000000)) {
61014                   UnallocatedA32(instr);
61015                   return;
61016                 }
61017                 Condition condition((instr >> 28) & 0xf);
61018                 unsigned rd = (instr >> 12) & 0xf;
61019                 unsigned rn = (instr >> 16) & 0xf;
61020                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61021                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61022                 ands(condition, Best, Register(rd), Register(rn), imm);
61023                 break;
61024               }
61025               case 0x00400000: {
61026                 // 0x02500000
61027                 switch (instr & 0x000f0000) {
61028                   case 0x000d0000: {
61029                     // 0x025d0000
61030                     if (((instr & 0xf0000000) == 0xf0000000)) {
61031                       UnallocatedA32(instr);
61032                       return;
61033                     }
61034                     Condition condition((instr >> 28) & 0xf);
61035                     unsigned rd = (instr >> 12) & 0xf;
61036                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61037                     // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61038                     subs(condition, Best, Register(rd), sp, imm);
61039                     break;
61040                   }
61041                   default: {
61042                     if (((instr & 0xf0000000) == 0xf0000000) ||
61043                         ((instr & 0xf0000) == 0xd0000)) {
61044                       UnallocatedA32(instr);
61045                       return;
61046                     }
61047                     Condition condition((instr >> 28) & 0xf);
61048                     unsigned rd = (instr >> 12) & 0xf;
61049                     unsigned rn = (instr >> 16) & 0xf;
61050                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61051                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61052                     subs(condition, Best, Register(rd), Register(rn), imm);
61053                     break;
61054                   }
61055                 }
61056                 break;
61057               }
61058             }
61059             break;
61060           }
61061           case 0x00200000: {
61062             // 0x02200000
61063             switch (instr & 0x00400000) {
61064               case 0x00000000: {
61065                 // 0x02200000
61066                 if (((instr & 0xf0000000) == 0xf0000000)) {
61067                   UnallocatedA32(instr);
61068                   return;
61069                 }
61070                 Condition condition((instr >> 28) & 0xf);
61071                 unsigned rd = (instr >> 12) & 0xf;
61072                 unsigned rn = (instr >> 16) & 0xf;
61073                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61074                 // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61075                 eor(condition, Best, Register(rd), Register(rn), imm);
61076                 break;
61077               }
61078               case 0x00400000: {
61079                 // 0x02600000
61080                 if (((instr & 0xf0000000) == 0xf0000000)) {
61081                   UnallocatedA32(instr);
61082                   return;
61083                 }
61084                 Condition condition((instr >> 28) & 0xf);
61085                 unsigned rd = (instr >> 12) & 0xf;
61086                 unsigned rn = (instr >> 16) & 0xf;
61087                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61088                 // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61089                 rsb(condition, Best, Register(rd), Register(rn), imm);
61090                 break;
61091               }
61092             }
61093             break;
61094           }
61095           case 0x00300000: {
61096             // 0x02300000
61097             switch (instr & 0x00400000) {
61098               case 0x00000000: {
61099                 // 0x02300000
61100                 if (((instr & 0xf0000000) == 0xf0000000)) {
61101                   UnallocatedA32(instr);
61102                   return;
61103                 }
61104                 Condition condition((instr >> 28) & 0xf);
61105                 unsigned rd = (instr >> 12) & 0xf;
61106                 unsigned rn = (instr >> 16) & 0xf;
61107                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61108                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61109                 eors(condition, Best, Register(rd), Register(rn), imm);
61110                 break;
61111               }
61112               case 0x00400000: {
61113                 // 0x02700000
61114                 if (((instr & 0xf0000000) == 0xf0000000)) {
61115                   UnallocatedA32(instr);
61116                   return;
61117                 }
61118                 Condition condition((instr >> 28) & 0xf);
61119                 unsigned rd = (instr >> 12) & 0xf;
61120                 unsigned rn = (instr >> 16) & 0xf;
61121                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61122                 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61123                 rsbs(condition, Best, Register(rd), Register(rn), imm);
61124                 break;
61125               }
61126             }
61127             break;
61128           }
61129           case 0x00800000: {
61130             // 0x02800000
61131             switch (instr & 0x00400000) {
61132               case 0x00000000: {
61133                 // 0x02800000
61134                 switch (instr & 0x000d0000) {
61135                   case 0x000d0000: {
61136                     // 0x028d0000
61137                     switch (instr & 0x00020000) {
61138                       case 0x00000000: {
61139                         // 0x028d0000
61140                         if (((instr & 0xf0000000) == 0xf0000000)) {
61141                           UnallocatedA32(instr);
61142                           return;
61143                         }
61144                         Condition condition((instr >> 28) & 0xf);
61145                         unsigned rd = (instr >> 12) & 0xf;
61146                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61147                         // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61148                         add(condition, Best, Register(rd), sp, imm);
61149                         break;
61150                       }
61151                       case 0x00020000: {
61152                         // 0x028f0000
61153                         if (((instr & 0xf0000000) == 0xf0000000)) {
61154                           UnallocatedA32(instr);
61155                           return;
61156                         }
61157                         Condition condition((instr >> 28) & 0xf);
61158                         unsigned rd = (instr >> 12) & 0xf;
61159                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61160                         Location location(imm, kA32PcDelta);
61161                         // ADR{<c>}{<q>} <Rd>, <label> ; A1
61162                         adr(condition, Best, Register(rd), &location);
61163                         break;
61164                       }
61165                     }
61166                     break;
61167                   }
61168                   default: {
61169                     if (((instr & 0xf0000000) == 0xf0000000) ||
61170                         ((instr & 0xd0000) == 0xd0000)) {
61171                       UnallocatedA32(instr);
61172                       return;
61173                     }
61174                     Condition condition((instr >> 28) & 0xf);
61175                     unsigned rd = (instr >> 12) & 0xf;
61176                     unsigned rn = (instr >> 16) & 0xf;
61177                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61178                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61179                     add(condition, Best, Register(rd), Register(rn), imm);
61180                     break;
61181                   }
61182                 }
61183                 break;
61184               }
61185               case 0x00400000: {
61186                 // 0x02c00000
61187                 if (((instr & 0xf0000000) == 0xf0000000)) {
61188                   UnallocatedA32(instr);
61189                   return;
61190                 }
61191                 Condition condition((instr >> 28) & 0xf);
61192                 unsigned rd = (instr >> 12) & 0xf;
61193                 unsigned rn = (instr >> 16) & 0xf;
61194                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61195                 // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61196                 sbc(condition, Best, Register(rd), Register(rn), imm);
61197                 break;
61198               }
61199             }
61200             break;
61201           }
61202           case 0x00900000: {
61203             // 0x02900000
61204             switch (instr & 0x00400000) {
61205               case 0x00000000: {
61206                 // 0x02900000
61207                 switch (instr & 0x000f0000) {
61208                   case 0x000d0000: {
61209                     // 0x029d0000
61210                     if (((instr & 0xf0000000) == 0xf0000000)) {
61211                       UnallocatedA32(instr);
61212                       return;
61213                     }
61214                     Condition condition((instr >> 28) & 0xf);
61215                     unsigned rd = (instr >> 12) & 0xf;
61216                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61217                     // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61218                     adds(condition, Best, Register(rd), sp, imm);
61219                     break;
61220                   }
61221                   default: {
61222                     if (((instr & 0xf0000000) == 0xf0000000) ||
61223                         ((instr & 0xf0000) == 0xd0000)) {
61224                       UnallocatedA32(instr);
61225                       return;
61226                     }
61227                     Condition condition((instr >> 28) & 0xf);
61228                     unsigned rd = (instr >> 12) & 0xf;
61229                     unsigned rn = (instr >> 16) & 0xf;
61230                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61231                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61232                     adds(condition, Best, Register(rd), Register(rn), imm);
61233                     break;
61234                   }
61235                 }
61236                 break;
61237               }
61238               case 0x00400000: {
61239                 // 0x02d00000
61240                 if (((instr & 0xf0000000) == 0xf0000000)) {
61241                   UnallocatedA32(instr);
61242                   return;
61243                 }
61244                 Condition condition((instr >> 28) & 0xf);
61245                 unsigned rd = (instr >> 12) & 0xf;
61246                 unsigned rn = (instr >> 16) & 0xf;
61247                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61248                 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61249                 sbcs(condition, Best, Register(rd), Register(rn), imm);
61250                 break;
61251               }
61252             }
61253             break;
61254           }
61255           case 0x00a00000: {
61256             // 0x02a00000
61257             switch (instr & 0x00400000) {
61258               case 0x00000000: {
61259                 // 0x02a00000
61260                 if (((instr & 0xf0000000) == 0xf0000000)) {
61261                   UnallocatedA32(instr);
61262                   return;
61263                 }
61264                 Condition condition((instr >> 28) & 0xf);
61265                 unsigned rd = (instr >> 12) & 0xf;
61266                 unsigned rn = (instr >> 16) & 0xf;
61267                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61268                 // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61269                 adc(condition, Best, Register(rd), Register(rn), imm);
61270                 break;
61271               }
61272               case 0x00400000: {
61273                 // 0x02e00000
61274                 if (((instr & 0xf0000000) == 0xf0000000)) {
61275                   UnallocatedA32(instr);
61276                   return;
61277                 }
61278                 Condition condition((instr >> 28) & 0xf);
61279                 unsigned rd = (instr >> 12) & 0xf;
61280                 unsigned rn = (instr >> 16) & 0xf;
61281                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61282                 // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61283                 rsc(condition, Register(rd), Register(rn), imm);
61284                 break;
61285               }
61286             }
61287             break;
61288           }
61289           case 0x00b00000: {
61290             // 0x02b00000
61291             switch (instr & 0x00400000) {
61292               case 0x00000000: {
61293                 // 0x02b00000
61294                 if (((instr & 0xf0000000) == 0xf0000000)) {
61295                   UnallocatedA32(instr);
61296                   return;
61297                 }
61298                 Condition condition((instr >> 28) & 0xf);
61299                 unsigned rd = (instr >> 12) & 0xf;
61300                 unsigned rn = (instr >> 16) & 0xf;
61301                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61302                 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61303                 adcs(condition, Best, Register(rd), Register(rn), imm);
61304                 break;
61305               }
61306               case 0x00400000: {
61307                 // 0x02f00000
61308                 if (((instr & 0xf0000000) == 0xf0000000)) {
61309                   UnallocatedA32(instr);
61310                   return;
61311                 }
61312                 Condition condition((instr >> 28) & 0xf);
61313                 unsigned rd = (instr >> 12) & 0xf;
61314                 unsigned rn = (instr >> 16) & 0xf;
61315                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61316                 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61317                 rscs(condition, Register(rd), Register(rn), imm);
61318                 break;
61319               }
61320             }
61321             break;
61322           }
61323           case 0x01000000: {
61324             // 0x03000000
61325             switch (instr & 0x00400000) {
61326               case 0x00000000: {
61327                 // 0x03000000
61328                 if (((instr & 0xf0000000) == 0xf0000000)) {
61329                   UnallocatedA32(instr);
61330                   return;
61331                 }
61332                 Condition condition((instr >> 28) & 0xf);
61333                 unsigned rd = (instr >> 12) & 0xf;
61334                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
61335                 if (!ImmediateA32::IsImmediateA32(imm)) {
61336                   // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2
61337                   mov(condition, Best, Register(rd), imm);
61338                 } else {
61339                   // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2
61340                   movw(condition, Register(rd), imm);
61341                 }
61342                 break;
61343               }
61344               case 0x00400000: {
61345                 // 0x03400000
61346                 if (((instr & 0xf0000000) == 0xf0000000)) {
61347                   UnallocatedA32(instr);
61348                   return;
61349                 }
61350                 Condition condition((instr >> 28) & 0xf);
61351                 unsigned rd = (instr >> 12) & 0xf;
61352                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
61353                 // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1
61354                 movt(condition, Register(rd), imm);
61355                 break;
61356               }
61357             }
61358             break;
61359           }
61360           case 0x01100000: {
61361             // 0x03100000
61362             switch (instr & 0x00400000) {
61363               case 0x00000000: {
61364                 // 0x03100000
61365                 if (((instr & 0xf0000000) == 0xf0000000)) {
61366                   UnallocatedA32(instr);
61367                   return;
61368                 }
61369                 Condition condition((instr >> 28) & 0xf);
61370                 unsigned rn = (instr >> 16) & 0xf;
61371                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61372                 // TST{<c>}{<q>} <Rn>, #<const> ; A1
61373                 tst(condition, Best, Register(rn), imm);
61374                 if (((instr & 0xff0f000) != 0x3100000)) {
61375                   UnpredictableA32(instr);
61376                 }
61377                 break;
61378               }
61379               case 0x00400000: {
61380                 // 0x03500000
61381                 if (((instr & 0xf0000000) == 0xf0000000)) {
61382                   UnallocatedA32(instr);
61383                   return;
61384                 }
61385                 Condition condition((instr >> 28) & 0xf);
61386                 unsigned rn = (instr >> 16) & 0xf;
61387                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61388                 // CMP{<c>}{<q>} <Rn>, #<const> ; A1
61389                 cmp(condition, Best, Register(rn), imm);
61390                 if (((instr & 0xff0f000) != 0x3500000)) {
61391                   UnpredictableA32(instr);
61392                 }
61393                 break;
61394               }
61395             }
61396             break;
61397           }
61398           case 0x01200000: {
61399             // 0x03200000
61400             switch (instr & 0x004f0000) {
61401               case 0x00000000: {
61402                 // 0x03200000
61403                 switch (instr & 0x000000f0) {
61404                   case 0x00000000: {
61405                     // 0x03200000
61406                     switch (instr & 0x0000000f) {
61407                       case 0x00000000: {
61408                         // 0x03200000
61409                         if (((instr & 0xf0000000) == 0xf0000000)) {
61410                           UnallocatedA32(instr);
61411                           return;
61412                         }
61413                         Condition condition((instr >> 28) & 0xf);
61414                         // NOP{<c>}{<q>} ; A1
61415                         nop(condition, Best);
61416                         if (((instr & 0xfffffff) != 0x320f000)) {
61417                           UnpredictableA32(instr);
61418                         }
61419                         break;
61420                       }
61421                       case 0x00000001: {
61422                         // 0x03200001
61423                         if (((instr & 0xf0000000) == 0xf0000000)) {
61424                           UnallocatedA32(instr);
61425                           return;
61426                         }
61427                         Condition condition((instr >> 28) & 0xf);
61428                         // YIELD{<c>}{<q>} ; A1
61429                         yield(condition, Best);
61430                         if (((instr & 0xfffffff) != 0x320f001)) {
61431                           UnpredictableA32(instr);
61432                         }
61433                         break;
61434                       }
61435                       case 0x00000002: {
61436                         // 0x03200002
61437                         if (((instr & 0xf0000000) == 0xf0000000)) {
61438                           UnallocatedA32(instr);
61439                           return;
61440                         }
61441                         UnimplementedA32("WFE", instr);
61442                         break;
61443                       }
61444                       case 0x00000003: {
61445                         // 0x03200003
61446                         if (((instr & 0xf0000000) == 0xf0000000)) {
61447                           UnallocatedA32(instr);
61448                           return;
61449                         }
61450                         UnimplementedA32("WFI", instr);
61451                         break;
61452                       }
61453                       case 0x00000004: {
61454                         // 0x03200004
61455                         if (((instr & 0xf0000000) == 0xf0000000)) {
61456                           UnallocatedA32(instr);
61457                           return;
61458                         }
61459                         UnimplementedA32("SEV", instr);
61460                         break;
61461                       }
61462                       case 0x00000005: {
61463                         // 0x03200005
61464                         if (((instr & 0xf0000000) == 0xf0000000)) {
61465                           UnallocatedA32(instr);
61466                           return;
61467                         }
61468                         UnimplementedA32("SEVL", instr);
61469                         break;
61470                       }
61471                       default:
61472                         UnallocatedA32(instr);
61473                         break;
61474                     }
61475                     break;
61476                   }
61477                   case 0x000000f0: {
61478                     // 0x032000f0
61479                     if (((instr & 0xf0000000) == 0xf0000000)) {
61480                       UnallocatedA32(instr);
61481                       return;
61482                     }
61483                     UnimplementedA32("DBG", instr);
61484                     break;
61485                   }
61486                   default:
61487                     UnallocatedA32(instr);
61488                     break;
61489                 }
61490                 break;
61491               }
61492               default: {
61493                 if (((instr & 0xf0000000) == 0xf0000000) ||
61494                     ((instr & 0x4f0000) == 0x0)) {
61495                   UnallocatedA32(instr);
61496                   return;
61497                 }
61498                 Condition condition((instr >> 28) & 0xf);
61499                 unsigned spec_reg =
61500                     ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
61501                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61502                 // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1
61503                 msr(condition, MaskedSpecialRegister(spec_reg), imm);
61504                 if (((instr & 0xfb0f000) != 0x320f000)) {
61505                   UnpredictableA32(instr);
61506                 }
61507                 break;
61508               }
61509             }
61510             break;
61511           }
61512           case 0x01300000: {
61513             // 0x03300000
61514             switch (instr & 0x00400000) {
61515               case 0x00000000: {
61516                 // 0x03300000
61517                 if (((instr & 0xf0000000) == 0xf0000000)) {
61518                   UnallocatedA32(instr);
61519                   return;
61520                 }
61521                 Condition condition((instr >> 28) & 0xf);
61522                 unsigned rn = (instr >> 16) & 0xf;
61523                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61524                 // TEQ{<c>}{<q>} <Rn>, #<const> ; A1
61525                 teq(condition, Register(rn), imm);
61526                 if (((instr & 0xff0f000) != 0x3300000)) {
61527                   UnpredictableA32(instr);
61528                 }
61529                 break;
61530               }
61531               case 0x00400000: {
61532                 // 0x03700000
61533                 if (((instr & 0xf0000000) == 0xf0000000)) {
61534                   UnallocatedA32(instr);
61535                   return;
61536                 }
61537                 Condition condition((instr >> 28) & 0xf);
61538                 unsigned rn = (instr >> 16) & 0xf;
61539                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61540                 // CMN{<c>}{<q>} <Rn>, #<const> ; A1
61541                 cmn(condition, Best, Register(rn), imm);
61542                 if (((instr & 0xff0f000) != 0x3700000)) {
61543                   UnpredictableA32(instr);
61544                 }
61545                 break;
61546               }
61547             }
61548             break;
61549           }
61550           case 0x01800000: {
61551             // 0x03800000
61552             switch (instr & 0x00400000) {
61553               case 0x00000000: {
61554                 // 0x03800000
61555                 if (((instr & 0xf0000000) == 0xf0000000)) {
61556                   UnallocatedA32(instr);
61557                   return;
61558                 }
61559                 Condition condition((instr >> 28) & 0xf);
61560                 unsigned rd = (instr >> 12) & 0xf;
61561                 unsigned rn = (instr >> 16) & 0xf;
61562                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61563                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61564                 orr(condition, Best, Register(rd), Register(rn), imm);
61565                 break;
61566               }
61567               case 0x00400000: {
61568                 // 0x03c00000
61569                 if (((instr & 0xf0000000) == 0xf0000000)) {
61570                   UnallocatedA32(instr);
61571                   return;
61572                 }
61573                 Condition condition((instr >> 28) & 0xf);
61574                 unsigned rd = (instr >> 12) & 0xf;
61575                 unsigned rn = (instr >> 16) & 0xf;
61576                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61577                 // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61578                 bic(condition, Best, Register(rd), Register(rn), imm);
61579                 break;
61580               }
61581             }
61582             break;
61583           }
61584           case 0x01900000: {
61585             // 0x03900000
61586             switch (instr & 0x00400000) {
61587               case 0x00000000: {
61588                 // 0x03900000
61589                 if (((instr & 0xf0000000) == 0xf0000000)) {
61590                   UnallocatedA32(instr);
61591                   return;
61592                 }
61593                 Condition condition((instr >> 28) & 0xf);
61594                 unsigned rd = (instr >> 12) & 0xf;
61595                 unsigned rn = (instr >> 16) & 0xf;
61596                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61597                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61598                 orrs(condition, Best, Register(rd), Register(rn), imm);
61599                 break;
61600               }
61601               case 0x00400000: {
61602                 // 0x03d00000
61603                 if (((instr & 0xf0000000) == 0xf0000000)) {
61604                   UnallocatedA32(instr);
61605                   return;
61606                 }
61607                 Condition condition((instr >> 28) & 0xf);
61608                 unsigned rd = (instr >> 12) & 0xf;
61609                 unsigned rn = (instr >> 16) & 0xf;
61610                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61611                 // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61612                 bics(condition, Best, Register(rd), Register(rn), imm);
61613                 break;
61614               }
61615             }
61616             break;
61617           }
61618           case 0x01a00000: {
61619             // 0x03a00000
61620             switch (instr & 0x00400000) {
61621               case 0x00000000: {
61622                 // 0x03a00000
61623                 if (((instr & 0xf0000000) == 0xf0000000)) {
61624                   UnallocatedA32(instr);
61625                   return;
61626                 }
61627                 Condition condition((instr >> 28) & 0xf);
61628                 unsigned rd = (instr >> 12) & 0xf;
61629                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61630                 // MOV{<c>}{<q>} <Rd>, #<const> ; A1
61631                 mov(condition, Best, Register(rd), imm);
61632                 if (((instr & 0xfff0000) != 0x3a00000)) {
61633                   UnpredictableA32(instr);
61634                 }
61635                 break;
61636               }
61637               case 0x00400000: {
61638                 // 0x03e00000
61639                 if (((instr & 0xf0000000) == 0xf0000000)) {
61640                   UnallocatedA32(instr);
61641                   return;
61642                 }
61643                 Condition condition((instr >> 28) & 0xf);
61644                 unsigned rd = (instr >> 12) & 0xf;
61645                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61646                 // MVN{<c>}{<q>} <Rd>, #<const> ; A1
61647                 mvn(condition, Best, Register(rd), imm);
61648                 if (((instr & 0xfff0000) != 0x3e00000)) {
61649                   UnpredictableA32(instr);
61650                 }
61651                 break;
61652               }
61653             }
61654             break;
61655           }
61656           case 0x01b00000: {
61657             // 0x03b00000
61658             switch (instr & 0x00400000) {
61659               case 0x00000000: {
61660                 // 0x03b00000
61661                 if (((instr & 0xf0000000) == 0xf0000000)) {
61662                   UnallocatedA32(instr);
61663                   return;
61664                 }
61665                 Condition condition((instr >> 28) & 0xf);
61666                 unsigned rd = (instr >> 12) & 0xf;
61667                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61668                 // MOVS{<c>}{<q>} <Rd>, #<const> ; A1
61669                 movs(condition, Best, Register(rd), imm);
61670                 if (((instr & 0xfff0000) != 0x3b00000)) {
61671                   UnpredictableA32(instr);
61672                 }
61673                 break;
61674               }
61675               case 0x00400000: {
61676                 // 0x03f00000
61677                 if (((instr & 0xf0000000) == 0xf0000000)) {
61678                   UnallocatedA32(instr);
61679                   return;
61680                 }
61681                 Condition condition((instr >> 28) & 0xf);
61682                 unsigned rd = (instr >> 12) & 0xf;
61683                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61684                 // MVNS{<c>}{<q>} <Rd>, #<const> ; A1
61685                 mvns(condition, Best, Register(rd), imm);
61686                 if (((instr & 0xfff0000) != 0x3f00000)) {
61687                   UnpredictableA32(instr);
61688                 }
61689                 break;
61690               }
61691             }
61692             break;
61693           }
61694         }
61695         break;
61696       }
61697       case 0x04000000: {
61698         // 0x04000000
61699         switch (instr & 0x00500000) {
61700           case 0x00000000: {
61701             // 0x04000000
61702             switch (instr & 0x01200000) {
61703               case 0x00000000: {
61704                 // 0x04000000
61705                 if (((instr & 0xf0000000) == 0xf0000000)) {
61706                   UnallocatedA32(instr);
61707                   return;
61708                 }
61709                 Condition condition((instr >> 28) & 0xf);
61710                 unsigned rt = (instr >> 12) & 0xf;
61711                 unsigned rn = (instr >> 16) & 0xf;
61712                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61713                 int32_t offset = instr & 0xfff;
61714                 // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
61715                 str(condition,
61716                     Best,
61717                     Register(rt),
61718                     MemOperand(Register(rn), sign, offset, PostIndex));
61719                 break;
61720               }
61721               case 0x00200000: {
61722                 // 0x04200000
61723                 if (((instr & 0xf0000000) == 0xf0000000)) {
61724                   UnallocatedA32(instr);
61725                   return;
61726                 }
61727                 UnimplementedA32("STRT", instr);
61728                 break;
61729               }
61730               case 0x01000000: {
61731                 // 0x05000000
61732                 if (((instr & 0xf0000000) == 0xf0000000)) {
61733                   UnallocatedA32(instr);
61734                   return;
61735                 }
61736                 Condition condition((instr >> 28) & 0xf);
61737                 unsigned rt = (instr >> 12) & 0xf;
61738                 unsigned rn = (instr >> 16) & 0xf;
61739                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61740                 int32_t offset = instr & 0xfff;
61741                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
61742                 str(condition,
61743                     Best,
61744                     Register(rt),
61745                     MemOperand(Register(rn), sign, offset, Offset));
61746                 break;
61747               }
61748               case 0x01200000: {
61749                 // 0x05200000
61750                 if (((instr & 0xf0000000) == 0xf0000000)) {
61751                   UnallocatedA32(instr);
61752                   return;
61753                 }
61754                 if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) &&
61755                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
61756                     ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
61757                     ((instr & 0xf0000000) != 0xf0000000)) {
61758                   Condition condition((instr >> 28) & 0xf);
61759                   unsigned rt = (instr >> 12) & 0xf;
61760                   // PUSH{<c>}{<q>} <single_register_list> ; A1
61761                   push(condition, Best, Register(rt));
61762                   return;
61763                 }
61764                 Condition condition((instr >> 28) & 0xf);
61765                 unsigned rt = (instr >> 12) & 0xf;
61766                 unsigned rn = (instr >> 16) & 0xf;
61767                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61768                 int32_t offset = instr & 0xfff;
61769                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
61770                 str(condition,
61771                     Best,
61772                     Register(rt),
61773                     MemOperand(Register(rn), sign, offset, PreIndex));
61774                 break;
61775               }
61776             }
61777             break;
61778           }
61779           case 0x00100000: {
61780             // 0x04100000
61781             switch (instr & 0x01200000) {
61782               case 0x00000000: {
61783                 // 0x04100000
61784                 switch (instr & 0x000f0000) {
61785                   case 0x000f0000: {
61786                     // 0x041f0000
61787                     if (((instr & 0xf0000000) == 0xf0000000) ||
61788                         ((instr & 0x1200000) == 0x200000)) {
61789                       UnallocatedA32(instr);
61790                       return;
61791                     }
61792                     Condition condition((instr >> 28) & 0xf);
61793                     unsigned rt = (instr >> 12) & 0xf;
61794                     uint32_t U = (instr >> 23) & 0x1;
61795                     int32_t imm = instr & 0xfff;
61796                     if (U == 0) imm = -imm;
61797                     bool minus_zero = (imm == 0) && (U == 0);
61798                     Location location(imm, kA32PcDelta);
61799                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
61800                     if (minus_zero) {
61801                       ldr(condition,
61802                           Best,
61803                           Register(rt),
61804                           MemOperand(pc, minus, 0));
61805                     } else {
61806                       ldr(condition, Best, Register(rt), &location);
61807                     }
61808                     if (((instr & 0xf7f0000) != 0x51f0000)) {
61809                       UnpredictableA32(instr);
61810                     }
61811                     break;
61812                   }
61813                   default: {
61814                     if (((instr & 0xf0000000) == 0xf0000000) ||
61815                         ((instr & 0xf0000) == 0xf0000)) {
61816                       UnallocatedA32(instr);
61817                       return;
61818                     }
61819                     if (((Uint32((instr >> 23)) & Uint32(0x1)) ==
61820                          Uint32(0x1)) &&
61821                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
61822                          Uint32(0xd)) &&
61823                         ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
61824                         ((instr & 0xf0000000) != 0xf0000000)) {
61825                       Condition condition((instr >> 28) & 0xf);
61826                       unsigned rt = (instr >> 12) & 0xf;
61827                       // POP{<c>}{<q>} <single_register_list> ; A1
61828                       pop(condition, Best, Register(rt));
61829                       return;
61830                     }
61831                     Condition condition((instr >> 28) & 0xf);
61832                     unsigned rt = (instr >> 12) & 0xf;
61833                     unsigned rn = (instr >> 16) & 0xf;
61834                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61835                     int32_t offset = instr & 0xfff;
61836                     // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
61837                     ldr(condition,
61838                         Best,
61839                         Register(rt),
61840                         MemOperand(Register(rn), sign, offset, PostIndex));
61841                     break;
61842                   }
61843                 }
61844                 break;
61845               }
61846               case 0x00200000: {
61847                 // 0x04300000
61848                 if (((instr & 0xf0000000) == 0xf0000000)) {
61849                   UnallocatedA32(instr);
61850                   return;
61851                 }
61852                 UnimplementedA32("LDRT", instr);
61853                 break;
61854               }
61855               case 0x01000000: {
61856                 // 0x05100000
61857                 switch (instr & 0x000f0000) {
61858                   case 0x000f0000: {
61859                     // 0x051f0000
61860                     if (((instr & 0xf0000000) == 0xf0000000) ||
61861                         ((instr & 0x1200000) == 0x200000)) {
61862                       UnallocatedA32(instr);
61863                       return;
61864                     }
61865                     Condition condition((instr >> 28) & 0xf);
61866                     unsigned rt = (instr >> 12) & 0xf;
61867                     uint32_t U = (instr >> 23) & 0x1;
61868                     int32_t imm = instr & 0xfff;
61869                     if (U == 0) imm = -imm;
61870                     bool minus_zero = (imm == 0) && (U == 0);
61871                     Location location(imm, kA32PcDelta);
61872                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
61873                     if (minus_zero) {
61874                       ldr(condition,
61875                           Best,
61876                           Register(rt),
61877                           MemOperand(pc, minus, 0));
61878                     } else {
61879                       ldr(condition, Best, Register(rt), &location);
61880                     }
61881                     if (((instr & 0xf7f0000) != 0x51f0000)) {
61882                       UnpredictableA32(instr);
61883                     }
61884                     break;
61885                   }
61886                   default: {
61887                     if (((instr & 0xf0000000) == 0xf0000000) ||
61888                         ((instr & 0xf0000) == 0xf0000)) {
61889                       UnallocatedA32(instr);
61890                       return;
61891                     }
61892                     Condition condition((instr >> 28) & 0xf);
61893                     unsigned rt = (instr >> 12) & 0xf;
61894                     unsigned rn = (instr >> 16) & 0xf;
61895                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61896                     int32_t offset = instr & 0xfff;
61897                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
61898                     ldr(condition,
61899                         Best,
61900                         Register(rt),
61901                         MemOperand(Register(rn), sign, offset, Offset));
61902                     break;
61903                   }
61904                 }
61905                 break;
61906               }
61907               case 0x01200000: {
61908                 // 0x05300000
61909                 switch (instr & 0x000f0000) {
61910                   case 0x000f0000: {
61911                     // 0x053f0000
61912                     if (((instr & 0xf0000000) == 0xf0000000) ||
61913                         ((instr & 0x1200000) == 0x200000)) {
61914                       UnallocatedA32(instr);
61915                       return;
61916                     }
61917                     Condition condition((instr >> 28) & 0xf);
61918                     unsigned rt = (instr >> 12) & 0xf;
61919                     uint32_t U = (instr >> 23) & 0x1;
61920                     int32_t imm = instr & 0xfff;
61921                     if (U == 0) imm = -imm;
61922                     bool minus_zero = (imm == 0) && (U == 0);
61923                     Location location(imm, kA32PcDelta);
61924                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
61925                     if (minus_zero) {
61926                       ldr(condition,
61927                           Best,
61928                           Register(rt),
61929                           MemOperand(pc, minus, 0));
61930                     } else {
61931                       ldr(condition, Best, Register(rt), &location);
61932                     }
61933                     if (((instr & 0xf7f0000) != 0x51f0000)) {
61934                       UnpredictableA32(instr);
61935                     }
61936                     break;
61937                   }
61938                   default: {
61939                     if (((instr & 0xf0000000) == 0xf0000000) ||
61940                         ((instr & 0xf0000) == 0xf0000)) {
61941                       UnallocatedA32(instr);
61942                       return;
61943                     }
61944                     Condition condition((instr >> 28) & 0xf);
61945                     unsigned rt = (instr >> 12) & 0xf;
61946                     unsigned rn = (instr >> 16) & 0xf;
61947                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61948                     int32_t offset = instr & 0xfff;
61949                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
61950                     ldr(condition,
61951                         Best,
61952                         Register(rt),
61953                         MemOperand(Register(rn), sign, offset, PreIndex));
61954                     break;
61955                   }
61956                 }
61957                 break;
61958               }
61959             }
61960             break;
61961           }
61962           case 0x00400000: {
61963             // 0x04400000
61964             switch (instr & 0x01200000) {
61965               case 0x00000000: {
61966                 // 0x04400000
61967                 if (((instr & 0xf0000000) == 0xf0000000)) {
61968                   UnallocatedA32(instr);
61969                   return;
61970                 }
61971                 Condition condition((instr >> 28) & 0xf);
61972                 unsigned rt = (instr >> 12) & 0xf;
61973                 unsigned rn = (instr >> 16) & 0xf;
61974                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61975                 int32_t offset = instr & 0xfff;
61976                 // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
61977                 strb(condition,
61978                      Best,
61979                      Register(rt),
61980                      MemOperand(Register(rn), sign, offset, PostIndex));
61981                 break;
61982               }
61983               case 0x00200000: {
61984                 // 0x04600000
61985                 if (((instr & 0xf0000000) == 0xf0000000)) {
61986                   UnallocatedA32(instr);
61987                   return;
61988                 }
61989                 UnimplementedA32("STRBT", instr);
61990                 break;
61991               }
61992               case 0x01000000: {
61993                 // 0x05400000
61994                 if (((instr & 0xf0000000) == 0xf0000000)) {
61995                   UnallocatedA32(instr);
61996                   return;
61997                 }
61998                 Condition condition((instr >> 28) & 0xf);
61999                 unsigned rt = (instr >> 12) & 0xf;
62000                 unsigned rn = (instr >> 16) & 0xf;
62001                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62002                 int32_t offset = instr & 0xfff;
62003                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62004                 strb(condition,
62005                      Best,
62006                      Register(rt),
62007                      MemOperand(Register(rn), sign, offset, Offset));
62008                 break;
62009               }
62010               case 0x01200000: {
62011                 // 0x05600000
62012                 if (((instr & 0xf0000000) == 0xf0000000)) {
62013                   UnallocatedA32(instr);
62014                   return;
62015                 }
62016                 Condition condition((instr >> 28) & 0xf);
62017                 unsigned rt = (instr >> 12) & 0xf;
62018                 unsigned rn = (instr >> 16) & 0xf;
62019                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62020                 int32_t offset = instr & 0xfff;
62021                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62022                 strb(condition,
62023                      Best,
62024                      Register(rt),
62025                      MemOperand(Register(rn), sign, offset, PreIndex));
62026                 break;
62027               }
62028             }
62029             break;
62030           }
62031           case 0x00500000: {
62032             // 0x04500000
62033             switch (instr & 0x01200000) {
62034               case 0x00000000: {
62035                 // 0x04500000
62036                 switch (instr & 0x000f0000) {
62037                   case 0x000f0000: {
62038                     // 0x045f0000
62039                     if (((instr & 0xf0000000) == 0xf0000000) ||
62040                         ((instr & 0x1200000) == 0x200000)) {
62041                       UnallocatedA32(instr);
62042                       return;
62043                     }
62044                     Condition condition((instr >> 28) & 0xf);
62045                     unsigned rt = (instr >> 12) & 0xf;
62046                     uint32_t U = (instr >> 23) & 0x1;
62047                     int32_t imm = instr & 0xfff;
62048                     if (U == 0) imm = -imm;
62049                     bool minus_zero = (imm == 0) && (U == 0);
62050                     Location location(imm, kA32PcDelta);
62051                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62052                     if (minus_zero) {
62053                       ldrb(condition,
62054                            Best,
62055                            Register(rt),
62056                            MemOperand(pc, minus, 0));
62057                     } else {
62058                       ldrb(condition, Register(rt), &location);
62059                     }
62060                     if (((instr & 0xf7f0000) != 0x55f0000)) {
62061                       UnpredictableA32(instr);
62062                     }
62063                     break;
62064                   }
62065                   default: {
62066                     if (((instr & 0xf0000000) == 0xf0000000) ||
62067                         ((instr & 0xf0000) == 0xf0000)) {
62068                       UnallocatedA32(instr);
62069                       return;
62070                     }
62071                     Condition condition((instr >> 28) & 0xf);
62072                     unsigned rt = (instr >> 12) & 0xf;
62073                     unsigned rn = (instr >> 16) & 0xf;
62074                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62075                     int32_t offset = instr & 0xfff;
62076                     // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62077                     ldrb(condition,
62078                          Best,
62079                          Register(rt),
62080                          MemOperand(Register(rn), sign, offset, PostIndex));
62081                     break;
62082                   }
62083                 }
62084                 break;
62085               }
62086               case 0x00200000: {
62087                 // 0x04700000
62088                 if (((instr & 0xf0000000) == 0xf0000000)) {
62089                   UnallocatedA32(instr);
62090                   return;
62091                 }
62092                 UnimplementedA32("LDRBT", instr);
62093                 break;
62094               }
62095               case 0x01000000: {
62096                 // 0x05500000
62097                 switch (instr & 0x000f0000) {
62098                   case 0x000f0000: {
62099                     // 0x055f0000
62100                     if (((instr & 0xf0000000) == 0xf0000000) ||
62101                         ((instr & 0x1200000) == 0x200000)) {
62102                       UnallocatedA32(instr);
62103                       return;
62104                     }
62105                     Condition condition((instr >> 28) & 0xf);
62106                     unsigned rt = (instr >> 12) & 0xf;
62107                     uint32_t U = (instr >> 23) & 0x1;
62108                     int32_t imm = instr & 0xfff;
62109                     if (U == 0) imm = -imm;
62110                     bool minus_zero = (imm == 0) && (U == 0);
62111                     Location location(imm, kA32PcDelta);
62112                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62113                     if (minus_zero) {
62114                       ldrb(condition,
62115                            Best,
62116                            Register(rt),
62117                            MemOperand(pc, minus, 0));
62118                     } else {
62119                       ldrb(condition, Register(rt), &location);
62120                     }
62121                     if (((instr & 0xf7f0000) != 0x55f0000)) {
62122                       UnpredictableA32(instr);
62123                     }
62124                     break;
62125                   }
62126                   default: {
62127                     if (((instr & 0xf0000000) == 0xf0000000) ||
62128                         ((instr & 0xf0000) == 0xf0000)) {
62129                       UnallocatedA32(instr);
62130                       return;
62131                     }
62132                     Condition condition((instr >> 28) & 0xf);
62133                     unsigned rt = (instr >> 12) & 0xf;
62134                     unsigned rn = (instr >> 16) & 0xf;
62135                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62136                     int32_t offset = instr & 0xfff;
62137                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62138                     ldrb(condition,
62139                          Best,
62140                          Register(rt),
62141                          MemOperand(Register(rn), sign, offset, Offset));
62142                     break;
62143                   }
62144                 }
62145                 break;
62146               }
62147               case 0x01200000: {
62148                 // 0x05700000
62149                 switch (instr & 0x000f0000) {
62150                   case 0x000f0000: {
62151                     // 0x057f0000
62152                     if (((instr & 0xf0000000) == 0xf0000000) ||
62153                         ((instr & 0x1200000) == 0x200000)) {
62154                       UnallocatedA32(instr);
62155                       return;
62156                     }
62157                     Condition condition((instr >> 28) & 0xf);
62158                     unsigned rt = (instr >> 12) & 0xf;
62159                     uint32_t U = (instr >> 23) & 0x1;
62160                     int32_t imm = instr & 0xfff;
62161                     if (U == 0) imm = -imm;
62162                     bool minus_zero = (imm == 0) && (U == 0);
62163                     Location location(imm, kA32PcDelta);
62164                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62165                     if (minus_zero) {
62166                       ldrb(condition,
62167                            Best,
62168                            Register(rt),
62169                            MemOperand(pc, minus, 0));
62170                     } else {
62171                       ldrb(condition, Register(rt), &location);
62172                     }
62173                     if (((instr & 0xf7f0000) != 0x55f0000)) {
62174                       UnpredictableA32(instr);
62175                     }
62176                     break;
62177                   }
62178                   default: {
62179                     if (((instr & 0xf0000000) == 0xf0000000) ||
62180                         ((instr & 0xf0000) == 0xf0000)) {
62181                       UnallocatedA32(instr);
62182                       return;
62183                     }
62184                     Condition condition((instr >> 28) & 0xf);
62185                     unsigned rt = (instr >> 12) & 0xf;
62186                     unsigned rn = (instr >> 16) & 0xf;
62187                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62188                     int32_t offset = instr & 0xfff;
62189                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62190                     ldrb(condition,
62191                          Best,
62192                          Register(rt),
62193                          MemOperand(Register(rn), sign, offset, PreIndex));
62194                     break;
62195                   }
62196                 }
62197                 break;
62198               }
62199             }
62200             break;
62201           }
62202         }
62203         break;
62204       }
62205       case 0x06000000: {
62206         // 0x06000000
62207         switch (instr & 0x01600010) {
62208           case 0x00000000: {
62209             // 0x06000000
62210             switch (instr & 0x00100000) {
62211               case 0x00000000: {
62212                 // 0x06000000
62213                 if (((instr & 0xf0000000) == 0xf0000000)) {
62214                   UnallocatedA32(instr);
62215                   return;
62216                 }
62217                 Condition condition((instr >> 28) & 0xf);
62218                 unsigned rt = (instr >> 12) & 0xf;
62219                 unsigned rn = (instr >> 16) & 0xf;
62220                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62221                 unsigned rm = instr & 0xf;
62222                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62223                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
62224                                                     (imm_and_type_ & 0x7c) >>
62225                                                         2);
62226                 Shift shift = shift_operand.GetShift();
62227                 uint32_t amount = shift_operand.GetAmount();
62228                 // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
62229                 str(condition,
62230                     Best,
62231                     Register(rt),
62232                     MemOperand(Register(rn),
62233                                sign,
62234                                Register(rm),
62235                                shift,
62236                                amount,
62237                                PostIndex));
62238                 break;
62239               }
62240               case 0x00100000: {
62241                 // 0x06100000
62242                 if (((instr & 0xf0000000) == 0xf0000000)) {
62243                   UnallocatedA32(instr);
62244                   return;
62245                 }
62246                 Condition condition((instr >> 28) & 0xf);
62247                 unsigned rt = (instr >> 12) & 0xf;
62248                 unsigned rn = (instr >> 16) & 0xf;
62249                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62250                 unsigned rm = instr & 0xf;
62251                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62252                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
62253                                                     (imm_and_type_ & 0x7c) >>
62254                                                         2);
62255                 Shift shift = shift_operand.GetShift();
62256                 uint32_t amount = shift_operand.GetAmount();
62257                 // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
62258                 ldr(condition,
62259                     Best,
62260                     Register(rt),
62261                     MemOperand(Register(rn),
62262                                sign,
62263                                Register(rm),
62264                                shift,
62265                                amount,
62266                                PostIndex));
62267                 break;
62268               }
62269             }
62270             break;
62271           }
62272           case 0x00000010: {
62273             // 0x06000010
62274             switch (instr & 0x00900060) {
62275               case 0x00100000: {
62276                 // 0x06100010
62277                 switch (instr & 0x00000080) {
62278                   case 0x00000000: {
62279                     // 0x06100010
62280                     if (((instr & 0xf0000000) == 0xf0000000)) {
62281                       UnallocatedA32(instr);
62282                       return;
62283                     }
62284                     Condition condition((instr >> 28) & 0xf);
62285                     unsigned rd = (instr >> 12) & 0xf;
62286                     unsigned rn = (instr >> 16) & 0xf;
62287                     unsigned rm = instr & 0xf;
62288                     // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62289                     sadd16(condition, Register(rd), Register(rn), Register(rm));
62290                     if (((instr & 0xff00ff0) != 0x6100f10)) {
62291                       UnpredictableA32(instr);
62292                     }
62293                     break;
62294                   }
62295                   case 0x00000080: {
62296                     // 0x06100090
62297                     if (((instr & 0xf0000000) == 0xf0000000)) {
62298                       UnallocatedA32(instr);
62299                       return;
62300                     }
62301                     Condition condition((instr >> 28) & 0xf);
62302                     unsigned rd = (instr >> 12) & 0xf;
62303                     unsigned rn = (instr >> 16) & 0xf;
62304                     unsigned rm = instr & 0xf;
62305                     // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62306                     sadd8(condition, Register(rd), Register(rn), Register(rm));
62307                     if (((instr & 0xff00ff0) != 0x6100f90)) {
62308                       UnpredictableA32(instr);
62309                     }
62310                     break;
62311                   }
62312                 }
62313                 break;
62314               }
62315               case 0x00100020: {
62316                 // 0x06100030
62317                 if ((instr & 0x00000080) == 0x00000000) {
62318                   if (((instr & 0xf0000000) == 0xf0000000)) {
62319                     UnallocatedA32(instr);
62320                     return;
62321                   }
62322                   Condition condition((instr >> 28) & 0xf);
62323                   unsigned rd = (instr >> 12) & 0xf;
62324                   unsigned rn = (instr >> 16) & 0xf;
62325                   unsigned rm = instr & 0xf;
62326                   // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62327                   sasx(condition, Register(rd), Register(rn), Register(rm));
62328                   if (((instr & 0xff00ff0) != 0x6100f30)) {
62329                     UnpredictableA32(instr);
62330                   }
62331                 } else {
62332                   UnallocatedA32(instr);
62333                 }
62334                 break;
62335               }
62336               case 0x00100040: {
62337                 // 0x06100050
62338                 if ((instr & 0x00000080) == 0x00000000) {
62339                   if (((instr & 0xf0000000) == 0xf0000000)) {
62340                     UnallocatedA32(instr);
62341                     return;
62342                   }
62343                   Condition condition((instr >> 28) & 0xf);
62344                   unsigned rd = (instr >> 12) & 0xf;
62345                   unsigned rn = (instr >> 16) & 0xf;
62346                   unsigned rm = instr & 0xf;
62347                   // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62348                   ssax(condition, Register(rd), Register(rn), Register(rm));
62349                   if (((instr & 0xff00ff0) != 0x6100f50)) {
62350                     UnpredictableA32(instr);
62351                   }
62352                 } else {
62353                   UnallocatedA32(instr);
62354                 }
62355                 break;
62356               }
62357               case 0x00100060: {
62358                 // 0x06100070
62359                 switch (instr & 0x00000080) {
62360                   case 0x00000000: {
62361                     // 0x06100070
62362                     if (((instr & 0xf0000000) == 0xf0000000)) {
62363                       UnallocatedA32(instr);
62364                       return;
62365                     }
62366                     Condition condition((instr >> 28) & 0xf);
62367                     unsigned rd = (instr >> 12) & 0xf;
62368                     unsigned rn = (instr >> 16) & 0xf;
62369                     unsigned rm = instr & 0xf;
62370                     // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62371                     ssub16(condition, Register(rd), Register(rn), Register(rm));
62372                     if (((instr & 0xff00ff0) != 0x6100f70)) {
62373                       UnpredictableA32(instr);
62374                     }
62375                     break;
62376                   }
62377                   case 0x00000080: {
62378                     // 0x061000f0
62379                     if (((instr & 0xf0000000) == 0xf0000000)) {
62380                       UnallocatedA32(instr);
62381                       return;
62382                     }
62383                     Condition condition((instr >> 28) & 0xf);
62384                     unsigned rd = (instr >> 12) & 0xf;
62385                     unsigned rn = (instr >> 16) & 0xf;
62386                     unsigned rm = instr & 0xf;
62387                     // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62388                     ssub8(condition, Register(rd), Register(rn), Register(rm));
62389                     if (((instr & 0xff00ff0) != 0x6100ff0)) {
62390                       UnpredictableA32(instr);
62391                     }
62392                     break;
62393                   }
62394                 }
62395                 break;
62396               }
62397               case 0x00800000: {
62398                 // 0x06800010
62399                 if (((instr & 0xf0000000) == 0xf0000000)) {
62400                   UnallocatedA32(instr);
62401                   return;
62402                 }
62403                 Condition condition((instr >> 28) & 0xf);
62404                 unsigned rd = (instr >> 12) & 0xf;
62405                 unsigned rn = (instr >> 16) & 0xf;
62406                 unsigned rm = instr & 0xf;
62407                 uint32_t amount = (instr >> 7) & 0x1f;
62408                 // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1
62409                 pkhbt(condition,
62410                       Register(rd),
62411                       Register(rn),
62412                       Operand(Register(rm), LSL, amount));
62413                 break;
62414               }
62415               case 0x00800020: {
62416                 // 0x06800030
62417                 if ((instr & 0x00000080) == 0x00000080) {
62418                   if (((instr & 0xf0000000) == 0xf0000000)) {
62419                     UnallocatedA32(instr);
62420                     return;
62421                   }
62422                   Condition condition((instr >> 28) & 0xf);
62423                   unsigned rd = (instr >> 12) & 0xf;
62424                   unsigned rn = (instr >> 16) & 0xf;
62425                   unsigned rm = instr & 0xf;
62426                   // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62427                   sel(condition, Register(rd), Register(rn), Register(rm));
62428                   if (((instr & 0xff00ff0) != 0x6800fb0)) {
62429                     UnpredictableA32(instr);
62430                   }
62431                 } else {
62432                   UnallocatedA32(instr);
62433                 }
62434                 break;
62435               }
62436               case 0x00800040: {
62437                 // 0x06800050
62438                 if (((instr & 0xf0000000) == 0xf0000000)) {
62439                   UnallocatedA32(instr);
62440                   return;
62441                 }
62442                 Condition condition((instr >> 28) & 0xf);
62443                 unsigned rd = (instr >> 12) & 0xf;
62444                 unsigned rn = (instr >> 16) & 0xf;
62445                 unsigned rm = instr & 0xf;
62446                 uint32_t amount = (instr >> 7) & 0x1f;
62447                 if (amount == 0) amount = 32;
62448                 // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1
62449                 pkhtb(condition,
62450                       Register(rd),
62451                       Register(rn),
62452                       Operand(Register(rm), ASR, amount));
62453                 break;
62454               }
62455               case 0x00800060: {
62456                 // 0x06800070
62457                 switch (instr & 0x00000080) {
62458                   case 0x00000000: {
62459                     // 0x06800070
62460                     switch (instr & 0x000f0000) {
62461                       case 0x000f0000: {
62462                         // 0x068f0070
62463                         if (((instr & 0xf0000000) == 0xf0000000)) {
62464                           UnallocatedA32(instr);
62465                           return;
62466                         }
62467                         Condition condition((instr >> 28) & 0xf);
62468                         unsigned rd = (instr >> 12) & 0xf;
62469                         unsigned rm = instr & 0xf;
62470                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
62471                         // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
62472                         sxtb16(condition,
62473                                Register(rd),
62474                                Operand(Register(rm), ROR, amount));
62475                         if (((instr & 0xfff03f0) != 0x68f0070)) {
62476                           UnpredictableA32(instr);
62477                         }
62478                         break;
62479                       }
62480                       default: {
62481                         if (((instr & 0xf0000000) == 0xf0000000) ||
62482                             ((instr & 0xf0000) == 0xf0000)) {
62483                           UnallocatedA32(instr);
62484                           return;
62485                         }
62486                         Condition condition((instr >> 28) & 0xf);
62487                         unsigned rd = (instr >> 12) & 0xf;
62488                         unsigned rn = (instr >> 16) & 0xf;
62489                         unsigned rm = instr & 0xf;
62490                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
62491                         // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
62492                         sxtab16(condition,
62493                                 Register(rd),
62494                                 Register(rn),
62495                                 Operand(Register(rm), ROR, amount));
62496                         if (((instr & 0xff003f0) != 0x6800070)) {
62497                           UnpredictableA32(instr);
62498                         }
62499                         break;
62500                       }
62501                     }
62502                     break;
62503                   }
62504                   default:
62505                     UnallocatedA32(instr);
62506                     break;
62507                 }
62508                 break;
62509               }
62510               default:
62511                 UnallocatedA32(instr);
62512                 break;
62513             }
62514             break;
62515           }
62516           case 0x00200000: {
62517             // 0x06200000
62518             switch (instr & 0x00100000) {
62519               case 0x00000000: {
62520                 // 0x06200000
62521                 if (((instr & 0xf0000000) == 0xf0000000)) {
62522                   UnallocatedA32(instr);
62523                   return;
62524                 }
62525                 UnimplementedA32("STRT", instr);
62526                 break;
62527               }
62528               case 0x00100000: {
62529                 // 0x06300000
62530                 if (((instr & 0xf0000000) == 0xf0000000)) {
62531                   UnallocatedA32(instr);
62532                   return;
62533                 }
62534                 UnimplementedA32("LDRT", instr);
62535                 break;
62536               }
62537             }
62538             break;
62539           }
62540           case 0x00200010: {
62541             // 0x06200010
62542             switch (instr & 0x00800060) {
62543               case 0x00000000: {
62544                 // 0x06200010
62545                 switch (instr & 0x00100080) {
62546                   case 0x00000000: {
62547                     // 0x06200010
62548                     if (((instr & 0xf0000000) == 0xf0000000)) {
62549                       UnallocatedA32(instr);
62550                       return;
62551                     }
62552                     Condition condition((instr >> 28) & 0xf);
62553                     unsigned rd = (instr >> 12) & 0xf;
62554                     unsigned rn = (instr >> 16) & 0xf;
62555                     unsigned rm = instr & 0xf;
62556                     // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62557                     qadd16(condition, Register(rd), Register(rn), Register(rm));
62558                     if (((instr & 0xff00ff0) != 0x6200f10)) {
62559                       UnpredictableA32(instr);
62560                     }
62561                     break;
62562                   }
62563                   case 0x00000080: {
62564                     // 0x06200090
62565                     if (((instr & 0xf0000000) == 0xf0000000)) {
62566                       UnallocatedA32(instr);
62567                       return;
62568                     }
62569                     Condition condition((instr >> 28) & 0xf);
62570                     unsigned rd = (instr >> 12) & 0xf;
62571                     unsigned rn = (instr >> 16) & 0xf;
62572                     unsigned rm = instr & 0xf;
62573                     // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62574                     qadd8(condition, Register(rd), Register(rn), Register(rm));
62575                     if (((instr & 0xff00ff0) != 0x6200f90)) {
62576                       UnpredictableA32(instr);
62577                     }
62578                     break;
62579                   }
62580                   case 0x00100000: {
62581                     // 0x06300010
62582                     if (((instr & 0xf0000000) == 0xf0000000)) {
62583                       UnallocatedA32(instr);
62584                       return;
62585                     }
62586                     Condition condition((instr >> 28) & 0xf);
62587                     unsigned rd = (instr >> 12) & 0xf;
62588                     unsigned rn = (instr >> 16) & 0xf;
62589                     unsigned rm = instr & 0xf;
62590                     // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62591                     shadd16(condition,
62592                             Register(rd),
62593                             Register(rn),
62594                             Register(rm));
62595                     if (((instr & 0xff00ff0) != 0x6300f10)) {
62596                       UnpredictableA32(instr);
62597                     }
62598                     break;
62599                   }
62600                   case 0x00100080: {
62601                     // 0x06300090
62602                     if (((instr & 0xf0000000) == 0xf0000000)) {
62603                       UnallocatedA32(instr);
62604                       return;
62605                     }
62606                     Condition condition((instr >> 28) & 0xf);
62607                     unsigned rd = (instr >> 12) & 0xf;
62608                     unsigned rn = (instr >> 16) & 0xf;
62609                     unsigned rm = instr & 0xf;
62610                     // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62611                     shadd8(condition, Register(rd), Register(rn), Register(rm));
62612                     if (((instr & 0xff00ff0) != 0x6300f90)) {
62613                       UnpredictableA32(instr);
62614                     }
62615                     break;
62616                   }
62617                 }
62618                 break;
62619               }
62620               case 0x00000020: {
62621                 // 0x06200030
62622                 switch (instr & 0x00100080) {
62623                   case 0x00000000: {
62624                     // 0x06200030
62625                     if (((instr & 0xf0000000) == 0xf0000000)) {
62626                       UnallocatedA32(instr);
62627                       return;
62628                     }
62629                     Condition condition((instr >> 28) & 0xf);
62630                     unsigned rd = (instr >> 12) & 0xf;
62631                     unsigned rn = (instr >> 16) & 0xf;
62632                     unsigned rm = instr & 0xf;
62633                     // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62634                     qasx(condition, Register(rd), Register(rn), Register(rm));
62635                     if (((instr & 0xff00ff0) != 0x6200f30)) {
62636                       UnpredictableA32(instr);
62637                     }
62638                     break;
62639                   }
62640                   case 0x00100000: {
62641                     // 0x06300030
62642                     if (((instr & 0xf0000000) == 0xf0000000)) {
62643                       UnallocatedA32(instr);
62644                       return;
62645                     }
62646                     Condition condition((instr >> 28) & 0xf);
62647                     unsigned rd = (instr >> 12) & 0xf;
62648                     unsigned rn = (instr >> 16) & 0xf;
62649                     unsigned rm = instr & 0xf;
62650                     // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62651                     shasx(condition, Register(rd), Register(rn), Register(rm));
62652                     if (((instr & 0xff00ff0) != 0x6300f30)) {
62653                       UnpredictableA32(instr);
62654                     }
62655                     break;
62656                   }
62657                   default:
62658                     UnallocatedA32(instr);
62659                     break;
62660                 }
62661                 break;
62662               }
62663               case 0x00000040: {
62664                 // 0x06200050
62665                 switch (instr & 0x00100080) {
62666                   case 0x00000000: {
62667                     // 0x06200050
62668                     if (((instr & 0xf0000000) == 0xf0000000)) {
62669                       UnallocatedA32(instr);
62670                       return;
62671                     }
62672                     Condition condition((instr >> 28) & 0xf);
62673                     unsigned rd = (instr >> 12) & 0xf;
62674                     unsigned rn = (instr >> 16) & 0xf;
62675                     unsigned rm = instr & 0xf;
62676                     // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62677                     qsax(condition, Register(rd), Register(rn), Register(rm));
62678                     if (((instr & 0xff00ff0) != 0x6200f50)) {
62679                       UnpredictableA32(instr);
62680                     }
62681                     break;
62682                   }
62683                   case 0x00100000: {
62684                     // 0x06300050
62685                     if (((instr & 0xf0000000) == 0xf0000000)) {
62686                       UnallocatedA32(instr);
62687                       return;
62688                     }
62689                     Condition condition((instr >> 28) & 0xf);
62690                     unsigned rd = (instr >> 12) & 0xf;
62691                     unsigned rn = (instr >> 16) & 0xf;
62692                     unsigned rm = instr & 0xf;
62693                     // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62694                     shsax(condition, Register(rd), Register(rn), Register(rm));
62695                     if (((instr & 0xff00ff0) != 0x6300f50)) {
62696                       UnpredictableA32(instr);
62697                     }
62698                     break;
62699                   }
62700                   default:
62701                     UnallocatedA32(instr);
62702                     break;
62703                 }
62704                 break;
62705               }
62706               case 0x00000060: {
62707                 // 0x06200070
62708                 switch (instr & 0x00100080) {
62709                   case 0x00000000: {
62710                     // 0x06200070
62711                     if (((instr & 0xf0000000) == 0xf0000000)) {
62712                       UnallocatedA32(instr);
62713                       return;
62714                     }
62715                     Condition condition((instr >> 28) & 0xf);
62716                     unsigned rd = (instr >> 12) & 0xf;
62717                     unsigned rn = (instr >> 16) & 0xf;
62718                     unsigned rm = instr & 0xf;
62719                     // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62720                     qsub16(condition, Register(rd), Register(rn), Register(rm));
62721                     if (((instr & 0xff00ff0) != 0x6200f70)) {
62722                       UnpredictableA32(instr);
62723                     }
62724                     break;
62725                   }
62726                   case 0x00000080: {
62727                     // 0x062000f0
62728                     if (((instr & 0xf0000000) == 0xf0000000)) {
62729                       UnallocatedA32(instr);
62730                       return;
62731                     }
62732                     Condition condition((instr >> 28) & 0xf);
62733                     unsigned rd = (instr >> 12) & 0xf;
62734                     unsigned rn = (instr >> 16) & 0xf;
62735                     unsigned rm = instr & 0xf;
62736                     // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62737                     qsub8(condition, Register(rd), Register(rn), Register(rm));
62738                     if (((instr & 0xff00ff0) != 0x6200ff0)) {
62739                       UnpredictableA32(instr);
62740                     }
62741                     break;
62742                   }
62743                   case 0x00100000: {
62744                     // 0x06300070
62745                     if (((instr & 0xf0000000) == 0xf0000000)) {
62746                       UnallocatedA32(instr);
62747                       return;
62748                     }
62749                     Condition condition((instr >> 28) & 0xf);
62750                     unsigned rd = (instr >> 12) & 0xf;
62751                     unsigned rn = (instr >> 16) & 0xf;
62752                     unsigned rm = instr & 0xf;
62753                     // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62754                     shsub16(condition,
62755                             Register(rd),
62756                             Register(rn),
62757                             Register(rm));
62758                     if (((instr & 0xff00ff0) != 0x6300f70)) {
62759                       UnpredictableA32(instr);
62760                     }
62761                     break;
62762                   }
62763                   case 0x00100080: {
62764                     // 0x063000f0
62765                     if (((instr & 0xf0000000) == 0xf0000000)) {
62766                       UnallocatedA32(instr);
62767                       return;
62768                     }
62769                     Condition condition((instr >> 28) & 0xf);
62770                     unsigned rd = (instr >> 12) & 0xf;
62771                     unsigned rn = (instr >> 16) & 0xf;
62772                     unsigned rm = instr & 0xf;
62773                     // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62774                     shsub8(condition, Register(rd), Register(rn), Register(rm));
62775                     if (((instr & 0xff00ff0) != 0x6300ff0)) {
62776                       UnpredictableA32(instr);
62777                     }
62778                     break;
62779                   }
62780                 }
62781                 break;
62782               }
62783               case 0x00800000: {
62784                 // 0x06a00010
62785                 if (((instr & 0xf0000000) == 0xf0000000)) {
62786                   UnallocatedA32(instr);
62787                   return;
62788                 }
62789                 Condition condition((instr >> 28) & 0xf);
62790                 unsigned rd = (instr >> 12) & 0xf;
62791                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
62792                 unsigned rn = instr & 0xf;
62793                 uint32_t amount = (instr >> 7) & 0x1f;
62794                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
62795                 ssat(condition,
62796                      Register(rd),
62797                      imm,
62798                      Operand(Register(rn), LSL, amount));
62799                 break;
62800               }
62801               case 0x00800020: {
62802                 // 0x06a00030
62803                 switch (instr & 0x00100080) {
62804                   case 0x00000000: {
62805                     // 0x06a00030
62806                     if (((instr & 0xf0000000) == 0xf0000000)) {
62807                       UnallocatedA32(instr);
62808                       return;
62809                     }
62810                     Condition condition((instr >> 28) & 0xf);
62811                     unsigned rd = (instr >> 12) & 0xf;
62812                     uint32_t imm = ((instr >> 16) & 0xf) + 1;
62813                     unsigned rn = instr & 0xf;
62814                     // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
62815                     ssat16(condition, Register(rd), imm, Register(rn));
62816                     if (((instr & 0xff00ff0) != 0x6a00f30)) {
62817                       UnpredictableA32(instr);
62818                     }
62819                     break;
62820                   }
62821                   case 0x00100000: {
62822                     // 0x06b00030
62823                     if (((instr & 0xf0000000) == 0xf0000000)) {
62824                       UnallocatedA32(instr);
62825                       return;
62826                     }
62827                     Condition condition((instr >> 28) & 0xf);
62828                     unsigned rd = (instr >> 12) & 0xf;
62829                     unsigned rm = instr & 0xf;
62830                     // REV{<c>}{<q>} <Rd>, <Rm> ; A1
62831                     rev(condition, Best, Register(rd), Register(rm));
62832                     if (((instr & 0xfff0ff0) != 0x6bf0f30)) {
62833                       UnpredictableA32(instr);
62834                     }
62835                     break;
62836                   }
62837                   case 0x00100080: {
62838                     // 0x06b000b0
62839                     if (((instr & 0xf0000000) == 0xf0000000)) {
62840                       UnallocatedA32(instr);
62841                       return;
62842                     }
62843                     Condition condition((instr >> 28) & 0xf);
62844                     unsigned rd = (instr >> 12) & 0xf;
62845                     unsigned rm = instr & 0xf;
62846                     // REV16{<c>}{<q>} <Rd>, <Rm> ; A1
62847                     rev16(condition, Best, Register(rd), Register(rm));
62848                     if (((instr & 0xfff0ff0) != 0x6bf0fb0)) {
62849                       UnpredictableA32(instr);
62850                     }
62851                     break;
62852                   }
62853                   default:
62854                     UnallocatedA32(instr);
62855                     break;
62856                 }
62857                 break;
62858               }
62859               case 0x00800040: {
62860                 // 0x06a00050
62861                 if (((instr & 0xf0000000) == 0xf0000000)) {
62862                   UnallocatedA32(instr);
62863                   return;
62864                 }
62865                 Condition condition((instr >> 28) & 0xf);
62866                 unsigned rd = (instr >> 12) & 0xf;
62867                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
62868                 unsigned rn = instr & 0xf;
62869                 uint32_t amount = (instr >> 7) & 0x1f;
62870                 if (amount == 0) amount = 32;
62871                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
62872                 ssat(condition,
62873                      Register(rd),
62874                      imm,
62875                      Operand(Register(rn), ASR, amount));
62876                 break;
62877               }
62878               case 0x00800060: {
62879                 // 0x06a00070
62880                 switch (instr & 0x00100080) {
62881                   case 0x00000000: {
62882                     // 0x06a00070
62883                     switch (instr & 0x000f0000) {
62884                       case 0x000f0000: {
62885                         // 0x06af0070
62886                         if (((instr & 0xf0000000) == 0xf0000000)) {
62887                           UnallocatedA32(instr);
62888                           return;
62889                         }
62890                         Condition condition((instr >> 28) & 0xf);
62891                         unsigned rd = (instr >> 12) & 0xf;
62892                         unsigned rm = instr & 0xf;
62893                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
62894                         // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
62895                         sxtb(condition,
62896                              Best,
62897                              Register(rd),
62898                              Operand(Register(rm), ROR, amount));
62899                         if (((instr & 0xfff03f0) != 0x6af0070)) {
62900                           UnpredictableA32(instr);
62901                         }
62902                         break;
62903                       }
62904                       default: {
62905                         if (((instr & 0xf0000000) == 0xf0000000) ||
62906                             ((instr & 0xf0000) == 0xf0000)) {
62907                           UnallocatedA32(instr);
62908                           return;
62909                         }
62910                         Condition condition((instr >> 28) & 0xf);
62911                         unsigned rd = (instr >> 12) & 0xf;
62912                         unsigned rn = (instr >> 16) & 0xf;
62913                         unsigned rm = instr & 0xf;
62914                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
62915                         // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
62916                         sxtab(condition,
62917                               Register(rd),
62918                               Register(rn),
62919                               Operand(Register(rm), ROR, amount));
62920                         if (((instr & 0xff003f0) != 0x6a00070)) {
62921                           UnpredictableA32(instr);
62922                         }
62923                         break;
62924                       }
62925                     }
62926                     break;
62927                   }
62928                   case 0x00100000: {
62929                     // 0x06b00070
62930                     switch (instr & 0x000f0000) {
62931                       case 0x000f0000: {
62932                         // 0x06bf0070
62933                         if (((instr & 0xf0000000) == 0xf0000000)) {
62934                           UnallocatedA32(instr);
62935                           return;
62936                         }
62937                         Condition condition((instr >> 28) & 0xf);
62938                         unsigned rd = (instr >> 12) & 0xf;
62939                         unsigned rm = instr & 0xf;
62940                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
62941                         // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
62942                         sxth(condition,
62943                              Best,
62944                              Register(rd),
62945                              Operand(Register(rm), ROR, amount));
62946                         if (((instr & 0xfff03f0) != 0x6bf0070)) {
62947                           UnpredictableA32(instr);
62948                         }
62949                         break;
62950                       }
62951                       default: {
62952                         if (((instr & 0xf0000000) == 0xf0000000) ||
62953                             ((instr & 0xf0000) == 0xf0000)) {
62954                           UnallocatedA32(instr);
62955                           return;
62956                         }
62957                         Condition condition((instr >> 28) & 0xf);
62958                         unsigned rd = (instr >> 12) & 0xf;
62959                         unsigned rn = (instr >> 16) & 0xf;
62960                         unsigned rm = instr & 0xf;
62961                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
62962                         // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
62963                         sxtah(condition,
62964                               Register(rd),
62965                               Register(rn),
62966                               Operand(Register(rm), ROR, amount));
62967                         if (((instr & 0xff003f0) != 0x6b00070)) {
62968                           UnpredictableA32(instr);
62969                         }
62970                         break;
62971                       }
62972                     }
62973                     break;
62974                   }
62975                   default:
62976                     UnallocatedA32(instr);
62977                     break;
62978                 }
62979                 break;
62980               }
62981             }
62982             break;
62983           }
62984           case 0x00400000: {
62985             // 0x06400000
62986             switch (instr & 0x00100000) {
62987               case 0x00000000: {
62988                 // 0x06400000
62989                 if (((instr & 0xf0000000) == 0xf0000000)) {
62990                   UnallocatedA32(instr);
62991                   return;
62992                 }
62993                 Condition condition((instr >> 28) & 0xf);
62994                 unsigned rt = (instr >> 12) & 0xf;
62995                 unsigned rn = (instr >> 16) & 0xf;
62996                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62997                 unsigned rm = instr & 0xf;
62998                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62999                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63000                                                     (imm_and_type_ & 0x7c) >>
63001                                                         2);
63002                 Shift shift = shift_operand.GetShift();
63003                 uint32_t amount = shift_operand.GetAmount();
63004                 // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
63005                 strb(condition,
63006                      Best,
63007                      Register(rt),
63008                      MemOperand(Register(rn),
63009                                 sign,
63010                                 Register(rm),
63011                                 shift,
63012                                 amount,
63013                                 PostIndex));
63014                 break;
63015               }
63016               case 0x00100000: {
63017                 // 0x06500000
63018                 if (((instr & 0xf0000000) == 0xf0000000)) {
63019                   UnallocatedA32(instr);
63020                   return;
63021                 }
63022                 Condition condition((instr >> 28) & 0xf);
63023                 unsigned rt = (instr >> 12) & 0xf;
63024                 unsigned rn = (instr >> 16) & 0xf;
63025                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63026                 unsigned rm = instr & 0xf;
63027                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63028                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63029                                                     (imm_and_type_ & 0x7c) >>
63030                                                         2);
63031                 Shift shift = shift_operand.GetShift();
63032                 uint32_t amount = shift_operand.GetAmount();
63033                 // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
63034                 ldrb(condition,
63035                      Best,
63036                      Register(rt),
63037                      MemOperand(Register(rn),
63038                                 sign,
63039                                 Register(rm),
63040                                 shift,
63041                                 amount,
63042                                 PostIndex));
63043                 break;
63044               }
63045             }
63046             break;
63047           }
63048           case 0x00400010: {
63049             // 0x06400010
63050             switch (instr & 0x009000e0) {
63051               case 0x00100000: {
63052                 // 0x06500010
63053                 if (((instr & 0xf0000000) == 0xf0000000)) {
63054                   UnallocatedA32(instr);
63055                   return;
63056                 }
63057                 Condition condition((instr >> 28) & 0xf);
63058                 unsigned rd = (instr >> 12) & 0xf;
63059                 unsigned rn = (instr >> 16) & 0xf;
63060                 unsigned rm = instr & 0xf;
63061                 // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63062                 uadd16(condition, Register(rd), Register(rn), Register(rm));
63063                 if (((instr & 0xff00ff0) != 0x6500f10)) {
63064                   UnpredictableA32(instr);
63065                 }
63066                 break;
63067               }
63068               case 0x00100020: {
63069                 // 0x06500030
63070                 if (((instr & 0xf0000000) == 0xf0000000)) {
63071                   UnallocatedA32(instr);
63072                   return;
63073                 }
63074                 Condition condition((instr >> 28) & 0xf);
63075                 unsigned rd = (instr >> 12) & 0xf;
63076                 unsigned rn = (instr >> 16) & 0xf;
63077                 unsigned rm = instr & 0xf;
63078                 // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63079                 uasx(condition, Register(rd), Register(rn), Register(rm));
63080                 if (((instr & 0xff00ff0) != 0x6500f30)) {
63081                   UnpredictableA32(instr);
63082                 }
63083                 break;
63084               }
63085               case 0x00100040: {
63086                 // 0x06500050
63087                 if (((instr & 0xf0000000) == 0xf0000000)) {
63088                   UnallocatedA32(instr);
63089                   return;
63090                 }
63091                 Condition condition((instr >> 28) & 0xf);
63092                 unsigned rd = (instr >> 12) & 0xf;
63093                 unsigned rn = (instr >> 16) & 0xf;
63094                 unsigned rm = instr & 0xf;
63095                 // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63096                 usax(condition, Register(rd), Register(rn), Register(rm));
63097                 if (((instr & 0xff00ff0) != 0x6500f50)) {
63098                   UnpredictableA32(instr);
63099                 }
63100                 break;
63101               }
63102               case 0x00100060: {
63103                 // 0x06500070
63104                 if (((instr & 0xf0000000) == 0xf0000000)) {
63105                   UnallocatedA32(instr);
63106                   return;
63107                 }
63108                 Condition condition((instr >> 28) & 0xf);
63109                 unsigned rd = (instr >> 12) & 0xf;
63110                 unsigned rn = (instr >> 16) & 0xf;
63111                 unsigned rm = instr & 0xf;
63112                 // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63113                 usub16(condition, Register(rd), Register(rn), Register(rm));
63114                 if (((instr & 0xff00ff0) != 0x6500f70)) {
63115                   UnpredictableA32(instr);
63116                 }
63117                 break;
63118               }
63119               case 0x00100080: {
63120                 // 0x06500090
63121                 if (((instr & 0xf0000000) == 0xf0000000)) {
63122                   UnallocatedA32(instr);
63123                   return;
63124                 }
63125                 Condition condition((instr >> 28) & 0xf);
63126                 unsigned rd = (instr >> 12) & 0xf;
63127                 unsigned rn = (instr >> 16) & 0xf;
63128                 unsigned rm = instr & 0xf;
63129                 // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63130                 uadd8(condition, Register(rd), Register(rn), Register(rm));
63131                 if (((instr & 0xff00ff0) != 0x6500f90)) {
63132                   UnpredictableA32(instr);
63133                 }
63134                 break;
63135               }
63136               case 0x001000e0: {
63137                 // 0x065000f0
63138                 if (((instr & 0xf0000000) == 0xf0000000)) {
63139                   UnallocatedA32(instr);
63140                   return;
63141                 }
63142                 Condition condition((instr >> 28) & 0xf);
63143                 unsigned rd = (instr >> 12) & 0xf;
63144                 unsigned rn = (instr >> 16) & 0xf;
63145                 unsigned rm = instr & 0xf;
63146                 // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63147                 usub8(condition, Register(rd), Register(rn), Register(rm));
63148                 if (((instr & 0xff00ff0) != 0x6500ff0)) {
63149                   UnpredictableA32(instr);
63150                 }
63151                 break;
63152               }
63153               case 0x00800060: {
63154                 // 0x06c00070
63155                 switch (instr & 0x000f0000) {
63156                   case 0x000f0000: {
63157                     // 0x06cf0070
63158                     if (((instr & 0xf0000000) == 0xf0000000)) {
63159                       UnallocatedA32(instr);
63160                       return;
63161                     }
63162                     Condition condition((instr >> 28) & 0xf);
63163                     unsigned rd = (instr >> 12) & 0xf;
63164                     unsigned rm = instr & 0xf;
63165                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
63166                     // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63167                     uxtb16(condition,
63168                            Register(rd),
63169                            Operand(Register(rm), ROR, amount));
63170                     if (((instr & 0xfff03f0) != 0x6cf0070)) {
63171                       UnpredictableA32(instr);
63172                     }
63173                     break;
63174                   }
63175                   default: {
63176                     if (((instr & 0xf0000000) == 0xf0000000) ||
63177                         ((instr & 0xf0000) == 0xf0000)) {
63178                       UnallocatedA32(instr);
63179                       return;
63180                     }
63181                     Condition condition((instr >> 28) & 0xf);
63182                     unsigned rd = (instr >> 12) & 0xf;
63183                     unsigned rn = (instr >> 16) & 0xf;
63184                     unsigned rm = instr & 0xf;
63185                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
63186                     // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63187                     uxtab16(condition,
63188                             Register(rd),
63189                             Register(rn),
63190                             Operand(Register(rm), ROR, amount));
63191                     if (((instr & 0xff003f0) != 0x6c00070)) {
63192                       UnpredictableA32(instr);
63193                     }
63194                     break;
63195                   }
63196                 }
63197                 break;
63198               }
63199               default:
63200                 UnallocatedA32(instr);
63201                 break;
63202             }
63203             break;
63204           }
63205           case 0x00600000: {
63206             // 0x06600000
63207             switch (instr & 0x00100000) {
63208               case 0x00000000: {
63209                 // 0x06600000
63210                 if (((instr & 0xf0000000) == 0xf0000000)) {
63211                   UnallocatedA32(instr);
63212                   return;
63213                 }
63214                 UnimplementedA32("STRBT", instr);
63215                 break;
63216               }
63217               case 0x00100000: {
63218                 // 0x06700000
63219                 if (((instr & 0xf0000000) == 0xf0000000)) {
63220                   UnallocatedA32(instr);
63221                   return;
63222                 }
63223                 UnimplementedA32("LDRBT", instr);
63224                 break;
63225               }
63226             }
63227             break;
63228           }
63229           case 0x00600010: {
63230             // 0x06600010
63231             switch (instr & 0x00800060) {
63232               case 0x00000000: {
63233                 // 0x06600010
63234                 switch (instr & 0x00100080) {
63235                   case 0x00000000: {
63236                     // 0x06600010
63237                     if (((instr & 0xf0000000) == 0xf0000000)) {
63238                       UnallocatedA32(instr);
63239                       return;
63240                     }
63241                     Condition condition((instr >> 28) & 0xf);
63242                     unsigned rd = (instr >> 12) & 0xf;
63243                     unsigned rn = (instr >> 16) & 0xf;
63244                     unsigned rm = instr & 0xf;
63245                     // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63246                     uqadd16(condition,
63247                             Register(rd),
63248                             Register(rn),
63249                             Register(rm));
63250                     if (((instr & 0xff00ff0) != 0x6600f10)) {
63251                       UnpredictableA32(instr);
63252                     }
63253                     break;
63254                   }
63255                   case 0x00000080: {
63256                     // 0x06600090
63257                     if (((instr & 0xf0000000) == 0xf0000000)) {
63258                       UnallocatedA32(instr);
63259                       return;
63260                     }
63261                     Condition condition((instr >> 28) & 0xf);
63262                     unsigned rd = (instr >> 12) & 0xf;
63263                     unsigned rn = (instr >> 16) & 0xf;
63264                     unsigned rm = instr & 0xf;
63265                     // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63266                     uqadd8(condition, Register(rd), Register(rn), Register(rm));
63267                     if (((instr & 0xff00ff0) != 0x6600f90)) {
63268                       UnpredictableA32(instr);
63269                     }
63270                     break;
63271                   }
63272                   case 0x00100000: {
63273                     // 0x06700010
63274                     if (((instr & 0xf0000000) == 0xf0000000)) {
63275                       UnallocatedA32(instr);
63276                       return;
63277                     }
63278                     Condition condition((instr >> 28) & 0xf);
63279                     unsigned rd = (instr >> 12) & 0xf;
63280                     unsigned rn = (instr >> 16) & 0xf;
63281                     unsigned rm = instr & 0xf;
63282                     // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63283                     uhadd16(condition,
63284                             Register(rd),
63285                             Register(rn),
63286                             Register(rm));
63287                     if (((instr & 0xff00ff0) != 0x6700f10)) {
63288                       UnpredictableA32(instr);
63289                     }
63290                     break;
63291                   }
63292                   case 0x00100080: {
63293                     // 0x06700090
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 rn = (instr >> 16) & 0xf;
63301                     unsigned rm = instr & 0xf;
63302                     // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63303                     uhadd8(condition, Register(rd), Register(rn), Register(rm));
63304                     if (((instr & 0xff00ff0) != 0x6700f90)) {
63305                       UnpredictableA32(instr);
63306                     }
63307                     break;
63308                   }
63309                 }
63310                 break;
63311               }
63312               case 0x00000020: {
63313                 // 0x06600030
63314                 switch (instr & 0x00100080) {
63315                   case 0x00000000: {
63316                     // 0x06600030
63317                     if (((instr & 0xf0000000) == 0xf0000000)) {
63318                       UnallocatedA32(instr);
63319                       return;
63320                     }
63321                     Condition condition((instr >> 28) & 0xf);
63322                     unsigned rd = (instr >> 12) & 0xf;
63323                     unsigned rn = (instr >> 16) & 0xf;
63324                     unsigned rm = instr & 0xf;
63325                     // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63326                     uqasx(condition, Register(rd), Register(rn), Register(rm));
63327                     if (((instr & 0xff00ff0) != 0x6600f30)) {
63328                       UnpredictableA32(instr);
63329                     }
63330                     break;
63331                   }
63332                   case 0x00100000: {
63333                     // 0x06700030
63334                     if (((instr & 0xf0000000) == 0xf0000000)) {
63335                       UnallocatedA32(instr);
63336                       return;
63337                     }
63338                     Condition condition((instr >> 28) & 0xf);
63339                     unsigned rd = (instr >> 12) & 0xf;
63340                     unsigned rn = (instr >> 16) & 0xf;
63341                     unsigned rm = instr & 0xf;
63342                     // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63343                     uhasx(condition, Register(rd), Register(rn), Register(rm));
63344                     if (((instr & 0xff00ff0) != 0x6700f30)) {
63345                       UnpredictableA32(instr);
63346                     }
63347                     break;
63348                   }
63349                   default:
63350                     UnallocatedA32(instr);
63351                     break;
63352                 }
63353                 break;
63354               }
63355               case 0x00000040: {
63356                 // 0x06600050
63357                 switch (instr & 0x00100080) {
63358                   case 0x00000000: {
63359                     // 0x06600050
63360                     if (((instr & 0xf0000000) == 0xf0000000)) {
63361                       UnallocatedA32(instr);
63362                       return;
63363                     }
63364                     Condition condition((instr >> 28) & 0xf);
63365                     unsigned rd = (instr >> 12) & 0xf;
63366                     unsigned rn = (instr >> 16) & 0xf;
63367                     unsigned rm = instr & 0xf;
63368                     // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63369                     uqsax(condition, Register(rd), Register(rn), Register(rm));
63370                     if (((instr & 0xff00ff0) != 0x6600f50)) {
63371                       UnpredictableA32(instr);
63372                     }
63373                     break;
63374                   }
63375                   case 0x00100000: {
63376                     // 0x06700050
63377                     if (((instr & 0xf0000000) == 0xf0000000)) {
63378                       UnallocatedA32(instr);
63379                       return;
63380                     }
63381                     Condition condition((instr >> 28) & 0xf);
63382                     unsigned rd = (instr >> 12) & 0xf;
63383                     unsigned rn = (instr >> 16) & 0xf;
63384                     unsigned rm = instr & 0xf;
63385                     // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63386                     uhsax(condition, Register(rd), Register(rn), Register(rm));
63387                     if (((instr & 0xff00ff0) != 0x6700f50)) {
63388                       UnpredictableA32(instr);
63389                     }
63390                     break;
63391                   }
63392                   default:
63393                     UnallocatedA32(instr);
63394                     break;
63395                 }
63396                 break;
63397               }
63398               case 0x00000060: {
63399                 // 0x06600070
63400                 switch (instr & 0x00100080) {
63401                   case 0x00000000: {
63402                     // 0x06600070
63403                     if (((instr & 0xf0000000) == 0xf0000000)) {
63404                       UnallocatedA32(instr);
63405                       return;
63406                     }
63407                     Condition condition((instr >> 28) & 0xf);
63408                     unsigned rd = (instr >> 12) & 0xf;
63409                     unsigned rn = (instr >> 16) & 0xf;
63410                     unsigned rm = instr & 0xf;
63411                     // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63412                     uqsub16(condition,
63413                             Register(rd),
63414                             Register(rn),
63415                             Register(rm));
63416                     if (((instr & 0xff00ff0) != 0x6600f70)) {
63417                       UnpredictableA32(instr);
63418                     }
63419                     break;
63420                   }
63421                   case 0x00000080: {
63422                     // 0x066000f0
63423                     if (((instr & 0xf0000000) == 0xf0000000)) {
63424                       UnallocatedA32(instr);
63425                       return;
63426                     }
63427                     Condition condition((instr >> 28) & 0xf);
63428                     unsigned rd = (instr >> 12) & 0xf;
63429                     unsigned rn = (instr >> 16) & 0xf;
63430                     unsigned rm = instr & 0xf;
63431                     // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63432                     uqsub8(condition, Register(rd), Register(rn), Register(rm));
63433                     if (((instr & 0xff00ff0) != 0x6600ff0)) {
63434                       UnpredictableA32(instr);
63435                     }
63436                     break;
63437                   }
63438                   case 0x00100000: {
63439                     // 0x06700070
63440                     if (((instr & 0xf0000000) == 0xf0000000)) {
63441                       UnallocatedA32(instr);
63442                       return;
63443                     }
63444                     Condition condition((instr >> 28) & 0xf);
63445                     unsigned rd = (instr >> 12) & 0xf;
63446                     unsigned rn = (instr >> 16) & 0xf;
63447                     unsigned rm = instr & 0xf;
63448                     // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63449                     uhsub16(condition,
63450                             Register(rd),
63451                             Register(rn),
63452                             Register(rm));
63453                     if (((instr & 0xff00ff0) != 0x6700f70)) {
63454                       UnpredictableA32(instr);
63455                     }
63456                     break;
63457                   }
63458                   case 0x00100080: {
63459                     // 0x067000f0
63460                     if (((instr & 0xf0000000) == 0xf0000000)) {
63461                       UnallocatedA32(instr);
63462                       return;
63463                     }
63464                     Condition condition((instr >> 28) & 0xf);
63465                     unsigned rd = (instr >> 12) & 0xf;
63466                     unsigned rn = (instr >> 16) & 0xf;
63467                     unsigned rm = instr & 0xf;
63468                     // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63469                     uhsub8(condition, Register(rd), Register(rn), Register(rm));
63470                     if (((instr & 0xff00ff0) != 0x6700ff0)) {
63471                       UnpredictableA32(instr);
63472                     }
63473                     break;
63474                   }
63475                 }
63476                 break;
63477               }
63478               case 0x00800000: {
63479                 // 0x06e00010
63480                 if (((instr & 0xf0000000) == 0xf0000000)) {
63481                   UnallocatedA32(instr);
63482                   return;
63483                 }
63484                 Condition condition((instr >> 28) & 0xf);
63485                 unsigned rd = (instr >> 12) & 0xf;
63486                 uint32_t imm = (instr >> 16) & 0x1f;
63487                 unsigned rn = instr & 0xf;
63488                 uint32_t amount = (instr >> 7) & 0x1f;
63489                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
63490                 usat(condition,
63491                      Register(rd),
63492                      imm,
63493                      Operand(Register(rn), LSL, amount));
63494                 break;
63495               }
63496               case 0x00800020: {
63497                 // 0x06e00030
63498                 switch (instr & 0x00100080) {
63499                   case 0x00000000: {
63500                     // 0x06e00030
63501                     if (((instr & 0xf0000000) == 0xf0000000)) {
63502                       UnallocatedA32(instr);
63503                       return;
63504                     }
63505                     Condition condition((instr >> 28) & 0xf);
63506                     unsigned rd = (instr >> 12) & 0xf;
63507                     uint32_t imm = (instr >> 16) & 0xf;
63508                     unsigned rn = instr & 0xf;
63509                     // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
63510                     usat16(condition, Register(rd), imm, Register(rn));
63511                     if (((instr & 0xff00ff0) != 0x6e00f30)) {
63512                       UnpredictableA32(instr);
63513                     }
63514                     break;
63515                   }
63516                   case 0x00100000: {
63517                     // 0x06f00030
63518                     if (((instr & 0xf0000000) == 0xf0000000)) {
63519                       UnallocatedA32(instr);
63520                       return;
63521                     }
63522                     Condition condition((instr >> 28) & 0xf);
63523                     unsigned rd = (instr >> 12) & 0xf;
63524                     unsigned rm = instr & 0xf;
63525                     // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1
63526                     rbit(condition, Register(rd), Register(rm));
63527                     if (((instr & 0xfff0ff0) != 0x6ff0f30)) {
63528                       UnpredictableA32(instr);
63529                     }
63530                     break;
63531                   }
63532                   case 0x00100080: {
63533                     // 0x06f000b0
63534                     if (((instr & 0xf0000000) == 0xf0000000)) {
63535                       UnallocatedA32(instr);
63536                       return;
63537                     }
63538                     Condition condition((instr >> 28) & 0xf);
63539                     unsigned rd = (instr >> 12) & 0xf;
63540                     unsigned rm = instr & 0xf;
63541                     // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1
63542                     revsh(condition, Best, Register(rd), Register(rm));
63543                     if (((instr & 0xfff0ff0) != 0x6ff0fb0)) {
63544                       UnpredictableA32(instr);
63545                     }
63546                     break;
63547                   }
63548                   default:
63549                     UnallocatedA32(instr);
63550                     break;
63551                 }
63552                 break;
63553               }
63554               case 0x00800040: {
63555                 // 0x06e00050
63556                 if (((instr & 0xf0000000) == 0xf0000000)) {
63557                   UnallocatedA32(instr);
63558                   return;
63559                 }
63560                 Condition condition((instr >> 28) & 0xf);
63561                 unsigned rd = (instr >> 12) & 0xf;
63562                 uint32_t imm = (instr >> 16) & 0x1f;
63563                 unsigned rn = instr & 0xf;
63564                 uint32_t amount = (instr >> 7) & 0x1f;
63565                 if (amount == 0) amount = 32;
63566                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
63567                 usat(condition,
63568                      Register(rd),
63569                      imm,
63570                      Operand(Register(rn), ASR, amount));
63571                 break;
63572               }
63573               case 0x00800060: {
63574                 // 0x06e00070
63575                 switch (instr & 0x00100080) {
63576                   case 0x00000000: {
63577                     // 0x06e00070
63578                     switch (instr & 0x000f0000) {
63579                       case 0x000f0000: {
63580                         // 0x06ef0070
63581                         if (((instr & 0xf0000000) == 0xf0000000)) {
63582                           UnallocatedA32(instr);
63583                           return;
63584                         }
63585                         Condition condition((instr >> 28) & 0xf);
63586                         unsigned rd = (instr >> 12) & 0xf;
63587                         unsigned rm = instr & 0xf;
63588                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63589                         // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63590                         uxtb(condition,
63591                              Best,
63592                              Register(rd),
63593                              Operand(Register(rm), ROR, amount));
63594                         if (((instr & 0xfff03f0) != 0x6ef0070)) {
63595                           UnpredictableA32(instr);
63596                         }
63597                         break;
63598                       }
63599                       default: {
63600                         if (((instr & 0xf0000000) == 0xf0000000) ||
63601                             ((instr & 0xf0000) == 0xf0000)) {
63602                           UnallocatedA32(instr);
63603                           return;
63604                         }
63605                         Condition condition((instr >> 28) & 0xf);
63606                         unsigned rd = (instr >> 12) & 0xf;
63607                         unsigned rn = (instr >> 16) & 0xf;
63608                         unsigned rm = instr & 0xf;
63609                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63610                         // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63611                         uxtab(condition,
63612                               Register(rd),
63613                               Register(rn),
63614                               Operand(Register(rm), ROR, amount));
63615                         if (((instr & 0xff003f0) != 0x6e00070)) {
63616                           UnpredictableA32(instr);
63617                         }
63618                         break;
63619                       }
63620                     }
63621                     break;
63622                   }
63623                   case 0x00100000: {
63624                     // 0x06f00070
63625                     switch (instr & 0x000f0000) {
63626                       case 0x000f0000: {
63627                         // 0x06ff0070
63628                         if (((instr & 0xf0000000) == 0xf0000000)) {
63629                           UnallocatedA32(instr);
63630                           return;
63631                         }
63632                         Condition condition((instr >> 28) & 0xf);
63633                         unsigned rd = (instr >> 12) & 0xf;
63634                         unsigned rm = instr & 0xf;
63635                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63636                         // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63637                         uxth(condition,
63638                              Best,
63639                              Register(rd),
63640                              Operand(Register(rm), ROR, amount));
63641                         if (((instr & 0xfff03f0) != 0x6ff0070)) {
63642                           UnpredictableA32(instr);
63643                         }
63644                         break;
63645                       }
63646                       default: {
63647                         if (((instr & 0xf0000000) == 0xf0000000) ||
63648                             ((instr & 0xf0000) == 0xf0000)) {
63649                           UnallocatedA32(instr);
63650                           return;
63651                         }
63652                         Condition condition((instr >> 28) & 0xf);
63653                         unsigned rd = (instr >> 12) & 0xf;
63654                         unsigned rn = (instr >> 16) & 0xf;
63655                         unsigned rm = instr & 0xf;
63656                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63657                         // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63658                         uxtah(condition,
63659                               Register(rd),
63660                               Register(rn),
63661                               Operand(Register(rm), ROR, amount));
63662                         if (((instr & 0xff003f0) != 0x6f00070)) {
63663                           UnpredictableA32(instr);
63664                         }
63665                         break;
63666                       }
63667                     }
63668                     break;
63669                   }
63670                   default:
63671                     UnallocatedA32(instr);
63672                     break;
63673                 }
63674                 break;
63675               }
63676             }
63677             break;
63678           }
63679           case 0x01000000: {
63680             // 0x07000000
63681             switch (instr & 0x00100000) {
63682               case 0x00000000: {
63683                 // 0x07000000
63684                 if (((instr & 0xf0000000) == 0xf0000000)) {
63685                   UnallocatedA32(instr);
63686                   return;
63687                 }
63688                 Condition condition((instr >> 28) & 0xf);
63689                 unsigned rt = (instr >> 12) & 0xf;
63690                 unsigned rn = (instr >> 16) & 0xf;
63691                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63692                 unsigned rm = instr & 0xf;
63693                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63694                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63695                                                     (imm_and_type_ & 0x7c) >>
63696                                                         2);
63697                 Shift shift = shift_operand.GetShift();
63698                 uint32_t amount = shift_operand.GetAmount();
63699                 AddrMode addrmode = Offset;
63700                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
63701                 str(condition,
63702                     Best,
63703                     Register(rt),
63704                     MemOperand(Register(rn),
63705                                sign,
63706                                Register(rm),
63707                                shift,
63708                                amount,
63709                                addrmode));
63710                 break;
63711               }
63712               case 0x00100000: {
63713                 // 0x07100000
63714                 if (((instr & 0xf0000000) == 0xf0000000)) {
63715                   UnallocatedA32(instr);
63716                   return;
63717                 }
63718                 Condition condition((instr >> 28) & 0xf);
63719                 unsigned rt = (instr >> 12) & 0xf;
63720                 unsigned rn = (instr >> 16) & 0xf;
63721                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63722                 unsigned rm = instr & 0xf;
63723                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63724                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63725                                                     (imm_and_type_ & 0x7c) >>
63726                                                         2);
63727                 Shift shift = shift_operand.GetShift();
63728                 uint32_t amount = shift_operand.GetAmount();
63729                 AddrMode addrmode = Offset;
63730                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
63731                 ldr(condition,
63732                     Best,
63733                     Register(rt),
63734                     MemOperand(Register(rn),
63735                                sign,
63736                                Register(rm),
63737                                shift,
63738                                amount,
63739                                addrmode));
63740                 break;
63741               }
63742             }
63743             break;
63744           }
63745           case 0x01000010: {
63746             // 0x07000010
63747             switch (instr & 0x009000e0) {
63748               case 0x00000000: {
63749                 // 0x07000010
63750                 switch (instr & 0x0000f000) {
63751                   case 0x0000f000: {
63752                     // 0x0700f010
63753                     if (((instr & 0xf0000000) == 0xf0000000)) {
63754                       UnallocatedA32(instr);
63755                       return;
63756                     }
63757                     Condition condition((instr >> 28) & 0xf);
63758                     unsigned rd = (instr >> 16) & 0xf;
63759                     unsigned rn = instr & 0xf;
63760                     unsigned rm = (instr >> 8) & 0xf;
63761                     // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63762                     smuad(condition, Register(rd), Register(rn), Register(rm));
63763                     break;
63764                   }
63765                   default: {
63766                     if (((instr & 0xf0000000) == 0xf0000000) ||
63767                         ((instr & 0xf000) == 0xf000)) {
63768                       UnallocatedA32(instr);
63769                       return;
63770                     }
63771                     Condition condition((instr >> 28) & 0xf);
63772                     unsigned rd = (instr >> 16) & 0xf;
63773                     unsigned rn = instr & 0xf;
63774                     unsigned rm = (instr >> 8) & 0xf;
63775                     unsigned ra = (instr >> 12) & 0xf;
63776                     // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63777                     smlad(condition,
63778                           Register(rd),
63779                           Register(rn),
63780                           Register(rm),
63781                           Register(ra));
63782                     break;
63783                   }
63784                 }
63785                 break;
63786               }
63787               case 0x00000020: {
63788                 // 0x07000030
63789                 switch (instr & 0x0000f000) {
63790                   case 0x0000f000: {
63791                     // 0x0700f030
63792                     if (((instr & 0xf0000000) == 0xf0000000)) {
63793                       UnallocatedA32(instr);
63794                       return;
63795                     }
63796                     Condition condition((instr >> 28) & 0xf);
63797                     unsigned rd = (instr >> 16) & 0xf;
63798                     unsigned rn = instr & 0xf;
63799                     unsigned rm = (instr >> 8) & 0xf;
63800                     // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63801                     smuadx(condition, Register(rd), Register(rn), Register(rm));
63802                     break;
63803                   }
63804                   default: {
63805                     if (((instr & 0xf0000000) == 0xf0000000) ||
63806                         ((instr & 0xf000) == 0xf000)) {
63807                       UnallocatedA32(instr);
63808                       return;
63809                     }
63810                     Condition condition((instr >> 28) & 0xf);
63811                     unsigned rd = (instr >> 16) & 0xf;
63812                     unsigned rn = instr & 0xf;
63813                     unsigned rm = (instr >> 8) & 0xf;
63814                     unsigned ra = (instr >> 12) & 0xf;
63815                     // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63816                     smladx(condition,
63817                            Register(rd),
63818                            Register(rn),
63819                            Register(rm),
63820                            Register(ra));
63821                     break;
63822                   }
63823                 }
63824                 break;
63825               }
63826               case 0x00000040: {
63827                 // 0x07000050
63828                 switch (instr & 0x0000f000) {
63829                   case 0x0000f000: {
63830                     // 0x0700f050
63831                     if (((instr & 0xf0000000) == 0xf0000000)) {
63832                       UnallocatedA32(instr);
63833                       return;
63834                     }
63835                     Condition condition((instr >> 28) & 0xf);
63836                     unsigned rd = (instr >> 16) & 0xf;
63837                     unsigned rn = instr & 0xf;
63838                     unsigned rm = (instr >> 8) & 0xf;
63839                     // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63840                     smusd(condition, Register(rd), Register(rn), Register(rm));
63841                     break;
63842                   }
63843                   default: {
63844                     if (((instr & 0xf0000000) == 0xf0000000) ||
63845                         ((instr & 0xf000) == 0xf000)) {
63846                       UnallocatedA32(instr);
63847                       return;
63848                     }
63849                     Condition condition((instr >> 28) & 0xf);
63850                     unsigned rd = (instr >> 16) & 0xf;
63851                     unsigned rn = instr & 0xf;
63852                     unsigned rm = (instr >> 8) & 0xf;
63853                     unsigned ra = (instr >> 12) & 0xf;
63854                     // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63855                     smlsd(condition,
63856                           Register(rd),
63857                           Register(rn),
63858                           Register(rm),
63859                           Register(ra));
63860                     break;
63861                   }
63862                 }
63863                 break;
63864               }
63865               case 0x00000060: {
63866                 // 0x07000070
63867                 switch (instr & 0x0000f000) {
63868                   case 0x0000f000: {
63869                     // 0x0700f070
63870                     if (((instr & 0xf0000000) == 0xf0000000)) {
63871                       UnallocatedA32(instr);
63872                       return;
63873                     }
63874                     Condition condition((instr >> 28) & 0xf);
63875                     unsigned rd = (instr >> 16) & 0xf;
63876                     unsigned rn = instr & 0xf;
63877                     unsigned rm = (instr >> 8) & 0xf;
63878                     // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63879                     smusdx(condition, Register(rd), Register(rn), Register(rm));
63880                     break;
63881                   }
63882                   default: {
63883                     if (((instr & 0xf0000000) == 0xf0000000) ||
63884                         ((instr & 0xf000) == 0xf000)) {
63885                       UnallocatedA32(instr);
63886                       return;
63887                     }
63888                     Condition condition((instr >> 28) & 0xf);
63889                     unsigned rd = (instr >> 16) & 0xf;
63890                     unsigned rn = instr & 0xf;
63891                     unsigned rm = (instr >> 8) & 0xf;
63892                     unsigned ra = (instr >> 12) & 0xf;
63893                     // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63894                     smlsdx(condition,
63895                            Register(rd),
63896                            Register(rn),
63897                            Register(rm),
63898                            Register(ra));
63899                     break;
63900                   }
63901                 }
63902                 break;
63903               }
63904               case 0x00100000: {
63905                 // 0x07100010
63906                 if (((instr & 0xf0000000) == 0xf0000000)) {
63907                   UnallocatedA32(instr);
63908                   return;
63909                 }
63910                 Condition condition((instr >> 28) & 0xf);
63911                 unsigned rd = (instr >> 16) & 0xf;
63912                 unsigned rn = instr & 0xf;
63913                 unsigned rm = (instr >> 8) & 0xf;
63914                 // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63915                 sdiv(condition, Register(rd), Register(rn), Register(rm));
63916                 if (((instr & 0xff0f0f0) != 0x710f010)) {
63917                   UnpredictableA32(instr);
63918                 }
63919                 break;
63920               }
63921               case 0x00800000: {
63922                 // 0x07800010
63923                 switch (instr & 0x0000f000) {
63924                   case 0x0000f000: {
63925                     // 0x0780f010
63926                     if (((instr & 0xf0000000) == 0xf0000000)) {
63927                       UnallocatedA32(instr);
63928                       return;
63929                     }
63930                     Condition condition((instr >> 28) & 0xf);
63931                     unsigned rd = (instr >> 16) & 0xf;
63932                     unsigned rn = instr & 0xf;
63933                     unsigned rm = (instr >> 8) & 0xf;
63934                     // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63935                     usad8(condition, Register(rd), Register(rn), Register(rm));
63936                     break;
63937                   }
63938                   default: {
63939                     if (((instr & 0xf0000000) == 0xf0000000) ||
63940                         ((instr & 0xf000) == 0xf000)) {
63941                       UnallocatedA32(instr);
63942                       return;
63943                     }
63944                     Condition condition((instr >> 28) & 0xf);
63945                     unsigned rd = (instr >> 16) & 0xf;
63946                     unsigned rn = instr & 0xf;
63947                     unsigned rm = (instr >> 8) & 0xf;
63948                     unsigned ra = (instr >> 12) & 0xf;
63949                     // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63950                     usada8(condition,
63951                            Register(rd),
63952                            Register(rn),
63953                            Register(rm),
63954                            Register(ra));
63955                     break;
63956                   }
63957                 }
63958                 break;
63959               }
63960               default:
63961                 UnallocatedA32(instr);
63962                 break;
63963             }
63964             break;
63965           }
63966           case 0x01200000: {
63967             // 0x07200000
63968             switch (instr & 0x00100000) {
63969               case 0x00000000: {
63970                 // 0x07200000
63971                 if (((instr & 0xf0000000) == 0xf0000000)) {
63972                   UnallocatedA32(instr);
63973                   return;
63974                 }
63975                 Condition condition((instr >> 28) & 0xf);
63976                 unsigned rt = (instr >> 12) & 0xf;
63977                 unsigned rn = (instr >> 16) & 0xf;
63978                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63979                 unsigned rm = instr & 0xf;
63980                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63981                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63982                                                     (imm_and_type_ & 0x7c) >>
63983                                                         2);
63984                 Shift shift = shift_operand.GetShift();
63985                 uint32_t amount = shift_operand.GetAmount();
63986                 AddrMode addrmode = PreIndex;
63987                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
63988                 str(condition,
63989                     Best,
63990                     Register(rt),
63991                     MemOperand(Register(rn),
63992                                sign,
63993                                Register(rm),
63994                                shift,
63995                                amount,
63996                                addrmode));
63997                 break;
63998               }
63999               case 0x00100000: {
64000                 // 0x07300000
64001                 if (((instr & 0xf0000000) == 0xf0000000)) {
64002                   UnallocatedA32(instr);
64003                   return;
64004                 }
64005                 Condition condition((instr >> 28) & 0xf);
64006                 unsigned rt = (instr >> 12) & 0xf;
64007                 unsigned rn = (instr >> 16) & 0xf;
64008                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64009                 unsigned rm = instr & 0xf;
64010                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64011                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64012                                                     (imm_and_type_ & 0x7c) >>
64013                                                         2);
64014                 Shift shift = shift_operand.GetShift();
64015                 uint32_t amount = shift_operand.GetAmount();
64016                 AddrMode addrmode = PreIndex;
64017                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64018                 ldr(condition,
64019                     Best,
64020                     Register(rt),
64021                     MemOperand(Register(rn),
64022                                sign,
64023                                Register(rm),
64024                                shift,
64025                                amount,
64026                                addrmode));
64027                 break;
64028               }
64029             }
64030             break;
64031           }
64032           case 0x01200010: {
64033             // 0x07200010
64034             switch (instr & 0x00800060) {
64035               case 0x00000000: {
64036                 // 0x07200010
64037                 if ((instr & 0x00100080) == 0x00100000) {
64038                   if (((instr & 0xf0000000) == 0xf0000000)) {
64039                     UnallocatedA32(instr);
64040                     return;
64041                   }
64042                   Condition condition((instr >> 28) & 0xf);
64043                   unsigned rd = (instr >> 16) & 0xf;
64044                   unsigned rn = instr & 0xf;
64045                   unsigned rm = (instr >> 8) & 0xf;
64046                   // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64047                   udiv(condition, Register(rd), Register(rn), Register(rm));
64048                   if (((instr & 0xff0f0f0) != 0x730f010)) {
64049                     UnpredictableA32(instr);
64050                   }
64051                 } else {
64052                   UnallocatedA32(instr);
64053                 }
64054                 break;
64055               }
64056               case 0x00800040: {
64057                 // 0x07a00050
64058                 if (((instr & 0xf0000000) == 0xf0000000)) {
64059                   UnallocatedA32(instr);
64060                   return;
64061                 }
64062                 Condition condition((instr >> 28) & 0xf);
64063                 unsigned rd = (instr >> 12) & 0xf;
64064                 unsigned rn = instr & 0xf;
64065                 uint32_t lsb = (instr >> 7) & 0x1f;
64066                 uint32_t widthm1 = (instr >> 16) & 0x1f;
64067                 uint32_t width = widthm1 + 1;
64068                 // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64069                 sbfx(condition, Register(rd), Register(rn), lsb, width);
64070                 break;
64071               }
64072               default:
64073                 UnallocatedA32(instr);
64074                 break;
64075             }
64076             break;
64077           }
64078           case 0x01400000: {
64079             // 0x07400000
64080             switch (instr & 0x00100000) {
64081               case 0x00000000: {
64082                 // 0x07400000
64083                 if (((instr & 0xf0000000) == 0xf0000000)) {
64084                   UnallocatedA32(instr);
64085                   return;
64086                 }
64087                 Condition condition((instr >> 28) & 0xf);
64088                 unsigned rt = (instr >> 12) & 0xf;
64089                 unsigned rn = (instr >> 16) & 0xf;
64090                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64091                 unsigned rm = instr & 0xf;
64092                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64093                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64094                                                     (imm_and_type_ & 0x7c) >>
64095                                                         2);
64096                 Shift shift = shift_operand.GetShift();
64097                 uint32_t amount = shift_operand.GetAmount();
64098                 AddrMode addrmode = Offset;
64099                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64100                 strb(condition,
64101                      Best,
64102                      Register(rt),
64103                      MemOperand(Register(rn),
64104                                 sign,
64105                                 Register(rm),
64106                                 shift,
64107                                 amount,
64108                                 addrmode));
64109                 break;
64110               }
64111               case 0x00100000: {
64112                 // 0x07500000
64113                 if (((instr & 0xf0000000) == 0xf0000000)) {
64114                   UnallocatedA32(instr);
64115                   return;
64116                 }
64117                 Condition condition((instr >> 28) & 0xf);
64118                 unsigned rt = (instr >> 12) & 0xf;
64119                 unsigned rn = (instr >> 16) & 0xf;
64120                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64121                 unsigned rm = instr & 0xf;
64122                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64123                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64124                                                     (imm_and_type_ & 0x7c) >>
64125                                                         2);
64126                 Shift shift = shift_operand.GetShift();
64127                 uint32_t amount = shift_operand.GetAmount();
64128                 AddrMode addrmode = Offset;
64129                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64130                 ldrb(condition,
64131                      Best,
64132                      Register(rt),
64133                      MemOperand(Register(rn),
64134                                 sign,
64135                                 Register(rm),
64136                                 shift,
64137                                 amount,
64138                                 addrmode));
64139                 break;
64140               }
64141             }
64142             break;
64143           }
64144           case 0x01400010: {
64145             // 0x07400010
64146             switch (instr & 0x00800060) {
64147               case 0x00000000: {
64148                 // 0x07400010
64149                 switch (instr & 0x00100080) {
64150                   case 0x00000000: {
64151                     // 0x07400010
64152                     if (((instr & 0xf0000000) == 0xf0000000)) {
64153                       UnallocatedA32(instr);
64154                       return;
64155                     }
64156                     Condition condition((instr >> 28) & 0xf);
64157                     unsigned rdlo = (instr >> 12) & 0xf;
64158                     unsigned rdhi = (instr >> 16) & 0xf;
64159                     unsigned rn = instr & 0xf;
64160                     unsigned rm = (instr >> 8) & 0xf;
64161                     // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64162                     smlald(condition,
64163                            Register(rdlo),
64164                            Register(rdhi),
64165                            Register(rn),
64166                            Register(rm));
64167                     break;
64168                   }
64169                   case 0x00100000: {
64170                     // 0x07500010
64171                     switch (instr & 0x0000f000) {
64172                       case 0x0000f000: {
64173                         // 0x0750f010
64174                         if (((instr & 0xf0000000) == 0xf0000000)) {
64175                           UnallocatedA32(instr);
64176                           return;
64177                         }
64178                         Condition condition((instr >> 28) & 0xf);
64179                         unsigned rd = (instr >> 16) & 0xf;
64180                         unsigned rn = instr & 0xf;
64181                         unsigned rm = (instr >> 8) & 0xf;
64182                         // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64183                         smmul(condition,
64184                               Register(rd),
64185                               Register(rn),
64186                               Register(rm));
64187                         break;
64188                       }
64189                       default: {
64190                         if (((instr & 0xf0000000) == 0xf0000000) ||
64191                             ((instr & 0xf000) == 0xf000)) {
64192                           UnallocatedA32(instr);
64193                           return;
64194                         }
64195                         Condition condition((instr >> 28) & 0xf);
64196                         unsigned rd = (instr >> 16) & 0xf;
64197                         unsigned rn = instr & 0xf;
64198                         unsigned rm = (instr >> 8) & 0xf;
64199                         unsigned ra = (instr >> 12) & 0xf;
64200                         // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64201                         smmla(condition,
64202                               Register(rd),
64203                               Register(rn),
64204                               Register(rm),
64205                               Register(ra));
64206                         break;
64207                       }
64208                     }
64209                     break;
64210                   }
64211                   default:
64212                     UnallocatedA32(instr);
64213                     break;
64214                 }
64215                 break;
64216               }
64217               case 0x00000020: {
64218                 // 0x07400030
64219                 switch (instr & 0x00100080) {
64220                   case 0x00000000: {
64221                     // 0x07400030
64222                     if (((instr & 0xf0000000) == 0xf0000000)) {
64223                       UnallocatedA32(instr);
64224                       return;
64225                     }
64226                     Condition condition((instr >> 28) & 0xf);
64227                     unsigned rdlo = (instr >> 12) & 0xf;
64228                     unsigned rdhi = (instr >> 16) & 0xf;
64229                     unsigned rn = instr & 0xf;
64230                     unsigned rm = (instr >> 8) & 0xf;
64231                     // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64232                     smlaldx(condition,
64233                             Register(rdlo),
64234                             Register(rdhi),
64235                             Register(rn),
64236                             Register(rm));
64237                     break;
64238                   }
64239                   case 0x00100000: {
64240                     // 0x07500030
64241                     switch (instr & 0x0000f000) {
64242                       case 0x0000f000: {
64243                         // 0x0750f030
64244                         if (((instr & 0xf0000000) == 0xf0000000)) {
64245                           UnallocatedA32(instr);
64246                           return;
64247                         }
64248                         Condition condition((instr >> 28) & 0xf);
64249                         unsigned rd = (instr >> 16) & 0xf;
64250                         unsigned rn = instr & 0xf;
64251                         unsigned rm = (instr >> 8) & 0xf;
64252                         // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64253                         smmulr(condition,
64254                                Register(rd),
64255                                Register(rn),
64256                                Register(rm));
64257                         break;
64258                       }
64259                       default: {
64260                         if (((instr & 0xf0000000) == 0xf0000000) ||
64261                             ((instr & 0xf000) == 0xf000)) {
64262                           UnallocatedA32(instr);
64263                           return;
64264                         }
64265                         Condition condition((instr >> 28) & 0xf);
64266                         unsigned rd = (instr >> 16) & 0xf;
64267                         unsigned rn = instr & 0xf;
64268                         unsigned rm = (instr >> 8) & 0xf;
64269                         unsigned ra = (instr >> 12) & 0xf;
64270                         // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64271                         smmlar(condition,
64272                                Register(rd),
64273                                Register(rn),
64274                                Register(rm),
64275                                Register(ra));
64276                         break;
64277                       }
64278                     }
64279                     break;
64280                   }
64281                   default:
64282                     UnallocatedA32(instr);
64283                     break;
64284                 }
64285                 break;
64286               }
64287               case 0x00000040: {
64288                 // 0x07400050
64289                 switch (instr & 0x00100080) {
64290                   case 0x00000000: {
64291                     // 0x07400050
64292                     if (((instr & 0xf0000000) == 0xf0000000)) {
64293                       UnallocatedA32(instr);
64294                       return;
64295                     }
64296                     Condition condition((instr >> 28) & 0xf);
64297                     unsigned rdlo = (instr >> 12) & 0xf;
64298                     unsigned rdhi = (instr >> 16) & 0xf;
64299                     unsigned rn = instr & 0xf;
64300                     unsigned rm = (instr >> 8) & 0xf;
64301                     // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64302                     smlsld(condition,
64303                            Register(rdlo),
64304                            Register(rdhi),
64305                            Register(rn),
64306                            Register(rm));
64307                     break;
64308                   }
64309                   case 0x00100080: {
64310                     // 0x075000d0
64311                     if (((instr & 0xf0000000) == 0xf0000000)) {
64312                       UnallocatedA32(instr);
64313                       return;
64314                     }
64315                     Condition condition((instr >> 28) & 0xf);
64316                     unsigned rd = (instr >> 16) & 0xf;
64317                     unsigned rn = instr & 0xf;
64318                     unsigned rm = (instr >> 8) & 0xf;
64319                     unsigned ra = (instr >> 12) & 0xf;
64320                     // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64321                     smmls(condition,
64322                           Register(rd),
64323                           Register(rn),
64324                           Register(rm),
64325                           Register(ra));
64326                     break;
64327                   }
64328                   default:
64329                     UnallocatedA32(instr);
64330                     break;
64331                 }
64332                 break;
64333               }
64334               case 0x00000060: {
64335                 // 0x07400070
64336                 switch (instr & 0x00100080) {
64337                   case 0x00000000: {
64338                     // 0x07400070
64339                     if (((instr & 0xf0000000) == 0xf0000000)) {
64340                       UnallocatedA32(instr);
64341                       return;
64342                     }
64343                     Condition condition((instr >> 28) & 0xf);
64344                     unsigned rdlo = (instr >> 12) & 0xf;
64345                     unsigned rdhi = (instr >> 16) & 0xf;
64346                     unsigned rn = instr & 0xf;
64347                     unsigned rm = (instr >> 8) & 0xf;
64348                     // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64349                     smlsldx(condition,
64350                             Register(rdlo),
64351                             Register(rdhi),
64352                             Register(rn),
64353                             Register(rm));
64354                     break;
64355                   }
64356                   case 0x00100080: {
64357                     // 0x075000f0
64358                     if (((instr & 0xf0000000) == 0xf0000000)) {
64359                       UnallocatedA32(instr);
64360                       return;
64361                     }
64362                     Condition condition((instr >> 28) & 0xf);
64363                     unsigned rd = (instr >> 16) & 0xf;
64364                     unsigned rn = instr & 0xf;
64365                     unsigned rm = (instr >> 8) & 0xf;
64366                     unsigned ra = (instr >> 12) & 0xf;
64367                     // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64368                     smmlsr(condition,
64369                            Register(rd),
64370                            Register(rn),
64371                            Register(rm),
64372                            Register(ra));
64373                     break;
64374                   }
64375                   default:
64376                     UnallocatedA32(instr);
64377                     break;
64378                 }
64379                 break;
64380               }
64381               case 0x00800000: {
64382                 // 0x07c00010
64383                 switch (instr & 0x0000000f) {
64384                   case 0x0000000f: {
64385                     // 0x07c0001f
64386                     if (((instr & 0xf0000000) == 0xf0000000)) {
64387                       UnallocatedA32(instr);
64388                       return;
64389                     }
64390                     Condition condition((instr >> 28) & 0xf);
64391                     unsigned rd = (instr >> 12) & 0xf;
64392                     uint32_t lsb = (instr >> 7) & 0x1f;
64393                     uint32_t msb = (instr >> 16) & 0x1f;
64394                     uint32_t width = msb - lsb + 1;
64395                     // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1
64396                     bfc(condition, Register(rd), lsb, width);
64397                     break;
64398                   }
64399                   default: {
64400                     if (((instr & 0xf0000000) == 0xf0000000) ||
64401                         ((instr & 0xf) == 0xf)) {
64402                       UnallocatedA32(instr);
64403                       return;
64404                     }
64405                     Condition condition((instr >> 28) & 0xf);
64406                     unsigned rd = (instr >> 12) & 0xf;
64407                     unsigned rn = instr & 0xf;
64408                     uint32_t lsb = (instr >> 7) & 0x1f;
64409                     uint32_t msb = (instr >> 16) & 0x1f;
64410                     uint32_t width = msb - lsb + 1;
64411                     // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64412                     bfi(condition, Register(rd), Register(rn), lsb, width);
64413                     break;
64414                   }
64415                 }
64416                 break;
64417               }
64418               default:
64419                 UnallocatedA32(instr);
64420                 break;
64421             }
64422             break;
64423           }
64424           case 0x01600000: {
64425             // 0x07600000
64426             switch (instr & 0x00100000) {
64427               case 0x00000000: {
64428                 // 0x07600000
64429                 if (((instr & 0xf0000000) == 0xf0000000)) {
64430                   UnallocatedA32(instr);
64431                   return;
64432                 }
64433                 Condition condition((instr >> 28) & 0xf);
64434                 unsigned rt = (instr >> 12) & 0xf;
64435                 unsigned rn = (instr >> 16) & 0xf;
64436                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64437                 unsigned rm = instr & 0xf;
64438                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64439                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64440                                                     (imm_and_type_ & 0x7c) >>
64441                                                         2);
64442                 Shift shift = shift_operand.GetShift();
64443                 uint32_t amount = shift_operand.GetAmount();
64444                 AddrMode addrmode = PreIndex;
64445                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64446                 strb(condition,
64447                      Best,
64448                      Register(rt),
64449                      MemOperand(Register(rn),
64450                                 sign,
64451                                 Register(rm),
64452                                 shift,
64453                                 amount,
64454                                 addrmode));
64455                 break;
64456               }
64457               case 0x00100000: {
64458                 // 0x07700000
64459                 if (((instr & 0xf0000000) == 0xf0000000)) {
64460                   UnallocatedA32(instr);
64461                   return;
64462                 }
64463                 Condition condition((instr >> 28) & 0xf);
64464                 unsigned rt = (instr >> 12) & 0xf;
64465                 unsigned rn = (instr >> 16) & 0xf;
64466                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64467                 unsigned rm = instr & 0xf;
64468                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64469                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64470                                                     (imm_and_type_ & 0x7c) >>
64471                                                         2);
64472                 Shift shift = shift_operand.GetShift();
64473                 uint32_t amount = shift_operand.GetAmount();
64474                 AddrMode addrmode = PreIndex;
64475                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64476                 ldrb(condition,
64477                      Best,
64478                      Register(rt),
64479                      MemOperand(Register(rn),
64480                                 sign,
64481                                 Register(rm),
64482                                 shift,
64483                                 amount,
64484                                 addrmode));
64485                 break;
64486               }
64487             }
64488             break;
64489           }
64490           case 0x01600010: {
64491             // 0x07600010
64492             switch (instr & 0x00800060) {
64493               case 0x00800040: {
64494                 // 0x07e00050
64495                 if (((instr & 0xf0000000) == 0xf0000000)) {
64496                   UnallocatedA32(instr);
64497                   return;
64498                 }
64499                 Condition condition((instr >> 28) & 0xf);
64500                 unsigned rd = (instr >> 12) & 0xf;
64501                 unsigned rn = instr & 0xf;
64502                 uint32_t lsb = (instr >> 7) & 0x1f;
64503                 uint32_t widthm1 = (instr >> 16) & 0x1f;
64504                 uint32_t width = widthm1 + 1;
64505                 // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64506                 ubfx(condition, Register(rd), Register(rn), lsb, width);
64507                 break;
64508               }
64509               case 0x00800060: {
64510                 // 0x07e00070
64511                 if ((instr & 0xf0100080) == 0xe0100080) {
64512                   uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
64513                   // UDF{<c>}{<q>} {#}<imm> ; A1
64514                   udf(al, Best, imm);
64515                 } else {
64516                   UnallocatedA32(instr);
64517                 }
64518                 break;
64519               }
64520               default:
64521                 UnallocatedA32(instr);
64522                 break;
64523             }
64524             break;
64525           }
64526         }
64527         break;
64528       }
64529       case 0x08000000: {
64530         // 0x08000000
64531         switch (instr & 0x00500000) {
64532           case 0x00000000: {
64533             // 0x08000000
64534             switch (instr & 0x01800000) {
64535               case 0x00000000: {
64536                 // 0x08000000
64537                 if (((instr & 0xf0000000) == 0xf0000000)) {
64538                   UnallocatedA32(instr);
64539                   return;
64540                 }
64541                 Condition condition((instr >> 28) & 0xf);
64542                 unsigned rn = (instr >> 16) & 0xf;
64543                 WriteBack write_back((instr >> 21) & 0x1);
64544                 RegisterList registers((instr & 0xffff));
64545                 // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
64546                 stmda(condition, Register(rn), write_back, registers);
64547                 break;
64548               }
64549               case 0x00800000: {
64550                 // 0x08800000
64551                 if (((instr & 0xf0000000) == 0xf0000000)) {
64552                   UnallocatedA32(instr);
64553                   return;
64554                 }
64555                 Condition condition((instr >> 28) & 0xf);
64556                 unsigned rn = (instr >> 16) & 0xf;
64557                 WriteBack write_back((instr >> 21) & 0x1);
64558                 RegisterList registers((instr & 0xffff));
64559                 // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1
64560                 stm(condition, Best, Register(rn), write_back, registers);
64561                 break;
64562               }
64563               case 0x01000000: {
64564                 // 0x09000000
64565                 if (((instr & 0xf0000000) == 0xf0000000)) {
64566                   UnallocatedA32(instr);
64567                   return;
64568                 }
64569                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
64570                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
64571                     ((instr & 0xf0000000) != 0xf0000000) &&
64572                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
64573                   Condition condition((instr >> 28) & 0xf);
64574                   RegisterList registers((instr & 0xffff));
64575                   // PUSH{<c>}{<q>} <registers> ; A1
64576                   push(condition, Best, registers);
64577                   return;
64578                 }
64579                 Condition condition((instr >> 28) & 0xf);
64580                 unsigned rn = (instr >> 16) & 0xf;
64581                 WriteBack write_back((instr >> 21) & 0x1);
64582                 RegisterList registers((instr & 0xffff));
64583                 // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64584                 stmdb(condition, Best, Register(rn), write_back, registers);
64585                 break;
64586               }
64587               case 0x01800000: {
64588                 // 0x09800000
64589                 if (((instr & 0xf0000000) == 0xf0000000)) {
64590                   UnallocatedA32(instr);
64591                   return;
64592                 }
64593                 Condition condition((instr >> 28) & 0xf);
64594                 unsigned rn = (instr >> 16) & 0xf;
64595                 WriteBack write_back((instr >> 21) & 0x1);
64596                 RegisterList registers((instr & 0xffff));
64597                 // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64598                 stmib(condition, Register(rn), write_back, registers);
64599                 break;
64600               }
64601             }
64602             break;
64603           }
64604           case 0x00100000: {
64605             // 0x08100000
64606             switch (instr & 0x01800000) {
64607               case 0x00000000: {
64608                 // 0x08100000
64609                 if (((instr & 0xf0000000) == 0xf0000000)) {
64610                   UnallocatedA32(instr);
64611                   return;
64612                 }
64613                 Condition condition((instr >> 28) & 0xf);
64614                 unsigned rn = (instr >> 16) & 0xf;
64615                 WriteBack write_back((instr >> 21) & 0x1);
64616                 RegisterList registers((instr & 0xffff));
64617                 // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
64618                 ldmda(condition, Register(rn), write_back, registers);
64619                 break;
64620               }
64621               case 0x00800000: {
64622                 // 0x08900000
64623                 if (((instr & 0xf0000000) == 0xf0000000)) {
64624                   UnallocatedA32(instr);
64625                   return;
64626                 }
64627                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
64628                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
64629                     ((instr & 0xf0000000) != 0xf0000000) &&
64630                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
64631                   Condition condition((instr >> 28) & 0xf);
64632                   RegisterList registers((instr & 0xffff));
64633                   // POP{<c>}{<q>} <registers> ; A1
64634                   pop(condition, Best, registers);
64635                   return;
64636                 }
64637                 Condition condition((instr >> 28) & 0xf);
64638                 unsigned rn = (instr >> 16) & 0xf;
64639                 WriteBack write_back((instr >> 21) & 0x1);
64640                 RegisterList registers((instr & 0xffff));
64641                 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1
64642                 ldm(condition, Best, Register(rn), write_back, registers);
64643                 break;
64644               }
64645               case 0x01000000: {
64646                 // 0x09100000
64647                 if (((instr & 0xf0000000) == 0xf0000000)) {
64648                   UnallocatedA32(instr);
64649                   return;
64650                 }
64651                 Condition condition((instr >> 28) & 0xf);
64652                 unsigned rn = (instr >> 16) & 0xf;
64653                 WriteBack write_back((instr >> 21) & 0x1);
64654                 RegisterList registers((instr & 0xffff));
64655                 // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64656                 ldmdb(condition, Register(rn), write_back, registers);
64657                 break;
64658               }
64659               case 0x01800000: {
64660                 // 0x09900000
64661                 if (((instr & 0xf0000000) == 0xf0000000)) {
64662                   UnallocatedA32(instr);
64663                   return;
64664                 }
64665                 Condition condition((instr >> 28) & 0xf);
64666                 unsigned rn = (instr >> 16) & 0xf;
64667                 WriteBack write_back((instr >> 21) & 0x1);
64668                 RegisterList registers((instr & 0xffff));
64669                 // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64670                 ldmib(condition, Register(rn), write_back, registers);
64671                 break;
64672               }
64673             }
64674             break;
64675           }
64676           case 0x00400000: {
64677             // 0x08400000
64678             if (((instr & 0xf0000000) == 0xf0000000)) {
64679               UnallocatedA32(instr);
64680               return;
64681             }
64682             UnimplementedA32("STM", instr);
64683             break;
64684           }
64685           case 0x00500000: {
64686             // 0x08500000
64687             switch (instr & 0x00008000) {
64688               case 0x00000000: {
64689                 // 0x08500000
64690                 if (((instr & 0xf0000000) == 0xf0000000)) {
64691                   UnallocatedA32(instr);
64692                   return;
64693                 }
64694                 UnimplementedA32("LDM", instr);
64695                 break;
64696               }
64697               case 0x00008000: {
64698                 // 0x08508000
64699                 if (((instr & 0xf0000000) == 0xf0000000)) {
64700                   UnallocatedA32(instr);
64701                   return;
64702                 }
64703                 UnimplementedA32("LDM", instr);
64704                 break;
64705               }
64706             }
64707             break;
64708           }
64709         }
64710         break;
64711       }
64712       case 0x0a000000: {
64713         // 0x0a000000
64714         switch (instr & 0x01000000) {
64715           case 0x00000000: {
64716             // 0x0a000000
64717             if (((instr & 0xf0000000) == 0xf0000000)) {
64718               UnallocatedA32(instr);
64719               return;
64720             }
64721             Condition condition((instr >> 28) & 0xf);
64722             int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26);
64723             Location location(imm, kA32PcDelta);
64724             // B{<c>}{<q>} <label> ; A1
64725             b(condition, Best, &location);
64726             break;
64727           }
64728           case 0x01000000: {
64729             // 0x0b000000
64730             if (((instr & 0xf0000000) == 0xf0000000)) {
64731               UnallocatedA32(instr);
64732               return;
64733             }
64734             Condition condition((instr >> 28) & 0xf);
64735             int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26);
64736             Location location(imm, kA32PcDelta);
64737             // BL{<c>}{<q>} <label> ; A1
64738             bl(condition, &location);
64739             break;
64740           }
64741         }
64742         break;
64743       }
64744       case 0x0c000000: {
64745         // 0x0c000000
64746         switch (instr & 0x01100e00) {
64747           case 0x00000a00: {
64748             // 0x0c000a00
64749             switch (instr & 0x00800100) {
64750               case 0x00000000: {
64751                 // 0x0c000a00
64752                 if ((instr & 0x006000d0) == 0x00400010) {
64753                   if (((instr & 0xf0000000) == 0xf0000000)) {
64754                     UnallocatedA32(instr);
64755                     return;
64756                   }
64757                   Condition condition((instr >> 28) & 0xf);
64758                   unsigned rm = ExtractSRegister(instr, 5, 0);
64759                   unsigned rt = (instr >> 12) & 0xf;
64760                   unsigned rt2 = (instr >> 16) & 0xf;
64761                   // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1
64762                   vmov(condition,
64763                        SRegister(rm),
64764                        SRegister(rm + 1),
64765                        Register(rt),
64766                        Register(rt2));
64767                 } else {
64768                   UnallocatedA32(instr);
64769                 }
64770                 break;
64771               }
64772               case 0x00000100: {
64773                 // 0x0c000b00
64774                 if ((instr & 0x006000d0) == 0x00400010) {
64775                   if (((instr & 0xf0000000) == 0xf0000000)) {
64776                     UnallocatedA32(instr);
64777                     return;
64778                   }
64779                   Condition condition((instr >> 28) & 0xf);
64780                   unsigned rm = ExtractDRegister(instr, 5, 0);
64781                   unsigned rt = (instr >> 12) & 0xf;
64782                   unsigned rt2 = (instr >> 16) & 0xf;
64783                   // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1
64784                   vmov(condition, DRegister(rm), Register(rt), Register(rt2));
64785                 } else {
64786                   UnallocatedA32(instr);
64787                 }
64788                 break;
64789               }
64790               case 0x00800000: {
64791                 // 0x0c800a00
64792                 if (((instr & 0xf0000000) == 0xf0000000)) {
64793                   UnallocatedA32(instr);
64794                   return;
64795                 }
64796                 Condition condition((instr >> 28) & 0xf);
64797                 unsigned rn = (instr >> 16) & 0xf;
64798                 WriteBack write_back((instr >> 21) & 0x1);
64799                 unsigned first = ExtractSRegister(instr, 22, 12);
64800                 unsigned len = instr & 0xff;
64801                 // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
64802                 vstm(condition,
64803                      kDataTypeValueNone,
64804                      Register(rn),
64805                      write_back,
64806                      SRegisterList(SRegister(first), len));
64807                 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
64808                   UnpredictableA32(instr);
64809                 }
64810                 break;
64811               }
64812               case 0x00800100: {
64813                 // 0x0c800b00
64814                 switch (instr & 0x00000001) {
64815                   case 0x00000000: {
64816                     // 0x0c800b00
64817                     if (((instr & 0xf0000000) == 0xf0000000)) {
64818                       UnallocatedA32(instr);
64819                       return;
64820                     }
64821                     Condition condition((instr >> 28) & 0xf);
64822                     unsigned rn = (instr >> 16) & 0xf;
64823                     WriteBack write_back((instr >> 21) & 0x1);
64824                     unsigned first = ExtractDRegister(instr, 22, 12);
64825                     unsigned imm8 = (instr & 0xff);
64826                     unsigned len = imm8 / 2;
64827                     unsigned end = first + len;
64828                     // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
64829                     vstm(condition,
64830                          kDataTypeValueNone,
64831                          Register(rn),
64832                          write_back,
64833                          DRegisterList(DRegister(first), len));
64834                     if ((len == 0) || (len > 16) ||
64835                         (end > kMaxNumberOfDRegisters)) {
64836                       UnpredictableA32(instr);
64837                     }
64838                     break;
64839                   }
64840                   case 0x00000001: {
64841                     // 0x0c800b01
64842                     if (((instr & 0xf0000000) == 0xf0000000)) {
64843                       UnallocatedA32(instr);
64844                       return;
64845                     }
64846                     Condition condition((instr >> 28) & 0xf);
64847                     unsigned rn = (instr >> 16) & 0xf;
64848                     WriteBack write_back((instr >> 21) & 0x1);
64849                     unsigned first = ExtractDRegister(instr, 22, 12);
64850                     unsigned imm8 = (instr & 0xff);
64851                     unsigned len = imm8 / 2;
64852                     unsigned end = first + len;
64853                     // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
64854                     fstmiax(condition,
64855                             Register(rn),
64856                             write_back,
64857                             DRegisterList(DRegister(first), len));
64858                     if ((len == 0) || (len > 16) || (end > 16)) {
64859                       UnpredictableA32(instr);
64860                     }
64861                     break;
64862                   }
64863                 }
64864                 break;
64865               }
64866             }
64867             break;
64868           }
64869           case 0x00000e00: {
64870             // 0x0c000e00
64871             switch (instr & 0x00600000) {
64872               case 0x00000000: {
64873                 // 0x0c000e00
64874                 if ((instr & 0x0080f100) == 0x00805000) {
64875                   if (((instr & 0xf0000000) == 0xf0000000)) {
64876                     UnallocatedA32(instr);
64877                     return;
64878                   }
64879                   UnimplementedA32("STC", instr);
64880                 } else {
64881                   UnallocatedA32(instr);
64882                 }
64883                 break;
64884               }
64885               case 0x00200000: {
64886                 // 0x0c200e00
64887                 if ((instr & 0x0000f100) == 0x00005000) {
64888                   if (((instr & 0xf0000000) == 0xf0000000)) {
64889                     UnallocatedA32(instr);
64890                     return;
64891                   }
64892                   UnimplementedA32("STC", instr);
64893                 } else {
64894                   UnallocatedA32(instr);
64895                 }
64896                 break;
64897               }
64898               case 0x00400000: {
64899                 // 0x0c400e00
64900                 if ((instr & 0x00800000) == 0x00000000) {
64901                   if (((instr & 0xf0000000) == 0xf0000000)) {
64902                     UnallocatedA32(instr);
64903                     return;
64904                   }
64905                   UnimplementedA32("MCRR", instr);
64906                 } else {
64907                   UnallocatedA32(instr);
64908                 }
64909                 break;
64910               }
64911               default:
64912                 UnallocatedA32(instr);
64913                 break;
64914             }
64915             break;
64916           }
64917           case 0x00100a00: {
64918             // 0x0c100a00
64919             switch (instr & 0x00800100) {
64920               case 0x00000000: {
64921                 // 0x0c100a00
64922                 if ((instr & 0x006000d0) == 0x00400010) {
64923                   if (((instr & 0xf0000000) == 0xf0000000)) {
64924                     UnallocatedA32(instr);
64925                     return;
64926                   }
64927                   Condition condition((instr >> 28) & 0xf);
64928                   unsigned rt = (instr >> 12) & 0xf;
64929                   unsigned rt2 = (instr >> 16) & 0xf;
64930                   unsigned rm = ExtractSRegister(instr, 5, 0);
64931                   // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1
64932                   vmov(condition,
64933                        Register(rt),
64934                        Register(rt2),
64935                        SRegister(rm),
64936                        SRegister(rm + 1));
64937                 } else {
64938                   UnallocatedA32(instr);
64939                 }
64940                 break;
64941               }
64942               case 0x00000100: {
64943                 // 0x0c100b00
64944                 if ((instr & 0x006000d0) == 0x00400010) {
64945                   if (((instr & 0xf0000000) == 0xf0000000)) {
64946                     UnallocatedA32(instr);
64947                     return;
64948                   }
64949                   Condition condition((instr >> 28) & 0xf);
64950                   unsigned rt = (instr >> 12) & 0xf;
64951                   unsigned rt2 = (instr >> 16) & 0xf;
64952                   unsigned rm = ExtractDRegister(instr, 5, 0);
64953                   // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1
64954                   vmov(condition, Register(rt), Register(rt2), DRegister(rm));
64955                 } else {
64956                   UnallocatedA32(instr);
64957                 }
64958                 break;
64959               }
64960               case 0x00800000: {
64961                 // 0x0c900a00
64962                 if (((instr & 0xf0000000) == 0xf0000000)) {
64963                   UnallocatedA32(instr);
64964                   return;
64965                 }
64966                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
64967                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
64968                     ((instr & 0xf0000000) != 0xf0000000)) {
64969                   Condition condition((instr >> 28) & 0xf);
64970                   unsigned first = ExtractSRegister(instr, 22, 12);
64971                   unsigned len = instr & 0xff;
64972                   // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2
64973                   vpop(condition,
64974                        kDataTypeValueNone,
64975                        SRegisterList(SRegister(first), len));
64976                   if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
64977                     UnpredictableA32(instr);
64978                   }
64979                   return;
64980                 }
64981                 Condition condition((instr >> 28) & 0xf);
64982                 unsigned rn = (instr >> 16) & 0xf;
64983                 WriteBack write_back((instr >> 21) & 0x1);
64984                 unsigned first = ExtractSRegister(instr, 22, 12);
64985                 unsigned len = instr & 0xff;
64986                 // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
64987                 vldm(condition,
64988                      kDataTypeValueNone,
64989                      Register(rn),
64990                      write_back,
64991                      SRegisterList(SRegister(first), len));
64992                 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
64993                   UnpredictableA32(instr);
64994                 }
64995                 break;
64996               }
64997               case 0x00800100: {
64998                 // 0x0c900b00
64999                 switch (instr & 0x00000001) {
65000                   case 0x00000000: {
65001                     // 0x0c900b00
65002                     if (((instr & 0xf0000000) == 0xf0000000)) {
65003                       UnallocatedA32(instr);
65004                       return;
65005                     }
65006                     if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
65007                          Uint32(0x1)) &&
65008                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
65009                          Uint32(0xd)) &&
65010                         ((instr & 0xf0000000) != 0xf0000000)) {
65011                       Condition condition((instr >> 28) & 0xf);
65012                       unsigned first = ExtractDRegister(instr, 22, 12);
65013                       unsigned imm8 = (instr & 0xff);
65014                       unsigned len = imm8 / 2;
65015                       unsigned end = first + len;
65016                       // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1
65017                       vpop(condition,
65018                            kDataTypeValueNone,
65019                            DRegisterList(DRegister(first), len));
65020                       if ((len == 0) || (len > 16) ||
65021                           (end > kMaxNumberOfDRegisters)) {
65022                         UnpredictableA32(instr);
65023                       }
65024                       return;
65025                     }
65026                     Condition condition((instr >> 28) & 0xf);
65027                     unsigned rn = (instr >> 16) & 0xf;
65028                     WriteBack write_back((instr >> 21) & 0x1);
65029                     unsigned first = ExtractDRegister(instr, 22, 12);
65030                     unsigned imm8 = (instr & 0xff);
65031                     unsigned len = imm8 / 2;
65032                     unsigned end = first + len;
65033                     // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
65034                     vldm(condition,
65035                          kDataTypeValueNone,
65036                          Register(rn),
65037                          write_back,
65038                          DRegisterList(DRegister(first), len));
65039                     if ((len == 0) || (len > 16) ||
65040                         (end > kMaxNumberOfDRegisters)) {
65041                       UnpredictableA32(instr);
65042                     }
65043                     break;
65044                   }
65045                   case 0x00000001: {
65046                     // 0x0c900b01
65047                     if (((instr & 0xf0000000) == 0xf0000000)) {
65048                       UnallocatedA32(instr);
65049                       return;
65050                     }
65051                     Condition condition((instr >> 28) & 0xf);
65052                     unsigned rn = (instr >> 16) & 0xf;
65053                     WriteBack write_back((instr >> 21) & 0x1);
65054                     unsigned first = ExtractDRegister(instr, 22, 12);
65055                     unsigned imm8 = (instr & 0xff);
65056                     unsigned len = imm8 / 2;
65057                     unsigned end = first + len;
65058                     // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
65059                     fldmiax(condition,
65060                             Register(rn),
65061                             write_back,
65062                             DRegisterList(DRegister(first), len));
65063                     if ((len == 0) || (len > 16) || (end > 16)) {
65064                       UnpredictableA32(instr);
65065                     }
65066                     break;
65067                   }
65068                 }
65069                 break;
65070               }
65071             }
65072             break;
65073           }
65074           case 0x00100e00: {
65075             // 0x0c100e00
65076             switch (instr & 0x00600000) {
65077               case 0x00000000: {
65078                 // 0x0c100e00
65079                 switch (instr & 0x0080f100) {
65080                   case 0x00805000: {
65081                     // 0x0c905e00
65082                     switch (instr & 0x000f0000) {
65083                       case 0x000f0000: {
65084                         // 0x0c9f5e00
65085                         if (((instr & 0xf0000000) == 0xf0000000)) {
65086                           UnallocatedA32(instr);
65087                           return;
65088                         }
65089                         UnimplementedA32("LDC", instr);
65090                         break;
65091                       }
65092                       default: {
65093                         if (((instr & 0xf0000000) == 0xf0000000) ||
65094                             ((instr & 0xf0000) == 0xf0000)) {
65095                           UnallocatedA32(instr);
65096                           return;
65097                         }
65098                         UnimplementedA32("LDC", instr);
65099                         break;
65100                       }
65101                     }
65102                     break;
65103                   }
65104                   default:
65105                     UnallocatedA32(instr);
65106                     break;
65107                 }
65108                 break;
65109               }
65110               case 0x00200000: {
65111                 // 0x0c300e00
65112                 if ((instr & 0x0000f100) == 0x00005000) {
65113                   if (((instr & 0xf0000000) == 0xf0000000) ||
65114                       ((instr & 0xf0000) == 0xf0000)) {
65115                     UnallocatedA32(instr);
65116                     return;
65117                   }
65118                   UnimplementedA32("LDC", instr);
65119                 } else {
65120                   UnallocatedA32(instr);
65121                 }
65122                 break;
65123               }
65124               case 0x00400000: {
65125                 // 0x0c500e00
65126                 if ((instr & 0x00800000) == 0x00000000) {
65127                   if (((instr & 0xf0000000) == 0xf0000000)) {
65128                     UnallocatedA32(instr);
65129                     return;
65130                   }
65131                   UnimplementedA32("MRRC", instr);
65132                 } else {
65133                   UnallocatedA32(instr);
65134                 }
65135                 break;
65136               }
65137               default:
65138                 UnallocatedA32(instr);
65139                 break;
65140             }
65141             break;
65142           }
65143           case 0x01000a00: {
65144             // 0x0d000a00
65145             switch (instr & 0x00200100) {
65146               case 0x00000000: {
65147                 // 0x0d000a00
65148                 if (((instr & 0xf0000000) == 0xf0000000)) {
65149                   UnallocatedA32(instr);
65150                   return;
65151                 }
65152                 Condition condition((instr >> 28) & 0xf);
65153                 unsigned rd = ExtractSRegister(instr, 22, 12);
65154                 unsigned rn = (instr >> 16) & 0xf;
65155                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65156                 int32_t offset = (instr & 0xff) << 2;
65157                 // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
65158                 vstr(condition,
65159                      Untyped32,
65160                      SRegister(rd),
65161                      MemOperand(Register(rn), sign, offset, Offset));
65162                 break;
65163               }
65164               case 0x00000100: {
65165                 // 0x0d000b00
65166                 if (((instr & 0xf0000000) == 0xf0000000)) {
65167                   UnallocatedA32(instr);
65168                   return;
65169                 }
65170                 Condition condition((instr >> 28) & 0xf);
65171                 unsigned rd = ExtractDRegister(instr, 22, 12);
65172                 unsigned rn = (instr >> 16) & 0xf;
65173                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65174                 int32_t offset = (instr & 0xff) << 2;
65175                 // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
65176                 vstr(condition,
65177                      Untyped64,
65178                      DRegister(rd),
65179                      MemOperand(Register(rn), sign, offset, Offset));
65180                 break;
65181               }
65182               case 0x00200000: {
65183                 // 0x0d200a00
65184                 if ((instr & 0x00800000) == 0x00000000) {
65185                   if (((instr & 0xf0000000) == 0xf0000000)) {
65186                     UnallocatedA32(instr);
65187                     return;
65188                   }
65189                   if (((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
65190                       ((instr & 0xf0000000) != 0xf0000000)) {
65191                     Condition condition((instr >> 28) & 0xf);
65192                     unsigned first = ExtractSRegister(instr, 22, 12);
65193                     unsigned len = instr & 0xff;
65194                     // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2
65195                     vpush(condition,
65196                           kDataTypeValueNone,
65197                           SRegisterList(SRegister(first), len));
65198                     if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65199                       UnpredictableA32(instr);
65200                     }
65201                     return;
65202                   }
65203                   Condition condition((instr >> 28) & 0xf);
65204                   unsigned rn = (instr >> 16) & 0xf;
65205                   unsigned first = ExtractSRegister(instr, 22, 12);
65206                   unsigned len = instr & 0xff;
65207                   // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
65208                   vstmdb(condition,
65209                          kDataTypeValueNone,
65210                          Register(rn),
65211                          WriteBack(WRITE_BACK),
65212                          SRegisterList(SRegister(first), len));
65213                   if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65214                     UnpredictableA32(instr);
65215                   }
65216                 } else {
65217                   UnallocatedA32(instr);
65218                 }
65219                 break;
65220               }
65221               case 0x00200100: {
65222                 // 0x0d200b00
65223                 switch (instr & 0x00800001) {
65224                   case 0x00000000: {
65225                     // 0x0d200b00
65226                     if (((instr & 0xf0000000) == 0xf0000000)) {
65227                       UnallocatedA32(instr);
65228                       return;
65229                     }
65230                     if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
65231                          Uint32(0xd)) &&
65232                         ((instr & 0xf0000000) != 0xf0000000)) {
65233                       Condition condition((instr >> 28) & 0xf);
65234                       unsigned first = ExtractDRegister(instr, 22, 12);
65235                       unsigned imm8 = (instr & 0xff);
65236                       unsigned len = imm8 / 2;
65237                       unsigned end = first + len;
65238                       // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1
65239                       vpush(condition,
65240                             kDataTypeValueNone,
65241                             DRegisterList(DRegister(first), len));
65242                       if ((len == 0) || (len > 16) ||
65243                           (end > kMaxNumberOfDRegisters)) {
65244                         UnpredictableA32(instr);
65245                       }
65246                       return;
65247                     }
65248                     Condition condition((instr >> 28) & 0xf);
65249                     unsigned rn = (instr >> 16) & 0xf;
65250                     unsigned first = ExtractDRegister(instr, 22, 12);
65251                     unsigned imm8 = (instr & 0xff);
65252                     unsigned len = imm8 / 2;
65253                     unsigned end = first + len;
65254                     // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
65255                     vstmdb(condition,
65256                            kDataTypeValueNone,
65257                            Register(rn),
65258                            WriteBack(WRITE_BACK),
65259                            DRegisterList(DRegister(first), len));
65260                     if ((len == 0) || (len > 16) ||
65261                         (end > kMaxNumberOfDRegisters)) {
65262                       UnpredictableA32(instr);
65263                     }
65264                     break;
65265                   }
65266                   case 0x00000001: {
65267                     // 0x0d200b01
65268                     if (((instr & 0xf0000000) == 0xf0000000)) {
65269                       UnallocatedA32(instr);
65270                       return;
65271                     }
65272                     Condition condition((instr >> 28) & 0xf);
65273                     unsigned rn = (instr >> 16) & 0xf;
65274                     unsigned first = ExtractDRegister(instr, 22, 12);
65275                     unsigned imm8 = (instr & 0xff);
65276                     unsigned len = imm8 / 2;
65277                     unsigned end = first + len;
65278                     // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
65279                     fstmdbx(condition,
65280                             Register(rn),
65281                             WriteBack(WRITE_BACK),
65282                             DRegisterList(DRegister(first), len));
65283                     if ((len == 0) || (len > 16) || (end > 16)) {
65284                       UnpredictableA32(instr);
65285                     }
65286                     break;
65287                   }
65288                   default:
65289                     UnallocatedA32(instr);
65290                     break;
65291                 }
65292                 break;
65293               }
65294             }
65295             break;
65296           }
65297           case 0x01000e00: {
65298             // 0x0d000e00
65299             switch (instr & 0x0060f100) {
65300               case 0x00005000: {
65301                 // 0x0d005e00
65302                 if (((instr & 0xf0000000) == 0xf0000000)) {
65303                   UnallocatedA32(instr);
65304                   return;
65305                 }
65306                 UnimplementedA32("STC", instr);
65307                 break;
65308               }
65309               case 0x00205000: {
65310                 // 0x0d205e00
65311                 if (((instr & 0xf0000000) == 0xf0000000)) {
65312                   UnallocatedA32(instr);
65313                   return;
65314                 }
65315                 UnimplementedA32("STC", instr);
65316                 break;
65317               }
65318               default:
65319                 UnallocatedA32(instr);
65320                 break;
65321             }
65322             break;
65323           }
65324           case 0x01100a00: {
65325             // 0x0d100a00
65326             switch (instr & 0x00200100) {
65327               case 0x00000000: {
65328                 // 0x0d100a00
65329                 switch (instr & 0x000f0000) {
65330                   case 0x000f0000: {
65331                     // 0x0d1f0a00
65332                     if (((instr & 0xf0000000) == 0xf0000000)) {
65333                       UnallocatedA32(instr);
65334                       return;
65335                     }
65336                     Condition condition((instr >> 28) & 0xf);
65337                     unsigned rd = ExtractSRegister(instr, 22, 12);
65338                     uint32_t U = (instr >> 23) & 0x1;
65339                     int32_t imm = instr & 0xff;
65340                     imm <<= 2;
65341                     if (U == 0) imm = -imm;
65342                     bool minus_zero = (imm == 0) && (U == 0);
65343                     Location location(imm, kA32PcDelta);
65344                     // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2
65345                     if (minus_zero) {
65346                       vldr(condition,
65347                            Untyped32,
65348                            SRegister(rd),
65349                            MemOperand(pc, minus, 0));
65350                     } else {
65351                       vldr(condition, Untyped32, SRegister(rd), &location);
65352                     }
65353                     break;
65354                   }
65355                   default: {
65356                     if (((instr & 0xf0000000) == 0xf0000000) ||
65357                         ((instr & 0xf0000) == 0xf0000)) {
65358                       UnallocatedA32(instr);
65359                       return;
65360                     }
65361                     Condition condition((instr >> 28) & 0xf);
65362                     unsigned rd = ExtractSRegister(instr, 22, 12);
65363                     unsigned rn = (instr >> 16) & 0xf;
65364                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65365                     int32_t offset = (instr & 0xff) << 2;
65366                     // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
65367                     vldr(condition,
65368                          Untyped32,
65369                          SRegister(rd),
65370                          MemOperand(Register(rn), sign, offset, Offset));
65371                     break;
65372                   }
65373                 }
65374                 break;
65375               }
65376               case 0x00000100: {
65377                 // 0x0d100b00
65378                 switch (instr & 0x000f0000) {
65379                   case 0x000f0000: {
65380                     // 0x0d1f0b00
65381                     if (((instr & 0xf0000000) == 0xf0000000)) {
65382                       UnallocatedA32(instr);
65383                       return;
65384                     }
65385                     Condition condition((instr >> 28) & 0xf);
65386                     unsigned rd = ExtractDRegister(instr, 22, 12);
65387                     uint32_t U = (instr >> 23) & 0x1;
65388                     int32_t imm = instr & 0xff;
65389                     imm <<= 2;
65390                     if (U == 0) imm = -imm;
65391                     bool minus_zero = (imm == 0) && (U == 0);
65392                     Location location(imm, kA32PcDelta);
65393                     // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1
65394                     if (minus_zero) {
65395                       vldr(condition,
65396                            Untyped64,
65397                            DRegister(rd),
65398                            MemOperand(pc, minus, 0));
65399                     } else {
65400                       vldr(condition, Untyped64, DRegister(rd), &location);
65401                     }
65402                     break;
65403                   }
65404                   default: {
65405                     if (((instr & 0xf0000000) == 0xf0000000) ||
65406                         ((instr & 0xf0000) == 0xf0000)) {
65407                       UnallocatedA32(instr);
65408                       return;
65409                     }
65410                     Condition condition((instr >> 28) & 0xf);
65411                     unsigned rd = ExtractDRegister(instr, 22, 12);
65412                     unsigned rn = (instr >> 16) & 0xf;
65413                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65414                     int32_t offset = (instr & 0xff) << 2;
65415                     // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
65416                     vldr(condition,
65417                          Untyped64,
65418                          DRegister(rd),
65419                          MemOperand(Register(rn), sign, offset, Offset));
65420                     break;
65421                   }
65422                 }
65423                 break;
65424               }
65425               case 0x00200000: {
65426                 // 0x0d300a00
65427                 if ((instr & 0x00800000) == 0x00000000) {
65428                   if (((instr & 0xf0000000) == 0xf0000000)) {
65429                     UnallocatedA32(instr);
65430                     return;
65431                   }
65432                   Condition condition((instr >> 28) & 0xf);
65433                   unsigned rn = (instr >> 16) & 0xf;
65434                   unsigned first = ExtractSRegister(instr, 22, 12);
65435                   unsigned len = instr & 0xff;
65436                   // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
65437                   vldmdb(condition,
65438                          kDataTypeValueNone,
65439                          Register(rn),
65440                          WriteBack(WRITE_BACK),
65441                          SRegisterList(SRegister(first), len));
65442                   if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65443                     UnpredictableA32(instr);
65444                   }
65445                 } else {
65446                   UnallocatedA32(instr);
65447                 }
65448                 break;
65449               }
65450               case 0x00200100: {
65451                 // 0x0d300b00
65452                 switch (instr & 0x00800001) {
65453                   case 0x00000000: {
65454                     // 0x0d300b00
65455                     if (((instr & 0xf0000000) == 0xf0000000)) {
65456                       UnallocatedA32(instr);
65457                       return;
65458                     }
65459                     Condition condition((instr >> 28) & 0xf);
65460                     unsigned rn = (instr >> 16) & 0xf;
65461                     unsigned first = ExtractDRegister(instr, 22, 12);
65462                     unsigned imm8 = (instr & 0xff);
65463                     unsigned len = imm8 / 2;
65464                     unsigned end = first + len;
65465                     // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
65466                     vldmdb(condition,
65467                            kDataTypeValueNone,
65468                            Register(rn),
65469                            WriteBack(WRITE_BACK),
65470                            DRegisterList(DRegister(first), len));
65471                     if ((len == 0) || (len > 16) ||
65472                         (end > kMaxNumberOfDRegisters)) {
65473                       UnpredictableA32(instr);
65474                     }
65475                     break;
65476                   }
65477                   case 0x00000001: {
65478                     // 0x0d300b01
65479                     if (((instr & 0xf0000000) == 0xf0000000)) {
65480                       UnallocatedA32(instr);
65481                       return;
65482                     }
65483                     Condition condition((instr >> 28) & 0xf);
65484                     unsigned rn = (instr >> 16) & 0xf;
65485                     unsigned first = ExtractDRegister(instr, 22, 12);
65486                     unsigned imm8 = (instr & 0xff);
65487                     unsigned len = imm8 / 2;
65488                     unsigned end = first + len;
65489                     // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
65490                     fldmdbx(condition,
65491                             Register(rn),
65492                             WriteBack(WRITE_BACK),
65493                             DRegisterList(DRegister(first), len));
65494                     if ((len == 0) || (len > 16) || (end > 16)) {
65495                       UnpredictableA32(instr);
65496                     }
65497                     break;
65498                   }
65499                   default:
65500                     UnallocatedA32(instr);
65501                     break;
65502                 }
65503                 break;
65504               }
65505             }
65506             break;
65507           }
65508           case 0x01100e00: {
65509             // 0x0d100e00
65510             switch (instr & 0x0060f100) {
65511               case 0x00005000: {
65512                 // 0x0d105e00
65513                 switch (instr & 0x000f0000) {
65514                   case 0x000f0000: {
65515                     // 0x0d1f5e00
65516                     if (((instr & 0xf0000000) == 0xf0000000)) {
65517                       UnallocatedA32(instr);
65518                       return;
65519                     }
65520                     UnimplementedA32("LDC", instr);
65521                     break;
65522                   }
65523                   default: {
65524                     if (((instr & 0xf0000000) == 0xf0000000) ||
65525                         ((instr & 0xf0000) == 0xf0000)) {
65526                       UnallocatedA32(instr);
65527                       return;
65528                     }
65529                     UnimplementedA32("LDC", instr);
65530                     break;
65531                   }
65532                 }
65533                 break;
65534               }
65535               case 0x00205000: {
65536                 // 0x0d305e00
65537                 if (((instr & 0xf0000000) == 0xf0000000) ||
65538                     ((instr & 0xf0000) == 0xf0000)) {
65539                   UnallocatedA32(instr);
65540                   return;
65541                 }
65542                 UnimplementedA32("LDC", instr);
65543                 break;
65544               }
65545               default:
65546                 UnallocatedA32(instr);
65547                 break;
65548             }
65549             break;
65550           }
65551           default:
65552             UnallocatedA32(instr);
65553             break;
65554         }
65555         break;
65556       }
65557       case 0x0e000000: {
65558         // 0x0e000000
65559         switch (instr & 0x01000000) {
65560           case 0x00000000: {
65561             // 0x0e000000
65562             switch (instr & 0x00100e10) {
65563               case 0x00000a00: {
65564                 // 0x0e000a00
65565                 switch (instr & 0x00a00140) {
65566                   case 0x00000000: {
65567                     // 0x0e000a00
65568                     if (((instr & 0xf0000000) == 0xf0000000)) {
65569                       UnallocatedA32(instr);
65570                       return;
65571                     }
65572                     Condition condition((instr >> 28) & 0xf);
65573                     unsigned rd = ExtractSRegister(instr, 22, 12);
65574                     unsigned rn = ExtractSRegister(instr, 7, 16);
65575                     unsigned rm = ExtractSRegister(instr, 5, 0);
65576                     // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
65577                     vmla(condition,
65578                          F32,
65579                          SRegister(rd),
65580                          SRegister(rn),
65581                          SRegister(rm));
65582                     break;
65583                   }
65584                   case 0x00000040: {
65585                     // 0x0e000a40
65586                     if (((instr & 0xf0000000) == 0xf0000000)) {
65587                       UnallocatedA32(instr);
65588                       return;
65589                     }
65590                     Condition condition((instr >> 28) & 0xf);
65591                     unsigned rd = ExtractSRegister(instr, 22, 12);
65592                     unsigned rn = ExtractSRegister(instr, 7, 16);
65593                     unsigned rm = ExtractSRegister(instr, 5, 0);
65594                     // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
65595                     vmls(condition,
65596                          F32,
65597                          SRegister(rd),
65598                          SRegister(rn),
65599                          SRegister(rm));
65600                     break;
65601                   }
65602                   case 0x00000100: {
65603                     // 0x0e000b00
65604                     if (((instr & 0xf0000000) == 0xf0000000)) {
65605                       UnallocatedA32(instr);
65606                       return;
65607                     }
65608                     Condition condition((instr >> 28) & 0xf);
65609                     unsigned rd = ExtractDRegister(instr, 22, 12);
65610                     unsigned rn = ExtractDRegister(instr, 7, 16);
65611                     unsigned rm = ExtractDRegister(instr, 5, 0);
65612                     // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
65613                     vmla(condition,
65614                          F64,
65615                          DRegister(rd),
65616                          DRegister(rn),
65617                          DRegister(rm));
65618                     break;
65619                   }
65620                   case 0x00000140: {
65621                     // 0x0e000b40
65622                     if (((instr & 0xf0000000) == 0xf0000000)) {
65623                       UnallocatedA32(instr);
65624                       return;
65625                     }
65626                     Condition condition((instr >> 28) & 0xf);
65627                     unsigned rd = ExtractDRegister(instr, 22, 12);
65628                     unsigned rn = ExtractDRegister(instr, 7, 16);
65629                     unsigned rm = ExtractDRegister(instr, 5, 0);
65630                     // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
65631                     vmls(condition,
65632                          F64,
65633                          DRegister(rd),
65634                          DRegister(rn),
65635                          DRegister(rm));
65636                     break;
65637                   }
65638                   case 0x00200000: {
65639                     // 0x0e200a00
65640                     if (((instr & 0xf0000000) == 0xf0000000)) {
65641                       UnallocatedA32(instr);
65642                       return;
65643                     }
65644                     Condition condition((instr >> 28) & 0xf);
65645                     unsigned rd = ExtractSRegister(instr, 22, 12);
65646                     unsigned rn = ExtractSRegister(instr, 7, 16);
65647                     unsigned rm = ExtractSRegister(instr, 5, 0);
65648                     // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
65649                     vmul(condition,
65650                          F32,
65651                          SRegister(rd),
65652                          SRegister(rn),
65653                          SRegister(rm));
65654                     break;
65655                   }
65656                   case 0x00200040: {
65657                     // 0x0e200a40
65658                     if (((instr & 0xf0000000) == 0xf0000000)) {
65659                       UnallocatedA32(instr);
65660                       return;
65661                     }
65662                     Condition condition((instr >> 28) & 0xf);
65663                     unsigned rd = ExtractSRegister(instr, 22, 12);
65664                     unsigned rn = ExtractSRegister(instr, 7, 16);
65665                     unsigned rm = ExtractSRegister(instr, 5, 0);
65666                     // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
65667                     vnmul(condition,
65668                           F32,
65669                           SRegister(rd),
65670                           SRegister(rn),
65671                           SRegister(rm));
65672                     break;
65673                   }
65674                   case 0x00200100: {
65675                     // 0x0e200b00
65676                     if (((instr & 0xf0000000) == 0xf0000000)) {
65677                       UnallocatedA32(instr);
65678                       return;
65679                     }
65680                     Condition condition((instr >> 28) & 0xf);
65681                     unsigned rd = ExtractDRegister(instr, 22, 12);
65682                     unsigned rn = ExtractDRegister(instr, 7, 16);
65683                     unsigned rm = ExtractDRegister(instr, 5, 0);
65684                     // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
65685                     vmul(condition,
65686                          F64,
65687                          DRegister(rd),
65688                          DRegister(rn),
65689                          DRegister(rm));
65690                     break;
65691                   }
65692                   case 0x00200140: {
65693                     // 0x0e200b40
65694                     if (((instr & 0xf0000000) == 0xf0000000)) {
65695                       UnallocatedA32(instr);
65696                       return;
65697                     }
65698                     Condition condition((instr >> 28) & 0xf);
65699                     unsigned rd = ExtractDRegister(instr, 22, 12);
65700                     unsigned rn = ExtractDRegister(instr, 7, 16);
65701                     unsigned rm = ExtractDRegister(instr, 5, 0);
65702                     // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
65703                     vnmul(condition,
65704                           F64,
65705                           DRegister(rd),
65706                           DRegister(rn),
65707                           DRegister(rm));
65708                     break;
65709                   }
65710                   case 0x00800000: {
65711                     // 0x0e800a00
65712                     if (((instr & 0xf0000000) == 0xf0000000)) {
65713                       UnallocatedA32(instr);
65714                       return;
65715                     }
65716                     Condition condition((instr >> 28) & 0xf);
65717                     unsigned rd = ExtractSRegister(instr, 22, 12);
65718                     unsigned rn = ExtractSRegister(instr, 7, 16);
65719                     unsigned rm = ExtractSRegister(instr, 5, 0);
65720                     // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
65721                     vdiv(condition,
65722                          F32,
65723                          SRegister(rd),
65724                          SRegister(rn),
65725                          SRegister(rm));
65726                     break;
65727                   }
65728                   case 0x00800100: {
65729                     // 0x0e800b00
65730                     if (((instr & 0xf0000000) == 0xf0000000)) {
65731                       UnallocatedA32(instr);
65732                       return;
65733                     }
65734                     Condition condition((instr >> 28) & 0xf);
65735                     unsigned rd = ExtractDRegister(instr, 22, 12);
65736                     unsigned rn = ExtractDRegister(instr, 7, 16);
65737                     unsigned rm = ExtractDRegister(instr, 5, 0);
65738                     // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
65739                     vdiv(condition,
65740                          F64,
65741                          DRegister(rd),
65742                          DRegister(rn),
65743                          DRegister(rm));
65744                     break;
65745                   }
65746                   case 0x00a00000: {
65747                     // 0x0ea00a00
65748                     if (((instr & 0xf0000000) == 0xf0000000)) {
65749                       UnallocatedA32(instr);
65750                       return;
65751                     }
65752                     Condition condition((instr >> 28) & 0xf);
65753                     unsigned rd = ExtractSRegister(instr, 22, 12);
65754                     unsigned rn = ExtractSRegister(instr, 7, 16);
65755                     unsigned rm = ExtractSRegister(instr, 5, 0);
65756                     // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
65757                     vfma(condition,
65758                          F32,
65759                          SRegister(rd),
65760                          SRegister(rn),
65761                          SRegister(rm));
65762                     break;
65763                   }
65764                   case 0x00a00040: {
65765                     // 0x0ea00a40
65766                     if (((instr & 0xf0000000) == 0xf0000000)) {
65767                       UnallocatedA32(instr);
65768                       return;
65769                     }
65770                     Condition condition((instr >> 28) & 0xf);
65771                     unsigned rd = ExtractSRegister(instr, 22, 12);
65772                     unsigned rn = ExtractSRegister(instr, 7, 16);
65773                     unsigned rm = ExtractSRegister(instr, 5, 0);
65774                     // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
65775                     vfms(condition,
65776                          F32,
65777                          SRegister(rd),
65778                          SRegister(rn),
65779                          SRegister(rm));
65780                     break;
65781                   }
65782                   case 0x00a00100: {
65783                     // 0x0ea00b00
65784                     if (((instr & 0xf0000000) == 0xf0000000)) {
65785                       UnallocatedA32(instr);
65786                       return;
65787                     }
65788                     Condition condition((instr >> 28) & 0xf);
65789                     unsigned rd = ExtractDRegister(instr, 22, 12);
65790                     unsigned rn = ExtractDRegister(instr, 7, 16);
65791                     unsigned rm = ExtractDRegister(instr, 5, 0);
65792                     // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
65793                     vfma(condition,
65794                          F64,
65795                          DRegister(rd),
65796                          DRegister(rn),
65797                          DRegister(rm));
65798                     break;
65799                   }
65800                   case 0x00a00140: {
65801                     // 0x0ea00b40
65802                     if (((instr & 0xf0000000) == 0xf0000000)) {
65803                       UnallocatedA32(instr);
65804                       return;
65805                     }
65806                     Condition condition((instr >> 28) & 0xf);
65807                     unsigned rd = ExtractDRegister(instr, 22, 12);
65808                     unsigned rn = ExtractDRegister(instr, 7, 16);
65809                     unsigned rm = ExtractDRegister(instr, 5, 0);
65810                     // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
65811                     vfms(condition,
65812                          F64,
65813                          DRegister(rd),
65814                          DRegister(rn),
65815                          DRegister(rm));
65816                     break;
65817                   }
65818                   default:
65819                     UnallocatedA32(instr);
65820                     break;
65821                 }
65822                 break;
65823               }
65824               case 0x00000a10: {
65825                 // 0x0e000a10
65826                 switch (instr & 0x00800100) {
65827                   case 0x00000000: {
65828                     // 0x0e000a10
65829                     if ((instr & 0x00600000) == 0x00000000) {
65830                       if (((instr & 0xf0000000) == 0xf0000000)) {
65831                         UnallocatedA32(instr);
65832                         return;
65833                       }
65834                       Condition condition((instr >> 28) & 0xf);
65835                       unsigned rn = ExtractSRegister(instr, 7, 16);
65836                       unsigned rt = (instr >> 12) & 0xf;
65837                       // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1
65838                       vmov(condition, SRegister(rn), Register(rt));
65839                       if (((instr & 0xff00f7f) != 0xe000a10)) {
65840                         UnpredictableA32(instr);
65841                       }
65842                     } else {
65843                       UnallocatedA32(instr);
65844                     }
65845                     break;
65846                   }
65847                   case 0x00000100: {
65848                     // 0x0e000b10
65849                     if (((instr & 0xf0000000) == 0xf0000000)) {
65850                       UnallocatedA32(instr);
65851                       return;
65852                     }
65853                     Condition condition((instr >> 28) & 0xf);
65854                     unsigned lane;
65855                     DataType dt =
65856                         Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
65857                                                   ((instr >> 19) & 0xc),
65858                                               &lane);
65859                     if (dt.Is(kDataTypeValueInvalid)) {
65860                       UnallocatedA32(instr);
65861                       return;
65862                     }
65863                     unsigned rd = ExtractDRegister(instr, 7, 16);
65864                     unsigned rt = (instr >> 12) & 0xf;
65865                     // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1
65866                     vmov(condition, dt, DRegisterLane(rd, lane), Register(rt));
65867                     if (((instr & 0xf900f1f) != 0xe000b10)) {
65868                       UnpredictableA32(instr);
65869                     }
65870                     break;
65871                   }
65872                   case 0x00800000: {
65873                     // 0x0e800a10
65874                     if ((instr & 0x00600000) == 0x00600000) {
65875                       if (((instr & 0xf0000000) == 0xf0000000)) {
65876                         UnallocatedA32(instr);
65877                         return;
65878                       }
65879                       Condition condition((instr >> 28) & 0xf);
65880                       unsigned spec_reg = (instr >> 16) & 0xf;
65881                       unsigned rt = (instr >> 12) & 0xf;
65882                       switch (spec_reg) {
65883                         case 0x0:
65884                         case 0x1:
65885                         case 0x8: {
65886                           // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1
65887                           vmsr(condition,
65888                                SpecialFPRegister(spec_reg),
65889                                Register(rt));
65890                           if (((instr & 0xff00fff) != 0xee00a10)) {
65891                             UnpredictableA32(instr);
65892                           }
65893                           break;
65894                         }
65895                         default:
65896                           UnallocatedA32(instr);
65897                           break;
65898                       }
65899                     } else {
65900                       UnallocatedA32(instr);
65901                     }
65902                     break;
65903                   }
65904                   case 0x00800100: {
65905                     // 0x0e800b10
65906                     switch (instr & 0x00200040) {
65907                       case 0x00000000: {
65908                         // 0x0e800b10
65909                         if (((instr & 0xf0000000) == 0xf0000000)) {
65910                           UnallocatedA32(instr);
65911                           return;
65912                         }
65913                         Condition condition((instr >> 28) & 0xf);
65914                         DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
65915                                                       ((instr >> 21) & 0x2));
65916                         if (dt.Is(kDataTypeValueInvalid)) {
65917                           UnallocatedA32(instr);
65918                           return;
65919                         }
65920                         unsigned rd = ExtractDRegister(instr, 7, 16);
65921                         unsigned rt = (instr >> 12) & 0xf;
65922                         // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1
65923                         vdup(condition, dt, DRegister(rd), Register(rt));
65924                         if (((instr & 0xfb00f5f) != 0xe800b10)) {
65925                           UnpredictableA32(instr);
65926                         }
65927                         break;
65928                       }
65929                       case 0x00200000: {
65930                         // 0x0ea00b10
65931                         if (((instr & 0xf0000000) == 0xf0000000)) {
65932                           UnallocatedA32(instr);
65933                           return;
65934                         }
65935                         Condition condition((instr >> 28) & 0xf);
65936                         DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
65937                                                       ((instr >> 21) & 0x2));
65938                         if (dt.Is(kDataTypeValueInvalid)) {
65939                           UnallocatedA32(instr);
65940                           return;
65941                         }
65942                         if (((instr >> 16) & 1) != 0) {
65943                           UnallocatedA32(instr);
65944                           return;
65945                         }
65946                         unsigned rd = ExtractQRegister(instr, 7, 16);
65947                         unsigned rt = (instr >> 12) & 0xf;
65948                         // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1
65949                         vdup(condition, dt, QRegister(rd), Register(rt));
65950                         if (((instr & 0xfb00f5f) != 0xea00b10)) {
65951                           UnpredictableA32(instr);
65952                         }
65953                         break;
65954                       }
65955                       default:
65956                         UnallocatedA32(instr);
65957                         break;
65958                     }
65959                     break;
65960                   }
65961                 }
65962                 break;
65963               }
65964               case 0x00000e10: {
65965                 // 0x0e000e10
65966                 if (((instr & 0xf0000000) == 0xf0000000)) {
65967                   UnallocatedA32(instr);
65968                   return;
65969                 }
65970                 UnimplementedA32("MCR", instr);
65971                 break;
65972               }
65973               case 0x00100a00: {
65974                 // 0x0e100a00
65975                 switch (instr & 0x00a00140) {
65976                   case 0x00000000: {
65977                     // 0x0e100a00
65978                     if (((instr & 0xf0000000) == 0xf0000000)) {
65979                       UnallocatedA32(instr);
65980                       return;
65981                     }
65982                     Condition condition((instr >> 28) & 0xf);
65983                     unsigned rd = ExtractSRegister(instr, 22, 12);
65984                     unsigned rn = ExtractSRegister(instr, 7, 16);
65985                     unsigned rm = ExtractSRegister(instr, 5, 0);
65986                     // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
65987                     vnmls(condition,
65988                           F32,
65989                           SRegister(rd),
65990                           SRegister(rn),
65991                           SRegister(rm));
65992                     break;
65993                   }
65994                   case 0x00000040: {
65995                     // 0x0e100a40
65996                     if (((instr & 0xf0000000) == 0xf0000000)) {
65997                       UnallocatedA32(instr);
65998                       return;
65999                     }
66000                     Condition condition((instr >> 28) & 0xf);
66001                     unsigned rd = ExtractSRegister(instr, 22, 12);
66002                     unsigned rn = ExtractSRegister(instr, 7, 16);
66003                     unsigned rm = ExtractSRegister(instr, 5, 0);
66004                     // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66005                     vnmla(condition,
66006                           F32,
66007                           SRegister(rd),
66008                           SRegister(rn),
66009                           SRegister(rm));
66010                     break;
66011                   }
66012                   case 0x00000100: {
66013                     // 0x0e100b00
66014                     if (((instr & 0xf0000000) == 0xf0000000)) {
66015                       UnallocatedA32(instr);
66016                       return;
66017                     }
66018                     Condition condition((instr >> 28) & 0xf);
66019                     unsigned rd = ExtractDRegister(instr, 22, 12);
66020                     unsigned rn = ExtractDRegister(instr, 7, 16);
66021                     unsigned rm = ExtractDRegister(instr, 5, 0);
66022                     // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66023                     vnmls(condition,
66024                           F64,
66025                           DRegister(rd),
66026                           DRegister(rn),
66027                           DRegister(rm));
66028                     break;
66029                   }
66030                   case 0x00000140: {
66031                     // 0x0e100b40
66032                     if (((instr & 0xf0000000) == 0xf0000000)) {
66033                       UnallocatedA32(instr);
66034                       return;
66035                     }
66036                     Condition condition((instr >> 28) & 0xf);
66037                     unsigned rd = ExtractDRegister(instr, 22, 12);
66038                     unsigned rn = ExtractDRegister(instr, 7, 16);
66039                     unsigned rm = ExtractDRegister(instr, 5, 0);
66040                     // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66041                     vnmla(condition,
66042                           F64,
66043                           DRegister(rd),
66044                           DRegister(rn),
66045                           DRegister(rm));
66046                     break;
66047                   }
66048                   case 0x00200000: {
66049                     // 0x0e300a00
66050                     if (((instr & 0xf0000000) == 0xf0000000)) {
66051                       UnallocatedA32(instr);
66052                       return;
66053                     }
66054                     Condition condition((instr >> 28) & 0xf);
66055                     unsigned rd = ExtractSRegister(instr, 22, 12);
66056                     unsigned rn = ExtractSRegister(instr, 7, 16);
66057                     unsigned rm = ExtractSRegister(instr, 5, 0);
66058                     // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66059                     vadd(condition,
66060                          F32,
66061                          SRegister(rd),
66062                          SRegister(rn),
66063                          SRegister(rm));
66064                     break;
66065                   }
66066                   case 0x00200040: {
66067                     // 0x0e300a40
66068                     if (((instr & 0xf0000000) == 0xf0000000)) {
66069                       UnallocatedA32(instr);
66070                       return;
66071                     }
66072                     Condition condition((instr >> 28) & 0xf);
66073                     unsigned rd = ExtractSRegister(instr, 22, 12);
66074                     unsigned rn = ExtractSRegister(instr, 7, 16);
66075                     unsigned rm = ExtractSRegister(instr, 5, 0);
66076                     // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66077                     vsub(condition,
66078                          F32,
66079                          SRegister(rd),
66080                          SRegister(rn),
66081                          SRegister(rm));
66082                     break;
66083                   }
66084                   case 0x00200100: {
66085                     // 0x0e300b00
66086                     if (((instr & 0xf0000000) == 0xf0000000)) {
66087                       UnallocatedA32(instr);
66088                       return;
66089                     }
66090                     Condition condition((instr >> 28) & 0xf);
66091                     unsigned rd = ExtractDRegister(instr, 22, 12);
66092                     unsigned rn = ExtractDRegister(instr, 7, 16);
66093                     unsigned rm = ExtractDRegister(instr, 5, 0);
66094                     // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66095                     vadd(condition,
66096                          F64,
66097                          DRegister(rd),
66098                          DRegister(rn),
66099                          DRegister(rm));
66100                     break;
66101                   }
66102                   case 0x00200140: {
66103                     // 0x0e300b40
66104                     if (((instr & 0xf0000000) == 0xf0000000)) {
66105                       UnallocatedA32(instr);
66106                       return;
66107                     }
66108                     Condition condition((instr >> 28) & 0xf);
66109                     unsigned rd = ExtractDRegister(instr, 22, 12);
66110                     unsigned rn = ExtractDRegister(instr, 7, 16);
66111                     unsigned rm = ExtractDRegister(instr, 5, 0);
66112                     // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66113                     vsub(condition,
66114                          F64,
66115                          DRegister(rd),
66116                          DRegister(rn),
66117                          DRegister(rm));
66118                     break;
66119                   }
66120                   case 0x00800000: {
66121                     // 0x0e900a00
66122                     if (((instr & 0xf0000000) == 0xf0000000)) {
66123                       UnallocatedA32(instr);
66124                       return;
66125                     }
66126                     Condition condition((instr >> 28) & 0xf);
66127                     unsigned rd = ExtractSRegister(instr, 22, 12);
66128                     unsigned rn = ExtractSRegister(instr, 7, 16);
66129                     unsigned rm = ExtractSRegister(instr, 5, 0);
66130                     // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66131                     vfnms(condition,
66132                           F32,
66133                           SRegister(rd),
66134                           SRegister(rn),
66135                           SRegister(rm));
66136                     break;
66137                   }
66138                   case 0x00800040: {
66139                     // 0x0e900a40
66140                     if (((instr & 0xf0000000) == 0xf0000000)) {
66141                       UnallocatedA32(instr);
66142                       return;
66143                     }
66144                     Condition condition((instr >> 28) & 0xf);
66145                     unsigned rd = ExtractSRegister(instr, 22, 12);
66146                     unsigned rn = ExtractSRegister(instr, 7, 16);
66147                     unsigned rm = ExtractSRegister(instr, 5, 0);
66148                     // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66149                     vfnma(condition,
66150                           F32,
66151                           SRegister(rd),
66152                           SRegister(rn),
66153                           SRegister(rm));
66154                     break;
66155                   }
66156                   case 0x00800100: {
66157                     // 0x0e900b00
66158                     if (((instr & 0xf0000000) == 0xf0000000)) {
66159                       UnallocatedA32(instr);
66160                       return;
66161                     }
66162                     Condition condition((instr >> 28) & 0xf);
66163                     unsigned rd = ExtractDRegister(instr, 22, 12);
66164                     unsigned rn = ExtractDRegister(instr, 7, 16);
66165                     unsigned rm = ExtractDRegister(instr, 5, 0);
66166                     // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66167                     vfnms(condition,
66168                           F64,
66169                           DRegister(rd),
66170                           DRegister(rn),
66171                           DRegister(rm));
66172                     break;
66173                   }
66174                   case 0x00800140: {
66175                     // 0x0e900b40
66176                     if (((instr & 0xf0000000) == 0xf0000000)) {
66177                       UnallocatedA32(instr);
66178                       return;
66179                     }
66180                     Condition condition((instr >> 28) & 0xf);
66181                     unsigned rd = ExtractDRegister(instr, 22, 12);
66182                     unsigned rn = ExtractDRegister(instr, 7, 16);
66183                     unsigned rm = ExtractDRegister(instr, 5, 0);
66184                     // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66185                     vfnma(condition,
66186                           F64,
66187                           DRegister(rd),
66188                           DRegister(rn),
66189                           DRegister(rm));
66190                     break;
66191                   }
66192                   case 0x00a00000: {
66193                     // 0x0eb00a00
66194                     if (((instr & 0xf0000000) == 0xf0000000)) {
66195                       UnallocatedA32(instr);
66196                       return;
66197                     }
66198                     Condition condition((instr >> 28) & 0xf);
66199                     unsigned rd = ExtractSRegister(instr, 22, 12);
66200                     uint32_t encoded_imm =
66201                         (instr & 0xf) | ((instr >> 12) & 0xf0);
66202                     NeonImmediate imm =
66203                         ImmediateVFP::Decode<float>(encoded_imm);
66204                     // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2
66205                     vmov(condition, F32, SRegister(rd), imm);
66206                     if (((instr & 0xfb00ff0) != 0xeb00a00)) {
66207                       UnpredictableA32(instr);
66208                     }
66209                     break;
66210                   }
66211                   case 0x00a00040: {
66212                     // 0x0eb00a40
66213                     switch (instr & 0x000e0000) {
66214                       case 0x00000000: {
66215                         // 0x0eb00a40
66216                         switch (instr & 0x00010080) {
66217                           case 0x00000000: {
66218                             // 0x0eb00a40
66219                             if (((instr & 0xf0000000) == 0xf0000000)) {
66220                               UnallocatedA32(instr);
66221                               return;
66222                             }
66223                             Condition condition((instr >> 28) & 0xf);
66224                             unsigned rd = ExtractSRegister(instr, 22, 12);
66225                             unsigned rm = ExtractSRegister(instr, 5, 0);
66226                             // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66227                             vmov(condition, F32, SRegister(rd), SRegister(rm));
66228                             break;
66229                           }
66230                           case 0x00000080: {
66231                             // 0x0eb00ac0
66232                             if (((instr & 0xf0000000) == 0xf0000000)) {
66233                               UnallocatedA32(instr);
66234                               return;
66235                             }
66236                             Condition condition((instr >> 28) & 0xf);
66237                             unsigned rd = ExtractSRegister(instr, 22, 12);
66238                             unsigned rm = ExtractSRegister(instr, 5, 0);
66239                             // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66240                             vabs(condition, F32, SRegister(rd), SRegister(rm));
66241                             break;
66242                           }
66243                           case 0x00010000: {
66244                             // 0x0eb10a40
66245                             if (((instr & 0xf0000000) == 0xf0000000)) {
66246                               UnallocatedA32(instr);
66247                               return;
66248                             }
66249                             Condition condition((instr >> 28) & 0xf);
66250                             unsigned rd = ExtractSRegister(instr, 22, 12);
66251                             unsigned rm = ExtractSRegister(instr, 5, 0);
66252                             // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66253                             vneg(condition, F32, SRegister(rd), SRegister(rm));
66254                             break;
66255                           }
66256                           case 0x00010080: {
66257                             // 0x0eb10ac0
66258                             if (((instr & 0xf0000000) == 0xf0000000)) {
66259                               UnallocatedA32(instr);
66260                               return;
66261                             }
66262                             Condition condition((instr >> 28) & 0xf);
66263                             unsigned rd = ExtractSRegister(instr, 22, 12);
66264                             unsigned rm = ExtractSRegister(instr, 5, 0);
66265                             // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66266                             vsqrt(condition, F32, SRegister(rd), SRegister(rm));
66267                             break;
66268                           }
66269                         }
66270                         break;
66271                       }
66272                       case 0x00020000: {
66273                         // 0x0eb20a40
66274                         switch (instr & 0x00010080) {
66275                           case 0x00000000: {
66276                             // 0x0eb20a40
66277                             if (((instr & 0xf0000000) == 0xf0000000)) {
66278                               UnallocatedA32(instr);
66279                               return;
66280                             }
66281                             Condition condition((instr >> 28) & 0xf);
66282                             unsigned rd = ExtractSRegister(instr, 22, 12);
66283                             unsigned rm = ExtractSRegister(instr, 5, 0);
66284                             // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
66285                             vcvtb(condition,
66286                                   F32,
66287                                   F16,
66288                                   SRegister(rd),
66289                                   SRegister(rm));
66290                             break;
66291                           }
66292                           case 0x00000080: {
66293                             // 0x0eb20ac0
66294                             if (((instr & 0xf0000000) == 0xf0000000)) {
66295                               UnallocatedA32(instr);
66296                               return;
66297                             }
66298                             Condition condition((instr >> 28) & 0xf);
66299                             unsigned rd = ExtractSRegister(instr, 22, 12);
66300                             unsigned rm = ExtractSRegister(instr, 5, 0);
66301                             // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
66302                             vcvtt(condition,
66303                                   F32,
66304                                   F16,
66305                                   SRegister(rd),
66306                                   SRegister(rm));
66307                             break;
66308                           }
66309                           case 0x00010000: {
66310                             // 0x0eb30a40
66311                             if (((instr & 0xf0000000) == 0xf0000000)) {
66312                               UnallocatedA32(instr);
66313                               return;
66314                             }
66315                             Condition condition((instr >> 28) & 0xf);
66316                             unsigned rd = ExtractSRegister(instr, 22, 12);
66317                             unsigned rm = ExtractSRegister(instr, 5, 0);
66318                             // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
66319                             vcvtb(condition,
66320                                   F16,
66321                                   F32,
66322                                   SRegister(rd),
66323                                   SRegister(rm));
66324                             break;
66325                           }
66326                           case 0x00010080: {
66327                             // 0x0eb30ac0
66328                             if (((instr & 0xf0000000) == 0xf0000000)) {
66329                               UnallocatedA32(instr);
66330                               return;
66331                             }
66332                             Condition condition((instr >> 28) & 0xf);
66333                             unsigned rd = ExtractSRegister(instr, 22, 12);
66334                             unsigned rm = ExtractSRegister(instr, 5, 0);
66335                             // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
66336                             vcvtt(condition,
66337                                   F16,
66338                                   F32,
66339                                   SRegister(rd),
66340                                   SRegister(rm));
66341                             break;
66342                           }
66343                         }
66344                         break;
66345                       }
66346                       case 0x00040000: {
66347                         // 0x0eb40a40
66348                         switch (instr & 0x00010080) {
66349                           case 0x00000000: {
66350                             // 0x0eb40a40
66351                             if (((instr & 0xf0000000) == 0xf0000000)) {
66352                               UnallocatedA32(instr);
66353                               return;
66354                             }
66355                             Condition condition((instr >> 28) & 0xf);
66356                             unsigned rd = ExtractSRegister(instr, 22, 12);
66357                             unsigned rm = ExtractSRegister(instr, 5, 0);
66358                             // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66359                             vcmp(condition, F32, SRegister(rd), SRegister(rm));
66360                             break;
66361                           }
66362                           case 0x00000080: {
66363                             // 0x0eb40ac0
66364                             if (((instr & 0xf0000000) == 0xf0000000)) {
66365                               UnallocatedA32(instr);
66366                               return;
66367                             }
66368                             Condition condition((instr >> 28) & 0xf);
66369                             unsigned rd = ExtractSRegister(instr, 22, 12);
66370                             unsigned rm = ExtractSRegister(instr, 5, 0);
66371                             // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66372                             vcmpe(condition, F32, SRegister(rd), SRegister(rm));
66373                             break;
66374                           }
66375                           case 0x00010000: {
66376                             // 0x0eb50a40
66377                             if (((instr & 0xf0000000) == 0xf0000000)) {
66378                               UnallocatedA32(instr);
66379                               return;
66380                             }
66381                             Condition condition((instr >> 28) & 0xf);
66382                             unsigned rd = ExtractSRegister(instr, 22, 12);
66383                             // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
66384                             vcmp(condition, F32, SRegister(rd), 0.0);
66385                             if (((instr & 0xfbf0fff) != 0xeb50a40)) {
66386                               UnpredictableA32(instr);
66387                             }
66388                             break;
66389                           }
66390                           case 0x00010080: {
66391                             // 0x0eb50ac0
66392                             if (((instr & 0xf0000000) == 0xf0000000)) {
66393                               UnallocatedA32(instr);
66394                               return;
66395                             }
66396                             Condition condition((instr >> 28) & 0xf);
66397                             unsigned rd = ExtractSRegister(instr, 22, 12);
66398                             // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
66399                             vcmpe(condition, F32, SRegister(rd), 0.0);
66400                             if (((instr & 0xfbf0fff) != 0xeb50ac0)) {
66401                               UnpredictableA32(instr);
66402                             }
66403                             break;
66404                           }
66405                         }
66406                         break;
66407                       }
66408                       case 0x00060000: {
66409                         // 0x0eb60a40
66410                         switch (instr & 0x00010080) {
66411                           case 0x00000000: {
66412                             // 0x0eb60a40
66413                             if (((instr & 0xf0000000) == 0xf0000000)) {
66414                               UnallocatedA32(instr);
66415                               return;
66416                             }
66417                             Condition condition((instr >> 28) & 0xf);
66418                             unsigned rd = ExtractSRegister(instr, 22, 12);
66419                             unsigned rm = ExtractSRegister(instr, 5, 0);
66420                             // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66421                             vrintr(condition,
66422                                    F32,
66423                                    SRegister(rd),
66424                                    SRegister(rm));
66425                             break;
66426                           }
66427                           case 0x00000080: {
66428                             // 0x0eb60ac0
66429                             if (((instr & 0xf0000000) == 0xf0000000)) {
66430                               UnallocatedA32(instr);
66431                               return;
66432                             }
66433                             Condition condition((instr >> 28) & 0xf);
66434                             unsigned rd = ExtractSRegister(instr, 22, 12);
66435                             unsigned rm = ExtractSRegister(instr, 5, 0);
66436                             // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66437                             vrintz(condition,
66438                                    F32,
66439                                    SRegister(rd),
66440                                    SRegister(rm));
66441                             break;
66442                           }
66443                           case 0x00010000: {
66444                             // 0x0eb70a40
66445                             if (((instr & 0xf0000000) == 0xf0000000)) {
66446                               UnallocatedA32(instr);
66447                               return;
66448                             }
66449                             Condition condition((instr >> 28) & 0xf);
66450                             unsigned rd = ExtractSRegister(instr, 22, 12);
66451                             unsigned rm = ExtractSRegister(instr, 5, 0);
66452                             // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66453                             vrintx(condition,
66454                                    F32,
66455                                    SRegister(rd),
66456                                    SRegister(rm));
66457                             break;
66458                           }
66459                           case 0x00010080: {
66460                             // 0x0eb70ac0
66461                             if (((instr & 0xf0000000) == 0xf0000000)) {
66462                               UnallocatedA32(instr);
66463                               return;
66464                             }
66465                             Condition condition((instr >> 28) & 0xf);
66466                             unsigned rd = ExtractDRegister(instr, 22, 12);
66467                             unsigned rm = ExtractSRegister(instr, 5, 0);
66468                             // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1
66469                             vcvt(condition,
66470                                  F64,
66471                                  F32,
66472                                  DRegister(rd),
66473                                  SRegister(rm));
66474                             break;
66475                           }
66476                         }
66477                         break;
66478                       }
66479                       case 0x00080000: {
66480                         // 0x0eb80a40
66481                         if ((instr & 0x00010000) == 0x00000000) {
66482                           if (((instr & 0xf0000000) == 0xf0000000)) {
66483                             UnallocatedA32(instr);
66484                             return;
66485                           }
66486                           Condition condition((instr >> 28) & 0xf);
66487                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
66488                           if (dt.Is(kDataTypeValueInvalid)) {
66489                             UnallocatedA32(instr);
66490                             return;
66491                           }
66492                           unsigned rd = ExtractSRegister(instr, 22, 12);
66493                           unsigned rm = ExtractSRegister(instr, 5, 0);
66494                           // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1
66495                           vcvt(condition,
66496                                F32,
66497                                dt,
66498                                SRegister(rd),
66499                                SRegister(rm));
66500                         } else {
66501                           UnallocatedA32(instr);
66502                         }
66503                         break;
66504                       }
66505                       case 0x000a0000: {
66506                         // 0x0eba0a40
66507                         if (((instr & 0xf0000000) == 0xf0000000)) {
66508                           UnallocatedA32(instr);
66509                           return;
66510                         }
66511                         Condition condition((instr >> 28) & 0xf);
66512                         DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
66513                                                        ((instr >> 15) & 0x2));
66514                         if (dt.Is(kDataTypeValueInvalid)) {
66515                           UnallocatedA32(instr);
66516                           return;
66517                         }
66518                         unsigned rd = ExtractSRegister(instr, 22, 12);
66519                         unsigned offset = 32;
66520                         if (dt.Is(S16) || dt.Is(U16)) {
66521                           offset = 16;
66522                         }
66523                         uint32_t fbits = offset - (((instr >> 5) & 0x1) |
66524                                                    ((instr << 1) & 0x1e));
66525                         // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1
66526                         vcvt(condition,
66527                              F32,
66528                              dt,
66529                              SRegister(rd),
66530                              SRegister(rd),
66531                              fbits);
66532                         break;
66533                       }
66534                       case 0x000c0000: {
66535                         // 0x0ebc0a40
66536                         switch (instr & 0x00010080) {
66537                           case 0x00000000: {
66538                             // 0x0ebc0a40
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                             // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
66547                             vcvtr(condition,
66548                                   U32,
66549                                   F32,
66550                                   SRegister(rd),
66551                                   SRegister(rm));
66552                             break;
66553                           }
66554                           case 0x00000080: {
66555                             // 0x0ebc0ac0
66556                             if (((instr & 0xf0000000) == 0xf0000000)) {
66557                               UnallocatedA32(instr);
66558                               return;
66559                             }
66560                             Condition condition((instr >> 28) & 0xf);
66561                             unsigned rd = ExtractSRegister(instr, 22, 12);
66562                             unsigned rm = ExtractSRegister(instr, 5, 0);
66563                             // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
66564                             vcvt(condition,
66565                                  U32,
66566                                  F32,
66567                                  SRegister(rd),
66568                                  SRegister(rm));
66569                             break;
66570                           }
66571                           case 0x00010000: {
66572                             // 0x0ebd0a40
66573                             if (((instr & 0xf0000000) == 0xf0000000)) {
66574                               UnallocatedA32(instr);
66575                               return;
66576                             }
66577                             Condition condition((instr >> 28) & 0xf);
66578                             unsigned rd = ExtractSRegister(instr, 22, 12);
66579                             unsigned rm = ExtractSRegister(instr, 5, 0);
66580                             // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
66581                             vcvtr(condition,
66582                                   S32,
66583                                   F32,
66584                                   SRegister(rd),
66585                                   SRegister(rm));
66586                             break;
66587                           }
66588                           case 0x00010080: {
66589                             // 0x0ebd0ac0
66590                             if (((instr & 0xf0000000) == 0xf0000000)) {
66591                               UnallocatedA32(instr);
66592                               return;
66593                             }
66594                             Condition condition((instr >> 28) & 0xf);
66595                             unsigned rd = ExtractSRegister(instr, 22, 12);
66596                             unsigned rm = ExtractSRegister(instr, 5, 0);
66597                             // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
66598                             vcvt(condition,
66599                                  S32,
66600                                  F32,
66601                                  SRegister(rd),
66602                                  SRegister(rm));
66603                             break;
66604                           }
66605                         }
66606                         break;
66607                       }
66608                       case 0x000e0000: {
66609                         // 0x0ebe0a40
66610                         if (((instr & 0xf0000000) == 0xf0000000)) {
66611                           UnallocatedA32(instr);
66612                           return;
66613                         }
66614                         Condition condition((instr >> 28) & 0xf);
66615                         DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
66616                                                        ((instr >> 15) & 0x2));
66617                         if (dt.Is(kDataTypeValueInvalid)) {
66618                           UnallocatedA32(instr);
66619                           return;
66620                         }
66621                         unsigned rd = ExtractSRegister(instr, 22, 12);
66622                         unsigned offset = 32;
66623                         if (dt.Is(S16) || dt.Is(U16)) {
66624                           offset = 16;
66625                         }
66626                         uint32_t fbits = offset - (((instr >> 5) & 0x1) |
66627                                                    ((instr << 1) & 0x1e));
66628                         // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1
66629                         vcvt(condition,
66630                              dt,
66631                              F32,
66632                              SRegister(rd),
66633                              SRegister(rd),
66634                              fbits);
66635                         break;
66636                       }
66637                     }
66638                     break;
66639                   }
66640                   case 0x00a00100: {
66641                     // 0x0eb00b00
66642                     if (((instr & 0xf0000000) == 0xf0000000)) {
66643                       UnallocatedA32(instr);
66644                       return;
66645                     }
66646                     Condition condition((instr >> 28) & 0xf);
66647                     unsigned rd = ExtractDRegister(instr, 22, 12);
66648                     uint32_t encoded_imm =
66649                         (instr & 0xf) | ((instr >> 12) & 0xf0);
66650                     NeonImmediate imm =
66651                         ImmediateVFP::Decode<double>(encoded_imm);
66652                     // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2
66653                     vmov(condition, F64, DRegister(rd), imm);
66654                     if (((instr & 0xfb00ff0) != 0xeb00b00)) {
66655                       UnpredictableA32(instr);
66656                     }
66657                     break;
66658                   }
66659                   case 0x00a00140: {
66660                     // 0x0eb00b40
66661                     switch (instr & 0x000e0000) {
66662                       case 0x00000000: {
66663                         // 0x0eb00b40
66664                         switch (instr & 0x00010080) {
66665                           case 0x00000000: {
66666                             // 0x0eb00b40
66667                             if (((instr & 0xf0000000) == 0xf0000000)) {
66668                               UnallocatedA32(instr);
66669                               return;
66670                             }
66671                             Condition condition((instr >> 28) & 0xf);
66672                             unsigned rd = ExtractDRegister(instr, 22, 12);
66673                             unsigned rm = ExtractDRegister(instr, 5, 0);
66674                             // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
66675                             vmov(condition, F64, DRegister(rd), DRegister(rm));
66676                             break;
66677                           }
66678                           case 0x00000080: {
66679                             // 0x0eb00bc0
66680                             if (((instr & 0xf0000000) == 0xf0000000)) {
66681                               UnallocatedA32(instr);
66682                               return;
66683                             }
66684                             Condition condition((instr >> 28) & 0xf);
66685                             unsigned rd = ExtractDRegister(instr, 22, 12);
66686                             unsigned rm = ExtractDRegister(instr, 5, 0);
66687                             // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
66688                             vabs(condition, F64, DRegister(rd), DRegister(rm));
66689                             break;
66690                           }
66691                           case 0x00010000: {
66692                             // 0x0eb10b40
66693                             if (((instr & 0xf0000000) == 0xf0000000)) {
66694                               UnallocatedA32(instr);
66695                               return;
66696                             }
66697                             Condition condition((instr >> 28) & 0xf);
66698                             unsigned rd = ExtractDRegister(instr, 22, 12);
66699                             unsigned rm = ExtractDRegister(instr, 5, 0);
66700                             // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
66701                             vneg(condition, F64, DRegister(rd), DRegister(rm));
66702                             break;
66703                           }
66704                           case 0x00010080: {
66705                             // 0x0eb10bc0
66706                             if (((instr & 0xf0000000) == 0xf0000000)) {
66707                               UnallocatedA32(instr);
66708                               return;
66709                             }
66710                             Condition condition((instr >> 28) & 0xf);
66711                             unsigned rd = ExtractDRegister(instr, 22, 12);
66712                             unsigned rm = ExtractDRegister(instr, 5, 0);
66713                             // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66714                             vsqrt(condition, F64, DRegister(rd), DRegister(rm));
66715                             break;
66716                           }
66717                         }
66718                         break;
66719                       }
66720                       case 0x00020000: {
66721                         // 0x0eb20b40
66722                         switch (instr & 0x00010080) {
66723                           case 0x00000000: {
66724                             // 0x0eb20b40
66725                             if (((instr & 0xf0000000) == 0xf0000000)) {
66726                               UnallocatedA32(instr);
66727                               return;
66728                             }
66729                             Condition condition((instr >> 28) & 0xf);
66730                             unsigned rd = ExtractDRegister(instr, 22, 12);
66731                             unsigned rm = ExtractSRegister(instr, 5, 0);
66732                             // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
66733                             vcvtb(condition,
66734                                   F64,
66735                                   F16,
66736                                   DRegister(rd),
66737                                   SRegister(rm));
66738                             break;
66739                           }
66740                           case 0x00000080: {
66741                             // 0x0eb20bc0
66742                             if (((instr & 0xf0000000) == 0xf0000000)) {
66743                               UnallocatedA32(instr);
66744                               return;
66745                             }
66746                             Condition condition((instr >> 28) & 0xf);
66747                             unsigned rd = ExtractDRegister(instr, 22, 12);
66748                             unsigned rm = ExtractSRegister(instr, 5, 0);
66749                             // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
66750                             vcvtt(condition,
66751                                   F64,
66752                                   F16,
66753                                   DRegister(rd),
66754                                   SRegister(rm));
66755                             break;
66756                           }
66757                           case 0x00010000: {
66758                             // 0x0eb30b40
66759                             if (((instr & 0xf0000000) == 0xf0000000)) {
66760                               UnallocatedA32(instr);
66761                               return;
66762                             }
66763                             Condition condition((instr >> 28) & 0xf);
66764                             unsigned rd = ExtractSRegister(instr, 22, 12);
66765                             unsigned rm = ExtractDRegister(instr, 5, 0);
66766                             // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
66767                             vcvtb(condition,
66768                                   F16,
66769                                   F64,
66770                                   SRegister(rd),
66771                                   DRegister(rm));
66772                             break;
66773                           }
66774                           case 0x00010080: {
66775                             // 0x0eb30bc0
66776                             if (((instr & 0xf0000000) == 0xf0000000)) {
66777                               UnallocatedA32(instr);
66778                               return;
66779                             }
66780                             Condition condition((instr >> 28) & 0xf);
66781                             unsigned rd = ExtractSRegister(instr, 22, 12);
66782                             unsigned rm = ExtractDRegister(instr, 5, 0);
66783                             // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
66784                             vcvtt(condition,
66785                                   F16,
66786                                   F64,
66787                                   SRegister(rd),
66788                                   DRegister(rm));
66789                             break;
66790                           }
66791                         }
66792                         break;
66793                       }
66794                       case 0x00040000: {
66795                         // 0x0eb40b40
66796                         switch (instr & 0x00010080) {
66797                           case 0x00000000: {
66798                             // 0x0eb40b40
66799                             if (((instr & 0xf0000000) == 0xf0000000)) {
66800                               UnallocatedA32(instr);
66801                               return;
66802                             }
66803                             Condition condition((instr >> 28) & 0xf);
66804                             unsigned rd = ExtractDRegister(instr, 22, 12);
66805                             unsigned rm = ExtractDRegister(instr, 5, 0);
66806                             // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66807                             vcmp(condition, F64, DRegister(rd), DRegister(rm));
66808                             break;
66809                           }
66810                           case 0x00000080: {
66811                             // 0x0eb40bc0
66812                             if (((instr & 0xf0000000) == 0xf0000000)) {
66813                               UnallocatedA32(instr);
66814                               return;
66815                             }
66816                             Condition condition((instr >> 28) & 0xf);
66817                             unsigned rd = ExtractDRegister(instr, 22, 12);
66818                             unsigned rm = ExtractDRegister(instr, 5, 0);
66819                             // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66820                             vcmpe(condition, F64, DRegister(rd), DRegister(rm));
66821                             break;
66822                           }
66823                           case 0x00010000: {
66824                             // 0x0eb50b40
66825                             if (((instr & 0xf0000000) == 0xf0000000)) {
66826                               UnallocatedA32(instr);
66827                               return;
66828                             }
66829                             Condition condition((instr >> 28) & 0xf);
66830                             unsigned rd = ExtractDRegister(instr, 22, 12);
66831                             // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
66832                             vcmp(condition, F64, DRegister(rd), 0.0);
66833                             if (((instr & 0xfbf0fff) != 0xeb50b40)) {
66834                               UnpredictableA32(instr);
66835                             }
66836                             break;
66837                           }
66838                           case 0x00010080: {
66839                             // 0x0eb50bc0
66840                             if (((instr & 0xf0000000) == 0xf0000000)) {
66841                               UnallocatedA32(instr);
66842                               return;
66843                             }
66844                             Condition condition((instr >> 28) & 0xf);
66845                             unsigned rd = ExtractDRegister(instr, 22, 12);
66846                             // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
66847                             vcmpe(condition, F64, DRegister(rd), 0.0);
66848                             if (((instr & 0xfbf0fff) != 0xeb50bc0)) {
66849                               UnpredictableA32(instr);
66850                             }
66851                             break;
66852                           }
66853                         }
66854                         break;
66855                       }
66856                       case 0x00060000: {
66857                         // 0x0eb60b40
66858                         switch (instr & 0x00010080) {
66859                           case 0x00000000: {
66860                             // 0x0eb60b40
66861                             if (((instr & 0xf0000000) == 0xf0000000)) {
66862                               UnallocatedA32(instr);
66863                               return;
66864                             }
66865                             Condition condition((instr >> 28) & 0xf);
66866                             unsigned rd = ExtractDRegister(instr, 22, 12);
66867                             unsigned rm = ExtractDRegister(instr, 5, 0);
66868                             // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66869                             vrintr(condition,
66870                                    F64,
66871                                    DRegister(rd),
66872                                    DRegister(rm));
66873                             break;
66874                           }
66875                           case 0x00000080: {
66876                             // 0x0eb60bc0
66877                             if (((instr & 0xf0000000) == 0xf0000000)) {
66878                               UnallocatedA32(instr);
66879                               return;
66880                             }
66881                             Condition condition((instr >> 28) & 0xf);
66882                             unsigned rd = ExtractDRegister(instr, 22, 12);
66883                             unsigned rm = ExtractDRegister(instr, 5, 0);
66884                             // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66885                             vrintz(condition,
66886                                    F64,
66887                                    DRegister(rd),
66888                                    DRegister(rm));
66889                             break;
66890                           }
66891                           case 0x00010000: {
66892                             // 0x0eb70b40
66893                             if (((instr & 0xf0000000) == 0xf0000000)) {
66894                               UnallocatedA32(instr);
66895                               return;
66896                             }
66897                             Condition condition((instr >> 28) & 0xf);
66898                             unsigned rd = ExtractDRegister(instr, 22, 12);
66899                             unsigned rm = ExtractDRegister(instr, 5, 0);
66900                             // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66901                             vrintx(condition,
66902                                    F64,
66903                                    DRegister(rd),
66904                                    DRegister(rm));
66905                             break;
66906                           }
66907                           case 0x00010080: {
66908                             // 0x0eb70bc0
66909                             if (((instr & 0xf0000000) == 0xf0000000)) {
66910                               UnallocatedA32(instr);
66911                               return;
66912                             }
66913                             Condition condition((instr >> 28) & 0xf);
66914                             unsigned rd = ExtractSRegister(instr, 22, 12);
66915                             unsigned rm = ExtractDRegister(instr, 5, 0);
66916                             // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1
66917                             vcvt(condition,
66918                                  F32,
66919                                  F64,
66920                                  SRegister(rd),
66921                                  DRegister(rm));
66922                             break;
66923                           }
66924                         }
66925                         break;
66926                       }
66927                       case 0x00080000: {
66928                         // 0x0eb80b40
66929                         if ((instr & 0x00010000) == 0x00000000) {
66930                           if (((instr & 0xf0000000) == 0xf0000000)) {
66931                             UnallocatedA32(instr);
66932                             return;
66933                           }
66934                           Condition condition((instr >> 28) & 0xf);
66935                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
66936                           if (dt.Is(kDataTypeValueInvalid)) {
66937                             UnallocatedA32(instr);
66938                             return;
66939                           }
66940                           unsigned rd = ExtractDRegister(instr, 22, 12);
66941                           unsigned rm = ExtractSRegister(instr, 5, 0);
66942                           // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1
66943                           vcvt(condition,
66944                                F64,
66945                                dt,
66946                                DRegister(rd),
66947                                SRegister(rm));
66948                         } else {
66949                           UnallocatedA32(instr);
66950                         }
66951                         break;
66952                       }
66953                       case 0x000a0000: {
66954                         // 0x0eba0b40
66955                         if (((instr & 0xf0000000) == 0xf0000000)) {
66956                           UnallocatedA32(instr);
66957                           return;
66958                         }
66959                         Condition condition((instr >> 28) & 0xf);
66960                         DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
66961                                                        ((instr >> 15) & 0x2));
66962                         if (dt.Is(kDataTypeValueInvalid)) {
66963                           UnallocatedA32(instr);
66964                           return;
66965                         }
66966                         unsigned rd = ExtractDRegister(instr, 22, 12);
66967                         unsigned offset = 32;
66968                         if (dt.Is(S16) || dt.Is(U16)) {
66969                           offset = 16;
66970                         }
66971                         uint32_t fbits = offset - (((instr >> 5) & 0x1) |
66972                                                    ((instr << 1) & 0x1e));
66973                         // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1
66974                         vcvt(condition,
66975                              F64,
66976                              dt,
66977                              DRegister(rd),
66978                              DRegister(rd),
66979                              fbits);
66980                         break;
66981                       }
66982                       case 0x000c0000: {
66983                         // 0x0ebc0b40
66984                         switch (instr & 0x00010080) {
66985                           case 0x00000000: {
66986                             // 0x0ebc0b40
66987                             if (((instr & 0xf0000000) == 0xf0000000)) {
66988                               UnallocatedA32(instr);
66989                               return;
66990                             }
66991                             Condition condition((instr >> 28) & 0xf);
66992                             unsigned rd = ExtractSRegister(instr, 22, 12);
66993                             unsigned rm = ExtractDRegister(instr, 5, 0);
66994                             // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
66995                             vcvtr(condition,
66996                                   U32,
66997                                   F64,
66998                                   SRegister(rd),
66999                                   DRegister(rm));
67000                             break;
67001                           }
67002                           case 0x00000080: {
67003                             // 0x0ebc0bc0
67004                             if (((instr & 0xf0000000) == 0xf0000000)) {
67005                               UnallocatedA32(instr);
67006                               return;
67007                             }
67008                             Condition condition((instr >> 28) & 0xf);
67009                             unsigned rd = ExtractSRegister(instr, 22, 12);
67010                             unsigned rm = ExtractDRegister(instr, 5, 0);
67011                             // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
67012                             vcvt(condition,
67013                                  U32,
67014                                  F64,
67015                                  SRegister(rd),
67016                                  DRegister(rm));
67017                             break;
67018                           }
67019                           case 0x00010000: {
67020                             // 0x0ebd0b40
67021                             if (((instr & 0xf0000000) == 0xf0000000)) {
67022                               UnallocatedA32(instr);
67023                               return;
67024                             }
67025                             Condition condition((instr >> 28) & 0xf);
67026                             unsigned rd = ExtractSRegister(instr, 22, 12);
67027                             unsigned rm = ExtractDRegister(instr, 5, 0);
67028                             // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
67029                             vcvtr(condition,
67030                                   S32,
67031                                   F64,
67032                                   SRegister(rd),
67033                                   DRegister(rm));
67034                             break;
67035                           }
67036                           case 0x00010080: {
67037                             // 0x0ebd0bc0
67038                             if (((instr & 0xf0000000) == 0xf0000000)) {
67039                               UnallocatedA32(instr);
67040                               return;
67041                             }
67042                             Condition condition((instr >> 28) & 0xf);
67043                             unsigned rd = ExtractSRegister(instr, 22, 12);
67044                             unsigned rm = ExtractDRegister(instr, 5, 0);
67045                             // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
67046                             vcvt(condition,
67047                                  S32,
67048                                  F64,
67049                                  SRegister(rd),
67050                                  DRegister(rm));
67051                             break;
67052                           }
67053                         }
67054                         break;
67055                       }
67056                       case 0x000e0000: {
67057                         // 0x0ebe0b40
67058                         if (((instr & 0xf0000000) == 0xf0000000)) {
67059                           UnallocatedA32(instr);
67060                           return;
67061                         }
67062                         Condition condition((instr >> 28) & 0xf);
67063                         DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
67064                                                        ((instr >> 15) & 0x2));
67065                         if (dt.Is(kDataTypeValueInvalid)) {
67066                           UnallocatedA32(instr);
67067                           return;
67068                         }
67069                         unsigned rd = ExtractDRegister(instr, 22, 12);
67070                         unsigned offset = 32;
67071                         if (dt.Is(S16) || dt.Is(U16)) {
67072                           offset = 16;
67073                         }
67074                         uint32_t fbits = offset - (((instr >> 5) & 0x1) |
67075                                                    ((instr << 1) & 0x1e));
67076                         // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1
67077                         vcvt(condition,
67078                              dt,
67079                              F64,
67080                              DRegister(rd),
67081                              DRegister(rd),
67082                              fbits);
67083                         break;
67084                       }
67085                     }
67086                     break;
67087                   }
67088                 }
67089                 break;
67090               }
67091               case 0x00100a10: {
67092                 // 0x0e100a10
67093                 switch (instr & 0x00000100) {
67094                   case 0x00000000: {
67095                     // 0x0e100a10
67096                     switch (instr & 0x00e00000) {
67097                       case 0x00000000: {
67098                         // 0x0e100a10
67099                         if (((instr & 0xf0000000) == 0xf0000000)) {
67100                           UnallocatedA32(instr);
67101                           return;
67102                         }
67103                         Condition condition((instr >> 28) & 0xf);
67104                         unsigned rt = (instr >> 12) & 0xf;
67105                         unsigned rn = ExtractSRegister(instr, 7, 16);
67106                         // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1
67107                         vmov(condition, Register(rt), SRegister(rn));
67108                         if (((instr & 0xff00f7f) != 0xe100a10)) {
67109                           UnpredictableA32(instr);
67110                         }
67111                         break;
67112                       }
67113                       case 0x00e00000: {
67114                         // 0x0ef00a10
67115                         if (((instr & 0xf0000000) == 0xf0000000)) {
67116                           UnallocatedA32(instr);
67117                           return;
67118                         }
67119                         Condition condition((instr >> 28) & 0xf);
67120                         unsigned rt = (instr >> 12) & 0xf;
67121                         unsigned spec_reg = (instr >> 16) & 0xf;
67122                         switch (spec_reg) {
67123                           case 0x0:
67124                           case 0x1:
67125                           case 0x5:
67126                           case 0x6:
67127                           case 0x7:
67128                           case 0x8: {
67129                             // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1
67130                             vmrs(condition,
67131                                  RegisterOrAPSR_nzcv(rt),
67132                                  SpecialFPRegister(spec_reg));
67133                             if (((instr & 0xff00fff) != 0xef00a10)) {
67134                               UnpredictableA32(instr);
67135                             }
67136                             break;
67137                           }
67138                           default:
67139                             UnallocatedA32(instr);
67140                             break;
67141                         }
67142                         break;
67143                       }
67144                       default:
67145                         UnallocatedA32(instr);
67146                         break;
67147                     }
67148                     break;
67149                   }
67150                   case 0x00000100: {
67151                     // 0x0e100b10
67152                     if (((instr & 0xf0000000) == 0xf0000000)) {
67153                       UnallocatedA32(instr);
67154                       return;
67155                     }
67156                     Condition condition((instr >> 28) & 0xf);
67157                     unsigned lane;
67158                     DataType dt =
67159                         Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
67160                                                     ((instr >> 19) & 0xc) |
67161                                                     ((instr >> 19) & 0x10),
67162                                                 &lane);
67163                     if (dt.Is(kDataTypeValueInvalid)) {
67164                       UnallocatedA32(instr);
67165                       return;
67166                     }
67167                     unsigned rt = (instr >> 12) & 0xf;
67168                     unsigned rn = ExtractDRegister(instr, 7, 16);
67169                     // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1
67170                     vmov(condition, dt, Register(rt), DRegisterLane(rn, lane));
67171                     if (((instr & 0xf100f1f) != 0xe100b10)) {
67172                       UnpredictableA32(instr);
67173                     }
67174                     break;
67175                   }
67176                 }
67177                 break;
67178               }
67179               case 0x00100e10: {
67180                 // 0x0e100e10
67181                 if (((instr & 0xf0000000) == 0xf0000000)) {
67182                   UnallocatedA32(instr);
67183                   return;
67184                 }
67185                 UnimplementedA32("MRC", instr);
67186                 break;
67187               }
67188               default:
67189                 UnallocatedA32(instr);
67190                 break;
67191             }
67192             break;
67193           }
67194           case 0x01000000: {
67195             // 0x0f000000
67196             if (((instr & 0xf0000000) == 0xf0000000)) {
67197               UnallocatedA32(instr);
67198               return;
67199             }
67200             Condition condition((instr >> 28) & 0xf);
67201             uint32_t imm = instr & 0xffffff;
67202             // SVC{<c>}{<q>} {#}<imm> ; A1
67203             svc(condition, imm);
67204             break;
67205           }
67206         }
67207         break;
67208       }
67209     }
67210   }
67211 }  // NOLINT(readability/fn_size)
67212 // End of generated code.
67213 
DecodeT32At(const uint16_t * instruction_address,const uint16_t * buffer_end)67214 const uint16_t* PrintDisassembler::DecodeT32At(
67215     const uint16_t* instruction_address, const uint16_t* buffer_end) {
67216   uint32_t instruction = *instruction_address++ << 16;
67217 
67218   if (instruction >= kLowestT32_32Opcode) {
67219     if (instruction_address >= buffer_end) {
67220       os() << "?\n";
67221       return instruction_address;
67222     }
67223     instruction |= *instruction_address++;
67224   }
67225 
67226   DecodeT32(instruction);
67227   return instruction_address;
67228 }
67229 
DecodeT32(uint32_t instruction)67230 void PrintDisassembler::DecodeT32(uint32_t instruction) {
67231   PrintCodeAddress(GetCodeAddress());
67232   if (T32Size(instruction) == 2) {
67233     PrintOpcode16(instruction >> 16);
67234     Disassembler::DecodeT32(instruction);
67235   } else {
67236     PrintOpcode32(instruction);
67237     Disassembler::DecodeT32(instruction);
67238   }
67239   os() << "\n";
67240 }
67241 
67242 
DecodeA32(uint32_t instruction)67243 void PrintDisassembler::DecodeA32(uint32_t instruction) {
67244   PrintCodeAddress(GetCodeAddress());
67245   PrintOpcode32(instruction);
67246   Disassembler::DecodeA32(instruction);
67247   os() << "\n";
67248 }
67249 
67250 
DisassembleA32Buffer(const uint32_t * buffer,size_t size_in_bytes)67251 void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer,
67252                                              size_t size_in_bytes) {
67253   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
67254   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
67255   const uint32_t* const end_buffer =
67256       buffer + (size_in_bytes / sizeof(uint32_t));
67257   while (buffer < end_buffer) {
67258     DecodeA32(*buffer++);
67259   }
67260 }
67261 
67262 
DisassembleT32Buffer(const uint16_t * buffer,size_t size_in_bytes)67263 void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer,
67264                                              size_t size_in_bytes) {
67265   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
67266   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
67267   const uint16_t* const end_buffer =
67268       buffer + (size_in_bytes / sizeof(uint16_t));
67269   while (buffer < end_buffer) {
67270     buffer = DecodeT32At(buffer, end_buffer);
67271   }
67272   VIXL_ASSERT(buffer == end_buffer);
67273 }
67274 
67275 }  // namespace aarch32
67276 }  // namespace vixl
67277