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
27extern "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
44namespace vixl {
45namespace aarch32 {
46
47class T32CodeAddressIncrementer {
48  uint32_t* code_address_;
49  uint32_t increment_;
50
51 public:
52  T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address)
53      : code_address_(code_address),
54        increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {}
55  ~T32CodeAddressIncrementer() { *code_address_ += increment_; }
56};
57
58class A32CodeAddressIncrementer {
59  uint32_t* code_address_;
60
61 public:
62  explicit A32CodeAddressIncrementer(uint32_t* code_address)
63      : code_address_(code_address) {}
64  ~A32CodeAddressIncrementer() { *code_address_ += 4; }
65};
66
67class DecodeNeon {
68  int lane_;
69  SpacingType spacing_;
70  bool valid_;
71
72 public:
73  DecodeNeon(int lane, SpacingType spacing)
74      : lane_(lane), spacing_(spacing), valid_(true) {}
75  DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {}
76  int GetLane() const { return lane_; }
77  SpacingType GetSpacing() const { return spacing_; }
78  bool IsValid() const { return valid_; }
79};
80
81class DecodeNeonAndAlign : public DecodeNeon {
82 public:
83  Alignment align_;
84  DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align)
85      : DecodeNeon(lanes, spacing), align_(align) {}
86  DecodeNeonAndAlign() : align_(kBadAlignment) {}
87  Alignment GetAlign() const { return align_; }
88};
89
90// Start of generated code.
91DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) {
92  if ((value & 0xf) == 0x1) {
93    switch (type_value) {
94      case 0x0:
95        return S8;
96      case 0x1:
97        return U8;
98    }
99  } else if ((value & 0xe) == 0x2) {
100    switch (type_value) {
101      case 0x0:
102        return S16;
103      case 0x1:
104        return U16;
105    }
106  } else if ((value & 0xc) == 0x4) {
107    switch (type_value) {
108      case 0x0:
109        return S32;
110      case 0x1:
111        return U32;
112    }
113  } else if ((value & 0x8) == 0x8) {
114    switch (type_value) {
115      case 0x0:
116        return S64;
117      case 0x1:
118        return U64;
119    }
120  }
121  return kDataTypeValueInvalid;
122}
123
124DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) {
125  if ((value & 0xf) == 0x1) {
126    if (type_value == 0x1) return S8;
127  } else if ((value & 0xe) == 0x2) {
128    if (type_value == 0x1) return S16;
129  } else if ((value & 0xc) == 0x4) {
130    if (type_value == 0x1) return S32;
131  } else if ((value & 0x8) == 0x8) {
132    if (type_value == 0x1) return S64;
133  }
134  return kDataTypeValueInvalid;
135}
136
137DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) {
138  if ((value & 0xf) == 0x1) {
139    return I8;
140  } else if ((value & 0xe) == 0x2) {
141    return I16;
142  } else if ((value & 0xc) == 0x4) {
143    return I32;
144  } else if ((value & 0x8) == 0x8) {
145    return I64;
146  }
147  return kDataTypeValueInvalid;
148}
149
150DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) {
151  if ((value & 0xf) == 0x1) {
152    return Untyped8;
153  } else if ((value & 0xe) == 0x2) {
154    return Untyped16;
155  } else if ((value & 0xc) == 0x4) {
156    return Untyped32;
157  } else if ((value & 0x8) == 0x8) {
158    return Untyped64;
159  }
160  return kDataTypeValueInvalid;
161}
162
163DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) {
164  if ((value & 0x7) == 0x1) {
165    switch (type_value) {
166      case 0x0:
167        return S16;
168      case 0x1:
169        return U16;
170    }
171  } else if ((value & 0x6) == 0x2) {
172    switch (type_value) {
173      case 0x0:
174        return S32;
175      case 0x1:
176        return U32;
177    }
178  } else if ((value & 0x4) == 0x4) {
179    switch (type_value) {
180      case 0x0:
181        return S64;
182      case 0x1:
183        return U64;
184    }
185  }
186  return kDataTypeValueInvalid;
187}
188
189DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) {
190  if ((value & 0x7) == 0x1) {
191    if (type_value == 0x1) return S16;
192  } else if ((value & 0x6) == 0x2) {
193    if (type_value == 0x1) return S32;
194  } else if ((value & 0x4) == 0x4) {
195    if (type_value == 0x1) return S64;
196  }
197  return kDataTypeValueInvalid;
198}
199
200DataTypeValue Dt_imm6_3_Decode(uint32_t value) {
201  if ((value & 0x7) == 0x1) {
202    return I16;
203  } else if ((value & 0x6) == 0x2) {
204    return I32;
205  } else if ((value & 0x4) == 0x4) {
206    return I64;
207  }
208  return kDataTypeValueInvalid;
209}
210
211DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) {
212  if ((value & 0x7) == 0x1) {
213    switch (type_value) {
214      case 0x0:
215        return S8;
216      case 0x1:
217        return U8;
218    }
219  } else if ((value & 0x6) == 0x2) {
220    switch (type_value) {
221      case 0x0:
222        return S16;
223      case 0x1:
224        return U16;
225    }
226  } else if ((value & 0x4) == 0x4) {
227    switch (type_value) {
228      case 0x0:
229        return S32;
230      case 0x1:
231        return U32;
232    }
233  }
234  return kDataTypeValueInvalid;
235}
236
237DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) {
238  switch (value) {
239    case 0x0:
240      return S8;
241    case 0x1:
242      return S16;
243    case 0x2:
244      return S32;
245    case 0x4:
246      return U8;
247    case 0x5:
248      return U16;
249    case 0x6:
250      return U32;
251    case 0x8:
252      return P8;
253    case 0xa:
254      return P64;
255  }
256  return kDataTypeValueInvalid;
257}
258
259DataTypeValue Dt_op_size_1_Decode(uint32_t value) {
260  switch (value) {
261    case 0x0:
262      return I8;
263    case 0x1:
264      return I16;
265    case 0x2:
266      return I32;
267    case 0x4:
268      return P8;
269  }
270  return kDataTypeValueInvalid;
271}
272
273DataTypeValue Dt_op_size_2_Decode(uint32_t value) {
274  switch (value) {
275    case 0x0:
276      return S8;
277    case 0x1:
278      return S16;
279    case 0x2:
280      return S32;
281    case 0x4:
282      return U8;
283    case 0x5:
284      return U16;
285    case 0x6:
286      return U32;
287  }
288  return kDataTypeValueInvalid;
289}
290
291DataTypeValue Dt_op_size_3_Decode(uint32_t value) {
292  switch (value) {
293    case 0x0:
294      return S16;
295    case 0x1:
296      return S32;
297    case 0x2:
298      return S64;
299    case 0x4:
300      return U16;
301    case 0x5:
302      return U32;
303    case 0x6:
304      return U64;
305  }
306  return kDataTypeValueInvalid;
307}
308
309DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) {
310  switch (value) {
311    case 0x1:
312      return S8;
313    case 0x2:
314      return S16;
315    case 0x4:
316      return S32;
317    case 0x9:
318      return U8;
319    case 0xa:
320      return U16;
321    case 0xc:
322      return U32;
323  }
324  return kDataTypeValueInvalid;
325}
326
327DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
328  if ((value & 0x18) == 0x8) {
329    *lane = value & 7;
330    return S8;
331  }
332  if ((value & 0x19) == 0x1) {
333    *lane = (value >> 1) & 3;
334    return S16;
335  }
336  if ((value & 0x18) == 0x18) {
337    *lane = value & 7;
338    return U8;
339  }
340  if ((value & 0x19) == 0x11) {
341    *lane = (value >> 1) & 3;
342    return U16;
343  }
344  if ((value & 0x1b) == 0x0) {
345    *lane = (value >> 2) & 1;
346    return Untyped32;
347  }
348  *lane = -1;
349  return kDataTypeValueInvalid;
350}
351
352DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
353  if ((value & 0x8) == 0x8) {
354    *lane = value & 7;
355    return Untyped8;
356  }
357  if ((value & 0x9) == 0x1) {
358    *lane = (value >> 1) & 3;
359    return Untyped16;
360  }
361  if ((value & 0xb) == 0x0) {
362    *lane = (value >> 2) & 1;
363    return Untyped32;
364  }
365  *lane = -1;
366  return kDataTypeValueInvalid;
367}
368
369DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) {
370  if ((value & 0x1) == 0x1) {
371    *lane = (value >> 1) & 7;
372    return Untyped8;
373  }
374  if ((value & 0x3) == 0x2) {
375    *lane = (value >> 2) & 3;
376    return Untyped16;
377  }
378  if ((value & 0x7) == 0x4) {
379    *lane = (value >> 3) & 1;
380    return Untyped32;
381  }
382  *lane = -1;
383  return kDataTypeValueInvalid;
384}
385
386DataTypeValue Dt_B_E_1_Decode(uint32_t value) {
387  switch (value) {
388    case 0x2:
389      return Untyped8;
390    case 0x1:
391      return Untyped16;
392    case 0x0:
393      return Untyped32;
394  }
395  return kDataTypeValueInvalid;
396}
397
398DataTypeValue Dt_op_1_Decode1(uint32_t value) {
399  switch (value) {
400    case 0x0:
401      return F32;
402    case 0x1:
403      return F32;
404    case 0x2:
405      return S32;
406    case 0x3:
407      return U32;
408  }
409  return kDataTypeValueInvalid;
410}
411
412DataTypeValue Dt_op_1_Decode2(uint32_t value) {
413  switch (value) {
414    case 0x0:
415      return S32;
416    case 0x1:
417      return U32;
418    case 0x2:
419      return F32;
420    case 0x3:
421      return F32;
422  }
423  return kDataTypeValueInvalid;
424}
425
426DataTypeValue Dt_op_2_Decode(uint32_t value) {
427  switch (value) {
428    case 0x0:
429      return U32;
430    case 0x1:
431      return S32;
432  }
433  return kDataTypeValueInvalid;
434}
435
436DataTypeValue Dt_op_3_Decode(uint32_t value) {
437  switch (value) {
438    case 0x0:
439      return S32;
440    case 0x1:
441      return U32;
442  }
443  return kDataTypeValueInvalid;
444}
445
446DataTypeValue Dt_U_sx_1_Decode(uint32_t value) {
447  switch (value) {
448    case 0x0:
449      return S16;
450    case 0x1:
451      return S32;
452    case 0x2:
453      return U16;
454    case 0x3:
455      return U32;
456  }
457  return kDataTypeValueInvalid;
458}
459
460DataTypeValue Dt_op_U_1_Decode1(uint32_t value) {
461  switch (value) {
462    case 0x0:
463      return F32;
464    case 0x1:
465      return F32;
466    case 0x2:
467      return S32;
468    case 0x3:
469      return U32;
470  }
471  return kDataTypeValueInvalid;
472}
473
474DataTypeValue Dt_op_U_1_Decode2(uint32_t value) {
475  switch (value) {
476    case 0x0:
477      return S32;
478    case 0x1:
479      return U32;
480    case 0x2:
481      return F32;
482    case 0x3:
483      return F32;
484  }
485  return kDataTypeValueInvalid;
486}
487
488DataTypeValue Dt_sz_1_Decode(uint32_t value) {
489  switch (value) {
490    case 0x0:
491      return F32;
492  }
493  return kDataTypeValueInvalid;
494}
495
496DataTypeValue Dt_F_size_1_Decode(uint32_t value) {
497  switch (value) {
498    case 0x0:
499      return S8;
500    case 0x1:
501      return S16;
502    case 0x2:
503      return S32;
504    case 0x6:
505      return F32;
506  }
507  return kDataTypeValueInvalid;
508}
509
510DataTypeValue Dt_F_size_2_Decode(uint32_t value) {
511  switch (value) {
512    case 0x0:
513      return I8;
514    case 0x1:
515      return I16;
516    case 0x2:
517      return I32;
518    case 0x6:
519      return F32;
520  }
521  return kDataTypeValueInvalid;
522}
523
524DataTypeValue Dt_F_size_3_Decode(uint32_t value) {
525  switch (value) {
526    case 0x1:
527      return I16;
528    case 0x2:
529      return I32;
530    case 0x6:
531      return F32;
532  }
533  return kDataTypeValueInvalid;
534}
535
536DataTypeValue Dt_F_size_4_Decode(uint32_t value) {
537  switch (value) {
538    case 0x2:
539      return U32;
540    case 0x6:
541      return F32;
542  }
543  return kDataTypeValueInvalid;
544}
545
546DataTypeValue Dt_U_size_1_Decode(uint32_t value) {
547  switch (value) {
548    case 0x0:
549      return S8;
550    case 0x1:
551      return S16;
552    case 0x2:
553      return S32;
554    case 0x4:
555      return U8;
556    case 0x5:
557      return U16;
558    case 0x6:
559      return U32;
560  }
561  return kDataTypeValueInvalid;
562}
563
564DataTypeValue Dt_U_size_2_Decode(uint32_t value) {
565  switch (value) {
566    case 0x1:
567      return S16;
568    case 0x2:
569      return S32;
570    case 0x5:
571      return U16;
572    case 0x6:
573      return U32;
574  }
575  return kDataTypeValueInvalid;
576}
577
578DataTypeValue Dt_U_size_3_Decode(uint32_t value) {
579  switch (value) {
580    case 0x0:
581      return S8;
582    case 0x1:
583      return S16;
584    case 0x2:
585      return S32;
586    case 0x3:
587      return S64;
588    case 0x4:
589      return U8;
590    case 0x5:
591      return U16;
592    case 0x6:
593      return U32;
594    case 0x7:
595      return U64;
596  }
597  return kDataTypeValueInvalid;
598}
599
600DataTypeValue Dt_size_1_Decode(uint32_t value) {
601  switch (value) {
602    case 0x0:
603      return Untyped8;
604  }
605  return kDataTypeValueInvalid;
606}
607
608DataTypeValue Dt_size_2_Decode(uint32_t value) {
609  switch (value) {
610    case 0x0:
611      return I8;
612    case 0x1:
613      return I16;
614    case 0x2:
615      return I32;
616    case 0x3:
617      return I64;
618  }
619  return kDataTypeValueInvalid;
620}
621
622DataTypeValue Dt_size_3_Decode(uint32_t value) {
623  switch (value) {
624    case 0x0:
625      return I16;
626    case 0x1:
627      return I32;
628    case 0x2:
629      return I64;
630  }
631  return kDataTypeValueInvalid;
632}
633
634DataTypeValue Dt_size_4_Decode(uint32_t value) {
635  switch (value) {
636    case 0x0:
637      return I8;
638    case 0x1:
639      return I16;
640    case 0x2:
641      return I32;
642  }
643  return kDataTypeValueInvalid;
644}
645
646DataTypeValue Dt_size_5_Decode(uint32_t value) {
647  switch (value) {
648    case 0x0:
649      return S8;
650    case 0x1:
651      return S16;
652    case 0x2:
653      return S32;
654  }
655  return kDataTypeValueInvalid;
656}
657
658DataTypeValue Dt_size_6_Decode(uint32_t value) {
659  switch (value) {
660    case 0x0:
661      return Untyped8;
662    case 0x1:
663      return Untyped16;
664    case 0x2:
665      return Untyped32;
666    case 0x3:
667      return Untyped64;
668  }
669  return kDataTypeValueInvalid;
670}
671
672DataTypeValue Dt_size_7_Decode(uint32_t value) {
673  switch (value) {
674    case 0x0:
675      return Untyped8;
676    case 0x1:
677      return Untyped16;
678    case 0x2:
679      return Untyped32;
680  }
681  return kDataTypeValueInvalid;
682}
683
684DataTypeValue Dt_size_8_Decode(uint32_t value) {
685  switch (value) {
686    case 0x0:
687      return Untyped8;
688    case 0x1:
689      return Untyped16;
690    case 0x2:
691      return Untyped32;
692    case 0x3:
693      return Untyped32;
694  }
695  return kDataTypeValueInvalid;
696}
697
698DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) {
699  switch (value) {
700    case 0x1:
701      switch (type_value) {
702        case 0x0:
703          return I16;
704      }
705      break;
706    case 0x2:
707      switch (type_value) {
708        case 0x0:
709          return I32;
710        case 0x1:
711          return F32;
712      }
713      break;
714  }
715  return kDataTypeValueInvalid;
716}
717
718DataTypeValue Dt_size_10_Decode(uint32_t value) {
719  switch (value) {
720    case 0x0:
721      return I8;
722    case 0x1:
723      return I16;
724    case 0x2:
725      return I32;
726  }
727  return kDataTypeValueInvalid;
728}
729
730DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) {
731  switch (value) {
732    case 0x1:
733      switch (type_value) {
734        case 0x0:
735          return S16;
736        case 0x1:
737          return U16;
738      }
739      break;
740    case 0x2:
741      switch (type_value) {
742        case 0x0:
743          return S32;
744        case 0x1:
745          return U32;
746      }
747      break;
748  }
749  return kDataTypeValueInvalid;
750}
751
752DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) {
753  switch (value) {
754    case 0x0:
755      switch (type_value) {
756        case 0x0:
757          return S8;
758        case 0x1:
759          return U8;
760      }
761      break;
762    case 0x1:
763      switch (type_value) {
764        case 0x0:
765          return S16;
766        case 0x1:
767          return U16;
768      }
769      break;
770    case 0x2:
771      switch (type_value) {
772        case 0x0:
773          return S32;
774        case 0x1:
775          return U32;
776      }
777      break;
778  }
779  return kDataTypeValueInvalid;
780}
781
782DataTypeValue Dt_size_13_Decode(uint32_t value) {
783  switch (value) {
784    case 0x1:
785      return S16;
786    case 0x2:
787      return S32;
788  }
789  return kDataTypeValueInvalid;
790}
791
792DataTypeValue Dt_size_14_Decode(uint32_t value) {
793  switch (value) {
794    case 0x0:
795      return S16;
796    case 0x1:
797      return S32;
798    case 0x2:
799      return S64;
800  }
801  return kDataTypeValueInvalid;
802}
803
804DataTypeValue Dt_size_15_Decode(uint32_t value) {
805  switch (value) {
806    case 0x0:
807      return Untyped8;
808    case 0x1:
809      return Untyped16;
810  }
811  return kDataTypeValueInvalid;
812}
813
814DataTypeValue Dt_size_16_Decode(uint32_t value) {
815  switch (value) {
816    case 0x0:
817      return I8;
818    case 0x1:
819      return I16;
820    case 0x2:
821      return I32;
822  }
823  return kDataTypeValueInvalid;
824}
825
826DecodeNeon Index_1_Decode(uint32_t value, DataType dt) {
827  switch (dt.GetValue()) {
828    case Untyped8: {
829      int lane = (value >> 1) & 0x7;
830      if ((value & 1) != 0) break;
831      SpacingType spacing = kSingle;
832      return DecodeNeon(lane, spacing);
833    }
834    case Untyped16: {
835      int lane = (value >> 2) & 0x3;
836      if ((value & 1) != 0) break;
837      SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle;
838      return DecodeNeon(lane, spacing);
839    }
840    case Untyped32: {
841      int lane = (value >> 3) & 0x1;
842      if ((value & 3) != 0) break;
843      SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle;
844      return DecodeNeon(lane, spacing);
845    }
846    default:
847      break;
848  }
849  return DecodeNeon();
850}
851
852DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) {
853  switch (dt.GetValue()) {
854    case Untyped8: {
855      AlignmentType align;
856      if ((value & 1) == 0) {
857        align = kNoAlignment;
858      } else {
859        break;
860      }
861      int lane = (value >> 1) & 0x7;
862      SpacingType spacing = kSingle;
863      return DecodeNeonAndAlign(lane, spacing, align);
864    }
865    case Untyped16: {
866      AlignmentType align;
867      if ((value & 3) == 1) {
868        align = k16BitAlign;
869      } else if ((value & 3) == 0) {
870        align = kNoAlignment;
871      } else {
872        break;
873      }
874      int lane = (value >> 2) & 0x3;
875      SpacingType spacing = kSingle;
876      return DecodeNeonAndAlign(lane, spacing, align);
877    }
878    case Untyped32: {
879      AlignmentType align;
880      if ((value & 7) == 3) {
881        align = k32BitAlign;
882      } else if ((value & 7) == 0) {
883        align = kNoAlignment;
884      } else {
885        break;
886      }
887      int lane = (value >> 3) & 0x1;
888      SpacingType spacing = kSingle;
889      return DecodeNeonAndAlign(lane, spacing, align);
890    }
891    default:
892      break;
893  }
894  return DecodeNeonAndAlign();
895}
896
897DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) {
898  switch (dt.GetValue()) {
899    case Untyped8: {
900      AlignmentType align;
901      if ((value & 1) == 1) {
902        align = k16BitAlign;
903      } else if ((value & 1) == 0) {
904        align = kNoAlignment;
905      } else {
906        break;
907      }
908      int lane = (value >> 1) & 0x7;
909      SpacingType spacing = kSingle;
910      return DecodeNeonAndAlign(lane, spacing, align);
911    }
912    case Untyped16: {
913      AlignmentType align;
914      if ((value & 1) == 1) {
915        align = k32BitAlign;
916      } else if ((value & 1) == 0) {
917        align = kNoAlignment;
918      } else {
919        break;
920      }
921      int lane = (value >> 2) & 0x3;
922      SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
923      return DecodeNeonAndAlign(lane, spacing, align);
924    }
925    case Untyped32: {
926      AlignmentType align;
927      if ((value & 3) == 1) {
928        align = k64BitAlign;
929      } else if ((value & 3) == 0) {
930        align = kNoAlignment;
931      } else {
932        break;
933      }
934      int lane = (value >> 3) & 0x1;
935      SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
936      return DecodeNeonAndAlign(lane, spacing, align);
937    }
938    default:
939      break;
940  }
941  return DecodeNeonAndAlign();
942}
943
944DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) {
945  switch (dt.GetValue()) {
946    case Untyped8: {
947      AlignmentType align;
948      if ((value & 1) == 1) {
949        align = k32BitAlign;
950      } else if ((value & 1) == 0) {
951        align = kNoAlignment;
952      } else {
953        break;
954      }
955      int lane = (value >> 1) & 0x7;
956      SpacingType spacing = kSingle;
957      return DecodeNeonAndAlign(lane, spacing, align);
958    }
959    case Untyped16: {
960      AlignmentType align;
961      if ((value & 1) == 1) {
962        align = k64BitAlign;
963      } else if ((value & 1) == 0) {
964        align = kNoAlignment;
965      } else {
966        break;
967      }
968      int lane = (value >> 2) & 0x3;
969      SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
970      return DecodeNeonAndAlign(lane, spacing, align);
971    }
972    case Untyped32: {
973      AlignmentType align;
974      if ((value & 3) == 1) {
975        align = k64BitAlign;
976      } else if ((value & 3) == 2) {
977        align = k128BitAlign;
978      } else if ((value & 3) == 0) {
979        align = kNoAlignment;
980      } else {
981        break;
982      }
983      int lane = (value >> 3) & 0x1;
984      SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
985      return DecodeNeonAndAlign(lane, spacing, align);
986    }
987    default:
988      break;
989  }
990  return DecodeNeonAndAlign();
991}
992
993Alignment Align_a_1_Decode(uint32_t value, DataType dt) {
994  switch (value) {
995    case 0:
996      return kNoAlignment;
997    case 1:
998      if (dt.Is(Untyped16)) return k16BitAlign;
999      if (dt.Is(Untyped32)) return k32BitAlign;
1000      break;
1001    default:
1002      break;
1003  }
1004  return kBadAlignment;
1005}
1006
1007Alignment Align_a_2_Decode(uint32_t value, DataType dt) {
1008  switch (value) {
1009    case 0:
1010      return kNoAlignment;
1011    case 1:
1012      if (dt.Is(Untyped8)) return k16BitAlign;
1013      if (dt.Is(Untyped16)) return k32BitAlign;
1014      if (dt.Is(Untyped32)) return k64BitAlign;
1015      break;
1016    default:
1017      break;
1018  }
1019  return kBadAlignment;
1020}
1021
1022Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) {
1023  switch (value) {
1024    case 0:
1025      if (size != 3) return kNoAlignment;
1026      break;
1027    case 1:
1028      if (dt.Is(Untyped8)) return k32BitAlign;
1029      if (dt.Is(Untyped16)) return k64BitAlign;
1030      if (size == 2) return k64BitAlign;
1031      if (size == 3) return k128BitAlign;
1032      break;
1033    default:
1034      break;
1035  }
1036  return kBadAlignment;
1037}
1038
1039Alignment Align_align_1_Decode(uint32_t value) {
1040  switch (value) {
1041    case 0:
1042      return kNoAlignment;
1043    case 1:
1044      return k64BitAlign;
1045    case 2:
1046      return k128BitAlign;
1047    case 3:
1048      return k256BitAlign;
1049    default:
1050      break;
1051  }
1052  return kBadAlignment;
1053}
1054
1055Alignment Align_align_2_Decode(uint32_t value) {
1056  switch (value) {
1057    case 0:
1058      return kNoAlignment;
1059    case 1:
1060      return k64BitAlign;
1061    case 2:
1062      return k128BitAlign;
1063    case 3:
1064      return k256BitAlign;
1065    default:
1066      break;
1067  }
1068  return kBadAlignment;
1069}
1070
1071Alignment Align_align_3_Decode(uint32_t value) {
1072  switch (value) {
1073    case 0:
1074      return kNoAlignment;
1075    case 1:
1076      return k64BitAlign;
1077    default:
1078      break;
1079  }
1080  return kBadAlignment;
1081}
1082
1083Alignment Align_align_4_Decode(uint32_t value) {
1084  switch (value) {
1085    case 0:
1086      return kNoAlignment;
1087    case 1:
1088      return k64BitAlign;
1089    case 2:
1090      return k128BitAlign;
1091    case 3:
1092      return k256BitAlign;
1093    default:
1094      break;
1095  }
1096  return kBadAlignment;
1097}
1098
1099Alignment Align_align_5_Decode(uint32_t value) {
1100  switch (value) {
1101    case 0:
1102      return kNoAlignment;
1103    case 1:
1104      return k64BitAlign;
1105    case 2:
1106      return k128BitAlign;
1107    case 3:
1108      return k256BitAlign;
1109    default:
1110      break;
1111  }
1112  return kBadAlignment;
1113}
1114
1115
1116void Disassembler::adc(Condition cond,
1117                       EncodingSize size,
1118                       Register rd,
1119                       Register rn,
1120                       const Operand& operand) {
1121  os().SetCurrentInstruction(kAdc, kArithmetic);
1122  os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size;
1123  os() << " ";
1124  if (!rd.Is(rn) || !use_short_hand_form_) {
1125    os() << rd << ", ";
1126  }
1127  os() << rn << ", " << operand;
1128}
1129
1130void Disassembler::adcs(Condition cond,
1131                        EncodingSize size,
1132                        Register rd,
1133                        Register rn,
1134                        const Operand& operand) {
1135  os().SetCurrentInstruction(kAdcs, kArithmetic);
1136  os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size;
1137  os() << " ";
1138  if (!rd.Is(rn) || !use_short_hand_form_) {
1139    os() << rd << ", ";
1140  }
1141  os() << rn << ", " << operand;
1142}
1143
1144void Disassembler::add(Condition cond,
1145                       EncodingSize size,
1146                       Register rd,
1147                       Register rn,
1148                       const Operand& operand) {
1149  os().SetCurrentInstruction(kAdd, kArithmetic);
1150  os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size;
1151  os() << " ";
1152  if (!rd.Is(rn) || !use_short_hand_form_) {
1153    os() << rd << ", ";
1154  }
1155  os() << rn << ", " << operand;
1156}
1157
1158void Disassembler::add(Condition cond, Register rd, const Operand& operand) {
1159  os().SetCurrentInstruction(kAdd, kArithmetic);
1160  os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd
1161       << ", " << operand;
1162}
1163
1164void Disassembler::adds(Condition cond,
1165                        EncodingSize size,
1166                        Register rd,
1167                        Register rn,
1168                        const Operand& operand) {
1169  os().SetCurrentInstruction(kAdds, kArithmetic);
1170  os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size;
1171  os() << " ";
1172  if (!rd.Is(rn) || !use_short_hand_form_) {
1173    os() << rd << ", ";
1174  }
1175  os() << rn << ", " << operand;
1176}
1177
1178void Disassembler::adds(Register rd, const Operand& operand) {
1179  os().SetCurrentInstruction(kAdds, kArithmetic);
1180  os() << ToCString(kAdds) << " " << rd << ", " << operand;
1181}
1182
1183void Disassembler::addw(Condition cond,
1184                        Register rd,
1185                        Register rn,
1186                        const Operand& operand) {
1187  os().SetCurrentInstruction(kAddw, kArithmetic);
1188  os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond);
1189  os() << " ";
1190  if (!rd.Is(rn) || !use_short_hand_form_) {
1191    os() << rd << ", ";
1192  }
1193  os() << rn << ", " << operand;
1194}
1195
1196void Disassembler::adr(Condition cond,
1197                       EncodingSize size,
1198                       Register rd,
1199                       Location* location) {
1200  os().SetCurrentInstruction(kAdr, kAddress);
1201  os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
1202       << rd << ", "
1203       << PrintLabel(kAnyLocation, location, GetCodeAddress() & ~3);
1204}
1205
1206void Disassembler::and_(Condition cond,
1207                        EncodingSize size,
1208                        Register rd,
1209                        Register rn,
1210                        const Operand& operand) {
1211  os().SetCurrentInstruction(kAnd, kBitwise);
1212  os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
1213  os() << " ";
1214  if (!rd.Is(rn) || !use_short_hand_form_) {
1215    os() << rd << ", ";
1216  }
1217  os() << rn << ", " << operand;
1218}
1219
1220void Disassembler::ands(Condition cond,
1221                        EncodingSize size,
1222                        Register rd,
1223                        Register rn,
1224                        const Operand& operand) {
1225  os().SetCurrentInstruction(kAnds, kBitwise);
1226  os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
1227  os() << " ";
1228  if (!rd.Is(rn) || !use_short_hand_form_) {
1229    os() << rd << ", ";
1230  }
1231  os() << rn << ", " << operand;
1232}
1233
1234void Disassembler::asr(Condition cond,
1235                       EncodingSize size,
1236                       Register rd,
1237                       Register rm,
1238                       const Operand& operand) {
1239  os().SetCurrentInstruction(kAsr, kShift);
1240  os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
1241  os() << " ";
1242  if (!rd.Is(rm) || !use_short_hand_form_) {
1243    os() << rd << ", ";
1244  }
1245  os() << rm << ", " << operand;
1246}
1247
1248void Disassembler::asrs(Condition cond,
1249                        EncodingSize size,
1250                        Register rd,
1251                        Register rm,
1252                        const Operand& operand) {
1253  os().SetCurrentInstruction(kAsrs, kShift);
1254  os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
1255  os() << " ";
1256  if (!rd.Is(rm) || !use_short_hand_form_) {
1257    os() << rd << ", ";
1258  }
1259  os() << rm << ", " << operand;
1260}
1261
1262void Disassembler::b(Condition cond, EncodingSize size, Location* location) {
1263  os().SetCurrentInstruction(kB, kAddress | kBranch);
1264  os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
1265       << PrintLabel(kCodeLocation, location, GetCodeAddress());
1266}
1267
1268void Disassembler::bfc(Condition cond,
1269                       Register rd,
1270                       uint32_t lsb,
1271                       uint32_t width) {
1272  os().SetCurrentInstruction(kBfc, kShift);
1273  os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
1274       << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width);
1275}
1276
1277void Disassembler::bfi(
1278    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
1279  os().SetCurrentInstruction(kBfi, kShift);
1280  os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
1281       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
1282       << ImmediatePrinter(width);
1283}
1284
1285void Disassembler::bic(Condition cond,
1286                       EncodingSize size,
1287                       Register rd,
1288                       Register rn,
1289                       const Operand& operand) {
1290  os().SetCurrentInstruction(kBic, kBitwise);
1291  os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
1292  os() << " ";
1293  if (!rd.Is(rn) || !use_short_hand_form_) {
1294    os() << rd << ", ";
1295  }
1296  os() << rn << ", " << operand;
1297}
1298
1299void Disassembler::bics(Condition cond,
1300                        EncodingSize size,
1301                        Register rd,
1302                        Register rn,
1303                        const Operand& operand) {
1304  os().SetCurrentInstruction(kBics, kBitwise);
1305  os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
1306  os() << " ";
1307  if (!rd.Is(rn) || !use_short_hand_form_) {
1308    os() << rd << ", ";
1309  }
1310  os() << rn << ", " << operand;
1311}
1312
1313void Disassembler::bkpt(Condition cond, uint32_t imm) {
1314  os().SetCurrentInstruction(kBkpt, kSystem);
1315  os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " "
1316       << RawImmediatePrinter(imm);
1317}
1318
1319void Disassembler::bl(Condition cond, Location* location) {
1320  os().SetCurrentInstruction(kBl, kAddress | kBranch);
1321  os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
1322       << PrintLabel(kCodeLocation, location, GetCodeAddress());
1323}
1324
1325void Disassembler::blx(Condition cond, Location* location) {
1326  os().SetCurrentInstruction(kBlx, kAddress | kBranch);
1327  os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
1328       << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
1329}
1330
1331void Disassembler::blx(Condition cond, Register rm) {
1332  os().SetCurrentInstruction(kBlx, kAddress | kBranch);
1333  os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
1334}
1335
1336void Disassembler::bx(Condition cond, Register rm) {
1337  os().SetCurrentInstruction(kBx, kAddress | kBranch);
1338  os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
1339}
1340
1341void Disassembler::bxj(Condition cond, Register rm) {
1342  os().SetCurrentInstruction(kBxj, kAddress | kBranch);
1343  os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
1344}
1345
1346void Disassembler::cbnz(Register rn, Location* location) {
1347  os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
1348  os() << ToCString(kCbnz) << " " << rn << ", "
1349       << PrintLabel(kCodeLocation, location, GetCodeAddress());
1350}
1351
1352void Disassembler::cbz(Register rn, Location* location) {
1353  os().SetCurrentInstruction(kCbz, kAddress | kBranch);
1354  os() << ToCString(kCbz) << " " << rn << ", "
1355       << PrintLabel(kCodeLocation, location, GetCodeAddress());
1356}
1357
1358void Disassembler::clrex(Condition cond) {
1359  os().SetCurrentInstruction(kClrex, kNoAttribute);
1360  os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
1361}
1362
1363void Disassembler::clz(Condition cond, Register rd, Register rm) {
1364  os().SetCurrentInstruction(kClz, kNoAttribute);
1365  os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
1366       << ", " << rm;
1367}
1368
1369void Disassembler::cmn(Condition cond,
1370                       EncodingSize size,
1371                       Register rn,
1372                       const Operand& operand) {
1373  os().SetCurrentInstruction(kCmn, kArithmetic);
1374  os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
1375       << rn << ", " << operand;
1376}
1377
1378void Disassembler::cmp(Condition cond,
1379                       EncodingSize size,
1380                       Register rn,
1381                       const Operand& operand) {
1382  os().SetCurrentInstruction(kCmp, kArithmetic);
1383  os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
1384       << rn << ", " << operand;
1385}
1386
1387void Disassembler::crc32b(Condition cond,
1388                          Register rd,
1389                          Register rn,
1390                          Register rm) {
1391  os().SetCurrentInstruction(kCrc32b, kNoAttribute);
1392  os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
1393       << ", " << rn << ", " << rm;
1394}
1395
1396void Disassembler::crc32cb(Condition cond,
1397                           Register rd,
1398                           Register rn,
1399                           Register rm) {
1400  os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
1401  os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
1402       << ", " << rn << ", " << rm;
1403}
1404
1405void Disassembler::crc32ch(Condition cond,
1406                           Register rd,
1407                           Register rn,
1408                           Register rm) {
1409  os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
1410  os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
1411       << ", " << rn << ", " << rm;
1412}
1413
1414void Disassembler::crc32cw(Condition cond,
1415                           Register rd,
1416                           Register rn,
1417                           Register rm) {
1418  os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
1419  os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
1420       << ", " << rn << ", " << rm;
1421}
1422
1423void Disassembler::crc32h(Condition cond,
1424                          Register rd,
1425                          Register rn,
1426                          Register rm) {
1427  os().SetCurrentInstruction(kCrc32h, kNoAttribute);
1428  os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
1429       << ", " << rn << ", " << rm;
1430}
1431
1432void Disassembler::crc32w(Condition cond,
1433                          Register rd,
1434                          Register rn,
1435                          Register rm) {
1436  os().SetCurrentInstruction(kCrc32w, kNoAttribute);
1437  os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
1438       << ", " << rn << ", " << rm;
1439}
1440
1441void Disassembler::dmb(Condition cond, MemoryBarrier option) {
1442  os().SetCurrentInstruction(kDmb, kNoAttribute);
1443  os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
1444}
1445
1446void Disassembler::dsb(Condition cond, MemoryBarrier option) {
1447  os().SetCurrentInstruction(kDsb, kNoAttribute);
1448  os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
1449}
1450
1451void Disassembler::eor(Condition cond,
1452                       EncodingSize size,
1453                       Register rd,
1454                       Register rn,
1455                       const Operand& operand) {
1456  os().SetCurrentInstruction(kEor, kBitwise);
1457  os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
1458  os() << " ";
1459  if (!rd.Is(rn) || !use_short_hand_form_) {
1460    os() << rd << ", ";
1461  }
1462  os() << rn << ", " << operand;
1463}
1464
1465void Disassembler::eors(Condition cond,
1466                        EncodingSize size,
1467                        Register rd,
1468                        Register rn,
1469                        const Operand& operand) {
1470  os().SetCurrentInstruction(kEors, kBitwise);
1471  os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
1472  os() << " ";
1473  if (!rd.Is(rn) || !use_short_hand_form_) {
1474    os() << rd << ", ";
1475  }
1476  os() << rn << ", " << operand;
1477}
1478
1479void Disassembler::fldmdbx(Condition cond,
1480                           Register rn,
1481                           WriteBack write_back,
1482                           DRegisterList dreglist) {
1483  os().SetCurrentInstruction(kFldmdbx,
1484                             kLoadStore | kLoadStoreMultiple | kFpNeon);
1485  os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
1486       << write_back << ", " << dreglist;
1487}
1488
1489void Disassembler::fldmiax(Condition cond,
1490                           Register rn,
1491                           WriteBack write_back,
1492                           DRegisterList dreglist) {
1493  os().SetCurrentInstruction(kFldmiax,
1494                             kLoadStore | kLoadStoreMultiple | kFpNeon);
1495  os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
1496       << write_back << ", " << dreglist;
1497}
1498
1499void Disassembler::fstmdbx(Condition cond,
1500                           Register rn,
1501                           WriteBack write_back,
1502                           DRegisterList dreglist) {
1503  os().SetCurrentInstruction(kFstmdbx,
1504                             kLoadStore | kLoadStoreMultiple | kFpNeon);
1505  os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
1506       << write_back << ", " << dreglist;
1507}
1508
1509void Disassembler::fstmiax(Condition cond,
1510                           Register rn,
1511                           WriteBack write_back,
1512                           DRegisterList dreglist) {
1513  os().SetCurrentInstruction(kFstmiax,
1514                             kLoadStore | kLoadStoreMultiple | kFpNeon);
1515  os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
1516       << write_back << ", " << dreglist;
1517}
1518
1519void Disassembler::hlt(Condition cond, uint32_t imm) {
1520  os().SetCurrentInstruction(kHlt, kSystem);
1521  os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " "
1522       << RawImmediatePrinter(imm);
1523}
1524
1525void Disassembler::hvc(Condition cond, uint32_t imm) {
1526  os().SetCurrentInstruction(kHvc, kSystem);
1527  os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " "
1528       << RawImmediatePrinter(imm);
1529}
1530
1531void Disassembler::isb(Condition cond, MemoryBarrier option) {
1532  os().SetCurrentInstruction(kIsb, kNoAttribute);
1533  os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option;
1534}
1535
1536void Disassembler::it(Condition cond, uint16_t mask) {
1537  os().SetCurrentInstruction(kIt, kNoAttribute);
1538  os() << ToCString(kIt);
1539  int count;
1540  if ((mask & 0x1) != 0) {
1541    count = 3;
1542  } else if ((mask & 0x2) != 0) {
1543    count = 2;
1544  } else if ((mask & 0x4) != 0) {
1545    count = 1;
1546  } else {
1547    count = 0;
1548  }
1549  uint16_t tmp = 0x8;
1550  uint16_t ref = (cond.GetCondition() & 0x1) << 3;
1551  while (count-- > 0) {
1552    os() << (((mask & tmp) == ref) ? "t" : "e");
1553    tmp >>= 1;
1554    ref >>= 1;
1555  }
1556  if (cond.Is(al)) {
1557    os() << " al";
1558  } else {
1559    os() << " " << cond;
1560  }
1561}
1562
1563void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) {
1564  os().SetCurrentInstruction(kLda, kAddress | kLoadStore);
1565  os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt
1566       << ", " << PrintMemOperand(kLoadWordLocation, operand);
1567}
1568
1569void Disassembler::ldab(Condition cond,
1570                        Register rt,
1571                        const MemOperand& operand) {
1572  os().SetCurrentInstruction(kLdab, kAddress | kLoadStore);
1573  os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt
1574       << ", " << PrintMemOperand(kLoadByteLocation, operand);
1575}
1576
1577void Disassembler::ldaex(Condition cond,
1578                         Register rt,
1579                         const MemOperand& operand) {
1580  os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore);
1581  os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt
1582       << ", " << PrintMemOperand(kLoadWordLocation, operand);
1583}
1584
1585void Disassembler::ldaexb(Condition cond,
1586                          Register rt,
1587                          const MemOperand& operand) {
1588  os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore);
1589  os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt
1590       << ", " << PrintMemOperand(kLoadByteLocation, operand);
1591}
1592
1593void Disassembler::ldaexd(Condition cond,
1594                          Register rt,
1595                          Register rt2,
1596                          const MemOperand& operand) {
1597  os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore);
1598  os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt
1599       << ", " << rt2 << ", "
1600       << PrintMemOperand(kLoadDoubleWordLocation, operand);
1601}
1602
1603void Disassembler::ldaexh(Condition cond,
1604                          Register rt,
1605                          const MemOperand& operand) {
1606  os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore);
1607  os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt
1608       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1609}
1610
1611void Disassembler::ldah(Condition cond,
1612                        Register rt,
1613                        const MemOperand& operand) {
1614  os().SetCurrentInstruction(kLdah, kAddress | kLoadStore);
1615  os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt
1616       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1617}
1618
1619void Disassembler::ldm(Condition cond,
1620                       EncodingSize size,
1621                       Register rn,
1622                       WriteBack write_back,
1623                       RegisterList registers) {
1624  os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple);
1625  os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " "
1626       << rn << write_back << ", " << registers;
1627}
1628
1629void Disassembler::ldmda(Condition cond,
1630                         Register rn,
1631                         WriteBack write_back,
1632                         RegisterList registers) {
1633  os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple);
1634  os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn
1635       << write_back << ", " << registers;
1636}
1637
1638void Disassembler::ldmdb(Condition cond,
1639                         Register rn,
1640                         WriteBack write_back,
1641                         RegisterList registers) {
1642  os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple);
1643  os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn
1644       << write_back << ", " << registers;
1645}
1646
1647void Disassembler::ldmea(Condition cond,
1648                         Register rn,
1649                         WriteBack write_back,
1650                         RegisterList registers) {
1651  os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple);
1652  os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn
1653       << write_back << ", " << registers;
1654}
1655
1656void Disassembler::ldmed(Condition cond,
1657                         Register rn,
1658                         WriteBack write_back,
1659                         RegisterList registers) {
1660  os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple);
1661  os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn
1662       << write_back << ", " << registers;
1663}
1664
1665void Disassembler::ldmfa(Condition cond,
1666                         Register rn,
1667                         WriteBack write_back,
1668                         RegisterList registers) {
1669  os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple);
1670  os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn
1671       << write_back << ", " << registers;
1672}
1673
1674void Disassembler::ldmfd(Condition cond,
1675                         EncodingSize size,
1676                         Register rn,
1677                         WriteBack write_back,
1678                         RegisterList registers) {
1679  os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple);
1680  os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " "
1681       << rn << write_back << ", " << registers;
1682}
1683
1684void Disassembler::ldmib(Condition cond,
1685                         Register rn,
1686                         WriteBack write_back,
1687                         RegisterList registers) {
1688  os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple);
1689  os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn
1690       << write_back << ", " << registers;
1691}
1692
1693void Disassembler::ldr(Condition cond,
1694                       EncodingSize size,
1695                       Register rt,
1696                       const MemOperand& operand) {
1697  os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
1698  os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
1699       << rt << ", " << PrintMemOperand(kLoadWordLocation, operand);
1700}
1701
1702void Disassembler::ldr(Condition cond,
1703                       EncodingSize size,
1704                       Register rt,
1705                       Location* location) {
1706  os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
1707  os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
1708       << rt << ", "
1709       << PrintLabel(kLoadWordLocation, location, GetCodeAddress() & ~3);
1710}
1711
1712void Disassembler::ldrb(Condition cond,
1713                        EncodingSize size,
1714                        Register rt,
1715                        const MemOperand& operand) {
1716  os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
1717  os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " "
1718       << rt << ", " << PrintMemOperand(kLoadByteLocation, operand);
1719}
1720
1721void Disassembler::ldrb(Condition cond, Register rt, Location* location) {
1722  os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
1723  os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
1724       << ", "
1725       << PrintLabel(kLoadByteLocation, location, GetCodeAddress() & ~3);
1726}
1727
1728void Disassembler::ldrd(Condition cond,
1729                        Register rt,
1730                        Register rt2,
1731                        const MemOperand& operand) {
1732  os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
1733  os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
1734       << ", " << rt2 << ", "
1735       << PrintMemOperand(kLoadDoubleWordLocation, operand);
1736}
1737
1738void Disassembler::ldrd(Condition cond,
1739                        Register rt,
1740                        Register rt2,
1741                        Location* location) {
1742  os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
1743  os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
1744       << ", " << rt2 << ", "
1745       << PrintLabel(kLoadDoubleWordLocation, location, GetCodeAddress() & ~3);
1746}
1747
1748void Disassembler::ldrex(Condition cond,
1749                         Register rt,
1750                         const MemOperand& operand) {
1751  os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
1752  os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
1753       << ", " << PrintMemOperand(kLoadWordLocation, operand);
1754}
1755
1756void Disassembler::ldrexb(Condition cond,
1757                          Register rt,
1758                          const MemOperand& operand) {
1759  os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
1760  os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
1761       << ", " << PrintMemOperand(kLoadByteLocation, operand);
1762}
1763
1764void Disassembler::ldrexd(Condition cond,
1765                          Register rt,
1766                          Register rt2,
1767                          const MemOperand& operand) {
1768  os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
1769  os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
1770       << ", " << rt2 << ", "
1771       << PrintMemOperand(kLoadDoubleWordLocation, operand);
1772}
1773
1774void Disassembler::ldrexh(Condition cond,
1775                          Register rt,
1776                          const MemOperand& operand) {
1777  os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
1778  os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
1779       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1780}
1781
1782void Disassembler::ldrh(Condition cond,
1783                        EncodingSize size,
1784                        Register rt,
1785                        const MemOperand& operand) {
1786  os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
1787  os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
1788       << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1789}
1790
1791void Disassembler::ldrh(Condition cond, Register rt, Location* location) {
1792  os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
1793  os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
1794       << ", "
1795       << PrintLabel(kLoadHalfWordLocation, location, GetCodeAddress() & ~3);
1796}
1797
1798void Disassembler::ldrsb(Condition cond,
1799                         EncodingSize size,
1800                         Register rt,
1801                         const MemOperand& operand) {
1802  os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
1803  os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
1804       << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
1805}
1806
1807void Disassembler::ldrsb(Condition cond, Register rt, Location* location) {
1808  os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
1809  os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
1810       << ", "
1811       << PrintLabel(kLoadSignedByteLocation, location, GetCodeAddress() & ~3);
1812}
1813
1814void Disassembler::ldrsh(Condition cond,
1815                         EncodingSize size,
1816                         Register rt,
1817                         const MemOperand& operand) {
1818  os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
1819  os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
1820       << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
1821}
1822
1823void Disassembler::ldrsh(Condition cond, Register rt, Location* location) {
1824  os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
1825  os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
1826       << ", " << PrintLabel(kLoadSignedHalfWordLocation,
1827                             location,
1828                             GetCodeAddress() & ~3);
1829}
1830
1831void Disassembler::lsl(Condition cond,
1832                       EncodingSize size,
1833                       Register rd,
1834                       Register rm,
1835                       const Operand& operand) {
1836  os().SetCurrentInstruction(kLsl, kShift);
1837  os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
1838  os() << " ";
1839  if (!rd.Is(rm) || !use_short_hand_form_) {
1840    os() << rd << ", ";
1841  }
1842  os() << rm << ", " << operand;
1843}
1844
1845void Disassembler::lsls(Condition cond,
1846                        EncodingSize size,
1847                        Register rd,
1848                        Register rm,
1849                        const Operand& operand) {
1850  os().SetCurrentInstruction(kLsls, kShift);
1851  os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
1852  os() << " ";
1853  if (!rd.Is(rm) || !use_short_hand_form_) {
1854    os() << rd << ", ";
1855  }
1856  os() << rm << ", " << operand;
1857}
1858
1859void Disassembler::lsr(Condition cond,
1860                       EncodingSize size,
1861                       Register rd,
1862                       Register rm,
1863                       const Operand& operand) {
1864  os().SetCurrentInstruction(kLsr, kShift);
1865  os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
1866  os() << " ";
1867  if (!rd.Is(rm) || !use_short_hand_form_) {
1868    os() << rd << ", ";
1869  }
1870  os() << rm << ", " << operand;
1871}
1872
1873void Disassembler::lsrs(Condition cond,
1874                        EncodingSize size,
1875                        Register rd,
1876                        Register rm,
1877                        const Operand& operand) {
1878  os().SetCurrentInstruction(kLsrs, kShift);
1879  os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
1880  os() << " ";
1881  if (!rd.Is(rm) || !use_short_hand_form_) {
1882    os() << rd << ", ";
1883  }
1884  os() << rm << ", " << operand;
1885}
1886
1887void Disassembler::mla(
1888    Condition cond, Register rd, Register rn, Register rm, Register ra) {
1889  os().SetCurrentInstruction(kMla, kArithmetic);
1890  os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
1891       << ", " << rn << ", " << rm << ", " << ra;
1892}
1893
1894void Disassembler::mlas(
1895    Condition cond, Register rd, Register rn, Register rm, Register ra) {
1896  os().SetCurrentInstruction(kMlas, kArithmetic);
1897  os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
1898       << ", " << rn << ", " << rm << ", " << ra;
1899}
1900
1901void Disassembler::mls(
1902    Condition cond, Register rd, Register rn, Register rm, Register ra) {
1903  os().SetCurrentInstruction(kMls, kArithmetic);
1904  os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
1905       << ", " << rn << ", " << rm << ", " << ra;
1906}
1907
1908void Disassembler::mov(Condition cond,
1909                       EncodingSize size,
1910                       Register rd,
1911                       const Operand& operand) {
1912  os().SetCurrentInstruction(kMov, kNoAttribute);
1913  os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
1914       << rd << ", " << operand;
1915}
1916
1917void Disassembler::movs(Condition cond,
1918                        EncodingSize size,
1919                        Register rd,
1920                        const Operand& operand) {
1921  os().SetCurrentInstruction(kMovs, kNoAttribute);
1922  os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
1923       << rd << ", " << operand;
1924}
1925
1926void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
1927  os().SetCurrentInstruction(kMovt, kNoAttribute);
1928  os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
1929       << ", " << operand;
1930}
1931
1932void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
1933  os().SetCurrentInstruction(kMovw, kNoAttribute);
1934  os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
1935       << ", " << operand;
1936}
1937
1938void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
1939  os().SetCurrentInstruction(kMrs, kNoAttribute);
1940  os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
1941       << ", " << spec_reg;
1942}
1943
1944void Disassembler::msr(Condition cond,
1945                       MaskedSpecialRegister spec_reg,
1946                       const Operand& operand) {
1947  os().SetCurrentInstruction(kMsr, kNoAttribute);
1948  os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
1949       << spec_reg << ", " << operand;
1950}
1951
1952void Disassembler::mul(
1953    Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
1954  os().SetCurrentInstruction(kMul, kArithmetic);
1955  os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
1956       << rd << ", " << rn << ", " << rm;
1957}
1958
1959void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
1960  os().SetCurrentInstruction(kMuls, kArithmetic);
1961  os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
1962       << ", " << rn << ", " << rm;
1963}
1964
1965void Disassembler::mvn(Condition cond,
1966                       EncodingSize size,
1967                       Register rd,
1968                       const Operand& operand) {
1969  os().SetCurrentInstruction(kMvn, kNoAttribute);
1970  os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
1971       << rd << ", " << operand;
1972}
1973
1974void Disassembler::mvns(Condition cond,
1975                        EncodingSize size,
1976                        Register rd,
1977                        const Operand& operand) {
1978  os().SetCurrentInstruction(kMvns, kNoAttribute);
1979  os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
1980       << rd << ", " << operand;
1981}
1982
1983void Disassembler::nop(Condition cond, EncodingSize size) {
1984  os().SetCurrentInstruction(kNop, kNoAttribute);
1985  os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
1986}
1987
1988void Disassembler::orn(Condition cond,
1989                       Register rd,
1990                       Register rn,
1991                       const Operand& operand) {
1992  os().SetCurrentInstruction(kOrn, kBitwise);
1993  os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
1994  os() << " ";
1995  if (!rd.Is(rn) || !use_short_hand_form_) {
1996    os() << rd << ", ";
1997  }
1998  os() << rn << ", " << operand;
1999}
2000
2001void Disassembler::orns(Condition cond,
2002                        Register rd,
2003                        Register rn,
2004                        const Operand& operand) {
2005  os().SetCurrentInstruction(kOrns, kBitwise);
2006  os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
2007  os() << " ";
2008  if (!rd.Is(rn) || !use_short_hand_form_) {
2009    os() << rd << ", ";
2010  }
2011  os() << rn << ", " << operand;
2012}
2013
2014void Disassembler::orr(Condition cond,
2015                       EncodingSize size,
2016                       Register rd,
2017                       Register rn,
2018                       const Operand& operand) {
2019  os().SetCurrentInstruction(kOrr, kBitwise);
2020  os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
2021  os() << " ";
2022  if (!rd.Is(rn) || !use_short_hand_form_) {
2023    os() << rd << ", ";
2024  }
2025  os() << rn << ", " << operand;
2026}
2027
2028void Disassembler::orrs(Condition cond,
2029                        EncodingSize size,
2030                        Register rd,
2031                        Register rn,
2032                        const Operand& operand) {
2033  os().SetCurrentInstruction(kOrrs, kBitwise);
2034  os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
2035  os() << " ";
2036  if (!rd.Is(rn) || !use_short_hand_form_) {
2037    os() << rd << ", ";
2038  }
2039  os() << rn << ", " << operand;
2040}
2041
2042void Disassembler::pkhbt(Condition cond,
2043                         Register rd,
2044                         Register rn,
2045                         const Operand& operand) {
2046  os().SetCurrentInstruction(kPkhbt, kNoAttribute);
2047  os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
2048  os() << " ";
2049  if (!rd.Is(rn) || !use_short_hand_form_) {
2050    os() << rd << ", ";
2051  }
2052  os() << rn << ", " << operand;
2053}
2054
2055void Disassembler::pkhtb(Condition cond,
2056                         Register rd,
2057                         Register rn,
2058                         const Operand& operand) {
2059  os().SetCurrentInstruction(kPkhtb, kNoAttribute);
2060  os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
2061  os() << " ";
2062  if (!rd.Is(rn) || !use_short_hand_form_) {
2063    os() << rd << ", ";
2064  }
2065  os() << rn << ", " << operand;
2066}
2067
2068void Disassembler::pld(Condition cond, Location* location) {
2069  os().SetCurrentInstruction(kPld, kAddress);
2070  os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
2071       << PrintLabel(kDataLocation, location, GetCodeAddress() & ~3);
2072}
2073
2074void Disassembler::pld(Condition cond, const MemOperand& operand) {
2075  os().SetCurrentInstruction(kPld, kAddress);
2076  os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
2077       << PrintMemOperand(kDataLocation, operand);
2078}
2079
2080void Disassembler::pldw(Condition cond, const MemOperand& operand) {
2081  os().SetCurrentInstruction(kPldw, kAddress);
2082  os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
2083       << PrintMemOperand(kDataLocation, operand);
2084}
2085
2086void Disassembler::pli(Condition cond, const MemOperand& operand) {
2087  os().SetCurrentInstruction(kPli, kAddress);
2088  os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
2089       << PrintMemOperand(kCodeLocation, operand);
2090}
2091
2092void Disassembler::pli(Condition cond, Location* location) {
2093  os().SetCurrentInstruction(kPli, kAddress);
2094  os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
2095       << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
2096}
2097
2098void Disassembler::pop(Condition cond,
2099                       EncodingSize size,
2100                       RegisterList registers) {
2101  os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
2102  os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
2103       << registers;
2104}
2105
2106void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
2107  os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
2108  os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
2109       << "{" << rt << "}";
2110}
2111
2112void Disassembler::push(Condition cond,
2113                        EncodingSize size,
2114                        RegisterList registers) {
2115  os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
2116  os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
2117       << registers;
2118}
2119
2120void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
2121  os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
2122  os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
2123       << "{" << rt << "}";
2124}
2125
2126void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
2127  os().SetCurrentInstruction(kQadd, kArithmetic);
2128  os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
2129  os() << " ";
2130  if (!rd.Is(rm) || !use_short_hand_form_) {
2131    os() << rd << ", ";
2132  }
2133  os() << rm << ", " << rn;
2134}
2135
2136void Disassembler::qadd16(Condition cond,
2137                          Register rd,
2138                          Register rn,
2139                          Register rm) {
2140  os().SetCurrentInstruction(kQadd16, kArithmetic);
2141  os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
2142  os() << " ";
2143  if (!rd.Is(rn) || !use_short_hand_form_) {
2144    os() << rd << ", ";
2145  }
2146  os() << rn << ", " << rm;
2147}
2148
2149void Disassembler::qadd8(Condition cond,
2150                         Register rd,
2151                         Register rn,
2152                         Register rm) {
2153  os().SetCurrentInstruction(kQadd8, kArithmetic);
2154  os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
2155  os() << " ";
2156  if (!rd.Is(rn) || !use_short_hand_form_) {
2157    os() << rd << ", ";
2158  }
2159  os() << rn << ", " << rm;
2160}
2161
2162void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
2163  os().SetCurrentInstruction(kQasx, kArithmetic);
2164  os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
2165  os() << " ";
2166  if (!rd.Is(rn) || !use_short_hand_form_) {
2167    os() << rd << ", ";
2168  }
2169  os() << rn << ", " << rm;
2170}
2171
2172void Disassembler::qdadd(Condition cond,
2173                         Register rd,
2174                         Register rm,
2175                         Register rn) {
2176  os().SetCurrentInstruction(kQdadd, kArithmetic);
2177  os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
2178  os() << " ";
2179  if (!rd.Is(rm) || !use_short_hand_form_) {
2180    os() << rd << ", ";
2181  }
2182  os() << rm << ", " << rn;
2183}
2184
2185void Disassembler::qdsub(Condition cond,
2186                         Register rd,
2187                         Register rm,
2188                         Register rn) {
2189  os().SetCurrentInstruction(kQdsub, kArithmetic);
2190  os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
2191  os() << " ";
2192  if (!rd.Is(rm) || !use_short_hand_form_) {
2193    os() << rd << ", ";
2194  }
2195  os() << rm << ", " << rn;
2196}
2197
2198void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
2199  os().SetCurrentInstruction(kQsax, kArithmetic);
2200  os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
2201  os() << " ";
2202  if (!rd.Is(rn) || !use_short_hand_form_) {
2203    os() << rd << ", ";
2204  }
2205  os() << rn << ", " << rm;
2206}
2207
2208void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
2209  os().SetCurrentInstruction(kQsub, kArithmetic);
2210  os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
2211  os() << " ";
2212  if (!rd.Is(rm) || !use_short_hand_form_) {
2213    os() << rd << ", ";
2214  }
2215  os() << rm << ", " << rn;
2216}
2217
2218void Disassembler::qsub16(Condition cond,
2219                          Register rd,
2220                          Register rn,
2221                          Register rm) {
2222  os().SetCurrentInstruction(kQsub16, kArithmetic);
2223  os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
2224  os() << " ";
2225  if (!rd.Is(rn) || !use_short_hand_form_) {
2226    os() << rd << ", ";
2227  }
2228  os() << rn << ", " << rm;
2229}
2230
2231void Disassembler::qsub8(Condition cond,
2232                         Register rd,
2233                         Register rn,
2234                         Register rm) {
2235  os().SetCurrentInstruction(kQsub8, kArithmetic);
2236  os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
2237  os() << " ";
2238  if (!rd.Is(rn) || !use_short_hand_form_) {
2239    os() << rd << ", ";
2240  }
2241  os() << rn << ", " << rm;
2242}
2243
2244void Disassembler::rbit(Condition cond, Register rd, Register rm) {
2245  os().SetCurrentInstruction(kRbit, kNoAttribute);
2246  os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
2247       << ", " << rm;
2248}
2249
2250void Disassembler::rev(Condition cond,
2251                       EncodingSize size,
2252                       Register rd,
2253                       Register rm) {
2254  os().SetCurrentInstruction(kRev, kNoAttribute);
2255  os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
2256       << rd << ", " << rm;
2257}
2258
2259void Disassembler::rev16(Condition cond,
2260                         EncodingSize size,
2261                         Register rd,
2262                         Register rm) {
2263  os().SetCurrentInstruction(kRev16, kNoAttribute);
2264  os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
2265       << rd << ", " << rm;
2266}
2267
2268void Disassembler::revsh(Condition cond,
2269                         EncodingSize size,
2270                         Register rd,
2271                         Register rm) {
2272  os().SetCurrentInstruction(kRevsh, kNoAttribute);
2273  os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
2274       << rd << ", " << rm;
2275}
2276
2277void Disassembler::ror(Condition cond,
2278                       EncodingSize size,
2279                       Register rd,
2280                       Register rm,
2281                       const Operand& operand) {
2282  os().SetCurrentInstruction(kRor, kShift);
2283  os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
2284  os() << " ";
2285  if (!rd.Is(rm) || !use_short_hand_form_) {
2286    os() << rd << ", ";
2287  }
2288  os() << rm << ", " << operand;
2289}
2290
2291void Disassembler::rors(Condition cond,
2292                        EncodingSize size,
2293                        Register rd,
2294                        Register rm,
2295                        const Operand& operand) {
2296  os().SetCurrentInstruction(kRors, kShift);
2297  os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
2298  os() << " ";
2299  if (!rd.Is(rm) || !use_short_hand_form_) {
2300    os() << rd << ", ";
2301  }
2302  os() << rm << ", " << operand;
2303}
2304
2305void Disassembler::rrx(Condition cond, Register rd, Register rm) {
2306  os().SetCurrentInstruction(kRrx, kShift);
2307  os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
2308  os() << " ";
2309  if (!rd.Is(rm) || !use_short_hand_form_) {
2310    os() << rd << ", ";
2311  }
2312  os() << rm;
2313}
2314
2315void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
2316  os().SetCurrentInstruction(kRrxs, kShift);
2317  os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
2318  os() << " ";
2319  if (!rd.Is(rm) || !use_short_hand_form_) {
2320    os() << rd << ", ";
2321  }
2322  os() << rm;
2323}
2324
2325void Disassembler::rsb(Condition cond,
2326                       EncodingSize size,
2327                       Register rd,
2328                       Register rn,
2329                       const Operand& operand) {
2330  os().SetCurrentInstruction(kRsb, kArithmetic);
2331  os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
2332  os() << " ";
2333  if (!rd.Is(rn) || !use_short_hand_form_) {
2334    os() << rd << ", ";
2335  }
2336  os() << rn << ", " << operand;
2337}
2338
2339void Disassembler::rsbs(Condition cond,
2340                        EncodingSize size,
2341                        Register rd,
2342                        Register rn,
2343                        const Operand& operand) {
2344  os().SetCurrentInstruction(kRsbs, kArithmetic);
2345  os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
2346  os() << " ";
2347  if (!rd.Is(rn) || !use_short_hand_form_) {
2348    os() << rd << ", ";
2349  }
2350  os() << rn << ", " << operand;
2351}
2352
2353void Disassembler::rsc(Condition cond,
2354                       Register rd,
2355                       Register rn,
2356                       const Operand& operand) {
2357  os().SetCurrentInstruction(kRsc, kArithmetic);
2358  os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
2359  os() << " ";
2360  if (!rd.Is(rn) || !use_short_hand_form_) {
2361    os() << rd << ", ";
2362  }
2363  os() << rn << ", " << operand;
2364}
2365
2366void Disassembler::rscs(Condition cond,
2367                        Register rd,
2368                        Register rn,
2369                        const Operand& operand) {
2370  os().SetCurrentInstruction(kRscs, kArithmetic);
2371  os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
2372  os() << " ";
2373  if (!rd.Is(rn) || !use_short_hand_form_) {
2374    os() << rd << ", ";
2375  }
2376  os() << rn << ", " << operand;
2377}
2378
2379void Disassembler::sadd16(Condition cond,
2380                          Register rd,
2381                          Register rn,
2382                          Register rm) {
2383  os().SetCurrentInstruction(kSadd16, kArithmetic);
2384  os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
2385  os() << " ";
2386  if (!rd.Is(rn) || !use_short_hand_form_) {
2387    os() << rd << ", ";
2388  }
2389  os() << rn << ", " << rm;
2390}
2391
2392void Disassembler::sadd8(Condition cond,
2393                         Register rd,
2394                         Register rn,
2395                         Register rm) {
2396  os().SetCurrentInstruction(kSadd8, kArithmetic);
2397  os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
2398  os() << " ";
2399  if (!rd.Is(rn) || !use_short_hand_form_) {
2400    os() << rd << ", ";
2401  }
2402  os() << rn << ", " << rm;
2403}
2404
2405void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
2406  os().SetCurrentInstruction(kSasx, kArithmetic);
2407  os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
2408  os() << " ";
2409  if (!rd.Is(rn) || !use_short_hand_form_) {
2410    os() << rd << ", ";
2411  }
2412  os() << rn << ", " << rm;
2413}
2414
2415void Disassembler::sbc(Condition cond,
2416                       EncodingSize size,
2417                       Register rd,
2418                       Register rn,
2419                       const Operand& operand) {
2420  os().SetCurrentInstruction(kSbc, kArithmetic);
2421  os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
2422  os() << " ";
2423  if (!rd.Is(rn) || !use_short_hand_form_) {
2424    os() << rd << ", ";
2425  }
2426  os() << rn << ", " << operand;
2427}
2428
2429void Disassembler::sbcs(Condition cond,
2430                        EncodingSize size,
2431                        Register rd,
2432                        Register rn,
2433                        const Operand& operand) {
2434  os().SetCurrentInstruction(kSbcs, kArithmetic);
2435  os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
2436  os() << " ";
2437  if (!rd.Is(rn) || !use_short_hand_form_) {
2438    os() << rd << ", ";
2439  }
2440  os() << rn << ", " << operand;
2441}
2442
2443void Disassembler::sbfx(
2444    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
2445  os().SetCurrentInstruction(kSbfx, kShift);
2446  os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
2447       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
2448       << ImmediatePrinter(width);
2449}
2450
2451void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
2452  os().SetCurrentInstruction(kSdiv, kArithmetic);
2453  os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
2454  os() << " ";
2455  if (!rd.Is(rn) || !use_short_hand_form_) {
2456    os() << rd << ", ";
2457  }
2458  os() << rn << ", " << rm;
2459}
2460
2461void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
2462  os().SetCurrentInstruction(kSel, kNoAttribute);
2463  os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
2464  os() << " ";
2465  if (!rd.Is(rn) || !use_short_hand_form_) {
2466    os() << rd << ", ";
2467  }
2468  os() << rn << ", " << rm;
2469}
2470
2471void Disassembler::shadd16(Condition cond,
2472                           Register rd,
2473                           Register rn,
2474                           Register rm) {
2475  os().SetCurrentInstruction(kShadd16, kArithmetic);
2476  os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
2477  os() << " ";
2478  if (!rd.Is(rn) || !use_short_hand_form_) {
2479    os() << rd << ", ";
2480  }
2481  os() << rn << ", " << rm;
2482}
2483
2484void Disassembler::shadd8(Condition cond,
2485                          Register rd,
2486                          Register rn,
2487                          Register rm) {
2488  os().SetCurrentInstruction(kShadd8, kArithmetic);
2489  os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
2490  os() << " ";
2491  if (!rd.Is(rn) || !use_short_hand_form_) {
2492    os() << rd << ", ";
2493  }
2494  os() << rn << ", " << rm;
2495}
2496
2497void Disassembler::shasx(Condition cond,
2498                         Register rd,
2499                         Register rn,
2500                         Register rm) {
2501  os().SetCurrentInstruction(kShasx, kArithmetic);
2502  os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
2503  os() << " ";
2504  if (!rd.Is(rn) || !use_short_hand_form_) {
2505    os() << rd << ", ";
2506  }
2507  os() << rn << ", " << rm;
2508}
2509
2510void Disassembler::shsax(Condition cond,
2511                         Register rd,
2512                         Register rn,
2513                         Register rm) {
2514  os().SetCurrentInstruction(kShsax, kArithmetic);
2515  os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
2516  os() << " ";
2517  if (!rd.Is(rn) || !use_short_hand_form_) {
2518    os() << rd << ", ";
2519  }
2520  os() << rn << ", " << rm;
2521}
2522
2523void Disassembler::shsub16(Condition cond,
2524                           Register rd,
2525                           Register rn,
2526                           Register rm) {
2527  os().SetCurrentInstruction(kShsub16, kArithmetic);
2528  os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
2529  os() << " ";
2530  if (!rd.Is(rn) || !use_short_hand_form_) {
2531    os() << rd << ", ";
2532  }
2533  os() << rn << ", " << rm;
2534}
2535
2536void Disassembler::shsub8(Condition cond,
2537                          Register rd,
2538                          Register rn,
2539                          Register rm) {
2540  os().SetCurrentInstruction(kShsub8, kArithmetic);
2541  os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
2542  os() << " ";
2543  if (!rd.Is(rn) || !use_short_hand_form_) {
2544    os() << rd << ", ";
2545  }
2546  os() << rn << ", " << rm;
2547}
2548
2549void Disassembler::smlabb(
2550    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2551  os().SetCurrentInstruction(kSmlabb, kArithmetic);
2552  os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
2553       << ", " << rn << ", " << rm << ", " << ra;
2554}
2555
2556void Disassembler::smlabt(
2557    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2558  os().SetCurrentInstruction(kSmlabt, kArithmetic);
2559  os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
2560       << ", " << rn << ", " << rm << ", " << ra;
2561}
2562
2563void Disassembler::smlad(
2564    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2565  os().SetCurrentInstruction(kSmlad, kArithmetic);
2566  os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
2567       << ", " << rn << ", " << rm << ", " << ra;
2568}
2569
2570void Disassembler::smladx(
2571    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2572  os().SetCurrentInstruction(kSmladx, kArithmetic);
2573  os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
2574       << ", " << rn << ", " << rm << ", " << ra;
2575}
2576
2577void Disassembler::smlal(
2578    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2579  os().SetCurrentInstruction(kSmlal, kArithmetic);
2580  os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
2581       << ", " << rdhi << ", " << rn << ", " << rm;
2582}
2583
2584void Disassembler::smlalbb(
2585    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2586  os().SetCurrentInstruction(kSmlalbb, kArithmetic);
2587  os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
2588       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2589}
2590
2591void Disassembler::smlalbt(
2592    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2593  os().SetCurrentInstruction(kSmlalbt, kArithmetic);
2594  os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
2595       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2596}
2597
2598void Disassembler::smlald(
2599    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2600  os().SetCurrentInstruction(kSmlald, kArithmetic);
2601  os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
2602       << ", " << rdhi << ", " << rn << ", " << rm;
2603}
2604
2605void Disassembler::smlaldx(
2606    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2607  os().SetCurrentInstruction(kSmlaldx, kArithmetic);
2608  os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
2609       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2610}
2611
2612void Disassembler::smlals(
2613    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2614  os().SetCurrentInstruction(kSmlals, kArithmetic);
2615  os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
2616       << ", " << rdhi << ", " << rn << ", " << rm;
2617}
2618
2619void Disassembler::smlaltb(
2620    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2621  os().SetCurrentInstruction(kSmlaltb, kArithmetic);
2622  os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
2623       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2624}
2625
2626void Disassembler::smlaltt(
2627    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2628  os().SetCurrentInstruction(kSmlaltt, kArithmetic);
2629  os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
2630       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2631}
2632
2633void Disassembler::smlatb(
2634    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2635  os().SetCurrentInstruction(kSmlatb, kArithmetic);
2636  os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
2637       << ", " << rn << ", " << rm << ", " << ra;
2638}
2639
2640void Disassembler::smlatt(
2641    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2642  os().SetCurrentInstruction(kSmlatt, kArithmetic);
2643  os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
2644       << ", " << rn << ", " << rm << ", " << ra;
2645}
2646
2647void Disassembler::smlawb(
2648    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2649  os().SetCurrentInstruction(kSmlawb, kArithmetic);
2650  os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
2651       << ", " << rn << ", " << rm << ", " << ra;
2652}
2653
2654void Disassembler::smlawt(
2655    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2656  os().SetCurrentInstruction(kSmlawt, kArithmetic);
2657  os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
2658       << ", " << rn << ", " << rm << ", " << ra;
2659}
2660
2661void Disassembler::smlsd(
2662    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2663  os().SetCurrentInstruction(kSmlsd, kArithmetic);
2664  os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
2665       << ", " << rn << ", " << rm << ", " << ra;
2666}
2667
2668void Disassembler::smlsdx(
2669    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2670  os().SetCurrentInstruction(kSmlsdx, kArithmetic);
2671  os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
2672       << ", " << rn << ", " << rm << ", " << ra;
2673}
2674
2675void Disassembler::smlsld(
2676    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2677  os().SetCurrentInstruction(kSmlsld, kArithmetic);
2678  os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
2679       << ", " << rdhi << ", " << rn << ", " << rm;
2680}
2681
2682void Disassembler::smlsldx(
2683    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2684  os().SetCurrentInstruction(kSmlsldx, kArithmetic);
2685  os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
2686       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2687}
2688
2689void Disassembler::smmla(
2690    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2691  os().SetCurrentInstruction(kSmmla, kArithmetic);
2692  os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
2693       << ", " << rn << ", " << rm << ", " << ra;
2694}
2695
2696void Disassembler::smmlar(
2697    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2698  os().SetCurrentInstruction(kSmmlar, kArithmetic);
2699  os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
2700       << ", " << rn << ", " << rm << ", " << ra;
2701}
2702
2703void Disassembler::smmls(
2704    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2705  os().SetCurrentInstruction(kSmmls, kArithmetic);
2706  os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
2707       << ", " << rn << ", " << rm << ", " << ra;
2708}
2709
2710void Disassembler::smmlsr(
2711    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2712  os().SetCurrentInstruction(kSmmlsr, kArithmetic);
2713  os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
2714       << ", " << rn << ", " << rm << ", " << ra;
2715}
2716
2717void Disassembler::smmul(Condition cond,
2718                         Register rd,
2719                         Register rn,
2720                         Register rm) {
2721  os().SetCurrentInstruction(kSmmul, kArithmetic);
2722  os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
2723  os() << " ";
2724  if (!rd.Is(rn) || !use_short_hand_form_) {
2725    os() << rd << ", ";
2726  }
2727  os() << rn << ", " << rm;
2728}
2729
2730void Disassembler::smmulr(Condition cond,
2731                          Register rd,
2732                          Register rn,
2733                          Register rm) {
2734  os().SetCurrentInstruction(kSmmulr, kArithmetic);
2735  os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
2736  os() << " ";
2737  if (!rd.Is(rn) || !use_short_hand_form_) {
2738    os() << rd << ", ";
2739  }
2740  os() << rn << ", " << rm;
2741}
2742
2743void Disassembler::smuad(Condition cond,
2744                         Register rd,
2745                         Register rn,
2746                         Register rm) {
2747  os().SetCurrentInstruction(kSmuad, kArithmetic);
2748  os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
2749  os() << " ";
2750  if (!rd.Is(rn) || !use_short_hand_form_) {
2751    os() << rd << ", ";
2752  }
2753  os() << rn << ", " << rm;
2754}
2755
2756void Disassembler::smuadx(Condition cond,
2757                          Register rd,
2758                          Register rn,
2759                          Register rm) {
2760  os().SetCurrentInstruction(kSmuadx, kArithmetic);
2761  os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
2762  os() << " ";
2763  if (!rd.Is(rn) || !use_short_hand_form_) {
2764    os() << rd << ", ";
2765  }
2766  os() << rn << ", " << rm;
2767}
2768
2769void Disassembler::smulbb(Condition cond,
2770                          Register rd,
2771                          Register rn,
2772                          Register rm) {
2773  os().SetCurrentInstruction(kSmulbb, kArithmetic);
2774  os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
2775  os() << " ";
2776  if (!rd.Is(rn) || !use_short_hand_form_) {
2777    os() << rd << ", ";
2778  }
2779  os() << rn << ", " << rm;
2780}
2781
2782void Disassembler::smulbt(Condition cond,
2783                          Register rd,
2784                          Register rn,
2785                          Register rm) {
2786  os().SetCurrentInstruction(kSmulbt, kArithmetic);
2787  os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
2788  os() << " ";
2789  if (!rd.Is(rn) || !use_short_hand_form_) {
2790    os() << rd << ", ";
2791  }
2792  os() << rn << ", " << rm;
2793}
2794
2795void Disassembler::smull(
2796    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2797  os().SetCurrentInstruction(kSmull, kArithmetic);
2798  os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
2799       << ", " << rdhi << ", " << rn << ", " << rm;
2800}
2801
2802void Disassembler::smulls(
2803    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2804  os().SetCurrentInstruction(kSmulls, kArithmetic);
2805  os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
2806       << ", " << rdhi << ", " << rn << ", " << rm;
2807}
2808
2809void Disassembler::smultb(Condition cond,
2810                          Register rd,
2811                          Register rn,
2812                          Register rm) {
2813  os().SetCurrentInstruction(kSmultb, kArithmetic);
2814  os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
2815  os() << " ";
2816  if (!rd.Is(rn) || !use_short_hand_form_) {
2817    os() << rd << ", ";
2818  }
2819  os() << rn << ", " << rm;
2820}
2821
2822void Disassembler::smultt(Condition cond,
2823                          Register rd,
2824                          Register rn,
2825                          Register rm) {
2826  os().SetCurrentInstruction(kSmultt, kArithmetic);
2827  os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
2828  os() << " ";
2829  if (!rd.Is(rn) || !use_short_hand_form_) {
2830    os() << rd << ", ";
2831  }
2832  os() << rn << ", " << rm;
2833}
2834
2835void Disassembler::smulwb(Condition cond,
2836                          Register rd,
2837                          Register rn,
2838                          Register rm) {
2839  os().SetCurrentInstruction(kSmulwb, kArithmetic);
2840  os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
2841  os() << " ";
2842  if (!rd.Is(rn) || !use_short_hand_form_) {
2843    os() << rd << ", ";
2844  }
2845  os() << rn << ", " << rm;
2846}
2847
2848void Disassembler::smulwt(Condition cond,
2849                          Register rd,
2850                          Register rn,
2851                          Register rm) {
2852  os().SetCurrentInstruction(kSmulwt, kArithmetic);
2853  os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
2854  os() << " ";
2855  if (!rd.Is(rn) || !use_short_hand_form_) {
2856    os() << rd << ", ";
2857  }
2858  os() << rn << ", " << rm;
2859}
2860
2861void Disassembler::smusd(Condition cond,
2862                         Register rd,
2863                         Register rn,
2864                         Register rm) {
2865  os().SetCurrentInstruction(kSmusd, kArithmetic);
2866  os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
2867  os() << " ";
2868  if (!rd.Is(rn) || !use_short_hand_form_) {
2869    os() << rd << ", ";
2870  }
2871  os() << rn << ", " << rm;
2872}
2873
2874void Disassembler::smusdx(Condition cond,
2875                          Register rd,
2876                          Register rn,
2877                          Register rm) {
2878  os().SetCurrentInstruction(kSmusdx, kArithmetic);
2879  os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
2880  os() << " ";
2881  if (!rd.Is(rn) || !use_short_hand_form_) {
2882    os() << rd << ", ";
2883  }
2884  os() << rn << ", " << rm;
2885}
2886
2887void Disassembler::ssat(Condition cond,
2888                        Register rd,
2889                        uint32_t imm,
2890                        const Operand& operand) {
2891  os().SetCurrentInstruction(kSsat, kArithmetic);
2892  os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
2893       << ", " << ImmediatePrinter(imm) << ", " << operand;
2894}
2895
2896void Disassembler::ssat16(Condition cond,
2897                          Register rd,
2898                          uint32_t imm,
2899                          Register rn) {
2900  os().SetCurrentInstruction(kSsat16, kArithmetic);
2901  os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
2902       << ", " << ImmediatePrinter(imm) << ", " << rn;
2903}
2904
2905void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
2906  os().SetCurrentInstruction(kSsax, kArithmetic);
2907  os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
2908  os() << " ";
2909  if (!rd.Is(rn) || !use_short_hand_form_) {
2910    os() << rd << ", ";
2911  }
2912  os() << rn << ", " << rm;
2913}
2914
2915void Disassembler::ssub16(Condition cond,
2916                          Register rd,
2917                          Register rn,
2918                          Register rm) {
2919  os().SetCurrentInstruction(kSsub16, kArithmetic);
2920  os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
2921  os() << " ";
2922  if (!rd.Is(rn) || !use_short_hand_form_) {
2923    os() << rd << ", ";
2924  }
2925  os() << rn << ", " << rm;
2926}
2927
2928void Disassembler::ssub8(Condition cond,
2929                         Register rd,
2930                         Register rn,
2931                         Register rm) {
2932  os().SetCurrentInstruction(kSsub8, kArithmetic);
2933  os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
2934  os() << " ";
2935  if (!rd.Is(rn) || !use_short_hand_form_) {
2936    os() << rd << ", ";
2937  }
2938  os() << rn << ", " << rm;
2939}
2940
2941void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
2942  os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
2943  os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
2944       << ", " << PrintMemOperand(kStoreWordLocation, operand);
2945}
2946
2947void Disassembler::stlb(Condition cond,
2948                        Register rt,
2949                        const MemOperand& operand) {
2950  os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
2951  os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
2952       << ", " << PrintMemOperand(kStoreByteLocation, operand);
2953}
2954
2955void Disassembler::stlex(Condition cond,
2956                         Register rd,
2957                         Register rt,
2958                         const MemOperand& operand) {
2959  os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
2960  os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
2961       << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
2962}
2963
2964void Disassembler::stlexb(Condition cond,
2965                          Register rd,
2966                          Register rt,
2967                          const MemOperand& operand) {
2968  os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
2969  os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
2970       << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
2971}
2972
2973void Disassembler::stlexd(Condition cond,
2974                          Register rd,
2975                          Register rt,
2976                          Register rt2,
2977                          const MemOperand& operand) {
2978  os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
2979  os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
2980       << ", " << rt << ", " << rt2 << ", "
2981       << PrintMemOperand(kStoreDoubleWordLocation, operand);
2982}
2983
2984void Disassembler::stlexh(Condition cond,
2985                          Register rd,
2986                          Register rt,
2987                          const MemOperand& operand) {
2988  os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
2989  os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
2990       << ", " << rt << ", "
2991       << PrintMemOperand(kStoreHalfWordLocation, operand);
2992}
2993
2994void Disassembler::stlh(Condition cond,
2995                        Register rt,
2996                        const MemOperand& operand) {
2997  os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
2998  os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
2999       << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
3000}
3001
3002void Disassembler::stm(Condition cond,
3003                       EncodingSize size,
3004                       Register rn,
3005                       WriteBack write_back,
3006                       RegisterList registers) {
3007  os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
3008  os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
3009       << rn << write_back << ", " << registers;
3010}
3011
3012void Disassembler::stmda(Condition cond,
3013                         Register rn,
3014                         WriteBack write_back,
3015                         RegisterList registers) {
3016  os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
3017  os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
3018       << write_back << ", " << registers;
3019}
3020
3021void Disassembler::stmdb(Condition cond,
3022                         EncodingSize size,
3023                         Register rn,
3024                         WriteBack write_back,
3025                         RegisterList registers) {
3026  os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
3027  os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
3028       << rn << write_back << ", " << registers;
3029}
3030
3031void Disassembler::stmea(Condition cond,
3032                         EncodingSize size,
3033                         Register rn,
3034                         WriteBack write_back,
3035                         RegisterList registers) {
3036  os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
3037  os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
3038       << rn << write_back << ", " << registers;
3039}
3040
3041void Disassembler::stmed(Condition cond,
3042                         Register rn,
3043                         WriteBack write_back,
3044                         RegisterList registers) {
3045  os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
3046  os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
3047       << write_back << ", " << registers;
3048}
3049
3050void Disassembler::stmfa(Condition cond,
3051                         Register rn,
3052                         WriteBack write_back,
3053                         RegisterList registers) {
3054  os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
3055  os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
3056       << write_back << ", " << registers;
3057}
3058
3059void Disassembler::stmfd(Condition cond,
3060                         Register rn,
3061                         WriteBack write_back,
3062                         RegisterList registers) {
3063  os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
3064  os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
3065       << write_back << ", " << registers;
3066}
3067
3068void Disassembler::stmib(Condition cond,
3069                         Register rn,
3070                         WriteBack write_back,
3071                         RegisterList registers) {
3072  os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
3073  os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
3074       << write_back << ", " << registers;
3075}
3076
3077void Disassembler::str(Condition cond,
3078                       EncodingSize size,
3079                       Register rt,
3080                       const MemOperand& operand) {
3081  os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
3082  os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
3083       << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
3084}
3085
3086void Disassembler::strb(Condition cond,
3087                        EncodingSize size,
3088                        Register rt,
3089                        const MemOperand& operand) {
3090  os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
3091  os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
3092       << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
3093}
3094
3095void Disassembler::strd(Condition cond,
3096                        Register rt,
3097                        Register rt2,
3098                        const MemOperand& operand) {
3099  os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
3100  os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
3101       << ", " << rt2 << ", "
3102       << PrintMemOperand(kStoreDoubleWordLocation, operand);
3103}
3104
3105void Disassembler::strex(Condition cond,
3106                         Register rd,
3107                         Register rt,
3108                         const MemOperand& operand) {
3109  os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
3110  os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
3111       << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
3112}
3113
3114void Disassembler::strexb(Condition cond,
3115                          Register rd,
3116                          Register rt,
3117                          const MemOperand& operand) {
3118  os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
3119  os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
3120       << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
3121}
3122
3123void Disassembler::strexd(Condition cond,
3124                          Register rd,
3125                          Register rt,
3126                          Register rt2,
3127                          const MemOperand& operand) {
3128  os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
3129  os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
3130       << ", " << rt << ", " << rt2 << ", "
3131       << PrintMemOperand(kStoreDoubleWordLocation, operand);
3132}
3133
3134void Disassembler::strexh(Condition cond,
3135                          Register rd,
3136                          Register rt,
3137                          const MemOperand& operand) {
3138  os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
3139  os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
3140       << ", " << rt << ", "
3141       << PrintMemOperand(kStoreHalfWordLocation, operand);
3142}
3143
3144void Disassembler::strh(Condition cond,
3145                        EncodingSize size,
3146                        Register rt,
3147                        const MemOperand& operand) {
3148  os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
3149  os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
3150       << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
3151}
3152
3153void Disassembler::sub(Condition cond,
3154                       EncodingSize size,
3155                       Register rd,
3156                       Register rn,
3157                       const Operand& operand) {
3158  os().SetCurrentInstruction(kSub, kArithmetic);
3159  os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
3160  os() << " ";
3161  if (!rd.Is(rn) || !use_short_hand_form_) {
3162    os() << rd << ", ";
3163  }
3164  os() << rn << ", " << operand;
3165}
3166
3167void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
3168  os().SetCurrentInstruction(kSub, kArithmetic);
3169  os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
3170       << ", " << operand;
3171}
3172
3173void Disassembler::subs(Condition cond,
3174                        EncodingSize size,
3175                        Register rd,
3176                        Register rn,
3177                        const Operand& operand) {
3178  os().SetCurrentInstruction(kSubs, kArithmetic);
3179  os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
3180  os() << " ";
3181  if (!rd.Is(rn) || !use_short_hand_form_) {
3182    os() << rd << ", ";
3183  }
3184  os() << rn << ", " << operand;
3185}
3186
3187void Disassembler::subs(Register rd, const Operand& operand) {
3188  os().SetCurrentInstruction(kSubs, kArithmetic);
3189  os() << ToCString(kSubs) << " " << rd << ", " << operand;
3190}
3191
3192void Disassembler::subw(Condition cond,
3193                        Register rd,
3194                        Register rn,
3195                        const Operand& operand) {
3196  os().SetCurrentInstruction(kSubw, kArithmetic);
3197  os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
3198  os() << " ";
3199  if (!rd.Is(rn) || !use_short_hand_form_) {
3200    os() << rd << ", ";
3201  }
3202  os() << rn << ", " << operand;
3203}
3204
3205void Disassembler::svc(Condition cond, uint32_t imm) {
3206  os().SetCurrentInstruction(kSvc, kSystem);
3207  os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " "
3208       << RawImmediatePrinter(imm);
3209}
3210
3211void Disassembler::sxtab(Condition cond,
3212                         Register rd,
3213                         Register rn,
3214                         const Operand& operand) {
3215  os().SetCurrentInstruction(kSxtab, kArithmetic);
3216  os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
3217  os() << " ";
3218  if (!rd.Is(rn) || !use_short_hand_form_) {
3219    os() << rd << ", ";
3220  }
3221  os() << rn << ", " << operand;
3222}
3223
3224void Disassembler::sxtab16(Condition cond,
3225                           Register rd,
3226                           Register rn,
3227                           const Operand& operand) {
3228  os().SetCurrentInstruction(kSxtab16, kArithmetic);
3229  os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
3230  os() << " ";
3231  if (!rd.Is(rn) || !use_short_hand_form_) {
3232    os() << rd << ", ";
3233  }
3234  os() << rn << ", " << operand;
3235}
3236
3237void Disassembler::sxtah(Condition cond,
3238                         Register rd,
3239                         Register rn,
3240                         const Operand& operand) {
3241  os().SetCurrentInstruction(kSxtah, kArithmetic);
3242  os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
3243  os() << " ";
3244  if (!rd.Is(rn) || !use_short_hand_form_) {
3245    os() << rd << ", ";
3246  }
3247  os() << rn << ", " << operand;
3248}
3249
3250void Disassembler::sxtb(Condition cond,
3251                        EncodingSize size,
3252                        Register rd,
3253                        const Operand& operand) {
3254  os().SetCurrentInstruction(kSxtb, kArithmetic);
3255  os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
3256  os() << " ";
3257  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3258    os() << rd << ", ";
3259  }
3260  os() << operand;
3261}
3262
3263void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
3264  os().SetCurrentInstruction(kSxtb16, kArithmetic);
3265  os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
3266  os() << " ";
3267  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3268    os() << rd << ", ";
3269  }
3270  os() << operand;
3271}
3272
3273void Disassembler::sxth(Condition cond,
3274                        EncodingSize size,
3275                        Register rd,
3276                        const Operand& operand) {
3277  os().SetCurrentInstruction(kSxth, kArithmetic);
3278  os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
3279  os() << " ";
3280  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3281    os() << rd << ", ";
3282  }
3283  os() << operand;
3284}
3285
3286void Disassembler::tbb(Condition cond, Register rn, Register rm) {
3287  os().SetCurrentInstruction(kTbb, kBranch);
3288  os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
3289       << MemOperand(rn, rm);
3290}
3291
3292void Disassembler::tbh(Condition cond, Register rn, Register rm) {
3293  os().SetCurrentInstruction(kTbh, kBranch);
3294  os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
3295       << MemOperand(rn, plus, rm, LSL, 1);
3296}
3297
3298void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
3299  os().SetCurrentInstruction(kTeq, kBitwise);
3300  os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
3301       << ", " << operand;
3302}
3303
3304void Disassembler::tst(Condition cond,
3305                       EncodingSize size,
3306                       Register rn,
3307                       const Operand& operand) {
3308  os().SetCurrentInstruction(kTst, kBitwise);
3309  os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
3310       << rn << ", " << operand;
3311}
3312
3313void Disassembler::uadd16(Condition cond,
3314                          Register rd,
3315                          Register rn,
3316                          Register rm) {
3317  os().SetCurrentInstruction(kUadd16, kArithmetic);
3318  os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
3319  os() << " ";
3320  if (!rd.Is(rn) || !use_short_hand_form_) {
3321    os() << rd << ", ";
3322  }
3323  os() << rn << ", " << rm;
3324}
3325
3326void Disassembler::uadd8(Condition cond,
3327                         Register rd,
3328                         Register rn,
3329                         Register rm) {
3330  os().SetCurrentInstruction(kUadd8, kArithmetic);
3331  os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
3332  os() << " ";
3333  if (!rd.Is(rn) || !use_short_hand_form_) {
3334    os() << rd << ", ";
3335  }
3336  os() << rn << ", " << rm;
3337}
3338
3339void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
3340  os().SetCurrentInstruction(kUasx, kArithmetic);
3341  os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
3342  os() << " ";
3343  if (!rd.Is(rn) || !use_short_hand_form_) {
3344    os() << rd << ", ";
3345  }
3346  os() << rn << ", " << rm;
3347}
3348
3349void Disassembler::ubfx(
3350    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
3351  os().SetCurrentInstruction(kUbfx, kShift);
3352  os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
3353       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
3354       << ImmediatePrinter(width);
3355}
3356
3357void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
3358  os().SetCurrentInstruction(kUdf, kNoAttribute);
3359  os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
3360       << RawImmediatePrinter(imm);
3361}
3362
3363void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
3364  os().SetCurrentInstruction(kUdiv, kArithmetic);
3365  os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
3366  os() << " ";
3367  if (!rd.Is(rn) || !use_short_hand_form_) {
3368    os() << rd << ", ";
3369  }
3370  os() << rn << ", " << rm;
3371}
3372
3373void Disassembler::uhadd16(Condition cond,
3374                           Register rd,
3375                           Register rn,
3376                           Register rm) {
3377  os().SetCurrentInstruction(kUhadd16, kArithmetic);
3378  os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
3379  os() << " ";
3380  if (!rd.Is(rn) || !use_short_hand_form_) {
3381    os() << rd << ", ";
3382  }
3383  os() << rn << ", " << rm;
3384}
3385
3386void Disassembler::uhadd8(Condition cond,
3387                          Register rd,
3388                          Register rn,
3389                          Register rm) {
3390  os().SetCurrentInstruction(kUhadd8, kArithmetic);
3391  os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
3392  os() << " ";
3393  if (!rd.Is(rn) || !use_short_hand_form_) {
3394    os() << rd << ", ";
3395  }
3396  os() << rn << ", " << rm;
3397}
3398
3399void Disassembler::uhasx(Condition cond,
3400                         Register rd,
3401                         Register rn,
3402                         Register rm) {
3403  os().SetCurrentInstruction(kUhasx, kArithmetic);
3404  os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
3405  os() << " ";
3406  if (!rd.Is(rn) || !use_short_hand_form_) {
3407    os() << rd << ", ";
3408  }
3409  os() << rn << ", " << rm;
3410}
3411
3412void Disassembler::uhsax(Condition cond,
3413                         Register rd,
3414                         Register rn,
3415                         Register rm) {
3416  os().SetCurrentInstruction(kUhsax, kArithmetic);
3417  os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
3418  os() << " ";
3419  if (!rd.Is(rn) || !use_short_hand_form_) {
3420    os() << rd << ", ";
3421  }
3422  os() << rn << ", " << rm;
3423}
3424
3425void Disassembler::uhsub16(Condition cond,
3426                           Register rd,
3427                           Register rn,
3428                           Register rm) {
3429  os().SetCurrentInstruction(kUhsub16, kArithmetic);
3430  os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
3431  os() << " ";
3432  if (!rd.Is(rn) || !use_short_hand_form_) {
3433    os() << rd << ", ";
3434  }
3435  os() << rn << ", " << rm;
3436}
3437
3438void Disassembler::uhsub8(Condition cond,
3439                          Register rd,
3440                          Register rn,
3441                          Register rm) {
3442  os().SetCurrentInstruction(kUhsub8, kArithmetic);
3443  os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
3444  os() << " ";
3445  if (!rd.Is(rn) || !use_short_hand_form_) {
3446    os() << rd << ", ";
3447  }
3448  os() << rn << ", " << rm;
3449}
3450
3451void Disassembler::umaal(
3452    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3453  os().SetCurrentInstruction(kUmaal, kArithmetic);
3454  os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
3455       << ", " << rdhi << ", " << rn << ", " << rm;
3456}
3457
3458void Disassembler::umlal(
3459    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3460  os().SetCurrentInstruction(kUmlal, kArithmetic);
3461  os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
3462       << ", " << rdhi << ", " << rn << ", " << rm;
3463}
3464
3465void Disassembler::umlals(
3466    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3467  os().SetCurrentInstruction(kUmlals, kArithmetic);
3468  os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
3469       << ", " << rdhi << ", " << rn << ", " << rm;
3470}
3471
3472void Disassembler::umull(
3473    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3474  os().SetCurrentInstruction(kUmull, kArithmetic);
3475  os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
3476       << ", " << rdhi << ", " << rn << ", " << rm;
3477}
3478
3479void Disassembler::umulls(
3480    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3481  os().SetCurrentInstruction(kUmulls, kArithmetic);
3482  os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
3483       << ", " << rdhi << ", " << rn << ", " << rm;
3484}
3485
3486void Disassembler::uqadd16(Condition cond,
3487                           Register rd,
3488                           Register rn,
3489                           Register rm) {
3490  os().SetCurrentInstruction(kUqadd16, kArithmetic);
3491  os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
3492  os() << " ";
3493  if (!rd.Is(rn) || !use_short_hand_form_) {
3494    os() << rd << ", ";
3495  }
3496  os() << rn << ", " << rm;
3497}
3498
3499void Disassembler::uqadd8(Condition cond,
3500                          Register rd,
3501                          Register rn,
3502                          Register rm) {
3503  os().SetCurrentInstruction(kUqadd8, kArithmetic);
3504  os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
3505  os() << " ";
3506  if (!rd.Is(rn) || !use_short_hand_form_) {
3507    os() << rd << ", ";
3508  }
3509  os() << rn << ", " << rm;
3510}
3511
3512void Disassembler::uqasx(Condition cond,
3513                         Register rd,
3514                         Register rn,
3515                         Register rm) {
3516  os().SetCurrentInstruction(kUqasx, kArithmetic);
3517  os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
3518  os() << " ";
3519  if (!rd.Is(rn) || !use_short_hand_form_) {
3520    os() << rd << ", ";
3521  }
3522  os() << rn << ", " << rm;
3523}
3524
3525void Disassembler::uqsax(Condition cond,
3526                         Register rd,
3527                         Register rn,
3528                         Register rm) {
3529  os().SetCurrentInstruction(kUqsax, kArithmetic);
3530  os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
3531  os() << " ";
3532  if (!rd.Is(rn) || !use_short_hand_form_) {
3533    os() << rd << ", ";
3534  }
3535  os() << rn << ", " << rm;
3536}
3537
3538void Disassembler::uqsub16(Condition cond,
3539                           Register rd,
3540                           Register rn,
3541                           Register rm) {
3542  os().SetCurrentInstruction(kUqsub16, kArithmetic);
3543  os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
3544  os() << " ";
3545  if (!rd.Is(rn) || !use_short_hand_form_) {
3546    os() << rd << ", ";
3547  }
3548  os() << rn << ", " << rm;
3549}
3550
3551void Disassembler::uqsub8(Condition cond,
3552                          Register rd,
3553                          Register rn,
3554                          Register rm) {
3555  os().SetCurrentInstruction(kUqsub8, kArithmetic);
3556  os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
3557  os() << " ";
3558  if (!rd.Is(rn) || !use_short_hand_form_) {
3559    os() << rd << ", ";
3560  }
3561  os() << rn << ", " << rm;
3562}
3563
3564void Disassembler::usad8(Condition cond,
3565                         Register rd,
3566                         Register rn,
3567                         Register rm) {
3568  os().SetCurrentInstruction(kUsad8, kArithmetic);
3569  os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
3570  os() << " ";
3571  if (!rd.Is(rn) || !use_short_hand_form_) {
3572    os() << rd << ", ";
3573  }
3574  os() << rn << ", " << rm;
3575}
3576
3577void Disassembler::usada8(
3578    Condition cond, Register rd, Register rn, Register rm, Register ra) {
3579  os().SetCurrentInstruction(kUsada8, kArithmetic);
3580  os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
3581       << ", " << rn << ", " << rm << ", " << ra;
3582}
3583
3584void Disassembler::usat(Condition cond,
3585                        Register rd,
3586                        uint32_t imm,
3587                        const Operand& operand) {
3588  os().SetCurrentInstruction(kUsat, kArithmetic);
3589  os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
3590       << ", " << ImmediatePrinter(imm) << ", " << operand;
3591}
3592
3593void Disassembler::usat16(Condition cond,
3594                          Register rd,
3595                          uint32_t imm,
3596                          Register rn) {
3597  os().SetCurrentInstruction(kUsat16, kArithmetic);
3598  os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
3599       << ", " << ImmediatePrinter(imm) << ", " << rn;
3600}
3601
3602void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
3603  os().SetCurrentInstruction(kUsax, kArithmetic);
3604  os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
3605  os() << " ";
3606  if (!rd.Is(rn) || !use_short_hand_form_) {
3607    os() << rd << ", ";
3608  }
3609  os() << rn << ", " << rm;
3610}
3611
3612void Disassembler::usub16(Condition cond,
3613                          Register rd,
3614                          Register rn,
3615                          Register rm) {
3616  os().SetCurrentInstruction(kUsub16, kArithmetic);
3617  os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
3618  os() << " ";
3619  if (!rd.Is(rn) || !use_short_hand_form_) {
3620    os() << rd << ", ";
3621  }
3622  os() << rn << ", " << rm;
3623}
3624
3625void Disassembler::usub8(Condition cond,
3626                         Register rd,
3627                         Register rn,
3628                         Register rm) {
3629  os().SetCurrentInstruction(kUsub8, kArithmetic);
3630  os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
3631  os() << " ";
3632  if (!rd.Is(rn) || !use_short_hand_form_) {
3633    os() << rd << ", ";
3634  }
3635  os() << rn << ", " << rm;
3636}
3637
3638void Disassembler::uxtab(Condition cond,
3639                         Register rd,
3640                         Register rn,
3641                         const Operand& operand) {
3642  os().SetCurrentInstruction(kUxtab, kArithmetic);
3643  os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
3644  os() << " ";
3645  if (!rd.Is(rn) || !use_short_hand_form_) {
3646    os() << rd << ", ";
3647  }
3648  os() << rn << ", " << operand;
3649}
3650
3651void Disassembler::uxtab16(Condition cond,
3652                           Register rd,
3653                           Register rn,
3654                           const Operand& operand) {
3655  os().SetCurrentInstruction(kUxtab16, kArithmetic);
3656  os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
3657  os() << " ";
3658  if (!rd.Is(rn) || !use_short_hand_form_) {
3659    os() << rd << ", ";
3660  }
3661  os() << rn << ", " << operand;
3662}
3663
3664void Disassembler::uxtah(Condition cond,
3665                         Register rd,
3666                         Register rn,
3667                         const Operand& operand) {
3668  os().SetCurrentInstruction(kUxtah, kArithmetic);
3669  os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
3670  os() << " ";
3671  if (!rd.Is(rn) || !use_short_hand_form_) {
3672    os() << rd << ", ";
3673  }
3674  os() << rn << ", " << operand;
3675}
3676
3677void Disassembler::uxtb(Condition cond,
3678                        EncodingSize size,
3679                        Register rd,
3680                        const Operand& operand) {
3681  os().SetCurrentInstruction(kUxtb, kArithmetic);
3682  os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
3683  os() << " ";
3684  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3685    os() << rd << ", ";
3686  }
3687  os() << operand;
3688}
3689
3690void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
3691  os().SetCurrentInstruction(kUxtb16, kArithmetic);
3692  os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
3693  os() << " ";
3694  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3695    os() << rd << ", ";
3696  }
3697  os() << operand;
3698}
3699
3700void Disassembler::uxth(Condition cond,
3701                        EncodingSize size,
3702                        Register rd,
3703                        const Operand& operand) {
3704  os().SetCurrentInstruction(kUxth, kArithmetic);
3705  os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
3706  os() << " ";
3707  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3708    os() << rd << ", ";
3709  }
3710  os() << operand;
3711}
3712
3713void Disassembler::vaba(
3714    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3715  os().SetCurrentInstruction(kVaba, kFpNeon);
3716  os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
3717       << rd << ", " << rn << ", " << rm;
3718}
3719
3720void Disassembler::vaba(
3721    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3722  os().SetCurrentInstruction(kVaba, kFpNeon);
3723  os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
3724       << rd << ", " << rn << ", " << rm;
3725}
3726
3727void Disassembler::vabal(
3728    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3729  os().SetCurrentInstruction(kVabal, kFpNeon);
3730  os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
3731       << rd << ", " << rn << ", " << rm;
3732}
3733
3734void Disassembler::vabd(
3735    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3736  os().SetCurrentInstruction(kVabd, kFpNeon);
3737  os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
3738  os() << " ";
3739  if (!rd.Is(rn) || !use_short_hand_form_) {
3740    os() << rd << ", ";
3741  }
3742  os() << rn << ", " << rm;
3743}
3744
3745void Disassembler::vabd(
3746    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
3756void Disassembler::vabdl(
3757    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3758  os().SetCurrentInstruction(kVabdl, kFpNeon);
3759  os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
3760       << rd << ", " << rn << ", " << rm;
3761}
3762
3763void Disassembler::vabs(Condition cond,
3764                        DataType dt,
3765                        DRegister rd,
3766                        DRegister rm) {
3767  os().SetCurrentInstruction(kVabs, kFpNeon);
3768  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3769       << rd << ", " << rm;
3770}
3771
3772void Disassembler::vabs(Condition cond,
3773                        DataType dt,
3774                        QRegister rd,
3775                        QRegister rm) {
3776  os().SetCurrentInstruction(kVabs, kFpNeon);
3777  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3778       << rd << ", " << rm;
3779}
3780
3781void Disassembler::vabs(Condition cond,
3782                        DataType dt,
3783                        SRegister rd,
3784                        SRegister rm) {
3785  os().SetCurrentInstruction(kVabs, kFpNeon);
3786  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3787       << rd << ", " << rm;
3788}
3789
3790void Disassembler::vacge(
3791    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3792  os().SetCurrentInstruction(kVacge, kFpNeon);
3793  os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
3794  os() << " ";
3795  if (!rd.Is(rn) || !use_short_hand_form_) {
3796    os() << rd << ", ";
3797  }
3798  os() << rn << ", " << rm;
3799}
3800
3801void Disassembler::vacge(
3802    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
3812void Disassembler::vacgt(
3813    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3814  os().SetCurrentInstruction(kVacgt, kFpNeon);
3815  os() << ToCString(kVacgt) << 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
3823void Disassembler::vacgt(
3824    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
3834void Disassembler::vacle(
3835    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3836  os().SetCurrentInstruction(kVacle, kFpNeon);
3837  os() << ToCString(kVacle) << 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
3845void Disassembler::vacle(
3846    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
3856void Disassembler::vaclt(
3857    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3858  os().SetCurrentInstruction(kVaclt, kFpNeon);
3859  os() << ToCString(kVaclt) << 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
3867void Disassembler::vaclt(
3868    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
3878void Disassembler::vadd(
3879    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3880  os().SetCurrentInstruction(kVadd, kFpNeon);
3881  os() << ToCString(kVadd) << 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
3889void Disassembler::vadd(
3890    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
3900void Disassembler::vadd(
3901    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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
3911void Disassembler::vaddhn(
3912    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
3913  os().SetCurrentInstruction(kVaddhn, kFpNeon);
3914  os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
3915       << rd << ", " << rn << ", " << rm;
3916}
3917
3918void Disassembler::vaddl(
3919    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3920  os().SetCurrentInstruction(kVaddl, kFpNeon);
3921  os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
3922       << rd << ", " << rn << ", " << rm;
3923}
3924
3925void Disassembler::vaddw(
3926    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
3927  os().SetCurrentInstruction(kVaddw, kFpNeon);
3928  os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
3929  os() << " ";
3930  if (!rd.Is(rn) || !use_short_hand_form_) {
3931    os() << rd << ", ";
3932  }
3933  os() << rn << ", " << rm;
3934}
3935
3936void Disassembler::vand(Condition cond,
3937                        DataType dt,
3938                        DRegister rd,
3939                        DRegister rn,
3940                        const DOperand& operand) {
3941  os().SetCurrentInstruction(kVand, kFpNeon);
3942  os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
3943  os() << " ";
3944  if (!rd.Is(rn) || !use_short_hand_form_) {
3945    os() << rd << ", ";
3946  }
3947  os() << rn << ", " << operand;
3948}
3949
3950void Disassembler::vand(Condition cond,
3951                        DataType dt,
3952                        QRegister rd,
3953                        QRegister rn,
3954                        const QOperand& operand) {
3955  os().SetCurrentInstruction(kVand, kFpNeon);
3956  os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
3957  os() << " ";
3958  if (!rd.Is(rn) || !use_short_hand_form_) {
3959    os() << rd << ", ";
3960  }
3961  os() << rn << ", " << operand;
3962}
3963
3964void Disassembler::vbic(Condition cond,
3965                        DataType dt,
3966                        DRegister rd,
3967                        DRegister rn,
3968                        const DOperand& operand) {
3969  os().SetCurrentInstruction(kVbic, kFpNeon);
3970  os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
3971  os() << " ";
3972  if (!rd.Is(rn) || !use_short_hand_form_) {
3973    os() << rd << ", ";
3974  }
3975  os() << rn << ", " << operand;
3976}
3977
3978void Disassembler::vbic(Condition cond,
3979                        DataType dt,
3980                        QRegister rd,
3981                        QRegister rn,
3982                        const QOperand& operand) {
3983  os().SetCurrentInstruction(kVbic, kFpNeon);
3984  os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
3985  os() << " ";
3986  if (!rd.Is(rn) || !use_short_hand_form_) {
3987    os() << rd << ", ";
3988  }
3989  os() << rn << ", " << operand;
3990}
3991
3992void Disassembler::vbif(
3993    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3994  os().SetCurrentInstruction(kVbif, kFpNeon);
3995  os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
3996  os() << " ";
3997  if (!rd.Is(rn) || !use_short_hand_form_) {
3998    os() << rd << ", ";
3999  }
4000  os() << rn << ", " << rm;
4001}
4002
4003void Disassembler::vbif(
4004    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4014void Disassembler::vbit(
4015    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4016  os().SetCurrentInstruction(kVbit, kFpNeon);
4017  os() << ToCString(kVbit) << 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
4025void Disassembler::vbit(
4026    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4036void Disassembler::vbsl(
4037    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4038  os().SetCurrentInstruction(kVbsl, kFpNeon);
4039  os() << ToCString(kVbsl) << 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
4047void Disassembler::vbsl(
4048    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4058void Disassembler::vceq(Condition cond,
4059                        DataType dt,
4060                        DRegister rd,
4061                        DRegister rm,
4062                        const DOperand& operand) {
4063  os().SetCurrentInstruction(kVceq, kFpNeon);
4064  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4065  os() << " ";
4066  if (!rd.Is(rm) || !use_short_hand_form_) {
4067    os() << rd << ", ";
4068  }
4069  os() << rm << ", " << operand;
4070}
4071
4072void Disassembler::vceq(Condition cond,
4073                        DataType dt,
4074                        QRegister rd,
4075                        QRegister rm,
4076                        const QOperand& operand) {
4077  os().SetCurrentInstruction(kVceq, kFpNeon);
4078  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4079  os() << " ";
4080  if (!rd.Is(rm) || !use_short_hand_form_) {
4081    os() << rd << ", ";
4082  }
4083  os() << rm << ", " << operand;
4084}
4085
4086void Disassembler::vceq(
4087    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4088  os().SetCurrentInstruction(kVceq, kFpNeon);
4089  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4090  os() << " ";
4091  if (!rd.Is(rn) || !use_short_hand_form_) {
4092    os() << rd << ", ";
4093  }
4094  os() << rn << ", " << rm;
4095}
4096
4097void Disassembler::vceq(
4098    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4108void Disassembler::vcge(Condition cond,
4109                        DataType dt,
4110                        DRegister rd,
4111                        DRegister rm,
4112                        const DOperand& operand) {
4113  os().SetCurrentInstruction(kVcge, kFpNeon);
4114  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4115  os() << " ";
4116  if (!rd.Is(rm) || !use_short_hand_form_) {
4117    os() << rd << ", ";
4118  }
4119  os() << rm << ", " << operand;
4120}
4121
4122void Disassembler::vcge(Condition cond,
4123                        DataType dt,
4124                        QRegister rd,
4125                        QRegister rm,
4126                        const QOperand& operand) {
4127  os().SetCurrentInstruction(kVcge, kFpNeon);
4128  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4129  os() << " ";
4130  if (!rd.Is(rm) || !use_short_hand_form_) {
4131    os() << rd << ", ";
4132  }
4133  os() << rm << ", " << operand;
4134}
4135
4136void Disassembler::vcge(
4137    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4138  os().SetCurrentInstruction(kVcge, kFpNeon);
4139  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4140  os() << " ";
4141  if (!rd.Is(rn) || !use_short_hand_form_) {
4142    os() << rd << ", ";
4143  }
4144  os() << rn << ", " << rm;
4145}
4146
4147void Disassembler::vcge(
4148    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4158void Disassembler::vcgt(Condition cond,
4159                        DataType dt,
4160                        DRegister rd,
4161                        DRegister rm,
4162                        const DOperand& operand) {
4163  os().SetCurrentInstruction(kVcgt, kFpNeon);
4164  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4165  os() << " ";
4166  if (!rd.Is(rm) || !use_short_hand_form_) {
4167    os() << rd << ", ";
4168  }
4169  os() << rm << ", " << operand;
4170}
4171
4172void Disassembler::vcgt(Condition cond,
4173                        DataType dt,
4174                        QRegister rd,
4175                        QRegister rm,
4176                        const QOperand& operand) {
4177  os().SetCurrentInstruction(kVcgt, kFpNeon);
4178  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4179  os() << " ";
4180  if (!rd.Is(rm) || !use_short_hand_form_) {
4181    os() << rd << ", ";
4182  }
4183  os() << rm << ", " << operand;
4184}
4185
4186void Disassembler::vcgt(
4187    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4188  os().SetCurrentInstruction(kVcgt, kFpNeon);
4189  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4190  os() << " ";
4191  if (!rd.Is(rn) || !use_short_hand_form_) {
4192    os() << rd << ", ";
4193  }
4194  os() << rn << ", " << rm;
4195}
4196
4197void Disassembler::vcgt(
4198    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4208void Disassembler::vcle(Condition cond,
4209                        DataType dt,
4210                        DRegister rd,
4211                        DRegister rm,
4212                        const DOperand& operand) {
4213  os().SetCurrentInstruction(kVcle, kFpNeon);
4214  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4215  os() << " ";
4216  if (!rd.Is(rm) || !use_short_hand_form_) {
4217    os() << rd << ", ";
4218  }
4219  os() << rm << ", " << operand;
4220}
4221
4222void Disassembler::vcle(Condition cond,
4223                        DataType dt,
4224                        QRegister rd,
4225                        QRegister rm,
4226                        const QOperand& operand) {
4227  os().SetCurrentInstruction(kVcle, kFpNeon);
4228  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4229  os() << " ";
4230  if (!rd.Is(rm) || !use_short_hand_form_) {
4231    os() << rd << ", ";
4232  }
4233  os() << rm << ", " << operand;
4234}
4235
4236void Disassembler::vcle(
4237    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4238  os().SetCurrentInstruction(kVcle, kFpNeon);
4239  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4240  os() << " ";
4241  if (!rd.Is(rn) || !use_short_hand_form_) {
4242    os() << rd << ", ";
4243  }
4244  os() << rn << ", " << rm;
4245}
4246
4247void Disassembler::vcle(
4248    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4258void Disassembler::vcls(Condition cond,
4259                        DataType dt,
4260                        DRegister rd,
4261                        DRegister rm) {
4262  os().SetCurrentInstruction(kVcls, kFpNeon);
4263  os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
4264       << rd << ", " << rm;
4265}
4266
4267void Disassembler::vcls(Condition cond,
4268                        DataType dt,
4269                        QRegister rd,
4270                        QRegister rm) {
4271  os().SetCurrentInstruction(kVcls, kFpNeon);
4272  os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
4273       << rd << ", " << rm;
4274}
4275
4276void Disassembler::vclt(Condition cond,
4277                        DataType dt,
4278                        DRegister rd,
4279                        DRegister rm,
4280                        const DOperand& operand) {
4281  os().SetCurrentInstruction(kVclt, kFpNeon);
4282  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4283  os() << " ";
4284  if (!rd.Is(rm) || !use_short_hand_form_) {
4285    os() << rd << ", ";
4286  }
4287  os() << rm << ", " << operand;
4288}
4289
4290void Disassembler::vclt(Condition cond,
4291                        DataType dt,
4292                        QRegister rd,
4293                        QRegister rm,
4294                        const QOperand& operand) {
4295  os().SetCurrentInstruction(kVclt, kFpNeon);
4296  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4297  os() << " ";
4298  if (!rd.Is(rm) || !use_short_hand_form_) {
4299    os() << rd << ", ";
4300  }
4301  os() << rm << ", " << operand;
4302}
4303
4304void Disassembler::vclt(
4305    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4306  os().SetCurrentInstruction(kVclt, kFpNeon);
4307  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4308  os() << " ";
4309  if (!rd.Is(rn) || !use_short_hand_form_) {
4310    os() << rd << ", ";
4311  }
4312  os() << rn << ", " << rm;
4313}
4314
4315void Disassembler::vclt(
4316    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4326void Disassembler::vclz(Condition cond,
4327                        DataType dt,
4328                        DRegister rd,
4329                        DRegister rm) {
4330  os().SetCurrentInstruction(kVclz, kFpNeon);
4331  os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
4332       << rd << ", " << rm;
4333}
4334
4335void Disassembler::vclz(Condition cond,
4336                        DataType dt,
4337                        QRegister rd,
4338                        QRegister rm) {
4339  os().SetCurrentInstruction(kVclz, kFpNeon);
4340  os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
4341       << rd << ", " << rm;
4342}
4343
4344void Disassembler::vcmp(Condition cond,
4345                        DataType dt,
4346                        SRegister rd,
4347                        const SOperand& operand) {
4348  os().SetCurrentInstruction(kVcmp, kFpNeon);
4349  os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4350       << rd << ", " << operand;
4351}
4352
4353void Disassembler::vcmp(Condition cond,
4354                        DataType dt,
4355                        DRegister rd,
4356                        const DOperand& operand) {
4357  os().SetCurrentInstruction(kVcmp, kFpNeon);
4358  os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4359       << rd << ", " << operand;
4360}
4361
4362void Disassembler::vcmpe(Condition cond,
4363                         DataType dt,
4364                         SRegister rd,
4365                         const SOperand& operand) {
4366  os().SetCurrentInstruction(kVcmpe, kFpNeon);
4367  os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4368       << rd << ", " << operand;
4369}
4370
4371void Disassembler::vcmpe(Condition cond,
4372                         DataType dt,
4373                         DRegister rd,
4374                         const DOperand& operand) {
4375  os().SetCurrentInstruction(kVcmpe, kFpNeon);
4376  os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4377       << rd << ", " << operand;
4378}
4379
4380void Disassembler::vcnt(Condition cond,
4381                        DataType dt,
4382                        DRegister rd,
4383                        DRegister rm) {
4384  os().SetCurrentInstruction(kVcnt, kFpNeon);
4385  os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
4386       << rd << ", " << rm;
4387}
4388
4389void Disassembler::vcnt(Condition cond,
4390                        DataType dt,
4391                        QRegister rd,
4392                        QRegister rm) {
4393  os().SetCurrentInstruction(kVcnt, kFpNeon);
4394  os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
4395       << rd << ", " << rm;
4396}
4397
4398void Disassembler::vcvt(
4399    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4400  os().SetCurrentInstruction(kVcvt, kFpNeon);
4401  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4402       << " " << rd << ", " << rm;
4403}
4404
4405void Disassembler::vcvt(
4406    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4407  os().SetCurrentInstruction(kVcvt, kFpNeon);
4408  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4409       << " " << rd << ", " << rm;
4410}
4411
4412void Disassembler::vcvt(Condition cond,
4413                        DataType dt1,
4414                        DataType dt2,
4415                        DRegister rd,
4416                        DRegister rm,
4417                        int32_t fbits) {
4418  os().SetCurrentInstruction(kVcvt, kFpNeon);
4419  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4420       << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
4421}
4422
4423void Disassembler::vcvt(Condition cond,
4424                        DataType dt1,
4425                        DataType dt2,
4426                        QRegister rd,
4427                        QRegister 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
4434void Disassembler::vcvt(Condition cond,
4435                        DataType dt1,
4436                        DataType dt2,
4437                        SRegister rd,
4438                        SRegister 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
4445void Disassembler::vcvt(
4446    Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
4447  os().SetCurrentInstruction(kVcvt, kFpNeon);
4448  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4449       << " " << rd << ", " << rm;
4450}
4451
4452void Disassembler::vcvt(
4453    Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
4454  os().SetCurrentInstruction(kVcvt, kFpNeon);
4455  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4456       << " " << rd << ", " << rm;
4457}
4458
4459void Disassembler::vcvt(
4460    Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
4461  os().SetCurrentInstruction(kVcvt, kFpNeon);
4462  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4463       << " " << rd << ", " << rm;
4464}
4465
4466void Disassembler::vcvt(
4467    Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
4468  os().SetCurrentInstruction(kVcvt, kFpNeon);
4469  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4470       << " " << rd << ", " << rm;
4471}
4472
4473void Disassembler::vcvt(
4474    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4475  os().SetCurrentInstruction(kVcvt, kFpNeon);
4476  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4477       << " " << rd << ", " << rm;
4478}
4479
4480void Disassembler::vcvta(DataType dt1,
4481                         DataType dt2,
4482                         DRegister rd,
4483                         DRegister rm) {
4484  os().SetCurrentInstruction(kVcvta, kFpNeon);
4485  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4486}
4487
4488void Disassembler::vcvta(DataType dt1,
4489                         DataType dt2,
4490                         QRegister rd,
4491                         QRegister rm) {
4492  os().SetCurrentInstruction(kVcvta, kFpNeon);
4493  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4494}
4495
4496void Disassembler::vcvta(DataType dt1,
4497                         DataType dt2,
4498                         SRegister rd,
4499                         SRegister rm) {
4500  os().SetCurrentInstruction(kVcvta, kFpNeon);
4501  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4502}
4503
4504void Disassembler::vcvta(DataType dt1,
4505                         DataType dt2,
4506                         SRegister rd,
4507                         DRegister rm) {
4508  os().SetCurrentInstruction(kVcvta, kFpNeon);
4509  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4510}
4511
4512void Disassembler::vcvtb(
4513    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4514  os().SetCurrentInstruction(kVcvtb, kFpNeon);
4515  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4516       << " " << rd << ", " << rm;
4517}
4518
4519void Disassembler::vcvtb(
4520    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4521  os().SetCurrentInstruction(kVcvtb, kFpNeon);
4522  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4523       << " " << rd << ", " << rm;
4524}
4525
4526void Disassembler::vcvtb(
4527    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4528  os().SetCurrentInstruction(kVcvtb, kFpNeon);
4529  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4530       << " " << rd << ", " << rm;
4531}
4532
4533void Disassembler::vcvtm(DataType dt1,
4534                         DataType dt2,
4535                         DRegister rd,
4536                         DRegister rm) {
4537  os().SetCurrentInstruction(kVcvtm, kFpNeon);
4538  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4539}
4540
4541void Disassembler::vcvtm(DataType dt1,
4542                         DataType dt2,
4543                         QRegister rd,
4544                         QRegister rm) {
4545  os().SetCurrentInstruction(kVcvtm, kFpNeon);
4546  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4547}
4548
4549void Disassembler::vcvtm(DataType dt1,
4550                         DataType dt2,
4551                         SRegister rd,
4552                         SRegister rm) {
4553  os().SetCurrentInstruction(kVcvtm, kFpNeon);
4554  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4555}
4556
4557void Disassembler::vcvtm(DataType dt1,
4558                         DataType dt2,
4559                         SRegister rd,
4560                         DRegister rm) {
4561  os().SetCurrentInstruction(kVcvtm, kFpNeon);
4562  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4563}
4564
4565void Disassembler::vcvtn(DataType dt1,
4566                         DataType dt2,
4567                         DRegister rd,
4568                         DRegister rm) {
4569  os().SetCurrentInstruction(kVcvtn, kFpNeon);
4570  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4571}
4572
4573void Disassembler::vcvtn(DataType dt1,
4574                         DataType dt2,
4575                         QRegister rd,
4576                         QRegister rm) {
4577  os().SetCurrentInstruction(kVcvtn, kFpNeon);
4578  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4579}
4580
4581void Disassembler::vcvtn(DataType dt1,
4582                         DataType dt2,
4583                         SRegister rd,
4584                         SRegister rm) {
4585  os().SetCurrentInstruction(kVcvtn, kFpNeon);
4586  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4587}
4588
4589void Disassembler::vcvtn(DataType dt1,
4590                         DataType dt2,
4591                         SRegister rd,
4592                         DRegister rm) {
4593  os().SetCurrentInstruction(kVcvtn, kFpNeon);
4594  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4595}
4596
4597void Disassembler::vcvtp(DataType dt1,
4598                         DataType dt2,
4599                         DRegister rd,
4600                         DRegister rm) {
4601  os().SetCurrentInstruction(kVcvtp, kFpNeon);
4602  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4603}
4604
4605void Disassembler::vcvtp(DataType dt1,
4606                         DataType dt2,
4607                         QRegister rd,
4608                         QRegister rm) {
4609  os().SetCurrentInstruction(kVcvtp, kFpNeon);
4610  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4611}
4612
4613void Disassembler::vcvtp(DataType dt1,
4614                         DataType dt2,
4615                         SRegister rd,
4616                         SRegister rm) {
4617  os().SetCurrentInstruction(kVcvtp, kFpNeon);
4618  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4619}
4620
4621void Disassembler::vcvtp(DataType dt1,
4622                         DataType dt2,
4623                         SRegister rd,
4624                         DRegister rm) {
4625  os().SetCurrentInstruction(kVcvtp, kFpNeon);
4626  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4627}
4628
4629void Disassembler::vcvtr(
4630    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4631  os().SetCurrentInstruction(kVcvtr, kFpNeon);
4632  os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4633       << " " << rd << ", " << rm;
4634}
4635
4636void Disassembler::vcvtr(
4637    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4638  os().SetCurrentInstruction(kVcvtr, kFpNeon);
4639  os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4640       << " " << rd << ", " << rm;
4641}
4642
4643void Disassembler::vcvtt(
4644    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4645  os().SetCurrentInstruction(kVcvtt, kFpNeon);
4646  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4647       << " " << rd << ", " << rm;
4648}
4649
4650void Disassembler::vcvtt(
4651    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4652  os().SetCurrentInstruction(kVcvtt, kFpNeon);
4653  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4654       << " " << rd << ", " << rm;
4655}
4656
4657void Disassembler::vcvtt(
4658    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4659  os().SetCurrentInstruction(kVcvtt, kFpNeon);
4660  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4661       << " " << rd << ", " << rm;
4662}
4663
4664void Disassembler::vdiv(
4665    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4666  os().SetCurrentInstruction(kVdiv, kFpNeon);
4667  os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
4668  os() << " ";
4669  if (!rd.Is(rn) || !use_short_hand_form_) {
4670    os() << rd << ", ";
4671  }
4672  os() << rn << ", " << rm;
4673}
4674
4675void Disassembler::vdiv(
4676    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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
4686void Disassembler::vdup(Condition cond,
4687                        DataType dt,
4688                        QRegister rd,
4689                        Register rt) {
4690  os().SetCurrentInstruction(kVdup, kFpNeon);
4691  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4692       << rd << ", " << rt;
4693}
4694
4695void Disassembler::vdup(Condition cond,
4696                        DataType dt,
4697                        DRegister rd,
4698                        Register rt) {
4699  os().SetCurrentInstruction(kVdup, kFpNeon);
4700  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4701       << rd << ", " << rt;
4702}
4703
4704void Disassembler::vdup(Condition cond,
4705                        DataType dt,
4706                        DRegister rd,
4707                        DRegisterLane rm) {
4708  os().SetCurrentInstruction(kVdup, kFpNeon);
4709  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4710       << rd << ", " << rm;
4711}
4712
4713void Disassembler::vdup(Condition cond,
4714                        DataType dt,
4715                        QRegister rd,
4716                        DRegisterLane rm) {
4717  os().SetCurrentInstruction(kVdup, kFpNeon);
4718  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4719       << rd << ", " << rm;
4720}
4721
4722void Disassembler::veor(
4723    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4724  os().SetCurrentInstruction(kVeor, kFpNeon);
4725  os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
4726  os() << " ";
4727  if (!rd.Is(rn) || !use_short_hand_form_) {
4728    os() << rd << ", ";
4729  }
4730  os() << rn << ", " << rm;
4731}
4732
4733void Disassembler::veor(
4734    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4744void Disassembler::vext(Condition cond,
4745                        DataType dt,
4746                        DRegister rd,
4747                        DRegister rn,
4748                        DRegister rm,
4749                        const DOperand& operand) {
4750  os().SetCurrentInstruction(kVext, kFpNeon);
4751  os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
4752  os() << " ";
4753  if (!rd.Is(rn) || !use_short_hand_form_) {
4754    os() << rd << ", ";
4755  }
4756  os() << rn << ", " << rm << ", " << operand;
4757}
4758
4759void Disassembler::vext(Condition cond,
4760                        DataType dt,
4761                        QRegister rd,
4762                        QRegister rn,
4763                        QRegister rm,
4764                        const QOperand& operand) {
4765  os().SetCurrentInstruction(kVext, kFpNeon);
4766  os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
4767  os() << " ";
4768  if (!rd.Is(rn) || !use_short_hand_form_) {
4769    os() << rd << ", ";
4770  }
4771  os() << rn << ", " << rm << ", " << operand;
4772}
4773
4774void Disassembler::vfma(
4775    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4776  os().SetCurrentInstruction(kVfma, kFpNeon);
4777  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4778       << rd << ", " << rn << ", " << rm;
4779}
4780
4781void Disassembler::vfma(
4782    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4783  os().SetCurrentInstruction(kVfma, kFpNeon);
4784  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4785       << rd << ", " << rn << ", " << rm;
4786}
4787
4788void Disassembler::vfma(
4789    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4790  os().SetCurrentInstruction(kVfma, kFpNeon);
4791  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4792       << rd << ", " << rn << ", " << rm;
4793}
4794
4795void Disassembler::vfms(
4796    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4797  os().SetCurrentInstruction(kVfms, kFpNeon);
4798  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4799       << rd << ", " << rn << ", " << rm;
4800}
4801
4802void Disassembler::vfms(
4803    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4804  os().SetCurrentInstruction(kVfms, kFpNeon);
4805  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4806       << rd << ", " << rn << ", " << rm;
4807}
4808
4809void Disassembler::vfms(
4810    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4811  os().SetCurrentInstruction(kVfms, kFpNeon);
4812  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4813       << rd << ", " << rn << ", " << rm;
4814}
4815
4816void Disassembler::vfnma(
4817    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4818  os().SetCurrentInstruction(kVfnma, kFpNeon);
4819  os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
4820       << rd << ", " << rn << ", " << rm;
4821}
4822
4823void Disassembler::vfnma(
4824    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4825  os().SetCurrentInstruction(kVfnma, kFpNeon);
4826  os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
4827       << rd << ", " << rn << ", " << rm;
4828}
4829
4830void Disassembler::vfnms(
4831    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4832  os().SetCurrentInstruction(kVfnms, kFpNeon);
4833  os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
4834       << rd << ", " << rn << ", " << rm;
4835}
4836
4837void Disassembler::vfnms(
4838    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4839  os().SetCurrentInstruction(kVfnms, kFpNeon);
4840  os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
4841       << rd << ", " << rn << ", " << rm;
4842}
4843
4844void Disassembler::vhadd(
4845    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4846  os().SetCurrentInstruction(kVhadd, kFpNeon);
4847  os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
4848  os() << " ";
4849  if (!rd.Is(rn) || !use_short_hand_form_) {
4850    os() << rd << ", ";
4851  }
4852  os() << rn << ", " << rm;
4853}
4854
4855void Disassembler::vhadd(
4856    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4866void Disassembler::vhsub(
4867    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4868  os().SetCurrentInstruction(kVhsub, kFpNeon);
4869  os() << ToCString(kVhsub) << 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
4877void Disassembler::vhsub(
4878    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
4888void Disassembler::vld1(Condition cond,
4889                        DataType dt,
4890                        const NeonRegisterList& nreglist,
4891                        const AlignedMemOperand& operand) {
4892  os().SetCurrentInstruction(kVld1, kFpNeon);
4893  os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
4894       << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
4895}
4896
4897void Disassembler::vld2(Condition cond,
4898                        DataType dt,
4899                        const NeonRegisterList& nreglist,
4900                        const AlignedMemOperand& operand) {
4901  os().SetCurrentInstruction(kVld2, kFpNeon);
4902  os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
4903       << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
4904}
4905
4906void Disassembler::vld3(Condition cond,
4907                        DataType dt,
4908                        const NeonRegisterList& nreglist,
4909                        const AlignedMemOperand& operand) {
4910  os().SetCurrentInstruction(kVld3, kFpNeon);
4911  os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
4912       << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
4913}
4914
4915void Disassembler::vld3(Condition cond,
4916                        DataType dt,
4917                        const NeonRegisterList& nreglist,
4918                        const MemOperand& operand) {
4919  os().SetCurrentInstruction(kVld3, kFpNeon);
4920  os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
4921       << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
4922}
4923
4924void Disassembler::vld4(Condition cond,
4925                        DataType dt,
4926                        const NeonRegisterList& nreglist,
4927                        const AlignedMemOperand& operand) {
4928  os().SetCurrentInstruction(kVld4, kFpNeon);
4929  os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
4930       << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
4931}
4932
4933void Disassembler::vldm(Condition cond,
4934                        DataType dt,
4935                        Register rn,
4936                        WriteBack write_back,
4937                        DRegisterList dreglist) {
4938  os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
4939  os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
4940       << rn << write_back << ", " << dreglist;
4941}
4942
4943void Disassembler::vldm(Condition cond,
4944                        DataType dt,
4945                        Register rn,
4946                        WriteBack write_back,
4947                        SRegisterList sreglist) {
4948  os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
4949  os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
4950       << rn << write_back << ", " << sreglist;
4951}
4952
4953void Disassembler::vldmdb(Condition cond,
4954                          DataType dt,
4955                          Register rn,
4956                          WriteBack write_back,
4957                          DRegisterList dreglist) {
4958  os().SetCurrentInstruction(kVldmdb,
4959                             kLoadStore | kLoadStoreMultiple | kFpNeon);
4960  os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
4961       << rn << write_back << ", " << dreglist;
4962}
4963
4964void Disassembler::vldmdb(Condition cond,
4965                          DataType dt,
4966                          Register rn,
4967                          WriteBack write_back,
4968                          SRegisterList sreglist) {
4969  os().SetCurrentInstruction(kVldmdb,
4970                             kLoadStore | kLoadStoreMultiple | kFpNeon);
4971  os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
4972       << rn << write_back << ", " << sreglist;
4973}
4974
4975void Disassembler::vldmia(Condition cond,
4976                          DataType dt,
4977                          Register rn,
4978                          WriteBack write_back,
4979                          DRegisterList dreglist) {
4980  os().SetCurrentInstruction(kVldmia,
4981                             kLoadStore | kLoadStoreMultiple | kFpNeon);
4982  os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
4983       << rn << write_back << ", " << dreglist;
4984}
4985
4986void Disassembler::vldmia(Condition cond,
4987                          DataType dt,
4988                          Register rn,
4989                          WriteBack write_back,
4990                          SRegisterList sreglist) {
4991  os().SetCurrentInstruction(kVldmia,
4992                             kLoadStore | kLoadStoreMultiple | kFpNeon);
4993  os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
4994       << rn << write_back << ", " << sreglist;
4995}
4996
4997void Disassembler::vldr(Condition cond,
4998                        DataType dt,
4999                        DRegister rd,
5000                        Location* location) {
5001  os().SetCurrentInstruction(kVldr, kFpNeon);
5002  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5003       << DtPrinter(dt, Untyped64) << " " << rd << ", "
5004       << PrintLabel(kLoadDoublePrecisionLocation,
5005                     location,
5006                     GetCodeAddress() & ~3);
5007}
5008
5009void Disassembler::vldr(Condition cond,
5010                        DataType dt,
5011                        DRegister rd,
5012                        const MemOperand& operand) {
5013  os().SetCurrentInstruction(kVldr, kFpNeon);
5014  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5015       << DtPrinter(dt, Untyped64) << " " << rd << ", "
5016       << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
5017}
5018
5019void Disassembler::vldr(Condition cond,
5020                        DataType dt,
5021                        SRegister rd,
5022                        Location* location) {
5023  os().SetCurrentInstruction(kVldr, kFpNeon);
5024  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5025       << DtPrinter(dt, Untyped32) << " " << rd << ", "
5026       << PrintLabel(kLoadSinglePrecisionLocation,
5027                     location,
5028                     GetCodeAddress() & ~3);
5029}
5030
5031void Disassembler::vldr(Condition cond,
5032                        DataType dt,
5033                        SRegister rd,
5034                        const MemOperand& operand) {
5035  os().SetCurrentInstruction(kVldr, kFpNeon);
5036  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5037       << DtPrinter(dt, Untyped32) << " " << rd << ", "
5038       << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
5039}
5040
5041void Disassembler::vmax(
5042    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5043  os().SetCurrentInstruction(kVmax, kFpNeon);
5044  os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
5045  os() << " ";
5046  if (!rd.Is(rn) || !use_short_hand_form_) {
5047    os() << rd << ", ";
5048  }
5049  os() << rn << ", " << rm;
5050}
5051
5052void Disassembler::vmax(
5053    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
5063void Disassembler::vmaxnm(DataType dt,
5064                          DRegister rd,
5065                          DRegister rn,
5066                          DRegister rm) {
5067  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5068  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5069}
5070
5071void Disassembler::vmaxnm(DataType dt,
5072                          QRegister rd,
5073                          QRegister rn,
5074                          QRegister rm) {
5075  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5076  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5077}
5078
5079void Disassembler::vmaxnm(DataType dt,
5080                          SRegister rd,
5081                          SRegister rn,
5082                          SRegister rm) {
5083  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5084  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5085}
5086
5087void Disassembler::vmin(
5088    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5089  os().SetCurrentInstruction(kVmin, kFpNeon);
5090  os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
5091  os() << " ";
5092  if (!rd.Is(rn) || !use_short_hand_form_) {
5093    os() << rd << ", ";
5094  }
5095  os() << rn << ", " << rm;
5096}
5097
5098void Disassembler::vmin(
5099    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
5109void Disassembler::vminnm(DataType dt,
5110                          DRegister rd,
5111                          DRegister rn,
5112                          DRegister rm) {
5113  os().SetCurrentInstruction(kVminnm, kFpNeon);
5114  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5115}
5116
5117void Disassembler::vminnm(DataType dt,
5118                          QRegister rd,
5119                          QRegister rn,
5120                          QRegister rm) {
5121  os().SetCurrentInstruction(kVminnm, kFpNeon);
5122  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5123}
5124
5125void Disassembler::vminnm(DataType dt,
5126                          SRegister rd,
5127                          SRegister rn,
5128                          SRegister rm) {
5129  os().SetCurrentInstruction(kVminnm, kFpNeon);
5130  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5131}
5132
5133void Disassembler::vmla(
5134    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5135  os().SetCurrentInstruction(kVmla, kFpNeon);
5136  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5137       << rd << ", " << rn << ", " << rm;
5138}
5139
5140void Disassembler::vmla(
5141    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5142  os().SetCurrentInstruction(kVmla, kFpNeon);
5143  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5144       << rd << ", " << rn << ", " << rm;
5145}
5146
5147void Disassembler::vmla(
5148    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5149  os().SetCurrentInstruction(kVmla, kFpNeon);
5150  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5151       << rd << ", " << rn << ", " << rm;
5152}
5153
5154void Disassembler::vmla(
5155    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5156  os().SetCurrentInstruction(kVmla, kFpNeon);
5157  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5158       << rd << ", " << rn << ", " << rm;
5159}
5160
5161void Disassembler::vmla(
5162    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5163  os().SetCurrentInstruction(kVmla, kFpNeon);
5164  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5165       << rd << ", " << rn << ", " << rm;
5166}
5167
5168void Disassembler::vmlal(
5169    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5170  os().SetCurrentInstruction(kVmlal, kFpNeon);
5171  os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5172       << rd << ", " << rn << ", " << rm;
5173}
5174
5175void Disassembler::vmlal(
5176    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5177  os().SetCurrentInstruction(kVmlal, kFpNeon);
5178  os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5179       << rd << ", " << rn << ", " << rm;
5180}
5181
5182void Disassembler::vmls(
5183    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5184  os().SetCurrentInstruction(kVmls, kFpNeon);
5185  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5186       << rd << ", " << rn << ", " << rm;
5187}
5188
5189void Disassembler::vmls(
5190    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5191  os().SetCurrentInstruction(kVmls, kFpNeon);
5192  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5193       << rd << ", " << rn << ", " << rm;
5194}
5195
5196void Disassembler::vmls(
5197    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5198  os().SetCurrentInstruction(kVmls, kFpNeon);
5199  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5200       << rd << ", " << rn << ", " << rm;
5201}
5202
5203void Disassembler::vmls(
5204    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5205  os().SetCurrentInstruction(kVmls, kFpNeon);
5206  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5207       << rd << ", " << rn << ", " << rm;
5208}
5209
5210void Disassembler::vmls(
5211    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5212  os().SetCurrentInstruction(kVmls, kFpNeon);
5213  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5214       << rd << ", " << rn << ", " << rm;
5215}
5216
5217void Disassembler::vmlsl(
5218    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5219  os().SetCurrentInstruction(kVmlsl, kFpNeon);
5220  os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5221       << rd << ", " << rn << ", " << rm;
5222}
5223
5224void Disassembler::vmlsl(
5225    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5226  os().SetCurrentInstruction(kVmlsl, kFpNeon);
5227  os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5228       << rd << ", " << rn << ", " << rm;
5229}
5230
5231void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
5232  os().SetCurrentInstruction(kVmov, kFpNeon);
5233  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5234       << ", " << rn;
5235}
5236
5237void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
5238  os().SetCurrentInstruction(kVmov, kFpNeon);
5239  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
5240       << ", " << rt;
5241}
5242
5243void Disassembler::vmov(Condition cond,
5244                        Register rt,
5245                        Register rt2,
5246                        DRegister rm) {
5247  os().SetCurrentInstruction(kVmov, kFpNeon);
5248  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5249       << ", " << rt2 << ", " << rm;
5250}
5251
5252void Disassembler::vmov(Condition cond,
5253                        DRegister rm,
5254                        Register rt,
5255                        Register rt2) {
5256  os().SetCurrentInstruction(kVmov, kFpNeon);
5257  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
5258       << ", " << rt << ", " << rt2;
5259}
5260
5261void Disassembler::vmov(
5262    Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
5263  os().SetCurrentInstruction(kVmov, kFpNeon);
5264  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5265       << ", " << rt2 << ", " << rm << ", " << rm1;
5266}
5267
5268void Disassembler::vmov(
5269    Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
5270  os().SetCurrentInstruction(kVmov, kFpNeon);
5271  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
5272       << ", " << rm1 << ", " << rt << ", " << rt2;
5273}
5274
5275void Disassembler::vmov(Condition cond,
5276                        DataType dt,
5277                        DRegisterLane rd,
5278                        Register rt) {
5279  os().SetCurrentInstruction(kVmov, kFpNeon);
5280  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5281       << rd << ", " << rt;
5282}
5283
5284void Disassembler::vmov(Condition cond,
5285                        DataType dt,
5286                        DRegister rd,
5287                        const DOperand& operand) {
5288  os().SetCurrentInstruction(kVmov, kFpNeon);
5289  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5290       << rd << ", " << operand;
5291}
5292
5293void Disassembler::vmov(Condition cond,
5294                        DataType dt,
5295                        QRegister rd,
5296                        const QOperand& operand) {
5297  os().SetCurrentInstruction(kVmov, kFpNeon);
5298  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5299       << rd << ", " << operand;
5300}
5301
5302void Disassembler::vmov(Condition cond,
5303                        DataType dt,
5304                        SRegister rd,
5305                        const SOperand& operand) {
5306  os().SetCurrentInstruction(kVmov, kFpNeon);
5307  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5308       << rd << ", " << operand;
5309}
5310
5311void Disassembler::vmov(Condition cond,
5312                        DataType dt,
5313                        Register rt,
5314                        DRegisterLane rn) {
5315  os().SetCurrentInstruction(kVmov, kFpNeon);
5316  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5317       << rt << ", " << rn;
5318}
5319
5320void Disassembler::vmovl(Condition cond,
5321                         DataType dt,
5322                         QRegister rd,
5323                         DRegister rm) {
5324  os().SetCurrentInstruction(kVmovl, kFpNeon);
5325  os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
5326       << rd << ", " << rm;
5327}
5328
5329void Disassembler::vmovn(Condition cond,
5330                         DataType dt,
5331                         DRegister rd,
5332                         QRegister rm) {
5333  os().SetCurrentInstruction(kVmovn, kFpNeon);
5334  os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
5335       << rd << ", " << rm;
5336}
5337
5338void Disassembler::vmrs(Condition cond,
5339                        RegisterOrAPSR_nzcv rt,
5340                        SpecialFPRegister spec_reg) {
5341  os().SetCurrentInstruction(kVmrs, kFpNeon);
5342  os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
5343       << ", " << spec_reg;
5344}
5345
5346void Disassembler::vmsr(Condition cond,
5347                        SpecialFPRegister spec_reg,
5348                        Register rt) {
5349  os().SetCurrentInstruction(kVmsr, kFpNeon);
5350  os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
5351       << spec_reg << ", " << rt;
5352}
5353
5354void Disassembler::vmul(Condition cond,
5355                        DataType dt,
5356                        DRegister rd,
5357                        DRegister rn,
5358                        DRegister dm,
5359                        unsigned index) {
5360  os().SetCurrentInstruction(kVmul, kFpNeon);
5361  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5362  os() << " ";
5363  if (!rd.Is(rn) || !use_short_hand_form_) {
5364    os() << rd << ", ";
5365  }
5366  os() << rn << ", " << IndexedRegisterPrinter(dm, index);
5367}
5368
5369void Disassembler::vmul(Condition cond,
5370                        DataType dt,
5371                        QRegister rd,
5372                        QRegister rn,
5373                        DRegister dm,
5374                        unsigned index) {
5375  os().SetCurrentInstruction(kVmul, kFpNeon);
5376  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5377  os() << " ";
5378  if (!rd.Is(rn) || !use_short_hand_form_) {
5379    os() << rd << ", ";
5380  }
5381  os() << rn << ", " << IndexedRegisterPrinter(dm, index);
5382}
5383
5384void Disassembler::vmul(
5385    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
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 << ", " << rm;
5393}
5394
5395void Disassembler::vmul(
5396    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
5406void Disassembler::vmul(
5407    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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
5417void Disassembler::vmull(Condition cond,
5418                         DataType dt,
5419                         QRegister rd,
5420                         DRegister rn,
5421                         DRegister dm,
5422                         unsigned index) {
5423  os().SetCurrentInstruction(kVmull, kFpNeon);
5424  os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
5425       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5426}
5427
5428void Disassembler::vmull(
5429    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5430  os().SetCurrentInstruction(kVmull, kFpNeon);
5431  os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
5432       << rd << ", " << rn << ", " << rm;
5433}
5434
5435void Disassembler::vmvn(Condition cond,
5436                        DataType dt,
5437                        DRegister rd,
5438                        const DOperand& operand) {
5439  os().SetCurrentInstruction(kVmvn, kFpNeon);
5440  os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
5441       << rd << ", " << operand;
5442}
5443
5444void Disassembler::vmvn(Condition cond,
5445                        DataType dt,
5446                        QRegister rd,
5447                        const QOperand& operand) {
5448  os().SetCurrentInstruction(kVmvn, kFpNeon);
5449  os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
5450       << rd << ", " << operand;
5451}
5452
5453void Disassembler::vneg(Condition cond,
5454                        DataType dt,
5455                        DRegister rd,
5456                        DRegister rm) {
5457  os().SetCurrentInstruction(kVneg, kFpNeon);
5458  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5459       << rd << ", " << rm;
5460}
5461
5462void Disassembler::vneg(Condition cond,
5463                        DataType dt,
5464                        QRegister rd,
5465                        QRegister rm) {
5466  os().SetCurrentInstruction(kVneg, kFpNeon);
5467  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5468       << rd << ", " << rm;
5469}
5470
5471void Disassembler::vneg(Condition cond,
5472                        DataType dt,
5473                        SRegister rd,
5474                        SRegister rm) {
5475  os().SetCurrentInstruction(kVneg, kFpNeon);
5476  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5477       << rd << ", " << rm;
5478}
5479
5480void Disassembler::vnmla(
5481    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5482  os().SetCurrentInstruction(kVnmla, kFpNeon);
5483  os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
5484       << rd << ", " << rn << ", " << rm;
5485}
5486
5487void Disassembler::vnmla(
5488    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5489  os().SetCurrentInstruction(kVnmla, kFpNeon);
5490  os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
5491       << rd << ", " << rn << ", " << rm;
5492}
5493
5494void Disassembler::vnmls(
5495    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5496  os().SetCurrentInstruction(kVnmls, kFpNeon);
5497  os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
5498       << rd << ", " << rn << ", " << rm;
5499}
5500
5501void Disassembler::vnmls(
5502    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5503  os().SetCurrentInstruction(kVnmls, kFpNeon);
5504  os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
5505       << rd << ", " << rn << ", " << rm;
5506}
5507
5508void Disassembler::vnmul(
5509    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5510  os().SetCurrentInstruction(kVnmul, kFpNeon);
5511  os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
5512  os() << " ";
5513  if (!rd.Is(rn) || !use_short_hand_form_) {
5514    os() << rd << ", ";
5515  }
5516  os() << rn << ", " << rm;
5517}
5518
5519void Disassembler::vnmul(
5520    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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
5530void Disassembler::vorn(Condition cond,
5531                        DataType dt,
5532                        DRegister rd,
5533                        DRegister rn,
5534                        const DOperand& operand) {
5535  os().SetCurrentInstruction(kVorn, kFpNeon);
5536  os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
5537  os() << " ";
5538  if (!rd.Is(rn) || !use_short_hand_form_) {
5539    os() << rd << ", ";
5540  }
5541  os() << rn << ", " << operand;
5542}
5543
5544void Disassembler::vorn(Condition cond,
5545                        DataType dt,
5546                        QRegister rd,
5547                        QRegister rn,
5548                        const QOperand& operand) {
5549  os().SetCurrentInstruction(kVorn, kFpNeon);
5550  os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
5551  os() << " ";
5552  if (!rd.Is(rn) || !use_short_hand_form_) {
5553    os() << rd << ", ";
5554  }
5555  os() << rn << ", " << operand;
5556}
5557
5558void Disassembler::vorr(Condition cond,
5559                        DataType dt,
5560                        DRegister rd,
5561                        DRegister rn,
5562                        const DOperand& operand) {
5563  os().SetCurrentInstruction(kVorr, kFpNeon);
5564  os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
5565  os() << " ";
5566  if (!rd.Is(rn) || !use_short_hand_form_) {
5567    os() << rd << ", ";
5568  }
5569  os() << rn << ", " << operand;
5570}
5571
5572void Disassembler::vorr(Condition cond,
5573                        DataType dt,
5574                        QRegister rd,
5575                        QRegister rn,
5576                        const QOperand& operand) {
5577  os().SetCurrentInstruction(kVorr, kFpNeon);
5578  os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
5579  os() << " ";
5580  if (!rd.Is(rn) || !use_short_hand_form_) {
5581    os() << rd << ", ";
5582  }
5583  os() << rn << ", " << operand;
5584}
5585
5586void Disassembler::vpadal(Condition cond,
5587                          DataType dt,
5588                          DRegister rd,
5589                          DRegister rm) {
5590  os().SetCurrentInstruction(kVpadal, kFpNeon);
5591  os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
5592       << rd << ", " << rm;
5593}
5594
5595void Disassembler::vpadal(Condition cond,
5596                          DataType dt,
5597                          QRegister rd,
5598                          QRegister rm) {
5599  os().SetCurrentInstruction(kVpadal, kFpNeon);
5600  os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
5601       << rd << ", " << rm;
5602}
5603
5604void Disassembler::vpadd(
5605    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5606  os().SetCurrentInstruction(kVpadd, kFpNeon);
5607  os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
5608  os() << " ";
5609  if (!rd.Is(rn) || !use_short_hand_form_) {
5610    os() << rd << ", ";
5611  }
5612  os() << rn << ", " << rm;
5613}
5614
5615void Disassembler::vpaddl(Condition cond,
5616                          DataType dt,
5617                          DRegister rd,
5618                          DRegister rm) {
5619  os().SetCurrentInstruction(kVpaddl, kFpNeon);
5620  os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
5621       << rd << ", " << rm;
5622}
5623
5624void Disassembler::vpaddl(Condition cond,
5625                          DataType dt,
5626                          QRegister rd,
5627                          QRegister rm) {
5628  os().SetCurrentInstruction(kVpaddl, kFpNeon);
5629  os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
5630       << rd << ", " << rm;
5631}
5632
5633void Disassembler::vpmax(
5634    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5635  os().SetCurrentInstruction(kVpmax, kFpNeon);
5636  os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
5637  os() << " ";
5638  if (!rd.Is(rn) || !use_short_hand_form_) {
5639    os() << rd << ", ";
5640  }
5641  os() << rn << ", " << rm;
5642}
5643
5644void Disassembler::vpmin(
5645    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5646  os().SetCurrentInstruction(kVpmin, kFpNeon);
5647  os() << ToCString(kVpmin) << 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
5655void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
5656  os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
5657  os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
5658       << dreglist;
5659}
5660
5661void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
5662  os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
5663  os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
5664       << sreglist;
5665}
5666
5667void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
5668  os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
5669  os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
5670       << dreglist;
5671}
5672
5673void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
5674  os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
5675  os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
5676       << sreglist;
5677}
5678
5679void Disassembler::vqabs(Condition cond,
5680                         DataType dt,
5681                         DRegister rd,
5682                         DRegister rm) {
5683  os().SetCurrentInstruction(kVqabs, kFpNeon);
5684  os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
5685       << rd << ", " << rm;
5686}
5687
5688void Disassembler::vqabs(Condition cond,
5689                         DataType dt,
5690                         QRegister rd,
5691                         QRegister rm) {
5692  os().SetCurrentInstruction(kVqabs, kFpNeon);
5693  os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
5694       << rd << ", " << rm;
5695}
5696
5697void Disassembler::vqadd(
5698    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5699  os().SetCurrentInstruction(kVqadd, kFpNeon);
5700  os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
5701  os() << " ";
5702  if (!rd.Is(rn) || !use_short_hand_form_) {
5703    os() << rd << ", ";
5704  }
5705  os() << rn << ", " << rm;
5706}
5707
5708void Disassembler::vqadd(
5709    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
5719void Disassembler::vqdmlal(
5720    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5721  os().SetCurrentInstruction(kVqdmlal, kFpNeon);
5722  os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5723       << rd << ", " << rn << ", " << rm;
5724}
5725
5726void Disassembler::vqdmlal(Condition cond,
5727                           DataType dt,
5728                           QRegister rd,
5729                           DRegister rn,
5730                           DRegister dm,
5731                           unsigned index) {
5732  os().SetCurrentInstruction(kVqdmlal, kFpNeon);
5733  os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5734       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5735}
5736
5737void Disassembler::vqdmlsl(
5738    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5739  os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
5740  os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5741       << rd << ", " << rn << ", " << rm;
5742}
5743
5744void Disassembler::vqdmlsl(Condition cond,
5745                           DataType dt,
5746                           QRegister rd,
5747                           DRegister rn,
5748                           DRegister dm,
5749                           unsigned index) {
5750  os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
5751  os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5752       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5753}
5754
5755void Disassembler::vqdmulh(
5756    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5757  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5758  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5759  os() << " ";
5760  if (!rd.Is(rn) || !use_short_hand_form_) {
5761    os() << rd << ", ";
5762  }
5763  os() << rn << ", " << rm;
5764}
5765
5766void Disassembler::vqdmulh(
5767    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
5777void Disassembler::vqdmulh(
5778    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane 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
5788void Disassembler::vqdmulh(
5789    Condition cond, DataType dt, QRegister rd, QRegister 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
5799void Disassembler::vqdmull(
5800    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5801  os().SetCurrentInstruction(kVqdmull, kFpNeon);
5802  os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
5803       << rd << ", " << rn << ", " << rm;
5804}
5805
5806void Disassembler::vqdmull(
5807    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5808  os().SetCurrentInstruction(kVqdmull, kFpNeon);
5809  os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
5810       << rd << ", " << rn << ", " << rm;
5811}
5812
5813void Disassembler::vqmovn(Condition cond,
5814                          DataType dt,
5815                          DRegister rd,
5816                          QRegister rm) {
5817  os().SetCurrentInstruction(kVqmovn, kFpNeon);
5818  os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
5819       << rd << ", " << rm;
5820}
5821
5822void Disassembler::vqmovun(Condition cond,
5823                           DataType dt,
5824                           DRegister rd,
5825                           QRegister rm) {
5826  os().SetCurrentInstruction(kVqmovun, kFpNeon);
5827  os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
5828       << rd << ", " << rm;
5829}
5830
5831void Disassembler::vqneg(Condition cond,
5832                         DataType dt,
5833                         DRegister rd,
5834                         DRegister rm) {
5835  os().SetCurrentInstruction(kVqneg, kFpNeon);
5836  os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
5837       << rd << ", " << rm;
5838}
5839
5840void Disassembler::vqneg(Condition cond,
5841                         DataType dt,
5842                         QRegister rd,
5843                         QRegister rm) {
5844  os().SetCurrentInstruction(kVqneg, kFpNeon);
5845  os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
5846       << rd << ", " << rm;
5847}
5848
5849void Disassembler::vqrdmulh(
5850    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5851  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5852  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5853  os() << " ";
5854  if (!rd.Is(rn) || !use_short_hand_form_) {
5855    os() << rd << ", ";
5856  }
5857  os() << rn << ", " << rm;
5858}
5859
5860void Disassembler::vqrdmulh(
5861    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
5871void Disassembler::vqrdmulh(
5872    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane 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
5882void Disassembler::vqrdmulh(
5883    Condition cond, DataType dt, QRegister rd, QRegister 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
5893void Disassembler::vqrshl(
5894    Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
5895  os().SetCurrentInstruction(kVqrshl, kFpNeon);
5896  os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
5897  os() << " ";
5898  if (!rd.Is(rm) || !use_short_hand_form_) {
5899    os() << rd << ", ";
5900  }
5901  os() << rm << ", " << rn;
5902}
5903
5904void Disassembler::vqrshl(
5905    Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister 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
5915void Disassembler::vqrshrn(Condition cond,
5916                           DataType dt,
5917                           DRegister rd,
5918                           QRegister rm,
5919                           const QOperand& operand) {
5920  os().SetCurrentInstruction(kVqrshrn, kFpNeon);
5921  os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
5922       << rd << ", " << rm << ", " << operand;
5923}
5924
5925void Disassembler::vqrshrun(Condition cond,
5926                            DataType dt,
5927                            DRegister rd,
5928                            QRegister rm,
5929                            const QOperand& operand) {
5930  os().SetCurrentInstruction(kVqrshrun, kFpNeon);
5931  os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
5932       << rd << ", " << rm << ", " << operand;
5933}
5934
5935void Disassembler::vqshl(Condition cond,
5936                         DataType dt,
5937                         DRegister rd,
5938                         DRegister rm,
5939                         const DOperand& operand) {
5940  os().SetCurrentInstruction(kVqshl, kFpNeon);
5941  os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
5942  os() << " ";
5943  if (!rd.Is(rm) || !use_short_hand_form_) {
5944    os() << rd << ", ";
5945  }
5946  os() << rm << ", " << operand;
5947}
5948
5949void Disassembler::vqshl(Condition cond,
5950                         DataType dt,
5951                         QRegister rd,
5952                         QRegister rm,
5953                         const QOperand& operand) {
5954  os().SetCurrentInstruction(kVqshl, kFpNeon);
5955  os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
5956  os() << " ";
5957  if (!rd.Is(rm) || !use_short_hand_form_) {
5958    os() << rd << ", ";
5959  }
5960  os() << rm << ", " << operand;
5961}
5962
5963void Disassembler::vqshlu(Condition cond,
5964                          DataType dt,
5965                          DRegister rd,
5966                          DRegister rm,
5967                          const DOperand& operand) {
5968  os().SetCurrentInstruction(kVqshlu, kFpNeon);
5969  os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
5970  os() << " ";
5971  if (!rd.Is(rm) || !use_short_hand_form_) {
5972    os() << rd << ", ";
5973  }
5974  os() << rm << ", " << operand;
5975}
5976
5977void Disassembler::vqshlu(Condition cond,
5978                          DataType dt,
5979                          QRegister rd,
5980                          QRegister rm,
5981                          const QOperand& operand) {
5982  os().SetCurrentInstruction(kVqshlu, kFpNeon);
5983  os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
5984  os() << " ";
5985  if (!rd.Is(rm) || !use_short_hand_form_) {
5986    os() << rd << ", ";
5987  }
5988  os() << rm << ", " << operand;
5989}
5990
5991void Disassembler::vqshrn(Condition cond,
5992                          DataType dt,
5993                          DRegister rd,
5994                          QRegister rm,
5995                          const QOperand& operand) {
5996  os().SetCurrentInstruction(kVqshrn, kFpNeon);
5997  os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
5998       << rd << ", " << rm << ", " << operand;
5999}
6000
6001void Disassembler::vqshrun(Condition cond,
6002                           DataType dt,
6003                           DRegister rd,
6004                           QRegister rm,
6005                           const QOperand& operand) {
6006  os().SetCurrentInstruction(kVqshrun, kFpNeon);
6007  os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
6008       << rd << ", " << rm << ", " << operand;
6009}
6010
6011void Disassembler::vqsub(
6012    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6013  os().SetCurrentInstruction(kVqsub, kFpNeon);
6014  os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
6015  os() << " ";
6016  if (!rd.Is(rn) || !use_short_hand_form_) {
6017    os() << rd << ", ";
6018  }
6019  os() << rn << ", " << rm;
6020}
6021
6022void Disassembler::vqsub(
6023    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
6033void Disassembler::vraddhn(
6034    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6035  os().SetCurrentInstruction(kVraddhn, kFpNeon);
6036  os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
6037       << rd << ", " << rn << ", " << rm;
6038}
6039
6040void Disassembler::vrecpe(Condition cond,
6041                          DataType dt,
6042                          DRegister rd,
6043                          DRegister rm) {
6044  os().SetCurrentInstruction(kVrecpe, kFpNeon);
6045  os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
6046       << rd << ", " << rm;
6047}
6048
6049void Disassembler::vrecpe(Condition cond,
6050                          DataType dt,
6051                          QRegister rd,
6052                          QRegister rm) {
6053  os().SetCurrentInstruction(kVrecpe, kFpNeon);
6054  os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
6055       << rd << ", " << rm;
6056}
6057
6058void Disassembler::vrecps(
6059    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6060  os().SetCurrentInstruction(kVrecps, kFpNeon);
6061  os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
6062  os() << " ";
6063  if (!rd.Is(rn) || !use_short_hand_form_) {
6064    os() << rd << ", ";
6065  }
6066  os() << rn << ", " << rm;
6067}
6068
6069void Disassembler::vrecps(
6070    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
6080void Disassembler::vrev16(Condition cond,
6081                          DataType dt,
6082                          DRegister rd,
6083                          DRegister rm) {
6084  os().SetCurrentInstruction(kVrev16, kFpNeon);
6085  os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
6086       << rd << ", " << rm;
6087}
6088
6089void Disassembler::vrev16(Condition cond,
6090                          DataType dt,
6091                          QRegister rd,
6092                          QRegister rm) {
6093  os().SetCurrentInstruction(kVrev16, kFpNeon);
6094  os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
6095       << rd << ", " << rm;
6096}
6097
6098void Disassembler::vrev32(Condition cond,
6099                          DataType dt,
6100                          DRegister rd,
6101                          DRegister rm) {
6102  os().SetCurrentInstruction(kVrev32, kFpNeon);
6103  os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
6104       << rd << ", " << rm;
6105}
6106
6107void Disassembler::vrev32(Condition cond,
6108                          DataType dt,
6109                          QRegister rd,
6110                          QRegister rm) {
6111  os().SetCurrentInstruction(kVrev32, kFpNeon);
6112  os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
6113       << rd << ", " << rm;
6114}
6115
6116void Disassembler::vrev64(Condition cond,
6117                          DataType dt,
6118                          DRegister rd,
6119                          DRegister rm) {
6120  os().SetCurrentInstruction(kVrev64, kFpNeon);
6121  os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
6122       << rd << ", " << rm;
6123}
6124
6125void Disassembler::vrev64(Condition cond,
6126                          DataType dt,
6127                          QRegister rd,
6128                          QRegister rm) {
6129  os().SetCurrentInstruction(kVrev64, kFpNeon);
6130  os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
6131       << rd << ", " << rm;
6132}
6133
6134void Disassembler::vrhadd(
6135    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6136  os().SetCurrentInstruction(kVrhadd, kFpNeon);
6137  os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
6138  os() << " ";
6139  if (!rd.Is(rn) || !use_short_hand_form_) {
6140    os() << rd << ", ";
6141  }
6142  os() << rn << ", " << rm;
6143}
6144
6145void Disassembler::vrhadd(
6146    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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
6156void Disassembler::vrinta(DataType dt1,
6157                          DataType dt2,
6158                          DRegister rd,
6159                          DRegister rm) {
6160  os().SetCurrentInstruction(kVrinta, kFpNeon);
6161  os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
6162}
6163
6164void Disassembler::vrinta(DataType dt1,
6165                          DataType dt2,
6166                          QRegister rd,
6167                          QRegister rm) {
6168  os().SetCurrentInstruction(kVrinta, kFpNeon);
6169  os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
6170}
6171
6172void Disassembler::vrinta(DataType dt1,
6173                          DataType dt2,
6174                          SRegister rd,
6175                          SRegister rm) {
6176  os().SetCurrentInstruction(kVrinta, kFpNeon);
6177  os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
6178}
6179
6180void Disassembler::vrintm(DataType dt1,
6181                          DataType dt2,
6182                          DRegister rd,
6183                          DRegister rm) {
6184  os().SetCurrentInstruction(kVrintm, kFpNeon);
6185  os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
6186}
6187
6188void Disassembler::vrintm(DataType dt1,
6189                          DataType dt2,
6190                          QRegister rd,
6191                          QRegister rm) {
6192  os().SetCurrentInstruction(kVrintm, kFpNeon);
6193  os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
6194}
6195
6196void Disassembler::vrintm(DataType dt1,
6197                          DataType dt2,
6198                          SRegister rd,
6199                          SRegister rm) {
6200  os().SetCurrentInstruction(kVrintm, kFpNeon);
6201  os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
6202}
6203
6204void Disassembler::vrintn(DataType dt1,
6205                          DataType dt2,
6206                          DRegister rd,
6207                          DRegister rm) {
6208  os().SetCurrentInstruction(kVrintn, kFpNeon);
6209  os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
6210}
6211
6212void Disassembler::vrintn(DataType dt1,
6213                          DataType dt2,
6214                          QRegister rd,
6215                          QRegister rm) {
6216  os().SetCurrentInstruction(kVrintn, kFpNeon);
6217  os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
6218}
6219
6220void Disassembler::vrintn(DataType dt1,
6221                          DataType dt2,
6222                          SRegister rd,
6223                          SRegister rm) {
6224  os().SetCurrentInstruction(kVrintn, kFpNeon);
6225  os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
6226}
6227
6228void Disassembler::vrintp(DataType dt1,
6229                          DataType dt2,
6230                          DRegister rd,
6231                          DRegister rm) {
6232  os().SetCurrentInstruction(kVrintp, kFpNeon);
6233  os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
6234}
6235
6236void Disassembler::vrintp(DataType dt1,
6237                          DataType dt2,
6238                          QRegister rd,
6239                          QRegister rm) {
6240  os().SetCurrentInstruction(kVrintp, kFpNeon);
6241  os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
6242}
6243
6244void Disassembler::vrintp(DataType dt1,
6245                          DataType dt2,
6246                          SRegister rd,
6247                          SRegister rm) {
6248  os().SetCurrentInstruction(kVrintp, kFpNeon);
6249  os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
6250}
6251
6252void Disassembler::vrintr(
6253    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6254  os().SetCurrentInstruction(kVrintr, kFpNeon);
6255  os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6256       << " " << rd << ", " << rm;
6257}
6258
6259void Disassembler::vrintr(
6260    Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6261  os().SetCurrentInstruction(kVrintr, kFpNeon);
6262  os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6263       << " " << rd << ", " << rm;
6264}
6265
6266void Disassembler::vrintx(
6267    Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6268  os().SetCurrentInstruction(kVrintx, kFpNeon);
6269  os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6270       << " " << rd << ", " << rm;
6271}
6272
6273void Disassembler::vrintx(DataType dt1,
6274                          DataType dt2,
6275                          QRegister rd,
6276                          QRegister rm) {
6277  os().SetCurrentInstruction(kVrintx, kFpNeon);
6278  os() << ToCString(kVrintx) << dt1 << dt2 << " " << rd << ", " << rm;
6279}
6280
6281void Disassembler::vrintx(
6282    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6283  os().SetCurrentInstruction(kVrintx, kFpNeon);
6284  os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6285       << " " << rd << ", " << rm;
6286}
6287
6288void Disassembler::vrintz(
6289    Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6290  os().SetCurrentInstruction(kVrintz, kFpNeon);
6291  os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6292       << " " << rd << ", " << rm;
6293}
6294
6295void Disassembler::vrintz(DataType dt1,
6296                          DataType dt2,
6297                          QRegister rd,
6298                          QRegister rm) {
6299  os().SetCurrentInstruction(kVrintz, kFpNeon);
6300  os() << ToCString(kVrintz) << dt1 << dt2 << " " << rd << ", " << rm;
6301}
6302
6303void Disassembler::vrintz(
6304    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6305  os().SetCurrentInstruction(kVrintz, kFpNeon);
6306  os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6307       << " " << rd << ", " << rm;
6308}
6309
6310void Disassembler::vrshl(
6311    Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
6312  os().SetCurrentInstruction(kVrshl, kFpNeon);
6313  os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
6314  os() << " ";
6315  if (!rd.Is(rm) || !use_short_hand_form_) {
6316    os() << rd << ", ";
6317  }
6318  os() << rm << ", " << rn;
6319}
6320
6321void Disassembler::vrshl(
6322    Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
6323  os().SetCurrentInstruction(kVrshl, kFpNeon);
6324  os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
6325  os() << " ";
6326  if (!rd.Is(rm) || !use_short_hand_form_) {
6327    os() << rd << ", ";
6328  }
6329  os() << rm << ", " << rn;
6330}
6331
6332void Disassembler::vrshr(Condition cond,
6333                         DataType dt,
6334                         DRegister rd,
6335                         DRegister rm,
6336                         const DOperand& operand) {
6337  os().SetCurrentInstruction(kVrshr, kFpNeon);
6338  os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
6339  os() << " ";
6340  if (!rd.Is(rm) || !use_short_hand_form_) {
6341    os() << rd << ", ";
6342  }
6343  os() << rm << ", " << operand;
6344}
6345
6346void Disassembler::vrshr(Condition cond,
6347                         DataType dt,
6348                         QRegister rd,
6349                         QRegister rm,
6350                         const QOperand& operand) {
6351  os().SetCurrentInstruction(kVrshr, kFpNeon);
6352  os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
6353  os() << " ";
6354  if (!rd.Is(rm) || !use_short_hand_form_) {
6355    os() << rd << ", ";
6356  }
6357  os() << rm << ", " << operand;
6358}
6359
6360void Disassembler::vrshrn(Condition cond,
6361                          DataType dt,
6362                          DRegister rd,
6363                          QRegister rm,
6364                          const QOperand& operand) {
6365  os().SetCurrentInstruction(kVrshrn, kFpNeon);
6366  os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6367       << rd << ", " << rm << ", " << operand;
6368}
6369
6370void Disassembler::vrsqrte(Condition cond,
6371                           DataType dt,
6372                           DRegister rd,
6373                           DRegister rm) {
6374  os().SetCurrentInstruction(kVrsqrte, kFpNeon);
6375  os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
6376       << rd << ", " << rm;
6377}
6378
6379void Disassembler::vrsqrte(Condition cond,
6380                           DataType dt,
6381                           QRegister rd,
6382                           QRegister rm) {
6383  os().SetCurrentInstruction(kVrsqrte, kFpNeon);
6384  os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
6385       << rd << ", " << rm;
6386}
6387
6388void Disassembler::vrsqrts(
6389    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6390  os().SetCurrentInstruction(kVrsqrts, kFpNeon);
6391  os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
6392  os() << " ";
6393  if (!rd.Is(rn) || !use_short_hand_form_) {
6394    os() << rd << ", ";
6395  }
6396  os() << rn << ", " << rm;
6397}
6398
6399void Disassembler::vrsqrts(
6400    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6401  os().SetCurrentInstruction(kVrsqrts, kFpNeon);
6402  os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
6403  os() << " ";
6404  if (!rd.Is(rn) || !use_short_hand_form_) {
6405    os() << rd << ", ";
6406  }
6407  os() << rn << ", " << rm;
6408}
6409
6410void Disassembler::vrsra(Condition cond,
6411                         DataType dt,
6412                         DRegister rd,
6413                         DRegister rm,
6414                         const DOperand& operand) {
6415  os().SetCurrentInstruction(kVrsra, kFpNeon);
6416  os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
6417  os() << " ";
6418  if (!rd.Is(rm) || !use_short_hand_form_) {
6419    os() << rd << ", ";
6420  }
6421  os() << rm << ", " << operand;
6422}
6423
6424void Disassembler::vrsra(Condition cond,
6425                         DataType dt,
6426                         QRegister rd,
6427                         QRegister rm,
6428                         const QOperand& operand) {
6429  os().SetCurrentInstruction(kVrsra, kFpNeon);
6430  os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
6431  os() << " ";
6432  if (!rd.Is(rm) || !use_short_hand_form_) {
6433    os() << rd << ", ";
6434  }
6435  os() << rm << ", " << operand;
6436}
6437
6438void Disassembler::vrsubhn(
6439    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6440  os().SetCurrentInstruction(kVrsubhn, kFpNeon);
6441  os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
6442       << rd << ", " << rn << ", " << rm;
6443}
6444
6445void Disassembler::vseleq(DataType dt,
6446                          DRegister rd,
6447                          DRegister rn,
6448                          DRegister rm) {
6449  os().SetCurrentInstruction(kVseleq, kFpNeon);
6450  os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
6451}
6452
6453void Disassembler::vseleq(DataType dt,
6454                          SRegister rd,
6455                          SRegister rn,
6456                          SRegister rm) {
6457  os().SetCurrentInstruction(kVseleq, kFpNeon);
6458  os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
6459}
6460
6461void Disassembler::vselge(DataType dt,
6462                          DRegister rd,
6463                          DRegister rn,
6464                          DRegister rm) {
6465  os().SetCurrentInstruction(kVselge, kFpNeon);
6466  os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
6467}
6468
6469void Disassembler::vselge(DataType dt,
6470                          SRegister rd,
6471                          SRegister rn,
6472                          SRegister rm) {
6473  os().SetCurrentInstruction(kVselge, kFpNeon);
6474  os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
6475}
6476
6477void Disassembler::vselgt(DataType dt,
6478                          DRegister rd,
6479                          DRegister rn,
6480                          DRegister rm) {
6481  os().SetCurrentInstruction(kVselgt, kFpNeon);
6482  os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
6483}
6484
6485void Disassembler::vselgt(DataType dt,
6486                          SRegister rd,
6487                          SRegister rn,
6488                          SRegister rm) {
6489  os().SetCurrentInstruction(kVselgt, kFpNeon);
6490  os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
6491}
6492
6493void Disassembler::vselvs(DataType dt,
6494                          DRegister rd,
6495                          DRegister rn,
6496                          DRegister rm) {
6497  os().SetCurrentInstruction(kVselvs, kFpNeon);
6498  os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
6499}
6500
6501void Disassembler::vselvs(DataType dt,
6502                          SRegister rd,
6503                          SRegister rn,
6504                          SRegister rm) {
6505  os().SetCurrentInstruction(kVselvs, kFpNeon);
6506  os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
6507}
6508
6509void Disassembler::vshl(Condition cond,
6510                        DataType dt,
6511                        DRegister rd,
6512                        DRegister rm,
6513                        const DOperand& operand) {
6514  os().SetCurrentInstruction(kVshl, kFpNeon);
6515  os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
6516  os() << " ";
6517  if (!rd.Is(rm) || !use_short_hand_form_) {
6518    os() << rd << ", ";
6519  }
6520  os() << rm << ", " << operand;
6521}
6522
6523void Disassembler::vshl(Condition cond,
6524                        DataType dt,
6525                        QRegister rd,
6526                        QRegister rm,
6527                        const QOperand& operand) {
6528  os().SetCurrentInstruction(kVshl, kFpNeon);
6529  os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
6530  os() << " ";
6531  if (!rd.Is(rm) || !use_short_hand_form_) {
6532    os() << rd << ", ";
6533  }
6534  os() << rm << ", " << operand;
6535}
6536
6537void Disassembler::vshll(Condition cond,
6538                         DataType dt,
6539                         QRegister rd,
6540                         DRegister rm,
6541                         const DOperand& operand) {
6542  os().SetCurrentInstruction(kVshll, kFpNeon);
6543  os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
6544       << rd << ", " << rm << ", " << operand;
6545}
6546
6547void Disassembler::vshr(Condition cond,
6548                        DataType dt,
6549                        DRegister rd,
6550                        DRegister rm,
6551                        const DOperand& operand) {
6552  os().SetCurrentInstruction(kVshr, kFpNeon);
6553  os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
6554  os() << " ";
6555  if (!rd.Is(rm) || !use_short_hand_form_) {
6556    os() << rd << ", ";
6557  }
6558  os() << rm << ", " << operand;
6559}
6560
6561void Disassembler::vshr(Condition cond,
6562                        DataType dt,
6563                        QRegister rd,
6564                        QRegister rm,
6565                        const QOperand& operand) {
6566  os().SetCurrentInstruction(kVshr, kFpNeon);
6567  os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
6568  os() << " ";
6569  if (!rd.Is(rm) || !use_short_hand_form_) {
6570    os() << rd << ", ";
6571  }
6572  os() << rm << ", " << operand;
6573}
6574
6575void Disassembler::vshrn(Condition cond,
6576                         DataType dt,
6577                         DRegister rd,
6578                         QRegister rm,
6579                         const QOperand& operand) {
6580  os().SetCurrentInstruction(kVshrn, kFpNeon);
6581  os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6582       << rd << ", " << rm << ", " << operand;
6583}
6584
6585void Disassembler::vsli(Condition cond,
6586                        DataType dt,
6587                        DRegister rd,
6588                        DRegister rm,
6589                        const DOperand& operand) {
6590  os().SetCurrentInstruction(kVsli, kFpNeon);
6591  os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
6592  os() << " ";
6593  if (!rd.Is(rm) || !use_short_hand_form_) {
6594    os() << rd << ", ";
6595  }
6596  os() << rm << ", " << operand;
6597}
6598
6599void Disassembler::vsli(Condition cond,
6600                        DataType dt,
6601                        QRegister rd,
6602                        QRegister rm,
6603                        const QOperand& operand) {
6604  os().SetCurrentInstruction(kVsli, kFpNeon);
6605  os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
6606  os() << " ";
6607  if (!rd.Is(rm) || !use_short_hand_form_) {
6608    os() << rd << ", ";
6609  }
6610  os() << rm << ", " << operand;
6611}
6612
6613void Disassembler::vsqrt(Condition cond,
6614                         DataType dt,
6615                         SRegister rd,
6616                         SRegister rm) {
6617  os().SetCurrentInstruction(kVsqrt, kFpNeon);
6618  os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
6619       << rd << ", " << rm;
6620}
6621
6622void Disassembler::vsqrt(Condition cond,
6623                         DataType dt,
6624                         DRegister rd,
6625                         DRegister rm) {
6626  os().SetCurrentInstruction(kVsqrt, kFpNeon);
6627  os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
6628       << rd << ", " << rm;
6629}
6630
6631void Disassembler::vsra(Condition cond,
6632                        DataType dt,
6633                        DRegister rd,
6634                        DRegister rm,
6635                        const DOperand& operand) {
6636  os().SetCurrentInstruction(kVsra, kFpNeon);
6637  os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
6638  os() << " ";
6639  if (!rd.Is(rm) || !use_short_hand_form_) {
6640    os() << rd << ", ";
6641  }
6642  os() << rm << ", " << operand;
6643}
6644
6645void Disassembler::vsra(Condition cond,
6646                        DataType dt,
6647                        QRegister rd,
6648                        QRegister rm,
6649                        const QOperand& operand) {
6650  os().SetCurrentInstruction(kVsra, kFpNeon);
6651  os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
6652  os() << " ";
6653  if (!rd.Is(rm) || !use_short_hand_form_) {
6654    os() << rd << ", ";
6655  }
6656  os() << rm << ", " << operand;
6657}
6658
6659void Disassembler::vsri(Condition cond,
6660                        DataType dt,
6661                        DRegister rd,
6662                        DRegister rm,
6663                        const DOperand& operand) {
6664  os().SetCurrentInstruction(kVsri, kFpNeon);
6665  os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
6666  os() << " ";
6667  if (!rd.Is(rm) || !use_short_hand_form_) {
6668    os() << rd << ", ";
6669  }
6670  os() << rm << ", " << operand;
6671}
6672
6673void Disassembler::vsri(Condition cond,
6674                        DataType dt,
6675                        QRegister rd,
6676                        QRegister rm,
6677                        const QOperand& operand) {
6678  os().SetCurrentInstruction(kVsri, kFpNeon);
6679  os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
6680  os() << " ";
6681  if (!rd.Is(rm) || !use_short_hand_form_) {
6682    os() << rd << ", ";
6683  }
6684  os() << rm << ", " << operand;
6685}
6686
6687void Disassembler::vst1(Condition cond,
6688                        DataType dt,
6689                        const NeonRegisterList& nreglist,
6690                        const AlignedMemOperand& operand) {
6691  os().SetCurrentInstruction(kVst1, kFpNeon);
6692  os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
6693       << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
6694}
6695
6696void Disassembler::vst2(Condition cond,
6697                        DataType dt,
6698                        const NeonRegisterList& nreglist,
6699                        const AlignedMemOperand& operand) {
6700  os().SetCurrentInstruction(kVst2, kFpNeon);
6701  os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
6702       << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
6703}
6704
6705void Disassembler::vst3(Condition cond,
6706                        DataType dt,
6707                        const NeonRegisterList& nreglist,
6708                        const AlignedMemOperand& operand) {
6709  os().SetCurrentInstruction(kVst3, kFpNeon);
6710  os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
6711       << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
6712}
6713
6714void Disassembler::vst3(Condition cond,
6715                        DataType dt,
6716                        const NeonRegisterList& nreglist,
6717                        const MemOperand& operand) {
6718  os().SetCurrentInstruction(kVst3, kFpNeon);
6719  os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
6720       << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
6721}
6722
6723void Disassembler::vst4(Condition cond,
6724                        DataType dt,
6725                        const NeonRegisterList& nreglist,
6726                        const AlignedMemOperand& operand) {
6727  os().SetCurrentInstruction(kVst4, kFpNeon);
6728  os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
6729       << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
6730}
6731
6732void Disassembler::vstm(Condition cond,
6733                        DataType dt,
6734                        Register rn,
6735                        WriteBack write_back,
6736                        DRegisterList dreglist) {
6737  os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
6738  os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
6739       << rn << write_back << ", " << dreglist;
6740}
6741
6742void Disassembler::vstm(Condition cond,
6743                        DataType dt,
6744                        Register rn,
6745                        WriteBack write_back,
6746                        SRegisterList sreglist) {
6747  os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
6748  os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
6749       << rn << write_back << ", " << sreglist;
6750}
6751
6752void Disassembler::vstmdb(Condition cond,
6753                          DataType dt,
6754                          Register rn,
6755                          WriteBack write_back,
6756                          DRegisterList dreglist) {
6757  os().SetCurrentInstruction(kVstmdb,
6758                             kLoadStore | kLoadStoreMultiple | kFpNeon);
6759  os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
6760       << rn << write_back << ", " << dreglist;
6761}
6762
6763void Disassembler::vstmdb(Condition cond,
6764                          DataType dt,
6765                          Register rn,
6766                          WriteBack write_back,
6767                          SRegisterList sreglist) {
6768  os().SetCurrentInstruction(kVstmdb,
6769                             kLoadStore | kLoadStoreMultiple | kFpNeon);
6770  os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
6771       << rn << write_back << ", " << sreglist;
6772}
6773
6774void Disassembler::vstmia(Condition cond,
6775                          DataType dt,
6776                          Register rn,
6777                          WriteBack write_back,
6778                          DRegisterList dreglist) {
6779  os().SetCurrentInstruction(kVstmia,
6780                             kLoadStore | kLoadStoreMultiple | kFpNeon);
6781  os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
6782       << rn << write_back << ", " << dreglist;
6783}
6784
6785void Disassembler::vstmia(Condition cond,
6786                          DataType dt,
6787                          Register rn,
6788                          WriteBack write_back,
6789                          SRegisterList sreglist) {
6790  os().SetCurrentInstruction(kVstmia,
6791                             kLoadStore | kLoadStoreMultiple | kFpNeon);
6792  os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
6793       << rn << write_back << ", " << sreglist;
6794}
6795
6796void Disassembler::vstr(Condition cond,
6797                        DataType dt,
6798                        DRegister rd,
6799                        const MemOperand& operand) {
6800  os().SetCurrentInstruction(kVstr, kFpNeon);
6801  os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
6802       << DtPrinter(dt, Untyped64) << " " << rd << ", "
6803       << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
6804}
6805
6806void Disassembler::vstr(Condition cond,
6807                        DataType dt,
6808                        SRegister rd,
6809                        const MemOperand& operand) {
6810  os().SetCurrentInstruction(kVstr, kFpNeon);
6811  os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
6812       << DtPrinter(dt, Untyped32) << " " << rd << ", "
6813       << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
6814}
6815
6816void Disassembler::vsub(
6817    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6818  os().SetCurrentInstruction(kVsub, kFpNeon);
6819  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6820  os() << " ";
6821  if (!rd.Is(rn) || !use_short_hand_form_) {
6822    os() << rd << ", ";
6823  }
6824  os() << rn << ", " << rm;
6825}
6826
6827void Disassembler::vsub(
6828    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6829  os().SetCurrentInstruction(kVsub, kFpNeon);
6830  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6831  os() << " ";
6832  if (!rd.Is(rn) || !use_short_hand_form_) {
6833    os() << rd << ", ";
6834  }
6835  os() << rn << ", " << rm;
6836}
6837
6838void Disassembler::vsub(
6839    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6840  os().SetCurrentInstruction(kVsub, kFpNeon);
6841  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6842  os() << " ";
6843  if (!rd.Is(rn) || !use_short_hand_form_) {
6844    os() << rd << ", ";
6845  }
6846  os() << rn << ", " << rm;
6847}
6848
6849void Disassembler::vsubhn(
6850    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6851  os().SetCurrentInstruction(kVsubhn, kFpNeon);
6852  os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
6853       << rd << ", " << rn << ", " << rm;
6854}
6855
6856void Disassembler::vsubl(
6857    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6858  os().SetCurrentInstruction(kVsubl, kFpNeon);
6859  os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
6860       << rd << ", " << rn << ", " << rm;
6861}
6862
6863void Disassembler::vsubw(
6864    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
6865  os().SetCurrentInstruction(kVsubw, kFpNeon);
6866  os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
6867  os() << " ";
6868  if (!rd.Is(rn) || !use_short_hand_form_) {
6869    os() << rd << ", ";
6870  }
6871  os() << rn << ", " << rm;
6872}
6873
6874void Disassembler::vswp(Condition cond,
6875                        DataType dt,
6876                        DRegister rd,
6877                        DRegister rm) {
6878  os().SetCurrentInstruction(kVswp, kFpNeon);
6879  os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
6880       << rd << ", " << rm;
6881}
6882
6883void Disassembler::vswp(Condition cond,
6884                        DataType dt,
6885                        QRegister rd,
6886                        QRegister rm) {
6887  os().SetCurrentInstruction(kVswp, kFpNeon);
6888  os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
6889       << rd << ", " << rm;
6890}
6891
6892void Disassembler::vtbl(Condition cond,
6893                        DataType dt,
6894                        DRegister rd,
6895                        const NeonRegisterList& nreglist,
6896                        DRegister rm) {
6897  os().SetCurrentInstruction(kVtbl, kFpNeon);
6898  os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
6899       << rd << ", " << nreglist << ", " << rm;
6900}
6901
6902void Disassembler::vtbx(Condition cond,
6903                        DataType dt,
6904                        DRegister rd,
6905                        const NeonRegisterList& nreglist,
6906                        DRegister rm) {
6907  os().SetCurrentInstruction(kVtbx, kFpNeon);
6908  os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
6909       << rd << ", " << nreglist << ", " << rm;
6910}
6911
6912void Disassembler::vtrn(Condition cond,
6913                        DataType dt,
6914                        DRegister rd,
6915                        DRegister rm) {
6916  os().SetCurrentInstruction(kVtrn, kFpNeon);
6917  os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
6918       << rd << ", " << rm;
6919}
6920
6921void Disassembler::vtrn(Condition cond,
6922                        DataType dt,
6923                        QRegister rd,
6924                        QRegister rm) {
6925  os().SetCurrentInstruction(kVtrn, kFpNeon);
6926  os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
6927       << rd << ", " << rm;
6928}
6929
6930void Disassembler::vtst(
6931    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6932  os().SetCurrentInstruction(kVtst, kFpNeon);
6933  os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
6934  os() << " ";
6935  if (!rd.Is(rn) || !use_short_hand_form_) {
6936    os() << rd << ", ";
6937  }
6938  os() << rn << ", " << rm;
6939}
6940
6941void Disassembler::vtst(
6942    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6943  os().SetCurrentInstruction(kVtst, kFpNeon);
6944  os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
6945  os() << " ";
6946  if (!rd.Is(rn) || !use_short_hand_form_) {
6947    os() << rd << ", ";
6948  }
6949  os() << rn << ", " << rm;
6950}
6951
6952void Disassembler::vuzp(Condition cond,
6953                        DataType dt,
6954                        DRegister rd,
6955                        DRegister rm) {
6956  os().SetCurrentInstruction(kVuzp, kFpNeon);
6957  os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
6958       << rd << ", " << rm;
6959}
6960
6961void Disassembler::vuzp(Condition cond,
6962                        DataType dt,
6963                        QRegister rd,
6964                        QRegister rm) {
6965  os().SetCurrentInstruction(kVuzp, kFpNeon);
6966  os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
6967       << rd << ", " << rm;
6968}
6969
6970void Disassembler::vzip(Condition cond,
6971                        DataType dt,
6972                        DRegister rd,
6973                        DRegister rm) {
6974  os().SetCurrentInstruction(kVzip, kFpNeon);
6975  os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
6976       << rd << ", " << rm;
6977}
6978
6979void Disassembler::vzip(Condition cond,
6980                        DataType dt,
6981                        QRegister rd,
6982                        QRegister rm) {
6983  os().SetCurrentInstruction(kVzip, kFpNeon);
6984  os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
6985       << rd << ", " << rm;
6986}
6987
6988void Disassembler::yield(Condition cond, EncodingSize size) {
6989  os().SetCurrentInstruction(kYield, kNoAttribute);
6990  os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
6991}
6992
6993int Disassembler::T32Size(uint32_t instr) {
6994  if ((instr & 0xe0000000) == 0xe0000000) {
6995    switch (instr & 0x08000000) {
6996      case 0x00000000:
6997        if ((instr & 0x10000000) == 0x10000000) return 4;
6998        return 2;
6999      case 0x08000000:
7000        return 4;
7001      default:
7002        return 2;
7003    }
7004  }
7005  return 2;
7006}
7007
7008void Disassembler::DecodeT32(uint32_t instr) {
7009  T32CodeAddressIncrementer incrementer(instr, &code_address_);
7010  ITBlockScope it_scope(&it_block_);
7011
7012  switch (instr & 0xe0000000) {
7013    case 0x00000000: {
7014      // 0x00000000
7015      switch (instr & 0x18000000) {
7016        case 0x18000000: {
7017          // 0x18000000
7018          switch (instr & 0x06000000) {
7019            case 0x00000000: {
7020              // 0x18000000
7021              unsigned rd = (instr >> 16) & 0x7;
7022              unsigned rn = (instr >> 19) & 0x7;
7023              unsigned rm = (instr >> 22) & 0x7;
7024              if (InITBlock()) {
7025                // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
7026                add(CurrentCond(),
7027                    Narrow,
7028                    Register(rd),
7029                    Register(rn),
7030                    Register(rm));
7031              } else if (OutsideITBlock()) {
7032                // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
7033                adds(Condition::None(),
7034                     Narrow,
7035                     Register(rd),
7036                     Register(rn),
7037                     Register(rm));
7038              } else {
7039                UnallocatedT32(instr);
7040              }
7041              break;
7042            }
7043            case 0x02000000: {
7044              // 0x1a000000
7045              unsigned rd = (instr >> 16) & 0x7;
7046              unsigned rn = (instr >> 19) & 0x7;
7047              unsigned rm = (instr >> 22) & 0x7;
7048              if (InITBlock()) {
7049                // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
7050                sub(CurrentCond(),
7051                    Narrow,
7052                    Register(rd),
7053                    Register(rn),
7054                    Register(rm));
7055              } else if (OutsideITBlock()) {
7056                // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
7057                subs(Condition::None(),
7058                     Narrow,
7059                     Register(rd),
7060                     Register(rn),
7061                     Register(rm));
7062              } else {
7063                UnallocatedT32(instr);
7064              }
7065              break;
7066            }
7067            case 0x04000000: {
7068              // 0x1c000000
7069              unsigned rd = (instr >> 16) & 0x7;
7070              unsigned rn = (instr >> 19) & 0x7;
7071              uint32_t imm = (instr >> 22) & 0x7;
7072              if (InITBlock()) {
7073                // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
7074                add(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
7075              } else if (OutsideITBlock()) {
7076                // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
7077                adds(Condition::None(),
7078                     Narrow,
7079                     Register(rd),
7080                     Register(rn),
7081                     imm);
7082              } else {
7083                UnallocatedT32(instr);
7084              }
7085              break;
7086            }
7087            case 0x06000000: {
7088              // 0x1e000000
7089              unsigned rd = (instr >> 16) & 0x7;
7090              unsigned rn = (instr >> 19) & 0x7;
7091              uint32_t imm = (instr >> 22) & 0x7;
7092              if (InITBlock()) {
7093                // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
7094                sub(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
7095              } else if (OutsideITBlock()) {
7096                // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
7097                subs(Condition::None(),
7098                     Narrow,
7099                     Register(rd),
7100                     Register(rn),
7101                     imm);
7102              } else {
7103                UnallocatedT32(instr);
7104              }
7105              break;
7106            }
7107          }
7108          break;
7109        }
7110        default: {
7111          if (((instr & 0x18000000) == 0x18000000)) {
7112            UnallocatedT32(instr);
7113            return;
7114          }
7115          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
7116              InITBlock()) {
7117            unsigned rd = (instr >> 16) & 0x7;
7118            unsigned rm = (instr >> 19) & 0x7;
7119            uint32_t amount = (instr >> 22) & 0x1f;
7120            if (amount == 0) amount = 32;
7121            // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7122            asr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7123            return;
7124          }
7125          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
7126              !InITBlock()) {
7127            unsigned rd = (instr >> 16) & 0x7;
7128            unsigned rm = (instr >> 19) & 0x7;
7129            uint32_t amount = (instr >> 22) & 0x1f;
7130            if (amount == 0) amount = 32;
7131            // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7132            asrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7133            return;
7134          }
7135          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
7136              ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
7137            unsigned rd = (instr >> 16) & 0x7;
7138            unsigned rm = (instr >> 19) & 0x7;
7139            uint32_t amount = (instr >> 22) & 0x1f;
7140            // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7141            lsl(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7142            return;
7143          }
7144          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
7145              ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
7146            unsigned rd = (instr >> 16) & 0x7;
7147            unsigned rm = (instr >> 19) & 0x7;
7148            uint32_t amount = (instr >> 22) & 0x1f;
7149            // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7150            lsls(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7151            return;
7152          }
7153          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
7154              InITBlock()) {
7155            unsigned rd = (instr >> 16) & 0x7;
7156            unsigned rm = (instr >> 19) & 0x7;
7157            uint32_t amount = (instr >> 22) & 0x1f;
7158            if (amount == 0) amount = 32;
7159            // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7160            lsr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7161            return;
7162          }
7163          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
7164              !InITBlock()) {
7165            unsigned rd = (instr >> 16) & 0x7;
7166            unsigned rm = (instr >> 19) & 0x7;
7167            uint32_t amount = (instr >> 22) & 0x1f;
7168            if (amount == 0) amount = 32;
7169            // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7170            lsrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7171            return;
7172          }
7173          unsigned rd = (instr >> 16) & 0x7;
7174          unsigned rm = (instr >> 19) & 0x7;
7175          ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
7176                                              (instr >> 22) & 0x1f);
7177          if (InITBlock()) {
7178            // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
7179            mov(CurrentCond(),
7180                Narrow,
7181                Register(rd),
7182                Operand(Register(rm),
7183                        shift_operand.GetType(),
7184                        shift_operand.GetAmount()));
7185          } else if (OutsideITBlock()) {
7186            // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
7187            movs(Condition::None(),
7188                 Narrow,
7189                 Register(rd),
7190                 Operand(Register(rm),
7191                         shift_operand.GetType(),
7192                         shift_operand.GetAmount()));
7193          } else {
7194            UnallocatedT32(instr);
7195          }
7196          break;
7197        }
7198      }
7199      break;
7200    }
7201    case 0x20000000: {
7202      // 0x20000000
7203      switch (instr & 0x18000000) {
7204        case 0x00000000: {
7205          // 0x20000000
7206          unsigned rd = (instr >> 24) & 0x7;
7207          uint32_t imm = (instr >> 16) & 0xff;
7208          if (InITBlock()) {
7209            // MOV<c>{<q>} <Rd>, #<imm8> ; T1
7210            mov(CurrentCond(), Narrow, Register(rd), imm);
7211          } else if (OutsideITBlock()) {
7212            // MOVS{<q>} <Rd>, #<imm8> ; T1
7213            movs(Condition::None(), Narrow, Register(rd), imm);
7214          } else {
7215            UnallocatedT32(instr);
7216          }
7217          break;
7218        }
7219        case 0x08000000: {
7220          // 0x28000000
7221          unsigned rn = (instr >> 24) & 0x7;
7222          uint32_t imm = (instr >> 16) & 0xff;
7223          // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
7224          cmp(CurrentCond(), Narrow, Register(rn), imm);
7225          break;
7226        }
7227        case 0x10000000: {
7228          // 0x30000000
7229          unsigned rd = (instr >> 24) & 0x7;
7230          uint32_t imm = (instr >> 16) & 0xff;
7231          if (InITBlock() && ((imm <= 7))) {
7232            // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
7233            add(CurrentCond(), Register(rd), imm);
7234          } else if (InITBlock() && ((imm > 7))) {
7235            // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7236            add(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
7237          } else if (OutsideITBlock() && ((imm <= 7))) {
7238            // ADDS{<q>} <Rdn>, #<imm8> ; T2
7239            adds(Register(rd), imm);
7240          } else if (OutsideITBlock() && ((imm > 7))) {
7241            // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7242            adds(Condition::None(), Narrow, Register(rd), Register(rd), imm);
7243          } else {
7244            UnallocatedT32(instr);
7245          }
7246          break;
7247        }
7248        case 0x18000000: {
7249          // 0x38000000
7250          unsigned rd = (instr >> 24) & 0x7;
7251          uint32_t imm = (instr >> 16) & 0xff;
7252          if (InITBlock() && ((imm <= 7))) {
7253            // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
7254            sub(CurrentCond(), Register(rd), imm);
7255          } else if (InITBlock() && ((imm > 7))) {
7256            // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7257            sub(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
7258          } else if (OutsideITBlock() && ((imm <= 7))) {
7259            // SUBS{<q>} <Rdn>, #<imm8> ; T2
7260            subs(Register(rd), imm);
7261          } else if (OutsideITBlock() && ((imm > 7))) {
7262            // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7263            subs(Condition::None(), Narrow, Register(rd), Register(rd), imm);
7264          } else {
7265            UnallocatedT32(instr);
7266          }
7267          break;
7268        }
7269      }
7270      break;
7271    }
7272    case 0x40000000: {
7273      // 0x40000000
7274      switch (instr & 0x18000000) {
7275        case 0x00000000: {
7276          // 0x40000000
7277          switch (instr & 0x07000000) {
7278            case 0x00000000: {
7279              // 0x40000000
7280              switch (instr & 0x00c00000) {
7281                case 0x00000000: {
7282                  // 0x40000000
7283                  unsigned rd = (instr >> 16) & 0x7;
7284                  unsigned rm = (instr >> 19) & 0x7;
7285                  if (InITBlock()) {
7286                    // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7287                    and_(CurrentCond(),
7288                         Narrow,
7289                         Register(rd),
7290                         Register(rd),
7291                         Register(rm));
7292                  } else if (OutsideITBlock()) {
7293                    // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7294                    ands(Condition::None(),
7295                         Narrow,
7296                         Register(rd),
7297                         Register(rd),
7298                         Register(rm));
7299                  } else {
7300                    UnallocatedT32(instr);
7301                  }
7302                  break;
7303                }
7304                case 0x00400000: {
7305                  // 0x40400000
7306                  unsigned rd = (instr >> 16) & 0x7;
7307                  unsigned rm = (instr >> 19) & 0x7;
7308                  if (InITBlock()) {
7309                    // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7310                    eor(CurrentCond(),
7311                        Narrow,
7312                        Register(rd),
7313                        Register(rd),
7314                        Register(rm));
7315                  } else if (OutsideITBlock()) {
7316                    // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7317                    eors(Condition::None(),
7318                         Narrow,
7319                         Register(rd),
7320                         Register(rd),
7321                         Register(rm));
7322                  } else {
7323                    UnallocatedT32(instr);
7324                  }
7325                  break;
7326                }
7327                case 0x00800000: {
7328                  // 0x40800000
7329                  if (InITBlock()) {
7330                    unsigned rd = (instr >> 16) & 0x7;
7331                    unsigned rs = (instr >> 19) & 0x7;
7332                    // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7333                    lsl(CurrentCond(),
7334                        Narrow,
7335                        Register(rd),
7336                        Register(rd),
7337                        Register(rs));
7338                    return;
7339                  }
7340                  if (!InITBlock()) {
7341                    unsigned rd = (instr >> 16) & 0x7;
7342                    unsigned rs = (instr >> 19) & 0x7;
7343                    // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7344                    lsls(Condition::None(),
7345                         Narrow,
7346                         Register(rd),
7347                         Register(rd),
7348                         Register(rs));
7349                    return;
7350                  }
7351                  unsigned rd = (instr >> 16) & 0x7;
7352                  unsigned rm = (instr >> 16) & 0x7;
7353                  unsigned rs = (instr >> 19) & 0x7;
7354                  if (InITBlock()) {
7355                    // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
7356                    mov(CurrentCond(),
7357                        Narrow,
7358                        Register(rd),
7359                        Operand(Register(rm), LSL, Register(rs)));
7360                  } else if (OutsideITBlock()) {
7361                    // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
7362                    movs(Condition::None(),
7363                         Narrow,
7364                         Register(rd),
7365                         Operand(Register(rm), LSL, Register(rs)));
7366                  } else {
7367                    UnallocatedT32(instr);
7368                  }
7369                  break;
7370                }
7371                case 0x00c00000: {
7372                  // 0x40c00000
7373                  if (InITBlock()) {
7374                    unsigned rd = (instr >> 16) & 0x7;
7375                    unsigned rs = (instr >> 19) & 0x7;
7376                    // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7377                    lsr(CurrentCond(),
7378                        Narrow,
7379                        Register(rd),
7380                        Register(rd),
7381                        Register(rs));
7382                    return;
7383                  }
7384                  if (!InITBlock()) {
7385                    unsigned rd = (instr >> 16) & 0x7;
7386                    unsigned rs = (instr >> 19) & 0x7;
7387                    // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7388                    lsrs(Condition::None(),
7389                         Narrow,
7390                         Register(rd),
7391                         Register(rd),
7392                         Register(rs));
7393                    return;
7394                  }
7395                  unsigned rd = (instr >> 16) & 0x7;
7396                  unsigned rm = (instr >> 16) & 0x7;
7397                  unsigned rs = (instr >> 19) & 0x7;
7398                  if (InITBlock()) {
7399                    // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
7400                    mov(CurrentCond(),
7401                        Narrow,
7402                        Register(rd),
7403                        Operand(Register(rm), LSR, Register(rs)));
7404                  } else if (OutsideITBlock()) {
7405                    // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
7406                    movs(Condition::None(),
7407                         Narrow,
7408                         Register(rd),
7409                         Operand(Register(rm), LSR, Register(rs)));
7410                  } else {
7411                    UnallocatedT32(instr);
7412                  }
7413                  break;
7414                }
7415              }
7416              break;
7417            }
7418            case 0x01000000: {
7419              // 0x41000000
7420              switch (instr & 0x00c00000) {
7421                case 0x00000000: {
7422                  // 0x41000000
7423                  if (InITBlock()) {
7424                    unsigned rd = (instr >> 16) & 0x7;
7425                    unsigned rs = (instr >> 19) & 0x7;
7426                    // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7427                    asr(CurrentCond(),
7428                        Narrow,
7429                        Register(rd),
7430                        Register(rd),
7431                        Register(rs));
7432                    return;
7433                  }
7434                  if (!InITBlock()) {
7435                    unsigned rd = (instr >> 16) & 0x7;
7436                    unsigned rs = (instr >> 19) & 0x7;
7437                    // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7438                    asrs(Condition::None(),
7439                         Narrow,
7440                         Register(rd),
7441                         Register(rd),
7442                         Register(rs));
7443                    return;
7444                  }
7445                  unsigned rd = (instr >> 16) & 0x7;
7446                  unsigned rm = (instr >> 16) & 0x7;
7447                  unsigned rs = (instr >> 19) & 0x7;
7448                  if (InITBlock()) {
7449                    // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
7450                    mov(CurrentCond(),
7451                        Narrow,
7452                        Register(rd),
7453                        Operand(Register(rm), ASR, Register(rs)));
7454                  } else if (OutsideITBlock()) {
7455                    // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
7456                    movs(Condition::None(),
7457                         Narrow,
7458                         Register(rd),
7459                         Operand(Register(rm), ASR, Register(rs)));
7460                  } else {
7461                    UnallocatedT32(instr);
7462                  }
7463                  break;
7464                }
7465                case 0x00400000: {
7466                  // 0x41400000
7467                  unsigned rd = (instr >> 16) & 0x7;
7468                  unsigned rm = (instr >> 19) & 0x7;
7469                  if (InITBlock()) {
7470                    // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7471                    adc(CurrentCond(),
7472                        Narrow,
7473                        Register(rd),
7474                        Register(rd),
7475                        Register(rm));
7476                  } else if (OutsideITBlock()) {
7477                    // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7478                    adcs(Condition::None(),
7479                         Narrow,
7480                         Register(rd),
7481                         Register(rd),
7482                         Register(rm));
7483                  } else {
7484                    UnallocatedT32(instr);
7485                  }
7486                  break;
7487                }
7488                case 0x00800000: {
7489                  // 0x41800000
7490                  unsigned rd = (instr >> 16) & 0x7;
7491                  unsigned rm = (instr >> 19) & 0x7;
7492                  if (InITBlock()) {
7493                    // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7494                    sbc(CurrentCond(),
7495                        Narrow,
7496                        Register(rd),
7497                        Register(rd),
7498                        Register(rm));
7499                  } else if (OutsideITBlock()) {
7500                    // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7501                    sbcs(Condition::None(),
7502                         Narrow,
7503                         Register(rd),
7504                         Register(rd),
7505                         Register(rm));
7506                  } else {
7507                    UnallocatedT32(instr);
7508                  }
7509                  break;
7510                }
7511                case 0x00c00000: {
7512                  // 0x41c00000
7513                  if (InITBlock()) {
7514                    unsigned rd = (instr >> 16) & 0x7;
7515                    unsigned rs = (instr >> 19) & 0x7;
7516                    // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7517                    ror(CurrentCond(),
7518                        Narrow,
7519                        Register(rd),
7520                        Register(rd),
7521                        Register(rs));
7522                    return;
7523                  }
7524                  if (!InITBlock()) {
7525                    unsigned rd = (instr >> 16) & 0x7;
7526                    unsigned rs = (instr >> 19) & 0x7;
7527                    // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7528                    rors(Condition::None(),
7529                         Narrow,
7530                         Register(rd),
7531                         Register(rd),
7532                         Register(rs));
7533                    return;
7534                  }
7535                  unsigned rd = (instr >> 16) & 0x7;
7536                  unsigned rm = (instr >> 16) & 0x7;
7537                  unsigned rs = (instr >> 19) & 0x7;
7538                  if (InITBlock()) {
7539                    // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
7540                    mov(CurrentCond(),
7541                        Narrow,
7542                        Register(rd),
7543                        Operand(Register(rm), ROR, Register(rs)));
7544                  } else if (OutsideITBlock()) {
7545                    // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
7546                    movs(Condition::None(),
7547                         Narrow,
7548                         Register(rd),
7549                         Operand(Register(rm), ROR, Register(rs)));
7550                  } else {
7551                    UnallocatedT32(instr);
7552                  }
7553                  break;
7554                }
7555              }
7556              break;
7557            }
7558            case 0x02000000: {
7559              // 0x42000000
7560              switch (instr & 0x00c00000) {
7561                case 0x00000000: {
7562                  // 0x42000000
7563                  unsigned rn = (instr >> 16) & 0x7;
7564                  unsigned rm = (instr >> 19) & 0x7;
7565                  // TST{<c>}{<q>} <Rn>, <Rm> ; T1
7566                  tst(CurrentCond(), Narrow, Register(rn), Register(rm));
7567                  break;
7568                }
7569                case 0x00400000: {
7570                  // 0x42400000
7571                  unsigned rd = (instr >> 16) & 0x7;
7572                  unsigned rn = (instr >> 19) & 0x7;
7573                  if (InITBlock()) {
7574                    // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
7575                    rsb(CurrentCond(),
7576                        Narrow,
7577                        Register(rd),
7578                        Register(rn),
7579                        UINT32_C(0));
7580                  } else if (OutsideITBlock()) {
7581                    // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
7582                    rsbs(Condition::None(),
7583                         Narrow,
7584                         Register(rd),
7585                         Register(rn),
7586                         UINT32_C(0));
7587                  } else {
7588                    UnallocatedT32(instr);
7589                  }
7590                  break;
7591                }
7592                case 0x00800000: {
7593                  // 0x42800000
7594                  unsigned rn = (instr >> 16) & 0x7;
7595                  unsigned rm = (instr >> 19) & 0x7;
7596                  // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
7597                  cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
7598                  break;
7599                }
7600                case 0x00c00000: {
7601                  // 0x42c00000
7602                  unsigned rn = (instr >> 16) & 0x7;
7603                  unsigned rm = (instr >> 19) & 0x7;
7604                  // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
7605                  cmn(CurrentCond(), Narrow, Register(rn), Register(rm));
7606                  break;
7607                }
7608              }
7609              break;
7610            }
7611            case 0x03000000: {
7612              // 0x43000000
7613              switch (instr & 0x00c00000) {
7614                case 0x00000000: {
7615                  // 0x43000000
7616                  unsigned rd = (instr >> 16) & 0x7;
7617                  unsigned rm = (instr >> 19) & 0x7;
7618                  if (InITBlock()) {
7619                    // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7620                    orr(CurrentCond(),
7621                        Narrow,
7622                        Register(rd),
7623                        Register(rd),
7624                        Register(rm));
7625                  } else if (OutsideITBlock()) {
7626                    // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7627                    orrs(Condition::None(),
7628                         Narrow,
7629                         Register(rd),
7630                         Register(rd),
7631                         Register(rm));
7632                  } else {
7633                    UnallocatedT32(instr);
7634                  }
7635                  break;
7636                }
7637                case 0x00400000: {
7638                  // 0x43400000
7639                  unsigned rd = (instr >> 16) & 0x7;
7640                  unsigned rn = (instr >> 19) & 0x7;
7641                  if (InITBlock()) {
7642                    // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
7643                    mul(CurrentCond(),
7644                        Narrow,
7645                        Register(rd),
7646                        Register(rn),
7647                        Register(rd));
7648                  } else if (OutsideITBlock()) {
7649                    // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
7650                    muls(Condition::None(),
7651                         Register(rd),
7652                         Register(rn),
7653                         Register(rd));
7654                  } else {
7655                    UnallocatedT32(instr);
7656                  }
7657                  break;
7658                }
7659                case 0x00800000: {
7660                  // 0x43800000
7661                  unsigned rd = (instr >> 16) & 0x7;
7662                  unsigned rm = (instr >> 19) & 0x7;
7663                  if (InITBlock()) {
7664                    // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7665                    bic(CurrentCond(),
7666                        Narrow,
7667                        Register(rd),
7668                        Register(rd),
7669                        Register(rm));
7670                  } else if (OutsideITBlock()) {
7671                    // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7672                    bics(Condition::None(),
7673                         Narrow,
7674                         Register(rd),
7675                         Register(rd),
7676                         Register(rm));
7677                  } else {
7678                    UnallocatedT32(instr);
7679                  }
7680                  break;
7681                }
7682                case 0x00c00000: {
7683                  // 0x43c00000
7684                  unsigned rd = (instr >> 16) & 0x7;
7685                  unsigned rm = (instr >> 19) & 0x7;
7686                  if (InITBlock()) {
7687                    // MVN<c>{<q>} <Rd>, <Rm> ; T1
7688                    mvn(CurrentCond(), Narrow, Register(rd), Register(rm));
7689                  } else if (OutsideITBlock()) {
7690                    // MVNS{<q>} <Rd>, <Rm> ; T1
7691                    mvns(Condition::None(), Narrow, Register(rd), Register(rm));
7692                  } else {
7693                    UnallocatedT32(instr);
7694                  }
7695                  break;
7696                }
7697              }
7698              break;
7699            }
7700            case 0x04000000: {
7701              // 0x44000000
7702              switch (instr & 0x00780000) {
7703                case 0x00680000: {
7704                  // 0x44680000
7705                  unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7706                  // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
7707                  add(CurrentCond(), Narrow, Register(rd), sp, Register(rd));
7708                  break;
7709                }
7710                default: {
7711                  switch (instr & 0x00870000) {
7712                    case 0x00850000: {
7713                      // 0x44850000
7714                      if (((instr & 0x780000) == 0x680000)) {
7715                        UnallocatedT32(instr);
7716                        return;
7717                      }
7718                      unsigned rm = (instr >> 19) & 0xf;
7719                      // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
7720                      add(CurrentCond(), Narrow, sp, sp, Register(rm));
7721                      break;
7722                    }
7723                    default: {
7724                      if (((instr & 0x780000) == 0x680000) ||
7725                          ((instr & 0x870000) == 0x850000)) {
7726                        UnallocatedT32(instr);
7727                        return;
7728                      }
7729                      unsigned rd =
7730                          ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7731                      unsigned rm = (instr >> 19) & 0xf;
7732                      if (InITBlock()) {
7733                        // ADD<c>{<q>} <Rdn>, <Rm> ; T2
7734                        add(CurrentCond(), Register(rd), Register(rm));
7735                      } else {
7736                        // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
7737                        add(CurrentCond(),
7738                            Narrow,
7739                            Register(rd),
7740                            Register(rd),
7741                            Register(rm));
7742                      }
7743                      break;
7744                    }
7745                  }
7746                  break;
7747                }
7748              }
7749              break;
7750            }
7751            case 0x05000000: {
7752              // 0x45000000
7753              unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7754              unsigned rm = (instr >> 19) & 0xf;
7755              // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
7756              cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
7757              break;
7758            }
7759            case 0x06000000: {
7760              // 0x46000000
7761              unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7762              unsigned rm = (instr >> 19) & 0xf;
7763              // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
7764              mov(CurrentCond(), Narrow, Register(rd), Register(rm));
7765              break;
7766            }
7767            case 0x07000000: {
7768              // 0x47000000
7769              switch (instr & 0x00800000) {
7770                case 0x00000000: {
7771                  // 0x47000000
7772                  unsigned rm = (instr >> 19) & 0xf;
7773                  // BX{<c>}{<q>} <Rm> ; T1
7774                  bx(CurrentCond(), Register(rm));
7775                  if (((instr & 0xff870000) != 0x47000000)) {
7776                    UnpredictableT32(instr);
7777                  }
7778                  break;
7779                }
7780                case 0x00800000: {
7781                  // 0x47800000
7782                  unsigned rm = (instr >> 19) & 0xf;
7783                  // BLX{<c>}{<q>} <Rm> ; T1
7784                  blx(CurrentCond(), Register(rm));
7785                  if (((instr & 0xff870000) != 0x47800000)) {
7786                    UnpredictableT32(instr);
7787                  }
7788                  break;
7789                }
7790              }
7791              break;
7792            }
7793          }
7794          break;
7795        }
7796        case 0x08000000: {
7797          // 0x48000000
7798          unsigned rt = (instr >> 24) & 0x7;
7799          int32_t imm = ((instr >> 16) & 0xff) << 2;
7800          Location location(imm, kT32PcDelta);
7801          // LDR{<c>}{<q>} <Rt>, <label> ; T1
7802          ldr(CurrentCond(), Narrow, Register(rt), &location);
7803          break;
7804        }
7805        case 0x10000000: {
7806          // 0x50000000
7807          switch (instr & 0x06000000) {
7808            case 0x00000000: {
7809              // 0x50000000
7810              unsigned rt = (instr >> 16) & 0x7;
7811              unsigned rn = (instr >> 19) & 0x7;
7812              Sign sign(plus);
7813              unsigned rm = (instr >> 22) & 0x7;
7814              AddrMode addrmode = Offset;
7815              // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7816              str(CurrentCond(),
7817                  Narrow,
7818                  Register(rt),
7819                  MemOperand(Register(rn), sign, Register(rm), addrmode));
7820              break;
7821            }
7822            case 0x02000000: {
7823              // 0x52000000
7824              unsigned rt = (instr >> 16) & 0x7;
7825              unsigned rn = (instr >> 19) & 0x7;
7826              Sign sign(plus);
7827              unsigned rm = (instr >> 22) & 0x7;
7828              AddrMode addrmode = Offset;
7829              // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7830              strh(CurrentCond(),
7831                   Narrow,
7832                   Register(rt),
7833                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7834              break;
7835            }
7836            case 0x04000000: {
7837              // 0x54000000
7838              unsigned rt = (instr >> 16) & 0x7;
7839              unsigned rn = (instr >> 19) & 0x7;
7840              Sign sign(plus);
7841              unsigned rm = (instr >> 22) & 0x7;
7842              AddrMode addrmode = Offset;
7843              // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7844              strb(CurrentCond(),
7845                   Narrow,
7846                   Register(rt),
7847                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7848              break;
7849            }
7850            case 0x06000000: {
7851              // 0x56000000
7852              unsigned rt = (instr >> 16) & 0x7;
7853              unsigned rn = (instr >> 19) & 0x7;
7854              Sign sign(plus);
7855              unsigned rm = (instr >> 22) & 0x7;
7856              AddrMode addrmode = Offset;
7857              // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7858              ldrsb(CurrentCond(),
7859                    Narrow,
7860                    Register(rt),
7861                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7862              break;
7863            }
7864          }
7865          break;
7866        }
7867        case 0x18000000: {
7868          // 0x58000000
7869          switch (instr & 0x06000000) {
7870            case 0x00000000: {
7871              // 0x58000000
7872              unsigned rt = (instr >> 16) & 0x7;
7873              unsigned rn = (instr >> 19) & 0x7;
7874              Sign sign(plus);
7875              unsigned rm = (instr >> 22) & 0x7;
7876              AddrMode addrmode = Offset;
7877              // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7878              ldr(CurrentCond(),
7879                  Narrow,
7880                  Register(rt),
7881                  MemOperand(Register(rn), sign, Register(rm), addrmode));
7882              break;
7883            }
7884            case 0x02000000: {
7885              // 0x5a000000
7886              unsigned rt = (instr >> 16) & 0x7;
7887              unsigned rn = (instr >> 19) & 0x7;
7888              Sign sign(plus);
7889              unsigned rm = (instr >> 22) & 0x7;
7890              AddrMode addrmode = Offset;
7891              // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7892              ldrh(CurrentCond(),
7893                   Narrow,
7894                   Register(rt),
7895                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7896              break;
7897            }
7898            case 0x04000000: {
7899              // 0x5c000000
7900              unsigned rt = (instr >> 16) & 0x7;
7901              unsigned rn = (instr >> 19) & 0x7;
7902              Sign sign(plus);
7903              unsigned rm = (instr >> 22) & 0x7;
7904              AddrMode addrmode = Offset;
7905              // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7906              ldrb(CurrentCond(),
7907                   Narrow,
7908                   Register(rt),
7909                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7910              break;
7911            }
7912            case 0x06000000: {
7913              // 0x5e000000
7914              unsigned rt = (instr >> 16) & 0x7;
7915              unsigned rn = (instr >> 19) & 0x7;
7916              Sign sign(plus);
7917              unsigned rm = (instr >> 22) & 0x7;
7918              AddrMode addrmode = Offset;
7919              // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7920              ldrsh(CurrentCond(),
7921                    Narrow,
7922                    Register(rt),
7923                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7924              break;
7925            }
7926          }
7927          break;
7928        }
7929      }
7930      break;
7931    }
7932    case 0x60000000: {
7933      // 0x60000000
7934      switch (instr & 0x18000000) {
7935        case 0x00000000: {
7936          // 0x60000000
7937          unsigned rt = (instr >> 16) & 0x7;
7938          unsigned rn = (instr >> 19) & 0x7;
7939          int32_t offset = ((instr >> 22) & 0x1f) << 2;
7940          // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7941          str(CurrentCond(),
7942              Narrow,
7943              Register(rt),
7944              MemOperand(Register(rn), plus, offset, Offset));
7945          break;
7946        }
7947        case 0x08000000: {
7948          // 0x68000000
7949          unsigned rt = (instr >> 16) & 0x7;
7950          unsigned rn = (instr >> 19) & 0x7;
7951          int32_t offset = ((instr >> 22) & 0x1f) << 2;
7952          // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7953          ldr(CurrentCond(),
7954              Narrow,
7955              Register(rt),
7956              MemOperand(Register(rn), plus, offset, Offset));
7957          break;
7958        }
7959        case 0x10000000: {
7960          // 0x70000000
7961          unsigned rt = (instr >> 16) & 0x7;
7962          unsigned rn = (instr >> 19) & 0x7;
7963          int32_t offset = (instr >> 22) & 0x1f;
7964          // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7965          strb(CurrentCond(),
7966               Narrow,
7967               Register(rt),
7968               MemOperand(Register(rn), plus, offset, Offset));
7969          break;
7970        }
7971        case 0x18000000: {
7972          // 0x78000000
7973          unsigned rt = (instr >> 16) & 0x7;
7974          unsigned rn = (instr >> 19) & 0x7;
7975          int32_t offset = (instr >> 22) & 0x1f;
7976          // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7977          ldrb(CurrentCond(),
7978               Narrow,
7979               Register(rt),
7980               MemOperand(Register(rn), plus, offset, Offset));
7981          break;
7982        }
7983      }
7984      break;
7985    }
7986    case 0x80000000: {
7987      // 0x80000000
7988      switch (instr & 0x18000000) {
7989        case 0x00000000: {
7990          // 0x80000000
7991          unsigned rt = (instr >> 16) & 0x7;
7992          unsigned rn = (instr >> 19) & 0x7;
7993          int32_t offset = ((instr >> 22) & 0x1f) << 1;
7994          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7995          strh(CurrentCond(),
7996               Narrow,
7997               Register(rt),
7998               MemOperand(Register(rn), plus, offset, Offset));
7999          break;
8000        }
8001        case 0x08000000: {
8002          // 0x88000000
8003          unsigned rt = (instr >> 16) & 0x7;
8004          unsigned rn = (instr >> 19) & 0x7;
8005          int32_t offset = ((instr >> 22) & 0x1f) << 1;
8006          // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
8007          ldrh(CurrentCond(),
8008               Narrow,
8009               Register(rt),
8010               MemOperand(Register(rn), plus, offset, Offset));
8011          break;
8012        }
8013        case 0x10000000: {
8014          // 0x90000000
8015          unsigned rt = (instr >> 24) & 0x7;
8016          int32_t offset = ((instr >> 16) & 0xff) << 2;
8017          // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
8018          str(CurrentCond(),
8019              Narrow,
8020              Register(rt),
8021              MemOperand(sp, plus, offset, Offset));
8022          break;
8023        }
8024        case 0x18000000: {
8025          // 0x98000000
8026          unsigned rt = (instr >> 24) & 0x7;
8027          int32_t offset = ((instr >> 16) & 0xff) << 2;
8028          // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
8029          ldr(CurrentCond(),
8030              Narrow,
8031              Register(rt),
8032              MemOperand(sp, plus, offset, Offset));
8033          break;
8034        }
8035      }
8036      break;
8037    }
8038    case 0xa0000000: {
8039      // 0xa0000000
8040      switch (instr & 0x18000000) {
8041        case 0x00000000: {
8042          // 0xa0000000
8043          unsigned rd = (instr >> 24) & 0x7;
8044          int32_t imm = ((instr >> 16) & 0xff) << 2;
8045          Location location(imm, kT32PcDelta);
8046          // ADR{<c>}{<q>} <Rd>, <label> ; T1
8047          adr(CurrentCond(), Narrow, Register(rd), &location);
8048          break;
8049        }
8050        case 0x08000000: {
8051          // 0xa8000000
8052          unsigned rd = (instr >> 24) & 0x7;
8053          uint32_t imm = ((instr >> 16) & 0xff) << 2;
8054          // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
8055          add(CurrentCond(), Narrow, Register(rd), sp, imm);
8056          break;
8057        }
8058        case 0x10000000: {
8059          // 0xb0000000
8060          switch (instr & 0x04000000) {
8061            case 0x00000000: {
8062              // 0xb0000000
8063              switch (instr & 0x01000000) {
8064                case 0x00000000: {
8065                  // 0xb0000000
8066                  switch (instr & 0x02800000) {
8067                    case 0x00000000: {
8068                      // 0xb0000000
8069                      uint32_t imm = ((instr >> 16) & 0x7f) << 2;
8070                      // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
8071                      add(CurrentCond(), Narrow, sp, sp, imm);
8072                      break;
8073                    }
8074                    case 0x00800000: {
8075                      // 0xb0800000
8076                      uint32_t imm = ((instr >> 16) & 0x7f) << 2;
8077                      // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
8078                      sub(CurrentCond(), Narrow, sp, sp, imm);
8079                      break;
8080                    }
8081                    case 0x02000000: {
8082                      // 0xb2000000
8083                      switch (instr & 0x00400000) {
8084                        case 0x00000000: {
8085                          // 0xb2000000
8086                          unsigned rd = (instr >> 16) & 0x7;
8087                          unsigned rm = (instr >> 19) & 0x7;
8088                          // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
8089                          sxth(CurrentCond(),
8090                               Narrow,
8091                               Register(rd),
8092                               Register(rm));
8093                          break;
8094                        }
8095                        case 0x00400000: {
8096                          // 0xb2400000
8097                          unsigned rd = (instr >> 16) & 0x7;
8098                          unsigned rm = (instr >> 19) & 0x7;
8099                          // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
8100                          sxtb(CurrentCond(),
8101                               Narrow,
8102                               Register(rd),
8103                               Register(rm));
8104                          break;
8105                        }
8106                      }
8107                      break;
8108                    }
8109                    case 0x02800000: {
8110                      // 0xb2800000
8111                      switch (instr & 0x00400000) {
8112                        case 0x00000000: {
8113                          // 0xb2800000
8114                          unsigned rd = (instr >> 16) & 0x7;
8115                          unsigned rm = (instr >> 19) & 0x7;
8116                          // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
8117                          uxth(CurrentCond(),
8118                               Narrow,
8119                               Register(rd),
8120                               Register(rm));
8121                          break;
8122                        }
8123                        case 0x00400000: {
8124                          // 0xb2c00000
8125                          unsigned rd = (instr >> 16) & 0x7;
8126                          unsigned rm = (instr >> 19) & 0x7;
8127                          // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
8128                          uxtb(CurrentCond(),
8129                               Narrow,
8130                               Register(rd),
8131                               Register(rm));
8132                          break;
8133                        }
8134                      }
8135                      break;
8136                    }
8137                  }
8138                  break;
8139                }
8140                case 0x01000000: {
8141                  // 0xb1000000
8142                  unsigned rn = (instr >> 16) & 0x7;
8143                  int32_t imm =
8144                      (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
8145                  Location location(imm, kT32PcDelta);
8146                  // CBZ{<q>} <Rn>, <label> ; T1
8147                  cbz(Register(rn), &location);
8148                  break;
8149                }
8150              }
8151              break;
8152            }
8153            case 0x04000000: {
8154              // 0xb4000000
8155              switch (instr & 0x02000000) {
8156                case 0x00000000: {
8157                  // 0xb4000000
8158                  RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
8159                                         ((instr >> 16) & 0xff));
8160                  // PUSH{<c>}{<q>} <registers> ; T1
8161                  push(CurrentCond(), Narrow, registers);
8162                  break;
8163                }
8164                case 0x02000000: {
8165                  // 0xb6000000
8166                  switch (instr & 0x01e00000) {
8167                    case 0x00400000: {
8168                      // 0xb6400000
8169                      UnimplementedT32_16("SETEND", instr);
8170                      break;
8171                    }
8172                    case 0x00600000: {
8173                      // 0xb6600000
8174                      switch (instr & 0x00100000) {
8175                        case 0x00000000: {
8176                          // 0xb6600000
8177                          UnimplementedT32_16("CPSIE", instr);
8178                          break;
8179                        }
8180                        case 0x00100000: {
8181                          // 0xb6700000
8182                          UnimplementedT32_16("CPSID", instr);
8183                          break;
8184                        }
8185                      }
8186                      break;
8187                    }
8188                    default:
8189                      UnallocatedT32(instr);
8190                      break;
8191                  }
8192                  break;
8193                }
8194              }
8195              break;
8196            }
8197          }
8198          break;
8199        }
8200        case 0x18000000: {
8201          // 0xb8000000
8202          switch (instr & 0x04000000) {
8203            case 0x00000000: {
8204              // 0xb8000000
8205              switch (instr & 0x01000000) {
8206                case 0x00000000: {
8207                  // 0xb8000000
8208                  switch (instr & 0x02c00000) {
8209                    case 0x02000000: {
8210                      // 0xba000000
8211                      unsigned rd = (instr >> 16) & 0x7;
8212                      unsigned rm = (instr >> 19) & 0x7;
8213                      // REV{<c>}{<q>} <Rd>, <Rm> ; T1
8214                      rev(CurrentCond(), Narrow, Register(rd), Register(rm));
8215                      break;
8216                    }
8217                    case 0x02400000: {
8218                      // 0xba400000
8219                      unsigned rd = (instr >> 16) & 0x7;
8220                      unsigned rm = (instr >> 19) & 0x7;
8221                      // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
8222                      rev16(CurrentCond(), Narrow, Register(rd), Register(rm));
8223                      break;
8224                    }
8225                    case 0x02800000: {
8226                      // 0xba800000
8227                      uint32_t imm = (instr >> 16) & 0x3f;
8228                      // HLT{<q>} {#}<imm> ; T1
8229                      hlt(Condition::None(), imm);
8230                      break;
8231                    }
8232                    case 0x02c00000: {
8233                      // 0xbac00000
8234                      unsigned rd = (instr >> 16) & 0x7;
8235                      unsigned rm = (instr >> 19) & 0x7;
8236                      // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
8237                      revsh(CurrentCond(), Narrow, Register(rd), Register(rm));
8238                      break;
8239                    }
8240                    default:
8241                      UnallocatedT32(instr);
8242                      break;
8243                  }
8244                  break;
8245                }
8246                case 0x01000000: {
8247                  // 0xb9000000
8248                  unsigned rn = (instr >> 16) & 0x7;
8249                  int32_t imm =
8250                      (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
8251                  Location location(imm, kT32PcDelta);
8252                  // CBNZ{<q>} <Rn>, <label> ; T1
8253                  cbnz(Register(rn), &location);
8254                  break;
8255                }
8256              }
8257              break;
8258            }
8259            case 0x04000000: {
8260              // 0xbc000000
8261              switch (instr & 0x02000000) {
8262                case 0x00000000: {
8263                  // 0xbc000000
8264                  RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
8265                                         ((instr >> 16) & 0xff));
8266                  // POP{<c>}{<q>} <registers> ; T1
8267                  pop(CurrentCond(), Narrow, registers);
8268                  break;
8269                }
8270                case 0x02000000: {
8271                  // 0xbe000000
8272                  switch (instr & 0x01000000) {
8273                    case 0x00000000: {
8274                      // 0xbe000000
8275                      uint32_t imm = (instr >> 16) & 0xff;
8276                      // BKPT{<q>} {#}<imm> ; T1
8277                      bkpt(Condition::None(), imm);
8278                      break;
8279                    }
8280                    case 0x01000000: {
8281                      // 0xbf000000
8282                      switch (instr & 0x000f0000) {
8283                        case 0x00000000: {
8284                          // 0xbf000000
8285                          switch (instr & 0x00f00000) {
8286                            case 0x00000000: {
8287                              // 0xbf000000
8288                              // NOP{<c>}{<q>} ; T1
8289                              nop(CurrentCond(), Narrow);
8290                              break;
8291                            }
8292                            case 0x00100000: {
8293                              // 0xbf100000
8294                              // YIELD{<c>}{<q>} ; T1
8295                              yield(CurrentCond(), Narrow);
8296                              break;
8297                            }
8298                            case 0x00200000: {
8299                              // 0xbf200000
8300                              UnimplementedT32_16("WFE", instr);
8301                              break;
8302                            }
8303                            case 0x00300000: {
8304                              // 0xbf300000
8305                              UnimplementedT32_16("WFI", instr);
8306                              break;
8307                            }
8308                            case 0x00400000: {
8309                              // 0xbf400000
8310                              UnimplementedT32_16("SEV", instr);
8311                              break;
8312                            }
8313                            case 0x00500000: {
8314                              // 0xbf500000
8315                              UnimplementedT32_16("SEVL", instr);
8316                              break;
8317                            }
8318                            default:
8319                              UnallocatedT32(instr);
8320                              break;
8321                          }
8322                          break;
8323                        }
8324                        default: {
8325                          if (((instr & 0xf0000) == 0x0)) {
8326                            UnallocatedT32(instr);
8327                            return;
8328                          }
8329                          unsigned firstcond = (instr >> 20) & 0xf;
8330                          unsigned mask = (instr >> 16) & 0xf;
8331                          bool wasInITBlock = InITBlock();
8332                          SetIT(Condition(firstcond), mask);
8333                          it(Condition(firstcond), mask);
8334                          if (wasInITBlock || (firstcond == 15) ||
8335                              ((firstcond == al) &&
8336                               (BitCount(Uint32(mask)) != 1))) {
8337                            UnpredictableT32(instr);
8338                          }
8339                          break;
8340                        }
8341                      }
8342                      break;
8343                    }
8344                  }
8345                  break;
8346                }
8347              }
8348              break;
8349            }
8350          }
8351          break;
8352        }
8353      }
8354      break;
8355    }
8356    case 0xc0000000: {
8357      // 0xc0000000
8358      switch (instr & 0x10000000) {
8359        case 0x00000000: {
8360          // 0xc0000000
8361          switch (instr & 0x08000000) {
8362            case 0x00000000: {
8363              // 0xc0000000
8364              unsigned rn = (instr >> 24) & 0x7;
8365              RegisterList registers(((instr >> 16) & 0xff));
8366              // STM{<c>}{<q>} <Rn>!, <registers> ; T1
8367              stm(CurrentCond(),
8368                  Narrow,
8369                  Register(rn),
8370                  WriteBack(WRITE_BACK),
8371                  registers);
8372              break;
8373            }
8374            case 0x08000000: {
8375              // 0xc8000000
8376              unsigned rn = (instr >> 24) & 0x7;
8377              RegisterList registers(((instr >> 16) & 0xff));
8378              // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
8379              ldm(CurrentCond(),
8380                  Narrow,
8381                  Register(rn),
8382                  WriteBack(!registers.Includes(Register(rn))),
8383                  registers);
8384              break;
8385            }
8386          }
8387          break;
8388        }
8389        case 0x10000000: {
8390          // 0xd0000000
8391          switch (instr & 0x0e000000) {
8392            case 0x0e000000: {
8393              // 0xde000000
8394              switch (instr & 0x01000000) {
8395                case 0x00000000: {
8396                  // 0xde000000
8397                  uint32_t imm = (instr >> 16) & 0xff;
8398                  // UDF{<c>}{<q>} {#}<imm> ; T1
8399                  udf(CurrentCond(), Narrow, imm);
8400                  break;
8401                }
8402                case 0x01000000: {
8403                  // 0xdf000000
8404                  uint32_t imm = (instr >> 16) & 0xff;
8405                  // SVC{<c>}{<q>} {#}<imm> ; T1
8406                  svc(CurrentCond(), imm);
8407                  break;
8408                }
8409              }
8410              break;
8411            }
8412            default: {
8413              if (((instr & 0xe000000) == 0xe000000)) {
8414                UnallocatedT32(instr);
8415                return;
8416              }
8417              Condition condition((instr >> 24) & 0xf);
8418              int32_t imm = SignExtend<int32_t>((instr >> 16) & 0xff, 8) << 1;
8419              Location location(imm, kT32PcDelta);
8420              // B<c>{<q>} <label> ; T1
8421              b(condition, Narrow, &location);
8422              break;
8423            }
8424          }
8425          break;
8426        }
8427      }
8428      break;
8429    }
8430    case 0xe0000000: {
8431      // 0xe0000000
8432      switch (instr & 0x08000000) {
8433        case 0x00000000: {
8434          // 0xe0000000
8435          switch (instr & 0x10000000) {
8436            case 0x00000000: {
8437              // 0xe0000000
8438              int32_t imm = SignExtend<int32_t>((instr >> 16) & 0x7ff, 11) << 1;
8439              Location location(imm, kT32PcDelta);
8440              // B{<c>}{<q>} <label> ; T2
8441              b(CurrentCond(), Narrow, &location);
8442              break;
8443            }
8444            case 0x10000000: {
8445              // 0xf0000000
8446              switch (instr & 0x00008000) {
8447                case 0x00000000: {
8448                  // 0xf0000000
8449                  switch (instr & 0x03f00000) {
8450                    case 0x00000000: {
8451                      // 0xf0000000
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                      // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8458                      and_(CurrentCond(),
8459                           Best,
8460                           Register(rd),
8461                           Register(rn),
8462                           imm);
8463                      break;
8464                    }
8465                    case 0x00100000: {
8466                      // 0xf0100000
8467                      switch (instr & 0x00000f00) {
8468                        case 0x00000f00: {
8469                          // 0xf0100f00
8470                          unsigned rn = (instr >> 16) & 0xf;
8471                          uint32_t imm = ImmediateT32::Decode(
8472                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8473                              ((instr >> 15) & 0x800));
8474                          // TST{<c>}{<q>} <Rn>, #<const> ; T1
8475                          tst(CurrentCond(), Best, Register(rn), imm);
8476                          break;
8477                        }
8478                        default: {
8479                          if (((instr & 0xf00) == 0xf00)) {
8480                            UnallocatedT32(instr);
8481                            return;
8482                          }
8483                          unsigned rd = (instr >> 8) & 0xf;
8484                          unsigned rn = (instr >> 16) & 0xf;
8485                          uint32_t imm = ImmediateT32::Decode(
8486                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8487                              ((instr >> 15) & 0x800));
8488                          // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8489                          ands(CurrentCond(),
8490                               Best,
8491                               Register(rd),
8492                               Register(rn),
8493                               imm);
8494                          break;
8495                        }
8496                      }
8497                      break;
8498                    }
8499                    case 0x00200000: {
8500                      // 0xf0200000
8501                      unsigned rd = (instr >> 8) & 0xf;
8502                      unsigned rn = (instr >> 16) & 0xf;
8503                      uint32_t imm = ImmediateT32::Decode(
8504                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8505                          ((instr >> 15) & 0x800));
8506                      // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8507                      bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
8508                      break;
8509                    }
8510                    case 0x00300000: {
8511                      // 0xf0300000
8512                      unsigned rd = (instr >> 8) & 0xf;
8513                      unsigned rn = (instr >> 16) & 0xf;
8514                      uint32_t imm = ImmediateT32::Decode(
8515                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8516                          ((instr >> 15) & 0x800));
8517                      // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8518                      bics(CurrentCond(),
8519                           Best,
8520                           Register(rd),
8521                           Register(rn),
8522                           imm);
8523                      break;
8524                    }
8525                    case 0x00400000: {
8526                      // 0xf0400000
8527                      switch (instr & 0x000f0000) {
8528                        case 0x000f0000: {
8529                          // 0xf04f0000
8530                          unsigned rd = (instr >> 8) & 0xf;
8531                          uint32_t imm = ImmediateT32::Decode(
8532                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8533                              ((instr >> 15) & 0x800));
8534                          if (InITBlock() &&
8535                              (instr & 0x00100000) == 0x00000000 &&
8536                              ((rd < kNumberOfT32LowRegisters) &&
8537                               (imm <= 255))) {
8538                            // MOV<c>.W <Rd>, #<const> ; T2
8539                            mov(CurrentCond(), Wide, Register(rd), imm);
8540                          } else if ((instr & 0x00100000) == 0x00000000) {
8541                            // MOV{<c>}{<q>} <Rd>, #<const> ; T2
8542                            mov(CurrentCond(), Best, Register(rd), imm);
8543                          } else {
8544                            UnallocatedT32(instr);
8545                          }
8546                          break;
8547                        }
8548                        default: {
8549                          if (((instr & 0xf0000) == 0xf0000)) {
8550                            UnallocatedT32(instr);
8551                            return;
8552                          }
8553                          unsigned rd = (instr >> 8) & 0xf;
8554                          unsigned rn = (instr >> 16) & 0xf;
8555                          uint32_t imm = ImmediateT32::Decode(
8556                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8557                              ((instr >> 15) & 0x800));
8558                          // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8559                          orr(CurrentCond(),
8560                              Best,
8561                              Register(rd),
8562                              Register(rn),
8563                              imm);
8564                          break;
8565                        }
8566                      }
8567                      break;
8568                    }
8569                    case 0x00500000: {
8570                      // 0xf0500000
8571                      switch (instr & 0x000f0000) {
8572                        case 0x000f0000: {
8573                          // 0xf05f0000
8574                          unsigned rd = (instr >> 8) & 0xf;
8575                          uint32_t imm = ImmediateT32::Decode(
8576                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8577                              ((instr >> 15) & 0x800));
8578                          if (OutsideITBlock() &&
8579                              (instr & 0x00100000) == 0x00100000 &&
8580                              ((rd < kNumberOfT32LowRegisters) &&
8581                               (imm <= 255))) {
8582                            // MOVS.W <Rd>, #<const> ; T2
8583                            movs(Condition::None(), Wide, Register(rd), imm);
8584                          } else if ((instr & 0x00100000) == 0x00100000) {
8585                            // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
8586                            movs(CurrentCond(), Best, Register(rd), imm);
8587                          } else {
8588                            UnallocatedT32(instr);
8589                          }
8590                          break;
8591                        }
8592                        default: {
8593                          if (((instr & 0xf0000) == 0xf0000)) {
8594                            UnallocatedT32(instr);
8595                            return;
8596                          }
8597                          unsigned rd = (instr >> 8) & 0xf;
8598                          unsigned rn = (instr >> 16) & 0xf;
8599                          uint32_t imm = ImmediateT32::Decode(
8600                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8601                              ((instr >> 15) & 0x800));
8602                          // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8603                          orrs(CurrentCond(),
8604                               Best,
8605                               Register(rd),
8606                               Register(rn),
8607                               imm);
8608                          break;
8609                        }
8610                      }
8611                      break;
8612                    }
8613                    case 0x00600000: {
8614                      // 0xf0600000
8615                      switch (instr & 0x000f0000) {
8616                        case 0x000f0000: {
8617                          // 0xf06f0000
8618                          unsigned rd = (instr >> 8) & 0xf;
8619                          uint32_t imm = ImmediateT32::Decode(
8620                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8621                              ((instr >> 15) & 0x800));
8622                          // MVN{<c>}{<q>} <Rd>, #<const> ; T1
8623                          mvn(CurrentCond(), Best, Register(rd), imm);
8624                          break;
8625                        }
8626                        default: {
8627                          if (((instr & 0xf0000) == 0xf0000)) {
8628                            UnallocatedT32(instr);
8629                            return;
8630                          }
8631                          unsigned rd = (instr >> 8) & 0xf;
8632                          unsigned rn = (instr >> 16) & 0xf;
8633                          uint32_t imm = ImmediateT32::Decode(
8634                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8635                              ((instr >> 15) & 0x800));
8636                          // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8637                          orn(CurrentCond(), Register(rd), Register(rn), imm);
8638                          break;
8639                        }
8640                      }
8641                      break;
8642                    }
8643                    case 0x00700000: {
8644                      // 0xf0700000
8645                      switch (instr & 0x000f0000) {
8646                        case 0x000f0000: {
8647                          // 0xf07f0000
8648                          unsigned rd = (instr >> 8) & 0xf;
8649                          uint32_t imm = ImmediateT32::Decode(
8650                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8651                              ((instr >> 15) & 0x800));
8652                          // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
8653                          mvns(CurrentCond(), Best, Register(rd), imm);
8654                          break;
8655                        }
8656                        default: {
8657                          if (((instr & 0xf0000) == 0xf0000)) {
8658                            UnallocatedT32(instr);
8659                            return;
8660                          }
8661                          unsigned rd = (instr >> 8) & 0xf;
8662                          unsigned rn = (instr >> 16) & 0xf;
8663                          uint32_t imm = ImmediateT32::Decode(
8664                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8665                              ((instr >> 15) & 0x800));
8666                          // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8667                          orns(CurrentCond(), Register(rd), Register(rn), imm);
8668                          break;
8669                        }
8670                      }
8671                      break;
8672                    }
8673                    case 0x00800000: {
8674                      // 0xf0800000
8675                      unsigned rd = (instr >> 8) & 0xf;
8676                      unsigned rn = (instr >> 16) & 0xf;
8677                      uint32_t imm = ImmediateT32::Decode(
8678                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8679                          ((instr >> 15) & 0x800));
8680                      // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8681                      eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
8682                      break;
8683                    }
8684                    case 0x00900000: {
8685                      // 0xf0900000
8686                      switch (instr & 0x00000f00) {
8687                        case 0x00000f00: {
8688                          // 0xf0900f00
8689                          unsigned rn = (instr >> 16) & 0xf;
8690                          uint32_t imm = ImmediateT32::Decode(
8691                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8692                              ((instr >> 15) & 0x800));
8693                          // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
8694                          teq(CurrentCond(), Register(rn), imm);
8695                          break;
8696                        }
8697                        default: {
8698                          if (((instr & 0xf00) == 0xf00)) {
8699                            UnallocatedT32(instr);
8700                            return;
8701                          }
8702                          unsigned rd = (instr >> 8) & 0xf;
8703                          unsigned rn = (instr >> 16) & 0xf;
8704                          uint32_t imm = ImmediateT32::Decode(
8705                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8706                              ((instr >> 15) & 0x800));
8707                          // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8708                          eors(CurrentCond(),
8709                               Best,
8710                               Register(rd),
8711                               Register(rn),
8712                               imm);
8713                          break;
8714                        }
8715                      }
8716                      break;
8717                    }
8718                    case 0x01000000: {
8719                      // 0xf1000000
8720                      switch (instr & 0x000f0000) {
8721                        case 0x000d0000: {
8722                          // 0xf10d0000
8723                          unsigned rd = (instr >> 8) & 0xf;
8724                          uint32_t imm = ImmediateT32::Decode(
8725                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8726                              ((instr >> 15) & 0x800));
8727                          if ((instr & 0x00100000) == 0x00000000 &&
8728                              (((rd < kNumberOfT32LowRegisters) &&
8729                                ((imm <= 1020) && ((imm & 3) == 0))) ||
8730                               ((rd == sp.GetCode()) &&
8731                                ((imm <= 508) && ((imm & 3) == 0))))) {
8732                            // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
8733                            add(CurrentCond(), Wide, Register(rd), sp, imm);
8734                          } else if ((instr & 0x00100000) == 0x00000000) {
8735                            // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
8736                            add(CurrentCond(), Best, Register(rd), sp, imm);
8737                          } else {
8738                            UnallocatedT32(instr);
8739                          }
8740                          break;
8741                        }
8742                        default: {
8743                          if (((instr & 0xf0000) == 0xd0000)) {
8744                            UnallocatedT32(instr);
8745                            return;
8746                          }
8747                          unsigned rd = (instr >> 8) & 0xf;
8748                          unsigned rn = (instr >> 16) & 0xf;
8749                          uint32_t imm = ImmediateT32::Decode(
8750                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8751                              ((instr >> 15) & 0x800));
8752                          if (InITBlock() &&
8753                              (instr & 0x00100000) == 0x00000000 &&
8754                              (((rd < kNumberOfT32LowRegisters) &&
8755                                (rn < kNumberOfT32LowRegisters) &&
8756                                (imm <= 7)) ||
8757                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
8758                                (imm <= 255)))) {
8759                            // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
8760                            add(CurrentCond(),
8761                                Wide,
8762                                Register(rd),
8763                                Register(rn),
8764                                imm);
8765                          } else if ((instr & 0x00100000) == 0x00000000) {
8766                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8767                            add(CurrentCond(),
8768                                Best,
8769                                Register(rd),
8770                                Register(rn),
8771                                imm);
8772                          } else {
8773                            UnallocatedT32(instr);
8774                          }
8775                          break;
8776                        }
8777                      }
8778                      break;
8779                    }
8780                    case 0x01100000: {
8781                      // 0xf1100000
8782                      switch (instr & 0x00000f00) {
8783                        case 0x00000f00: {
8784                          // 0xf1100f00
8785                          unsigned rn = (instr >> 16) & 0xf;
8786                          uint32_t imm = ImmediateT32::Decode(
8787                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8788                              ((instr >> 15) & 0x800));
8789                          // CMN{<c>}{<q>} <Rn>, #<const> ; T1
8790                          cmn(CurrentCond(), Best, Register(rn), imm);
8791                          break;
8792                        }
8793                        default: {
8794                          switch (instr & 0x000f0000) {
8795                            case 0x000d0000: {
8796                              // 0xf11d0000
8797                              if (((instr & 0xf00) == 0xf00)) {
8798                                UnallocatedT32(instr);
8799                                return;
8800                              }
8801                              unsigned rd = (instr >> 8) & 0xf;
8802                              uint32_t imm = ImmediateT32::Decode(
8803                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
8804                                  ((instr >> 15) & 0x800));
8805                              // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
8806                              adds(CurrentCond(), Best, Register(rd), sp, imm);
8807                              break;
8808                            }
8809                            default: {
8810                              if (((instr & 0xf0000) == 0xd0000) ||
8811                                  ((instr & 0xf00) == 0xf00)) {
8812                                UnallocatedT32(instr);
8813                                return;
8814                              }
8815                              unsigned rd = (instr >> 8) & 0xf;
8816                              unsigned rn = (instr >> 16) & 0xf;
8817                              uint32_t imm = ImmediateT32::Decode(
8818                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
8819                                  ((instr >> 15) & 0x800));
8820                              if (OutsideITBlock() &&
8821                                  (instr & 0x00100000) == 0x00100000 &&
8822                                  (((rd < kNumberOfT32LowRegisters) &&
8823                                    (rn < kNumberOfT32LowRegisters) &&
8824                                    (imm <= 7)) ||
8825                                   ((rd == rn) &&
8826                                    (rd < kNumberOfT32LowRegisters) &&
8827                                    (imm <= 255)))) {
8828                                // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
8829                                adds(Condition::None(),
8830                                     Wide,
8831                                     Register(rd),
8832                                     Register(rn),
8833                                     imm);
8834                              } else if ((instr & 0x00100000) == 0x00100000) {
8835                                // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8836                                adds(CurrentCond(),
8837                                     Best,
8838                                     Register(rd),
8839                                     Register(rn),
8840                                     imm);
8841                              } else {
8842                                UnallocatedT32(instr);
8843                              }
8844                              break;
8845                            }
8846                          }
8847                          break;
8848                        }
8849                      }
8850                      break;
8851                    }
8852                    case 0x01400000: {
8853                      // 0xf1400000
8854                      unsigned rd = (instr >> 8) & 0xf;
8855                      unsigned rn = (instr >> 16) & 0xf;
8856                      uint32_t imm = ImmediateT32::Decode(
8857                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8858                          ((instr >> 15) & 0x800));
8859                      // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8860                      adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
8861                      break;
8862                    }
8863                    case 0x01500000: {
8864                      // 0xf1500000
8865                      unsigned rd = (instr >> 8) & 0xf;
8866                      unsigned rn = (instr >> 16) & 0xf;
8867                      uint32_t imm = ImmediateT32::Decode(
8868                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8869                          ((instr >> 15) & 0x800));
8870                      // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8871                      adcs(CurrentCond(),
8872                           Best,
8873                           Register(rd),
8874                           Register(rn),
8875                           imm);
8876                      break;
8877                    }
8878                    case 0x01600000: {
8879                      // 0xf1600000
8880                      unsigned rd = (instr >> 8) & 0xf;
8881                      unsigned rn = (instr >> 16) & 0xf;
8882                      uint32_t imm = ImmediateT32::Decode(
8883                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8884                          ((instr >> 15) & 0x800));
8885                      // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8886                      sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
8887                      break;
8888                    }
8889                    case 0x01700000: {
8890                      // 0xf1700000
8891                      unsigned rd = (instr >> 8) & 0xf;
8892                      unsigned rn = (instr >> 16) & 0xf;
8893                      uint32_t imm = ImmediateT32::Decode(
8894                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8895                          ((instr >> 15) & 0x800));
8896                      // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8897                      sbcs(CurrentCond(),
8898                           Best,
8899                           Register(rd),
8900                           Register(rn),
8901                           imm);
8902                      break;
8903                    }
8904                    case 0x01a00000: {
8905                      // 0xf1a00000
8906                      switch (instr & 0x000f0000) {
8907                        case 0x000d0000: {
8908                          // 0xf1ad0000
8909                          unsigned rd = (instr >> 8) & 0xf;
8910                          uint32_t imm = ImmediateT32::Decode(
8911                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8912                              ((instr >> 15) & 0x800));
8913                          if ((instr & 0x00100000) == 0x00000000 &&
8914                              ((rd == sp.GetCode()) &&
8915                               ((imm <= 508) && ((imm & 3) == 0)))) {
8916                            // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
8917                            sub(CurrentCond(), Wide, Register(rd), sp, imm);
8918                          } else if ((instr & 0x00100000) == 0x00000000) {
8919                            // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
8920                            sub(CurrentCond(), Best, Register(rd), sp, imm);
8921                          } else {
8922                            UnallocatedT32(instr);
8923                          }
8924                          break;
8925                        }
8926                        default: {
8927                          if (((instr & 0xf0000) == 0xd0000)) {
8928                            UnallocatedT32(instr);
8929                            return;
8930                          }
8931                          unsigned rd = (instr >> 8) & 0xf;
8932                          unsigned rn = (instr >> 16) & 0xf;
8933                          uint32_t imm = ImmediateT32::Decode(
8934                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8935                              ((instr >> 15) & 0x800));
8936                          if (InITBlock() &&
8937                              (instr & 0x00100000) == 0x00000000 &&
8938                              (((rd < kNumberOfT32LowRegisters) &&
8939                                (rn < kNumberOfT32LowRegisters) &&
8940                                (imm <= 7)) ||
8941                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
8942                                (imm <= 255)))) {
8943                            // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
8944                            sub(CurrentCond(),
8945                                Wide,
8946                                Register(rd),
8947                                Register(rn),
8948                                imm);
8949                          } else if ((instr & 0x00100000) == 0x00000000) {
8950                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8951                            sub(CurrentCond(),
8952                                Best,
8953                                Register(rd),
8954                                Register(rn),
8955                                imm);
8956                          } else {
8957                            UnallocatedT32(instr);
8958                          }
8959                          break;
8960                        }
8961                      }
8962                      break;
8963                    }
8964                    case 0x01b00000: {
8965                      // 0xf1b00000
8966                      switch (instr & 0x00000f00) {
8967                        case 0x00000f00: {
8968                          // 0xf1b00f00
8969                          unsigned rn = (instr >> 16) & 0xf;
8970                          uint32_t imm = ImmediateT32::Decode(
8971                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8972                              ((instr >> 15) & 0x800));
8973                          if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
8974                            // CMP{<c>}.W <Rn>, #<const> ; T2
8975                            cmp(CurrentCond(), Wide, Register(rn), imm);
8976                          } else {
8977                            // CMP{<c>}{<q>} <Rn>, #<const> ; T2
8978                            cmp(CurrentCond(), Best, Register(rn), imm);
8979                          }
8980                          break;
8981                        }
8982                        default: {
8983                          switch (instr & 0x000f0000) {
8984                            case 0x000d0000: {
8985                              // 0xf1bd0000
8986                              if (((instr & 0xf00) == 0xf00)) {
8987                                UnallocatedT32(instr);
8988                                return;
8989                              }
8990                              unsigned rd = (instr >> 8) & 0xf;
8991                              uint32_t imm = ImmediateT32::Decode(
8992                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
8993                                  ((instr >> 15) & 0x800));
8994                              // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
8995                              subs(CurrentCond(), Best, Register(rd), sp, imm);
8996                              break;
8997                            }
8998                            default: {
8999                              if (((instr & 0xf0000) == 0xd0000) ||
9000                                  ((instr & 0xf00) == 0xf00)) {
9001                                UnallocatedT32(instr);
9002                                return;
9003                              }
9004                              unsigned rd = (instr >> 8) & 0xf;
9005                              unsigned rn = (instr >> 16) & 0xf;
9006                              uint32_t imm = ImmediateT32::Decode(
9007                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
9008                                  ((instr >> 15) & 0x800));
9009                              if (OutsideITBlock() &&
9010                                  (instr & 0x00100000) == 0x00100000 &&
9011                                  (((rd < kNumberOfT32LowRegisters) &&
9012                                    (rn < kNumberOfT32LowRegisters) &&
9013                                    (imm <= 7)) ||
9014                                   ((rd == rn) &&
9015                                    (rd < kNumberOfT32LowRegisters) &&
9016                                    (imm <= 255)))) {
9017                                // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
9018                                subs(Condition::None(),
9019                                     Wide,
9020                                     Register(rd),
9021                                     Register(rn),
9022                                     imm);
9023                              } else if ((instr & 0x00100000) == 0x00100000) {
9024                                // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
9025                                subs(CurrentCond(),
9026                                     Best,
9027                                     Register(rd),
9028                                     Register(rn),
9029                                     imm);
9030                              } else {
9031                                UnallocatedT32(instr);
9032                              }
9033                              break;
9034                            }
9035                          }
9036                          break;
9037                        }
9038                      }
9039                      break;
9040                    }
9041                    case 0x01c00000: {
9042                      // 0xf1c00000
9043                      unsigned rd = (instr >> 8) & 0xf;
9044                      unsigned rn = (instr >> 16) & 0xf;
9045                      uint32_t imm = ImmediateT32::Decode(
9046                          (instr & 0xff) | ((instr >> 4) & 0x700) |
9047                          ((instr >> 15) & 0x800));
9048                      if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
9049                          (imm == 0) &&
9050                          ((rd < kNumberOfT32LowRegisters) &&
9051                           (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
9052                        // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
9053                        rsb(CurrentCond(),
9054                            Wide,
9055                            Register(rd),
9056                            Register(rn),
9057                            UINT32_C(0));
9058                      } else if ((instr & 0x00100000) == 0x00000000) {
9059                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
9060                        rsb(CurrentCond(),
9061                            Best,
9062                            Register(rd),
9063                            Register(rn),
9064                            imm);
9065                      } else {
9066                        UnallocatedT32(instr);
9067                      }
9068                      break;
9069                    }
9070                    case 0x01d00000: {
9071                      // 0xf1d00000
9072                      unsigned rd = (instr >> 8) & 0xf;
9073                      unsigned rn = (instr >> 16) & 0xf;
9074                      uint32_t imm = ImmediateT32::Decode(
9075                          (instr & 0xff) | ((instr >> 4) & 0x700) |
9076                          ((instr >> 15) & 0x800));
9077                      if (OutsideITBlock() &&
9078                          (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
9079                          ((rd < kNumberOfT32LowRegisters) &&
9080                           (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
9081                        // RSBS.W {<Rd>}, <Rn>, #0 ; T2
9082                        rsbs(Condition::None(),
9083                             Wide,
9084                             Register(rd),
9085                             Register(rn),
9086                             UINT32_C(0));
9087                      } else if ((instr & 0x00100000) == 0x00100000) {
9088                        // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
9089                        rsbs(CurrentCond(),
9090                             Best,
9091                             Register(rd),
9092                             Register(rn),
9093                             imm);
9094                      } else {
9095                        UnallocatedT32(instr);
9096                      }
9097                      break;
9098                    }
9099                    case 0x02000000: {
9100                      // 0xf2000000
9101                      switch (instr & 0x000d0000) {
9102                        case 0x000d0000: {
9103                          // 0xf20d0000
9104                          switch (instr & 0x00020000) {
9105                            case 0x00000000: {
9106                              // 0xf20d0000
9107                              unsigned rd = (instr >> 8) & 0xf;
9108                              uint32_t imm = (instr & 0xff) |
9109                                             ((instr >> 4) & 0x700) |
9110                                             ((instr >> 15) & 0x800);
9111                              if (((rd >= kNumberOfT32LowRegisters) ||
9112                                   ((imm > 1020) || ((imm & 3) != 0))) &&
9113                                  ((rd != sp.GetCode()) ||
9114                                   ((imm > 508) || ((imm & 3) != 0))) &&
9115                                  (!ImmediateT32::IsImmediateT32(imm))) {
9116                                // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
9117                                add(CurrentCond(), Best, Register(rd), sp, imm);
9118                              } else {
9119                                // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
9120                                addw(CurrentCond(), Register(rd), sp, imm);
9121                              }
9122                              break;
9123                            }
9124                            case 0x00020000: {
9125                              // 0xf20f0000
9126                              unsigned rd = (instr >> 8) & 0xf;
9127                              int32_t imm = (instr & 0xff) |
9128                                            ((instr >> 4) & 0x700) |
9129                                            ((instr >> 15) & 0x800);
9130                              Location location(imm, kT32PcDelta);
9131                              if ((imm >= 0) && (imm <= 4095) &&
9132                                  ((rd < kNumberOfT32LowRegisters) &&
9133                                   (imm >= 0) && (imm <= 1020) &&
9134                                   ((imm & 3) == 0))) {
9135                                // ADR{<c>}.W <Rd>, <label> ; T3
9136                                adr(CurrentCond(),
9137                                    Wide,
9138                                    Register(rd),
9139                                    &location);
9140                              } else if ((imm >= 0) && (imm <= 4095)) {
9141                                // ADR{<c>}{<q>} <Rd>, <label> ; T3
9142                                adr(CurrentCond(),
9143                                    Best,
9144                                    Register(rd),
9145                                    &location);
9146                              } else {
9147                                UnallocatedT32(instr);
9148                              }
9149                              break;
9150                            }
9151                          }
9152                          break;
9153                        }
9154                        default: {
9155                          if (((instr & 0xd0000) == 0xd0000)) {
9156                            UnallocatedT32(instr);
9157                            return;
9158                          }
9159                          unsigned rd = (instr >> 8) & 0xf;
9160                          unsigned rn = (instr >> 16) & 0xf;
9161                          uint32_t imm = (instr & 0xff) |
9162                                         ((instr >> 4) & 0x700) |
9163                                         ((instr >> 15) & 0x800);
9164                          if ((InITBlock() ||
9165                               (rd >= kNumberOfT32LowRegisters) ||
9166                               (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
9167                              (InITBlock() || (rd != rn) ||
9168                               (rd >= kNumberOfT32LowRegisters) ||
9169                               (imm > 255)) &&
9170                              (!ImmediateT32::IsImmediateT32(imm))) {
9171                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9172                            add(CurrentCond(),
9173                                Best,
9174                                Register(rd),
9175                                Register(rn),
9176                                imm);
9177                          } else {
9178                            // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9179                            addw(CurrentCond(),
9180                                 Register(rd),
9181                                 Register(rn),
9182                                 imm);
9183                          }
9184                          break;
9185                        }
9186                      }
9187                      break;
9188                    }
9189                    case 0x02400000: {
9190                      // 0xf2400000
9191                      unsigned rd = (instr >> 8) & 0xf;
9192                      uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
9193                                     ((instr >> 15) & 0x800) |
9194                                     ((instr >> 4) & 0xf000);
9195                      if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
9196                           (imm > 255)) &&
9197                          (!ImmediateT32::IsImmediateT32(imm))) {
9198                        // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
9199                        mov(CurrentCond(), Best, Register(rd), imm);
9200                      } else {
9201                        // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
9202                        movw(CurrentCond(), Register(rd), imm);
9203                      }
9204                      break;
9205                    }
9206                    case 0x02a00000: {
9207                      // 0xf2a00000
9208                      switch (instr & 0x000d0000) {
9209                        case 0x000d0000: {
9210                          // 0xf2ad0000
9211                          switch (instr & 0x00020000) {
9212                            case 0x00000000: {
9213                              // 0xf2ad0000
9214                              unsigned rd = (instr >> 8) & 0xf;
9215                              uint32_t imm = (instr & 0xff) |
9216                                             ((instr >> 4) & 0x700) |
9217                                             ((instr >> 15) & 0x800);
9218                              if (((rd != sp.GetCode()) ||
9219                                   ((imm > 508) || ((imm & 3) != 0))) &&
9220                                  (!ImmediateT32::IsImmediateT32(imm))) {
9221                                // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
9222                                sub(CurrentCond(), Best, Register(rd), sp, imm);
9223                              } else {
9224                                // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
9225                                subw(CurrentCond(), Register(rd), sp, imm);
9226                              }
9227                              break;
9228                            }
9229                            case 0x00020000: {
9230                              // 0xf2af0000
9231                              if (((((Uint32((instr >> 26)) & Uint32(0x1))
9232                                     << 11) |
9233                                    ((Uint32((instr >> 12)) & Uint32(0x7))
9234                                     << 8) |
9235                                    (Uint32(instr) & Uint32(0xff))) ==
9236                                   Uint32(0x0))) {
9237                                unsigned rd = (instr >> 8) & 0xf;
9238                                uint32_t imm = (instr & 0xff) |
9239                                               ((instr >> 4) & 0x700) |
9240                                               ((instr >> 15) & 0x800);
9241                                // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
9242                                sub(CurrentCond(), Best, Register(rd), pc, imm);
9243                                return;
9244                              }
9245                              unsigned rd = (instr >> 8) & 0xf;
9246                              int32_t imm = (instr & 0xff) |
9247                                            ((instr >> 4) & 0x700) |
9248                                            ((instr >> 15) & 0x800);
9249                              Location location(-imm, kT32PcDelta);
9250                              // ADR{<c>}{<q>} <Rd>, <label> ; T2
9251                              adr(CurrentCond(), Best, Register(rd), &location);
9252                              break;
9253                            }
9254                          }
9255                          break;
9256                        }
9257                        default: {
9258                          if (((instr & 0xd0000) == 0xd0000)) {
9259                            UnallocatedT32(instr);
9260                            return;
9261                          }
9262                          unsigned rd = (instr >> 8) & 0xf;
9263                          unsigned rn = (instr >> 16) & 0xf;
9264                          uint32_t imm = (instr & 0xff) |
9265                                         ((instr >> 4) & 0x700) |
9266                                         ((instr >> 15) & 0x800);
9267                          if ((InITBlock() ||
9268                               (rd >= kNumberOfT32LowRegisters) ||
9269                               (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
9270                              (InITBlock() || (rd != rn) ||
9271                               (rd >= kNumberOfT32LowRegisters) ||
9272                               (imm > 255)) &&
9273                              (!ImmediateT32::IsImmediateT32(imm))) {
9274                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9275                            sub(CurrentCond(),
9276                                Best,
9277                                Register(rd),
9278                                Register(rn),
9279                                imm);
9280                          } else {
9281                            // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9282                            subw(CurrentCond(),
9283                                 Register(rd),
9284                                 Register(rn),
9285                                 imm);
9286                          }
9287                          break;
9288                        }
9289                      }
9290                      break;
9291                    }
9292                    case 0x02c00000: {
9293                      // 0xf2c00000
9294                      unsigned rd = (instr >> 8) & 0xf;
9295                      uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
9296                                     ((instr >> 15) & 0x800) |
9297                                     ((instr >> 4) & 0xf000);
9298                      // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
9299                      movt(CurrentCond(), Register(rd), imm);
9300                      break;
9301                    }
9302                    case 0x03000000: {
9303                      // 0xf3000000
9304                      unsigned rd = (instr >> 8) & 0xf;
9305                      uint32_t imm = (instr & 0x1f) + 1;
9306                      unsigned rn = (instr >> 16) & 0xf;
9307                      uint32_t amount =
9308                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9309                      // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
9310                      ssat(CurrentCond(),
9311                           Register(rd),
9312                           imm,
9313                           Operand(Register(rn), LSL, amount));
9314                      if (((instr & 0xfff08020) != 0xf3000000)) {
9315                        UnpredictableT32(instr);
9316                      }
9317                      break;
9318                    }
9319                    case 0x03200000: {
9320                      // 0xf3200000
9321                      switch (instr & 0x000070c0) {
9322                        case 0x00000000: {
9323                          // 0xf3200000
9324                          unsigned rd = (instr >> 8) & 0xf;
9325                          uint32_t imm = (instr & 0xf) + 1;
9326                          unsigned rn = (instr >> 16) & 0xf;
9327                          // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
9328                          ssat16(CurrentCond(),
9329                                 Register(rd),
9330                                 imm,
9331                                 Register(rn));
9332                          if (((instr & 0xfff0f0f0) != 0xf3200000)) {
9333                            UnpredictableT32(instr);
9334                          }
9335                          break;
9336                        }
9337                        default: {
9338                          if (((instr & 0x70c0) == 0x0)) {
9339                            UnallocatedT32(instr);
9340                            return;
9341                          }
9342                          unsigned rd = (instr >> 8) & 0xf;
9343                          uint32_t imm = (instr & 0x1f) + 1;
9344                          unsigned rn = (instr >> 16) & 0xf;
9345                          uint32_t amount =
9346                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9347                          // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
9348                          ssat(CurrentCond(),
9349                               Register(rd),
9350                               imm,
9351                               Operand(Register(rn), ASR, amount));
9352                          if (((instr & 0xfff08020) != 0xf3200000)) {
9353                            UnpredictableT32(instr);
9354                          }
9355                          break;
9356                        }
9357                      }
9358                      break;
9359                    }
9360                    case 0x03400000: {
9361                      // 0xf3400000
9362                      unsigned rd = (instr >> 8) & 0xf;
9363                      unsigned rn = (instr >> 16) & 0xf;
9364                      uint32_t lsb =
9365                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9366                      uint32_t widthm1 = instr & 0x1f;
9367                      uint32_t width = widthm1 + 1;
9368                      // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9369                      sbfx(CurrentCond(),
9370                           Register(rd),
9371                           Register(rn),
9372                           lsb,
9373                           width);
9374                      if (((instr & 0xfff08020) != 0xf3400000)) {
9375                        UnpredictableT32(instr);
9376                      }
9377                      break;
9378                    }
9379                    case 0x03600000: {
9380                      // 0xf3600000
9381                      switch (instr & 0x000f0000) {
9382                        case 0x000f0000: {
9383                          // 0xf36f0000
9384                          unsigned rd = (instr >> 8) & 0xf;
9385                          uint32_t lsb =
9386                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9387                          uint32_t msb = instr & 0x1f;
9388                          uint32_t width = msb - lsb + 1;
9389                          // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
9390                          bfc(CurrentCond(), Register(rd), lsb, width);
9391                          if (((instr & 0xffff8020) != 0xf36f0000)) {
9392                            UnpredictableT32(instr);
9393                          }
9394                          break;
9395                        }
9396                        default: {
9397                          if (((instr & 0xf0000) == 0xf0000)) {
9398                            UnallocatedT32(instr);
9399                            return;
9400                          }
9401                          unsigned rd = (instr >> 8) & 0xf;
9402                          unsigned rn = (instr >> 16) & 0xf;
9403                          uint32_t lsb =
9404                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9405                          uint32_t msb = instr & 0x1f;
9406                          uint32_t width = msb - lsb + 1;
9407                          // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9408                          bfi(CurrentCond(),
9409                              Register(rd),
9410                              Register(rn),
9411                              lsb,
9412                              width);
9413                          if (((instr & 0xfff08020) != 0xf3600000)) {
9414                            UnpredictableT32(instr);
9415                          }
9416                          break;
9417                        }
9418                      }
9419                      break;
9420                    }
9421                    case 0x03800000: {
9422                      // 0xf3800000
9423                      unsigned rd = (instr >> 8) & 0xf;
9424                      uint32_t imm = instr & 0x1f;
9425                      unsigned rn = (instr >> 16) & 0xf;
9426                      uint32_t amount =
9427                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9428                      // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
9429                      usat(CurrentCond(),
9430                           Register(rd),
9431                           imm,
9432                           Operand(Register(rn), LSL, amount));
9433                      if (((instr & 0xfff08020) != 0xf3800000)) {
9434                        UnpredictableT32(instr);
9435                      }
9436                      break;
9437                    }
9438                    case 0x03a00000: {
9439                      // 0xf3a00000
9440                      switch (instr & 0x000070c0) {
9441                        case 0x00000000: {
9442                          // 0xf3a00000
9443                          unsigned rd = (instr >> 8) & 0xf;
9444                          uint32_t imm = instr & 0xf;
9445                          unsigned rn = (instr >> 16) & 0xf;
9446                          // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
9447                          usat16(CurrentCond(),
9448                                 Register(rd),
9449                                 imm,
9450                                 Register(rn));
9451                          if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
9452                            UnpredictableT32(instr);
9453                          }
9454                          break;
9455                        }
9456                        default: {
9457                          if (((instr & 0x70c0) == 0x0)) {
9458                            UnallocatedT32(instr);
9459                            return;
9460                          }
9461                          unsigned rd = (instr >> 8) & 0xf;
9462                          uint32_t imm = instr & 0x1f;
9463                          unsigned rn = (instr >> 16) & 0xf;
9464                          uint32_t amount =
9465                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9466                          // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
9467                          usat(CurrentCond(),
9468                               Register(rd),
9469                               imm,
9470                               Operand(Register(rn), ASR, amount));
9471                          if (((instr & 0xfff08020) != 0xf3a00000)) {
9472                            UnpredictableT32(instr);
9473                          }
9474                          break;
9475                        }
9476                      }
9477                      break;
9478                    }
9479                    case 0x03c00000: {
9480                      // 0xf3c00000
9481                      unsigned rd = (instr >> 8) & 0xf;
9482                      unsigned rn = (instr >> 16) & 0xf;
9483                      uint32_t lsb =
9484                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9485                      uint32_t widthm1 = instr & 0x1f;
9486                      uint32_t width = widthm1 + 1;
9487                      // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9488                      ubfx(CurrentCond(),
9489                           Register(rd),
9490                           Register(rn),
9491                           lsb,
9492                           width);
9493                      if (((instr & 0xfff08020) != 0xf3c00000)) {
9494                        UnpredictableT32(instr);
9495                      }
9496                      break;
9497                    }
9498                    default:
9499                      UnallocatedT32(instr);
9500                      break;
9501                  }
9502                  break;
9503                }
9504                case 0x00008000: {
9505                  // 0xf0008000
9506                  switch (instr & 0x00005000) {
9507                    case 0x00000000: {
9508                      // 0xf0008000
9509                      switch (instr & 0x03800000) {
9510                        case 0x03800000: {
9511                          // 0xf3808000
9512                          switch (instr & 0x04600000) {
9513                            case 0x00000000: {
9514                              // 0xf3808000
9515                              switch (instr & 0x00000020) {
9516                                case 0x00000000: {
9517                                  // 0xf3808000
9518                                  unsigned spec_reg = ((instr >> 8) & 0xf) |
9519                                                      ((instr >> 16) & 0x10);
9520                                  unsigned rn = (instr >> 16) & 0xf;
9521                                  // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
9522                                  msr(CurrentCond(),
9523                                      MaskedSpecialRegister(spec_reg),
9524                                      Register(rn));
9525                                  if (((instr & 0xffe0f0ff) != 0xf3808000)) {
9526                                    UnpredictableT32(instr);
9527                                  }
9528                                  break;
9529                                }
9530                                case 0x00000020: {
9531                                  // 0xf3808020
9532                                  UnimplementedT32_32("MSR", instr);
9533                                  break;
9534                                }
9535                              }
9536                              break;
9537                            }
9538                            case 0x00200000: {
9539                              // 0xf3a08000
9540                              switch (instr & 0x00100000) {
9541                                case 0x00000000: {
9542                                  // 0xf3a08000
9543                                  switch (instr & 0x00000700) {
9544                                    case 0x00000000: {
9545                                      // 0xf3a08000
9546                                      switch (instr & 0x000000f0) {
9547                                        case 0x00000000: {
9548                                          // 0xf3a08000
9549                                          switch (instr & 0x0000000f) {
9550                                            case 0x00000000: {
9551                                              // 0xf3a08000
9552                                              // NOP{<c>}.W ; T2
9553                                              nop(CurrentCond(), Wide);
9554                                              if (((instr & 0xffffffff) !=
9555                                                   0xf3af8000)) {
9556                                                UnpredictableT32(instr);
9557                                              }
9558                                              break;
9559                                            }
9560                                            case 0x00000001: {
9561                                              // 0xf3a08001
9562                                              // YIELD{<c>}.W ; T2
9563                                              yield(CurrentCond(), Wide);
9564                                              if (((instr & 0xffffffff) !=
9565                                                   0xf3af8001)) {
9566                                                UnpredictableT32(instr);
9567                                              }
9568                                              break;
9569                                            }
9570                                            case 0x00000002: {
9571                                              // 0xf3a08002
9572                                              UnimplementedT32_32("WFE", instr);
9573                                              break;
9574                                            }
9575                                            case 0x00000003: {
9576                                              // 0xf3a08003
9577                                              UnimplementedT32_32("WFI", instr);
9578                                              break;
9579                                            }
9580                                            case 0x00000004: {
9581                                              // 0xf3a08004
9582                                              UnimplementedT32_32("SEV", instr);
9583                                              break;
9584                                            }
9585                                            case 0x00000005: {
9586                                              // 0xf3a08005
9587                                              UnimplementedT32_32("SEVL",
9588                                                                  instr);
9589                                              break;
9590                                            }
9591                                            default:
9592                                              UnallocatedT32(instr);
9593                                              break;
9594                                          }
9595                                          break;
9596                                        }
9597                                        case 0x000000f0: {
9598                                          // 0xf3a080f0
9599                                          UnimplementedT32_32("DBG", instr);
9600                                          break;
9601                                        }
9602                                        default:
9603                                          UnallocatedT32(instr);
9604                                          break;
9605                                      }
9606                                      break;
9607                                    }
9608                                    case 0x00000100: {
9609                                      // 0xf3a08100
9610                                      if ((instr & 0x000000e0) == 0x00000000) {
9611                                        UnimplementedT32_32("CPS", instr);
9612                                      } else {
9613                                        UnallocatedT32(instr);
9614                                      }
9615                                      break;
9616                                    }
9617                                    case 0x00000400: {
9618                                      // 0xf3a08400
9619                                      if ((instr & 0x0000001f) == 0x00000000) {
9620                                        UnimplementedT32_32("CPSIE", instr);
9621                                      } else {
9622                                        UnallocatedT32(instr);
9623                                      }
9624                                      break;
9625                                    }
9626                                    case 0x00000500: {
9627                                      // 0xf3a08500
9628                                      UnimplementedT32_32("CPSIE", instr);
9629                                      break;
9630                                    }
9631                                    case 0x00000600: {
9632                                      // 0xf3a08600
9633                                      if ((instr & 0x0000001f) == 0x00000000) {
9634                                        UnimplementedT32_32("CPSID", instr);
9635                                      } else {
9636                                        UnallocatedT32(instr);
9637                                      }
9638                                      break;
9639                                    }
9640                                    case 0x00000700: {
9641                                      // 0xf3a08700
9642                                      UnimplementedT32_32("CPSID", instr);
9643                                      break;
9644                                    }
9645                                    default:
9646                                      UnallocatedT32(instr);
9647                                      break;
9648                                  }
9649                                  break;
9650                                }
9651                                case 0x00100000: {
9652                                  // 0xf3b08000
9653                                  switch (instr & 0x000000f0) {
9654                                    case 0x00000020: {
9655                                      // 0xf3b08020
9656                                      // CLREX{<c>}{<q>} ; T1
9657                                      clrex(CurrentCond());
9658                                      if (((instr & 0xffffffff) !=
9659                                           0xf3bf8f2f)) {
9660                                        UnpredictableT32(instr);
9661                                      }
9662                                      break;
9663                                    }
9664                                    case 0x00000040: {
9665                                      // 0xf3b08040
9666                                      MemoryBarrier option(instr & 0xf);
9667                                      // DSB{<c>}{<q>} {<option>} ; T1
9668                                      dsb(CurrentCond(), option);
9669                                      if (((instr & 0xfffffff0) !=
9670                                           0xf3bf8f40)) {
9671                                        UnpredictableT32(instr);
9672                                      }
9673                                      break;
9674                                    }
9675                                    case 0x00000050: {
9676                                      // 0xf3b08050
9677                                      MemoryBarrier option(instr & 0xf);
9678                                      // DMB{<c>}{<q>} {<option>} ; T1
9679                                      dmb(CurrentCond(), option);
9680                                      if (((instr & 0xfffffff0) !=
9681                                           0xf3bf8f50)) {
9682                                        UnpredictableT32(instr);
9683                                      }
9684                                      break;
9685                                    }
9686                                    case 0x00000060: {
9687                                      // 0xf3b08060
9688                                      MemoryBarrier option(instr & 0xf);
9689                                      // ISB{<c>}{<q>} {<option>} ; T1
9690                                      isb(CurrentCond(), option);
9691                                      if (((instr & 0xfffffff0) !=
9692                                           0xf3bf8f60)) {
9693                                        UnpredictableT32(instr);
9694                                      }
9695                                      break;
9696                                    }
9697                                    default:
9698                                      UnallocatedT32(instr);
9699                                      break;
9700                                  }
9701                                  break;
9702                                }
9703                              }
9704                              break;
9705                            }
9706                            case 0x00400000: {
9707                              // 0xf3c08000
9708                              switch (instr & 0x00100000) {
9709                                case 0x00000000: {
9710                                  // 0xf3c08000
9711                                  unsigned rm = (instr >> 16) & 0xf;
9712                                  // BXJ{<c>}{<q>} <Rm> ; T1
9713                                  bxj(CurrentCond(), Register(rm));
9714                                  if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
9715                                    UnpredictableT32(instr);
9716                                  }
9717                                  break;
9718                                }
9719                                case 0x00100000: {
9720                                  // 0xf3d08000
9721                                  switch (instr & 0x000000ff) {
9722                                    case 0x00000000: {
9723                                      // 0xf3d08000
9724                                      if ((instr & 0x000f0000) == 0x000e0000) {
9725                                        UnimplementedT32_32("ERET", instr);
9726                                      } else {
9727                                        UnallocatedT32(instr);
9728                                      }
9729                                      break;
9730                                    }
9731                                    default: {
9732                                      if (((instr & 0xff) == 0x0)) {
9733                                        UnallocatedT32(instr);
9734                                        return;
9735                                      }
9736                                      uint32_t imm = instr & 0xff;
9737                                      // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
9738                                      subs(CurrentCond(), Best, pc, lr, imm);
9739                                      if (((instr & 0xffffff00) !=
9740                                           0xf3de8f00)) {
9741                                        UnpredictableT32(instr);
9742                                      }
9743                                      break;
9744                                    }
9745                                  }
9746                                  break;
9747                                }
9748                              }
9749                              break;
9750                            }
9751                            case 0x00600000: {
9752                              // 0xf3e08000
9753                              switch (instr & 0x00000020) {
9754                                case 0x00000000: {
9755                                  // 0xf3e08000
9756                                  unsigned rd = (instr >> 8) & 0xf;
9757                                  unsigned spec_reg = (instr >> 20) & 0x1;
9758                                  // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
9759                                  mrs(CurrentCond(),
9760                                      Register(rd),
9761                                      SpecialRegister(spec_reg));
9762                                  if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
9763                                    UnpredictableT32(instr);
9764                                  }
9765                                  break;
9766                                }
9767                                case 0x00000020: {
9768                                  // 0xf3e08020
9769                                  UnimplementedT32_32("MRS", instr);
9770                                  break;
9771                                }
9772                              }
9773                              break;
9774                            }
9775                            case 0x04000000: {
9776                              // 0xf7808000
9777                              switch (instr & 0x001f2fff) {
9778                                case 0x000f0001: {
9779                                  // 0xf78f8001
9780                                  UnimplementedT32_32("DCPS1", instr);
9781                                  break;
9782                                }
9783                                case 0x000f0002: {
9784                                  // 0xf78f8002
9785                                  UnimplementedT32_32("DCPS2", instr);
9786                                  break;
9787                                }
9788                                case 0x000f0003: {
9789                                  // 0xf78f8003
9790                                  UnimplementedT32_32("DCPS3", instr);
9791                                  break;
9792                                }
9793                                default:
9794                                  UnallocatedT32(instr);
9795                                  break;
9796                              }
9797                              break;
9798                            }
9799                            case 0x04600000: {
9800                              // 0xf7e08000
9801                              switch (instr & 0x00102000) {
9802                                case 0x00000000: {
9803                                  // 0xf7e08000
9804                                  uint32_t imm =
9805                                      (instr & 0xfff) | ((instr >> 4) & 0xf000);
9806                                  // HVC{<q>} {#}<imm16> ; T1
9807                                  hvc(Condition::None(), imm);
9808                                  break;
9809                                }
9810                                case 0x00100000: {
9811                                  // 0xf7f08000
9812                                  UnimplementedT32_32("SMC", instr);
9813                                  break;
9814                                }
9815                                case 0x00102000: {
9816                                  // 0xf7f0a000
9817                                  uint32_t imm =
9818                                      (instr & 0xfff) | ((instr >> 4) & 0xf000);
9819                                  if ((imm <= 255)) {
9820                                    // UDF{<c>}.W {#}<imm> ; T2
9821                                    udf(CurrentCond(), Wide, imm);
9822                                  } else {
9823                                    // UDF{<c>}{<q>} {#}<imm> ; T2
9824                                    udf(CurrentCond(), Best, imm);
9825                                  }
9826                                  break;
9827                                }
9828                                default:
9829                                  UnallocatedT32(instr);
9830                                  break;
9831                              }
9832                              break;
9833                            }
9834                            default:
9835                              UnallocatedT32(instr);
9836                              break;
9837                          }
9838                          break;
9839                        }
9840                        default: {
9841                          if (((instr & 0x3800000) == 0x3800000)) {
9842                            UnallocatedT32(instr);
9843                            return;
9844                          }
9845                          Condition condition((instr >> 22) & 0xf);
9846                          int32_t imm =
9847                              SignExtend<int32_t>((instr & 0x7ff) |
9848                                                      ((instr >> 5) & 0x1f800) |
9849                                                      ((instr << 4) & 0x20000) |
9850                                                      ((instr << 7) & 0x40000) |
9851                                                      ((instr >> 7) & 0x80000),
9852                                                  20)
9853                              << 1;
9854                          Location location(imm, kT32PcDelta);
9855                          if (OutsideITBlock() && (imm >= -1048576) &&
9856                              (imm <= 1048574) && ((imm & 1) == 0) &&
9857                              ((imm >= -256) && (imm <= 254) &&
9858                               ((imm & 1) == 0))) {
9859                            // B<c>.W <label> ; T3
9860                            b(condition, Wide, &location);
9861                          } else if (OutsideITBlock() && (imm >= -1048576) &&
9862                                     (imm <= 1048574) && ((imm & 1) == 0)) {
9863                            // B<c>{<q>} <label> ; T3
9864                            b(condition, Best, &location);
9865                          } else {
9866                            UnallocatedT32(instr);
9867                          }
9868                          break;
9869                        }
9870                      }
9871                      break;
9872                    }
9873                    case 0x00001000: {
9874                      // 0xf0009000
9875                      uint32_t encoded_imm =
9876                          (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
9877                          ((instr << 10) & 0x200000) |
9878                          ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
9879                      uint32_t S = encoded_imm & (1 << 23);
9880                      encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
9881                      int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
9882                      Location location(imm, kT32PcDelta);
9883                      if ((imm >= -16777216) && (imm <= 16777214) &&
9884                          ((imm & 1) == 0) &&
9885                          (OutsideITBlockOrLast() && (imm >= -2048) &&
9886                           (imm <= 2046) && ((imm & 1) == 0))) {
9887                        // B{<c>}.W <label> ; T4
9888                        b(CurrentCond(), Wide, &location);
9889                      } else if (OutsideITBlockOrLast() && (imm >= -16777216) &&
9890                                 (imm <= 16777214) && ((imm & 1) == 0)) {
9891                        // B{<c>}{<q>} <label> ; T4
9892                        b(CurrentCond(), Best, &location);
9893                      } else {
9894                        UnallocatedT32(instr);
9895                      }
9896                      break;
9897                    }
9898                    case 0x00004000: {
9899                      // 0xf000c000
9900                      if ((instr & 0x00000001) == 0x00000000) {
9901                        uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
9902                                               ((instr >> 6) & 0xffc00) |
9903                                               ((instr << 9) & 0x100000) |
9904                                               ((instr << 8) & 0x200000) |
9905                                               ((instr >> 4) & 0x400000);
9906                        uint32_t S = encoded_imm & (1 << 22);
9907                        encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
9908                        int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
9909                        Location location(imm, kT32PcDelta);
9910                        // BLX{<c>}{<q>} <label> ; T2
9911                        blx(CurrentCond(), &location);
9912                      } else {
9913                        UnallocatedT32(instr);
9914                      }
9915                      break;
9916                    }
9917                    case 0x00005000: {
9918                      // 0xf000d000
9919                      uint32_t encoded_imm =
9920                          (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
9921                          ((instr << 10) & 0x200000) |
9922                          ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
9923                      uint32_t S = encoded_imm & (1 << 23);
9924                      encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
9925                      int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
9926                      Location location(imm, kT32PcDelta);
9927                      // BL{<c>}{<q>} <label> ; T1
9928                      bl(CurrentCond(), &location);
9929                      break;
9930                    }
9931                  }
9932                  break;
9933                }
9934              }
9935              break;
9936            }
9937          }
9938          break;
9939        }
9940        case 0x08000000: {
9941          // 0xe8000000
9942          switch (instr & 0x06000000) {
9943            case 0x00000000: {
9944              // 0xe8000000
9945              switch (instr & 0x10100000) {
9946                case 0x00000000: {
9947                  // 0xe8000000
9948                  switch (instr & 0x01400000) {
9949                    case 0x00000000: {
9950                      // 0xe8000000
9951                      switch (instr & 0x00800000) {
9952                        case 0x00000000: {
9953                          // 0xe8000000
9954                          UnimplementedT32_32("SRSDB", instr);
9955                          break;
9956                        }
9957                        case 0x00800000: {
9958                          // 0xe8800000
9959                          unsigned rn = (instr >> 16) & 0xf;
9960                          WriteBack write_back((instr >> 21) & 0x1);
9961                          RegisterList registers(
9962                              (((instr >> 14) & 0x1) << kLRRegNum) |
9963                              (instr & 0x1fff));
9964                          if ((rn < kNumberOfT32LowRegisters) &&
9965                              write_back.DoesWriteBack() &&
9966                              ((registers.GetList() & ~0xff) == 0)) {
9967                            // STM{<c>}.W <Rn>{!}, <registers> ; T2
9968                            stm(CurrentCond(),
9969                                Wide,
9970                                Register(rn),
9971                                write_back,
9972                                registers);
9973                            if (((instr & 0xffd0a000) != 0xe8800000)) {
9974                              UnpredictableT32(instr);
9975                            }
9976                          } else {
9977                            // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
9978                            stm(CurrentCond(),
9979                                Best,
9980                                Register(rn),
9981                                write_back,
9982                                registers);
9983                            if (((instr & 0xffd0a000) != 0xe8800000)) {
9984                              UnpredictableT32(instr);
9985                            }
9986                          }
9987                          break;
9988                        }
9989                      }
9990                      break;
9991                    }
9992                    case 0x00400000: {
9993                      // 0xe8400000
9994                      switch (instr & 0x00200000) {
9995                        case 0x00000000: {
9996                          // 0xe8400000
9997                          switch (instr & 0x00800000) {
9998                            case 0x00000000: {
9999                              // 0xe8400000
10000                              unsigned rd = (instr >> 8) & 0xf;
10001                              unsigned rt = (instr >> 12) & 0xf;
10002                              unsigned rn = (instr >> 16) & 0xf;
10003                              int32_t offset = (instr & 0xff) << 2;
10004                              // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
10005                              strex(CurrentCond(),
10006                                    Register(rd),
10007                                    Register(rt),
10008                                    MemOperand(Register(rn),
10009                                               plus,
10010                                               offset,
10011                                               Offset));
10012                              break;
10013                            }
10014                            case 0x00800000: {
10015                              // 0xe8c00000
10016                              switch (instr & 0x000000f0) {
10017                                case 0x00000040: {
10018                                  // 0xe8c00040
10019                                  unsigned rd = instr & 0xf;
10020                                  unsigned rt = (instr >> 12) & 0xf;
10021                                  unsigned rn = (instr >> 16) & 0xf;
10022                                  // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10023                                  strexb(CurrentCond(),
10024                                         Register(rd),
10025                                         Register(rt),
10026                                         MemOperand(Register(rn), Offset));
10027                                  if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
10028                                    UnpredictableT32(instr);
10029                                  }
10030                                  break;
10031                                }
10032                                case 0x00000050: {
10033                                  // 0xe8c00050
10034                                  unsigned rd = instr & 0xf;
10035                                  unsigned rt = (instr >> 12) & 0xf;
10036                                  unsigned rn = (instr >> 16) & 0xf;
10037                                  // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10038                                  strexh(CurrentCond(),
10039                                         Register(rd),
10040                                         Register(rt),
10041                                         MemOperand(Register(rn), Offset));
10042                                  if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
10043                                    UnpredictableT32(instr);
10044                                  }
10045                                  break;
10046                                }
10047                                case 0x00000070: {
10048                                  // 0xe8c00070
10049                                  unsigned rd = instr & 0xf;
10050                                  unsigned rt = (instr >> 12) & 0xf;
10051                                  unsigned rt2 = (instr >> 8) & 0xf;
10052                                  unsigned rn = (instr >> 16) & 0xf;
10053                                  // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
10054                                  strexd(CurrentCond(),
10055                                         Register(rd),
10056                                         Register(rt),
10057                                         Register(rt2),
10058                                         MemOperand(Register(rn), Offset));
10059                                  break;
10060                                }
10061                                case 0x00000080: {
10062                                  // 0xe8c00080
10063                                  unsigned rt = (instr >> 12) & 0xf;
10064                                  unsigned rn = (instr >> 16) & 0xf;
10065                                  // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10066                                  stlb(CurrentCond(),
10067                                       Register(rt),
10068                                       MemOperand(Register(rn), Offset));
10069                                  if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
10070                                    UnpredictableT32(instr);
10071                                  }
10072                                  break;
10073                                }
10074                                case 0x00000090: {
10075                                  // 0xe8c00090
10076                                  unsigned rt = (instr >> 12) & 0xf;
10077                                  unsigned rn = (instr >> 16) & 0xf;
10078                                  // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10079                                  stlh(CurrentCond(),
10080                                       Register(rt),
10081                                       MemOperand(Register(rn), Offset));
10082                                  if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
10083                                    UnpredictableT32(instr);
10084                                  }
10085                                  break;
10086                                }
10087                                case 0x000000a0: {
10088                                  // 0xe8c000a0
10089                                  unsigned rt = (instr >> 12) & 0xf;
10090                                  unsigned rn = (instr >> 16) & 0xf;
10091                                  // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
10092                                  stl(CurrentCond(),
10093                                      Register(rt),
10094                                      MemOperand(Register(rn), Offset));
10095                                  if (((instr & 0xfff00fff) != 0xe8c00faf)) {
10096                                    UnpredictableT32(instr);
10097                                  }
10098                                  break;
10099                                }
10100                                case 0x000000c0: {
10101                                  // 0xe8c000c0
10102                                  unsigned rd = instr & 0xf;
10103                                  unsigned rt = (instr >> 12) & 0xf;
10104                                  unsigned rn = (instr >> 16) & 0xf;
10105                                  // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10106                                  stlexb(CurrentCond(),
10107                                         Register(rd),
10108                                         Register(rt),
10109                                         MemOperand(Register(rn), Offset));
10110                                  if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
10111                                    UnpredictableT32(instr);
10112                                  }
10113                                  break;
10114                                }
10115                                case 0x000000d0: {
10116                                  // 0xe8c000d0
10117                                  unsigned rd = instr & 0xf;
10118                                  unsigned rt = (instr >> 12) & 0xf;
10119                                  unsigned rn = (instr >> 16) & 0xf;
10120                                  // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10121                                  stlexh(CurrentCond(),
10122                                         Register(rd),
10123                                         Register(rt),
10124                                         MemOperand(Register(rn), Offset));
10125                                  if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
10126                                    UnpredictableT32(instr);
10127                                  }
10128                                  break;
10129                                }
10130                                case 0x000000e0: {
10131                                  // 0xe8c000e0
10132                                  unsigned rd = instr & 0xf;
10133                                  unsigned rt = (instr >> 12) & 0xf;
10134                                  unsigned rn = (instr >> 16) & 0xf;
10135                                  // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10136                                  stlex(CurrentCond(),
10137                                        Register(rd),
10138                                        Register(rt),
10139                                        MemOperand(Register(rn), Offset));
10140                                  if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
10141                                    UnpredictableT32(instr);
10142                                  }
10143                                  break;
10144                                }
10145                                case 0x000000f0: {
10146                                  // 0xe8c000f0
10147                                  unsigned rd = instr & 0xf;
10148                                  unsigned rt = (instr >> 12) & 0xf;
10149                                  unsigned rt2 = (instr >> 8) & 0xf;
10150                                  unsigned rn = (instr >> 16) & 0xf;
10151                                  // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
10152                                  stlexd(CurrentCond(),
10153                                         Register(rd),
10154                                         Register(rt),
10155                                         Register(rt2),
10156                                         MemOperand(Register(rn), Offset));
10157                                  break;
10158                                }
10159                                default:
10160                                  UnallocatedT32(instr);
10161                                  break;
10162                              }
10163                              break;
10164                            }
10165                          }
10166                          break;
10167                        }
10168                        case 0x00200000: {
10169                          // 0xe8600000
10170                          if (((instr & 0xf0000) == 0xf0000)) {
10171                            UnallocatedT32(instr);
10172                            return;
10173                          }
10174                          unsigned rt = (instr >> 12) & 0xf;
10175                          unsigned rt2 = (instr >> 8) & 0xf;
10176                          unsigned rn = (instr >> 16) & 0xf;
10177                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10178                                                                 : plus);
10179                          int32_t offset = (instr & 0xff) << 2;
10180                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
10181                          strd(CurrentCond(),
10182                               Register(rt),
10183                               Register(rt2),
10184                               MemOperand(Register(rn),
10185                                          sign,
10186                                          offset,
10187                                          PostIndex));
10188                          break;
10189                        }
10190                      }
10191                      break;
10192                    }
10193                    case 0x01000000: {
10194                      // 0xe9000000
10195                      switch (instr & 0x00800000) {
10196                        case 0x00000000: {
10197                          // 0xe9000000
10198                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
10199                               Uint32(0x1)) &&
10200                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
10201                               Uint32(0xd)) &&
10202                              (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
10203                                         << 13) |
10204                                        (Uint32(instr) & Uint32(0x1fff))) >
10205                               Int64(1))) {
10206                            RegisterList registers(
10207                                (((instr >> 14) & 0x1) << kLRRegNum) |
10208                                (instr & 0x1fff));
10209                            if (registers.IsR0toR7orLR()) {
10210                              // PUSH{<c>}.W <registers> ; T1
10211                              push(CurrentCond(), Wide, registers);
10212                              if (((instr & 0xffffa000) != 0xe92d0000)) {
10213                                UnpredictableT32(instr);
10214                              }
10215                            } else {
10216                              // PUSH{<c>}{<q>} <registers> ; T1
10217                              push(CurrentCond(), Best, registers);
10218                              if (((instr & 0xffffa000) != 0xe92d0000)) {
10219                                UnpredictableT32(instr);
10220                              }
10221                            }
10222                            return;
10223                          }
10224                          unsigned rn = (instr >> 16) & 0xf;
10225                          WriteBack write_back((instr >> 21) & 0x1);
10226                          RegisterList registers(
10227                              (((instr >> 14) & 0x1) << kLRRegNum) |
10228                              (instr & 0x1fff));
10229                          // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
10230                          stmdb(CurrentCond(),
10231                                Best,
10232                                Register(rn),
10233                                write_back,
10234                                registers);
10235                          if (((instr & 0xffd0a000) != 0xe9000000)) {
10236                            UnpredictableT32(instr);
10237                          }
10238                          break;
10239                        }
10240                        case 0x00800000: {
10241                          // 0xe9800000
10242                          UnimplementedT32_32("SRS{IA}", instr);
10243                          break;
10244                        }
10245                      }
10246                      break;
10247                    }
10248                    case 0x01400000: {
10249                      // 0xe9400000
10250                      switch (instr & 0x00200000) {
10251                        case 0x00000000: {
10252                          // 0xe9400000
10253                          if (((instr & 0xf0000) == 0xf0000)) {
10254                            UnallocatedT32(instr);
10255                            return;
10256                          }
10257                          unsigned rt = (instr >> 12) & 0xf;
10258                          unsigned rt2 = (instr >> 8) & 0xf;
10259                          unsigned rn = (instr >> 16) & 0xf;
10260                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10261                                                                 : plus);
10262                          int32_t offset = (instr & 0xff) << 2;
10263                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
10264                          strd(CurrentCond(),
10265                               Register(rt),
10266                               Register(rt2),
10267                               MemOperand(Register(rn), sign, offset, Offset));
10268                          break;
10269                        }
10270                        case 0x00200000: {
10271                          // 0xe9600000
10272                          if (((instr & 0xf0000) == 0xf0000)) {
10273                            UnallocatedT32(instr);
10274                            return;
10275                          }
10276                          unsigned rt = (instr >> 12) & 0xf;
10277                          unsigned rt2 = (instr >> 8) & 0xf;
10278                          unsigned rn = (instr >> 16) & 0xf;
10279                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10280                                                                 : plus);
10281                          int32_t offset = (instr & 0xff) << 2;
10282                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
10283                          strd(CurrentCond(),
10284                               Register(rt),
10285                               Register(rt2),
10286                               MemOperand(Register(rn),
10287                                          sign,
10288                                          offset,
10289                                          PreIndex));
10290                          break;
10291                        }
10292                      }
10293                      break;
10294                    }
10295                  }
10296                  break;
10297                }
10298                case 0x00100000: {
10299                  // 0xe8100000
10300                  switch (instr & 0x00400000) {
10301                    case 0x00000000: {
10302                      // 0xe8100000
10303                      switch (instr & 0x01800000) {
10304                        case 0x00000000: {
10305                          // 0xe8100000
10306                          UnimplementedT32_32("RFEDB", instr);
10307                          break;
10308                        }
10309                        case 0x00800000: {
10310                          // 0xe8900000
10311                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
10312                               Uint32(0x1)) &&
10313                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
10314                               Uint32(0xd)) &&
10315                              (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
10316                                         << 14) |
10317                                        ((Uint32((instr >> 14)) & Uint32(0x1))
10318                                         << 13) |
10319                                        (Uint32(instr) & Uint32(0x1fff))) >
10320                               Int64(1))) {
10321                            RegisterList registers(
10322                                (((instr >> 15) & 0x1) << kPCRegNum) |
10323                                (((instr >> 14) & 0x1) << kLRRegNum) |
10324                                (instr & 0x1fff));
10325                            if (registers.IsR0toR7orPC()) {
10326                              // POP{<c>}.W <registers> ; T2
10327                              pop(CurrentCond(), Wide, registers);
10328                              if (((instr & 0xffff2000) != 0xe8bd0000)) {
10329                                UnpredictableT32(instr);
10330                              }
10331                            } else {
10332                              // POP{<c>}{<q>} <registers> ; T2
10333                              pop(CurrentCond(), Best, registers);
10334                              if (((instr & 0xffff2000) != 0xe8bd0000)) {
10335                                UnpredictableT32(instr);
10336                              }
10337                            }
10338                            return;
10339                          }
10340                          unsigned rn = (instr >> 16) & 0xf;
10341                          WriteBack write_back((instr >> 21) & 0x1);
10342                          RegisterList registers(
10343                              (((instr >> 15) & 0x1) << kPCRegNum) |
10344                              (((instr >> 14) & 0x1) << kLRRegNum) |
10345                              (instr & 0x1fff));
10346                          if ((rn < kNumberOfT32LowRegisters) &&
10347                              (((registers.GetList() & (1 << rn)) == 0) ==
10348                               write_back.DoesWriteBack()) &&
10349                              ((registers.GetList() & ~0xff) == 0)) {
10350                            // LDM{<c>}.W <Rn>{!}, <registers> ; T2
10351                            ldm(CurrentCond(),
10352                                Wide,
10353                                Register(rn),
10354                                write_back,
10355                                registers);
10356                            if (((instr & 0xffd02000) != 0xe8900000)) {
10357                              UnpredictableT32(instr);
10358                            }
10359                          } else {
10360                            // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
10361                            ldm(CurrentCond(),
10362                                Best,
10363                                Register(rn),
10364                                write_back,
10365                                registers);
10366                            if (((instr & 0xffd02000) != 0xe8900000)) {
10367                              UnpredictableT32(instr);
10368                            }
10369                          }
10370                          break;
10371                        }
10372                        case 0x01000000: {
10373                          // 0xe9100000
10374                          unsigned rn = (instr >> 16) & 0xf;
10375                          WriteBack write_back((instr >> 21) & 0x1);
10376                          RegisterList registers(
10377                              (((instr >> 15) & 0x1) << kPCRegNum) |
10378                              (((instr >> 14) & 0x1) << kLRRegNum) |
10379                              (instr & 0x1fff));
10380                          // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
10381                          ldmdb(CurrentCond(),
10382                                Register(rn),
10383                                write_back,
10384                                registers);
10385                          if (((instr & 0xffd02000) != 0xe9100000)) {
10386                            UnpredictableT32(instr);
10387                          }
10388                          break;
10389                        }
10390                        case 0x01800000: {
10391                          // 0xe9900000
10392                          UnimplementedT32_32("RFE{IA}", instr);
10393                          break;
10394                        }
10395                      }
10396                      break;
10397                    }
10398                    case 0x00400000: {
10399                      // 0xe8500000
10400                      switch (instr & 0x01200000) {
10401                        case 0x00000000: {
10402                          // 0xe8500000
10403                          switch (instr & 0x00800000) {
10404                            case 0x00000000: {
10405                              // 0xe8500000
10406                              unsigned rt = (instr >> 12) & 0xf;
10407                              unsigned rn = (instr >> 16) & 0xf;
10408                              int32_t offset = (instr & 0xff) << 2;
10409                              // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
10410                              ldrex(CurrentCond(),
10411                                    Register(rt),
10412                                    MemOperand(Register(rn),
10413                                               plus,
10414                                               offset,
10415                                               Offset));
10416                              if (((instr & 0xfff00f00) != 0xe8500f00)) {
10417                                UnpredictableT32(instr);
10418                              }
10419                              break;
10420                            }
10421                            case 0x00800000: {
10422                              // 0xe8d00000
10423                              switch (instr & 0x000000f0) {
10424                                case 0x00000000: {
10425                                  // 0xe8d00000
10426                                  unsigned rn = (instr >> 16) & 0xf;
10427                                  unsigned rm = instr & 0xf;
10428                                  // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
10429                                  tbb(CurrentCond(),
10430                                      Register(rn),
10431                                      Register(rm));
10432                                  if (((instr & 0xfff0fff0) != 0xe8d0f000)) {
10433                                    UnpredictableT32(instr);
10434                                  }
10435                                  break;
10436                                }
10437                                case 0x00000010: {
10438                                  // 0xe8d00010
10439                                  unsigned rn = (instr >> 16) & 0xf;
10440                                  unsigned rm = instr & 0xf;
10441                                  // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
10442                                  tbh(CurrentCond(),
10443                                      Register(rn),
10444                                      Register(rm));
10445                                  if (((instr & 0xfff0fff0) != 0xe8d0f010)) {
10446                                    UnpredictableT32(instr);
10447                                  }
10448                                  break;
10449                                }
10450                                case 0x00000040: {
10451                                  // 0xe8d00040
10452                                  unsigned rt = (instr >> 12) & 0xf;
10453                                  unsigned rn = (instr >> 16) & 0xf;
10454                                  // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10455                                  ldrexb(CurrentCond(),
10456                                         Register(rt),
10457                                         MemOperand(Register(rn), Offset));
10458                                  if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
10459                                    UnpredictableT32(instr);
10460                                  }
10461                                  break;
10462                                }
10463                                case 0x00000050: {
10464                                  // 0xe8d00050
10465                                  unsigned rt = (instr >> 12) & 0xf;
10466                                  unsigned rn = (instr >> 16) & 0xf;
10467                                  // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10468                                  ldrexh(CurrentCond(),
10469                                         Register(rt),
10470                                         MemOperand(Register(rn), Offset));
10471                                  if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
10472                                    UnpredictableT32(instr);
10473                                  }
10474                                  break;
10475                                }
10476                                case 0x00000070: {
10477                                  // 0xe8d00070
10478                                  unsigned rt = (instr >> 12) & 0xf;
10479                                  unsigned rt2 = (instr >> 8) & 0xf;
10480                                  unsigned rn = (instr >> 16) & 0xf;
10481                                  // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
10482                                  ldrexd(CurrentCond(),
10483                                         Register(rt),
10484                                         Register(rt2),
10485                                         MemOperand(Register(rn), Offset));
10486                                  if (((instr & 0xfff000ff) != 0xe8d0007f)) {
10487                                    UnpredictableT32(instr);
10488                                  }
10489                                  break;
10490                                }
10491                                case 0x00000080: {
10492                                  // 0xe8d00080
10493                                  unsigned rt = (instr >> 12) & 0xf;
10494                                  unsigned rn = (instr >> 16) & 0xf;
10495                                  // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10496                                  ldab(CurrentCond(),
10497                                       Register(rt),
10498                                       MemOperand(Register(rn), Offset));
10499                                  if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
10500                                    UnpredictableT32(instr);
10501                                  }
10502                                  break;
10503                                }
10504                                case 0x00000090: {
10505                                  // 0xe8d00090
10506                                  unsigned rt = (instr >> 12) & 0xf;
10507                                  unsigned rn = (instr >> 16) & 0xf;
10508                                  // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10509                                  ldah(CurrentCond(),
10510                                       Register(rt),
10511                                       MemOperand(Register(rn), Offset));
10512                                  if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
10513                                    UnpredictableT32(instr);
10514                                  }
10515                                  break;
10516                                }
10517                                case 0x000000a0: {
10518                                  // 0xe8d000a0
10519                                  unsigned rt = (instr >> 12) & 0xf;
10520                                  unsigned rn = (instr >> 16) & 0xf;
10521                                  // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
10522                                  lda(CurrentCond(),
10523                                      Register(rt),
10524                                      MemOperand(Register(rn), Offset));
10525                                  if (((instr & 0xfff00fff) != 0xe8d00faf)) {
10526                                    UnpredictableT32(instr);
10527                                  }
10528                                  break;
10529                                }
10530                                case 0x000000c0: {
10531                                  // 0xe8d000c0
10532                                  unsigned rt = (instr >> 12) & 0xf;
10533                                  unsigned rn = (instr >> 16) & 0xf;
10534                                  // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10535                                  ldaexb(CurrentCond(),
10536                                         Register(rt),
10537                                         MemOperand(Register(rn), Offset));
10538                                  if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
10539                                    UnpredictableT32(instr);
10540                                  }
10541                                  break;
10542                                }
10543                                case 0x000000d0: {
10544                                  // 0xe8d000d0
10545                                  unsigned rt = (instr >> 12) & 0xf;
10546                                  unsigned rn = (instr >> 16) & 0xf;
10547                                  // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10548                                  ldaexh(CurrentCond(),
10549                                         Register(rt),
10550                                         MemOperand(Register(rn), Offset));
10551                                  if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
10552                                    UnpredictableT32(instr);
10553                                  }
10554                                  break;
10555                                }
10556                                case 0x000000e0: {
10557                                  // 0xe8d000e0
10558                                  unsigned rt = (instr >> 12) & 0xf;
10559                                  unsigned rn = (instr >> 16) & 0xf;
10560                                  // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
10561                                  ldaex(CurrentCond(),
10562                                        Register(rt),
10563                                        MemOperand(Register(rn), Offset));
10564                                  if (((instr & 0xfff00fff) != 0xe8d00fef)) {
10565                                    UnpredictableT32(instr);
10566                                  }
10567                                  break;
10568                                }
10569                                case 0x000000f0: {
10570                                  // 0xe8d000f0
10571                                  unsigned rt = (instr >> 12) & 0xf;
10572                                  unsigned rt2 = (instr >> 8) & 0xf;
10573                                  unsigned rn = (instr >> 16) & 0xf;
10574                                  // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
10575                                  ldaexd(CurrentCond(),
10576                                         Register(rt),
10577                                         Register(rt2),
10578                                         MemOperand(Register(rn), Offset));
10579                                  if (((instr & 0xfff000ff) != 0xe8d000ff)) {
10580                                    UnpredictableT32(instr);
10581                                  }
10582                                  break;
10583                                }
10584                                default:
10585                                  UnallocatedT32(instr);
10586                                  break;
10587                              }
10588                              break;
10589                            }
10590                          }
10591                          break;
10592                        }
10593                        case 0x00200000: {
10594                          // 0xe8700000
10595                          switch (instr & 0x000f0000) {
10596                            case 0x000f0000: {
10597                              // 0xe87f0000
10598                              if (((instr & 0x1200000) == 0x0)) {
10599                                UnallocatedT32(instr);
10600                                return;
10601                              }
10602                              unsigned rt = (instr >> 12) & 0xf;
10603                              unsigned rt2 = (instr >> 8) & 0xf;
10604                              uint32_t U = (instr >> 23) & 0x1;
10605                              int32_t imm = instr & 0xff;
10606                              imm <<= 2;
10607                              if (U == 0) imm = -imm;
10608                              bool minus_zero = (imm == 0) && (U == 0);
10609                              Location location(imm, kT32PcDelta);
10610                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10611                              if (minus_zero) {
10612                                ldrd(CurrentCond(),
10613                                     Register(rt),
10614                                     Register(rt2),
10615                                     MemOperand(pc, minus, 0));
10616                              } else {
10617                                ldrd(CurrentCond(),
10618                                     Register(rt),
10619                                     Register(rt2),
10620                                     &location);
10621                              }
10622                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
10623                                UnpredictableT32(instr);
10624                              }
10625                              break;
10626                            }
10627                            default: {
10628                              if (((instr & 0xf0000) == 0xf0000)) {
10629                                UnallocatedT32(instr);
10630                                return;
10631                              }
10632                              unsigned rt = (instr >> 12) & 0xf;
10633                              unsigned rt2 = (instr >> 8) & 0xf;
10634                              unsigned rn = (instr >> 16) & 0xf;
10635                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10636                                                                     : plus);
10637                              int32_t offset = (instr & 0xff) << 2;
10638                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
10639                              ldrd(CurrentCond(),
10640                                   Register(rt),
10641                                   Register(rt2),
10642                                   MemOperand(Register(rn),
10643                                              sign,
10644                                              offset,
10645                                              PostIndex));
10646                              break;
10647                            }
10648                          }
10649                          break;
10650                        }
10651                        case 0x01000000: {
10652                          // 0xe9500000
10653                          switch (instr & 0x000f0000) {
10654                            case 0x000f0000: {
10655                              // 0xe95f0000
10656                              if (((instr & 0x1200000) == 0x0)) {
10657                                UnallocatedT32(instr);
10658                                return;
10659                              }
10660                              unsigned rt = (instr >> 12) & 0xf;
10661                              unsigned rt2 = (instr >> 8) & 0xf;
10662                              uint32_t U = (instr >> 23) & 0x1;
10663                              int32_t imm = instr & 0xff;
10664                              imm <<= 2;
10665                              if (U == 0) imm = -imm;
10666                              bool minus_zero = (imm == 0) && (U == 0);
10667                              Location location(imm, kT32PcDelta);
10668                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10669                              if (minus_zero) {
10670                                ldrd(CurrentCond(),
10671                                     Register(rt),
10672                                     Register(rt2),
10673                                     MemOperand(pc, minus, 0));
10674                              } else {
10675                                ldrd(CurrentCond(),
10676                                     Register(rt),
10677                                     Register(rt2),
10678                                     &location);
10679                              }
10680                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
10681                                UnpredictableT32(instr);
10682                              }
10683                              break;
10684                            }
10685                            default: {
10686                              if (((instr & 0xf0000) == 0xf0000)) {
10687                                UnallocatedT32(instr);
10688                                return;
10689                              }
10690                              unsigned rt = (instr >> 12) & 0xf;
10691                              unsigned rt2 = (instr >> 8) & 0xf;
10692                              unsigned rn = (instr >> 16) & 0xf;
10693                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10694                                                                     : plus);
10695                              int32_t offset = (instr & 0xff) << 2;
10696                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
10697                              ldrd(CurrentCond(),
10698                                   Register(rt),
10699                                   Register(rt2),
10700                                   MemOperand(Register(rn),
10701                                              sign,
10702                                              offset,
10703                                              Offset));
10704                              break;
10705                            }
10706                          }
10707                          break;
10708                        }
10709                        case 0x01200000: {
10710                          // 0xe9700000
10711                          switch (instr & 0x000f0000) {
10712                            case 0x000f0000: {
10713                              // 0xe97f0000
10714                              if (((instr & 0x1200000) == 0x0)) {
10715                                UnallocatedT32(instr);
10716                                return;
10717                              }
10718                              unsigned rt = (instr >> 12) & 0xf;
10719                              unsigned rt2 = (instr >> 8) & 0xf;
10720                              uint32_t U = (instr >> 23) & 0x1;
10721                              int32_t imm = instr & 0xff;
10722                              imm <<= 2;
10723                              if (U == 0) imm = -imm;
10724                              bool minus_zero = (imm == 0) && (U == 0);
10725                              Location location(imm, kT32PcDelta);
10726                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10727                              if (minus_zero) {
10728                                ldrd(CurrentCond(),
10729                                     Register(rt),
10730                                     Register(rt2),
10731                                     MemOperand(pc, minus, 0));
10732                              } else {
10733                                ldrd(CurrentCond(),
10734                                     Register(rt),
10735                                     Register(rt2),
10736                                     &location);
10737                              }
10738                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
10739                                UnpredictableT32(instr);
10740                              }
10741                              break;
10742                            }
10743                            default: {
10744                              if (((instr & 0xf0000) == 0xf0000)) {
10745                                UnallocatedT32(instr);
10746                                return;
10747                              }
10748                              unsigned rt = (instr >> 12) & 0xf;
10749                              unsigned rt2 = (instr >> 8) & 0xf;
10750                              unsigned rn = (instr >> 16) & 0xf;
10751                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10752                                                                     : plus);
10753                              int32_t offset = (instr & 0xff) << 2;
10754                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
10755                              ldrd(CurrentCond(),
10756                                   Register(rt),
10757                                   Register(rt2),
10758                                   MemOperand(Register(rn),
10759                                              sign,
10760                                              offset,
10761                                              PreIndex));
10762                              break;
10763                            }
10764                          }
10765                          break;
10766                        }
10767                      }
10768                      break;
10769                    }
10770                  }
10771                  break;
10772                }
10773                case 0x10000000: {
10774                  // 0xf8000000
10775                  switch (instr & 0x01a00000) {
10776                    case 0x00000000: {
10777                      // 0xf8000000
10778                      switch (instr & 0x00400d00) {
10779                        case 0x00000000: {
10780                          // 0xf8000000
10781                          if ((instr & 0x000002c0) == 0x00000000) {
10782                            if (((instr & 0xf0000) == 0xf0000)) {
10783                              UnallocatedT32(instr);
10784                              return;
10785                            }
10786                            unsigned rt = (instr >> 12) & 0xf;
10787                            unsigned rn = (instr >> 16) & 0xf;
10788                            Sign sign(plus);
10789                            unsigned rm = instr & 0xf;
10790                            Shift shift = LSL;
10791                            uint32_t amount = (instr >> 4) & 0x3;
10792                            AddrMode addrmode = Offset;
10793                            if ((rt < kNumberOfT32LowRegisters) &&
10794                                (rn < kNumberOfT32LowRegisters) &&
10795                                (rm < kNumberOfT32LowRegisters) &&
10796                                shift.IsLSL() && (amount == 0) &&
10797                                sign.IsPlus()) {
10798                              // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
10799                              strb(CurrentCond(),
10800                                   Wide,
10801                                   Register(rt),
10802                                   MemOperand(Register(rn),
10803                                              sign,
10804                                              Register(rm),
10805                                              addrmode));
10806                            } else {
10807                              // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
10808                              strb(CurrentCond(),
10809                                   Best,
10810                                   Register(rt),
10811                                   MemOperand(Register(rn),
10812                                              sign,
10813                                              Register(rm),
10814                                              shift,
10815                                              amount,
10816                                              addrmode));
10817                            }
10818                          } else {
10819                            UnallocatedT32(instr);
10820                          }
10821                          break;
10822                        }
10823                        case 0x00000900: {
10824                          // 0xf8000900
10825                          if (((instr & 0xf0000) == 0xf0000)) {
10826                            UnallocatedT32(instr);
10827                            return;
10828                          }
10829                          unsigned rt = (instr >> 12) & 0xf;
10830                          unsigned rn = (instr >> 16) & 0xf;
10831                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10832                          int32_t offset = instr & 0xff;
10833                          // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
10834                          strb(CurrentCond(),
10835                               Best,
10836                               Register(rt),
10837                               MemOperand(Register(rn),
10838                                          sign,
10839                                          offset,
10840                                          PostIndex));
10841                          break;
10842                        }
10843                        case 0x00000c00: {
10844                          // 0xf8000c00
10845                          switch (instr & 0x00000200) {
10846                            case 0x00000000: {
10847                              // 0xf8000c00
10848                              if (((instr & 0xf0000) == 0xf0000)) {
10849                                UnallocatedT32(instr);
10850                                return;
10851                              }
10852                              unsigned rt = (instr >> 12) & 0xf;
10853                              unsigned rn = (instr >> 16) & 0xf;
10854                              int32_t offset = instr & 0xff;
10855                              // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
10856                              strb(CurrentCond(),
10857                                   Best,
10858                                   Register(rt),
10859                                   MemOperand(Register(rn),
10860                                              minus,
10861                                              offset,
10862                                              Offset));
10863                              break;
10864                            }
10865                            case 0x00000200: {
10866                              // 0xf8000e00
10867                              if (((instr & 0xf0000) == 0xf0000)) {
10868                                UnallocatedT32(instr);
10869                                return;
10870                              }
10871                              UnimplementedT32_32("STRBT", instr);
10872                              break;
10873                            }
10874                          }
10875                          break;
10876                        }
10877                        case 0x00000d00: {
10878                          // 0xf8000d00
10879                          if (((instr & 0xf0000) == 0xf0000)) {
10880                            UnallocatedT32(instr);
10881                            return;
10882                          }
10883                          unsigned rt = (instr >> 12) & 0xf;
10884                          unsigned rn = (instr >> 16) & 0xf;
10885                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10886                          int32_t offset = instr & 0xff;
10887                          // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
10888                          strb(CurrentCond(),
10889                               Best,
10890                               Register(rt),
10891                               MemOperand(Register(rn),
10892                                          sign,
10893                                          offset,
10894                                          PreIndex));
10895                          break;
10896                        }
10897                        case 0x00400000: {
10898                          // 0xf8400000
10899                          if ((instr & 0x000002c0) == 0x00000000) {
10900                            if (((instr & 0xf0000) == 0xf0000)) {
10901                              UnallocatedT32(instr);
10902                              return;
10903                            }
10904                            unsigned rt = (instr >> 12) & 0xf;
10905                            unsigned rn = (instr >> 16) & 0xf;
10906                            Sign sign(plus);
10907                            unsigned rm = instr & 0xf;
10908                            Shift shift = LSL;
10909                            uint32_t amount = (instr >> 4) & 0x3;
10910                            AddrMode addrmode = Offset;
10911                            if ((rt < kNumberOfT32LowRegisters) &&
10912                                (rn < kNumberOfT32LowRegisters) &&
10913                                (rm < kNumberOfT32LowRegisters) &&
10914                                shift.IsLSL() && (amount == 0) &&
10915                                sign.IsPlus()) {
10916                              // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
10917                              str(CurrentCond(),
10918                                  Wide,
10919                                  Register(rt),
10920                                  MemOperand(Register(rn),
10921                                             sign,
10922                                             Register(rm),
10923                                             addrmode));
10924                            } else {
10925                              // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
10926                              str(CurrentCond(),
10927                                  Best,
10928                                  Register(rt),
10929                                  MemOperand(Register(rn),
10930                                             sign,
10931                                             Register(rm),
10932                                             shift,
10933                                             amount,
10934                                             addrmode));
10935                            }
10936                          } else {
10937                            UnallocatedT32(instr);
10938                          }
10939                          break;
10940                        }
10941                        case 0x00400900: {
10942                          // 0xf8400900
10943                          if (((instr & 0xf0000) == 0xf0000)) {
10944                            UnallocatedT32(instr);
10945                            return;
10946                          }
10947                          unsigned rt = (instr >> 12) & 0xf;
10948                          unsigned rn = (instr >> 16) & 0xf;
10949                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10950                          int32_t offset = instr & 0xff;
10951                          // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
10952                          str(CurrentCond(),
10953                              Best,
10954                              Register(rt),
10955                              MemOperand(Register(rn),
10956                                         sign,
10957                                         offset,
10958                                         PostIndex));
10959                          break;
10960                        }
10961                        case 0x00400c00: {
10962                          // 0xf8400c00
10963                          switch (instr & 0x00000200) {
10964                            case 0x00000000: {
10965                              // 0xf8400c00
10966                              if (((instr & 0xf0000) == 0xf0000)) {
10967                                UnallocatedT32(instr);
10968                                return;
10969                              }
10970                              unsigned rt = (instr >> 12) & 0xf;
10971                              unsigned rn = (instr >> 16) & 0xf;
10972                              int32_t offset = instr & 0xff;
10973                              // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
10974                              str(CurrentCond(),
10975                                  Best,
10976                                  Register(rt),
10977                                  MemOperand(Register(rn),
10978                                             minus,
10979                                             offset,
10980                                             Offset));
10981                              break;
10982                            }
10983                            case 0x00000200: {
10984                              // 0xf8400e00
10985                              if (((instr & 0xf0000) == 0xf0000)) {
10986                                UnallocatedT32(instr);
10987                                return;
10988                              }
10989                              UnimplementedT32_32("STRT", instr);
10990                              break;
10991                            }
10992                          }
10993                          break;
10994                        }
10995                        case 0x00400d00: {
10996                          // 0xf8400d00
10997                          if (((instr & 0xf0000) == 0xf0000)) {
10998                            UnallocatedT32(instr);
10999                            return;
11000                          }
11001                          if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
11002                               Uint32(0xd)) &&
11003                              ((Uint32((instr >> 9)) & Uint32(0x1)) ==
11004                               Uint32(0x0)) &&
11005                              ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
11006                            unsigned rt = (instr >> 12) & 0xf;
11007                            if ((rt <= 7) || (rt == kLRRegNum)) {
11008                              // PUSH{<c>}.W <single_register_list> ; T4
11009                              push(CurrentCond(), Wide, Register(rt));
11010                            } else {
11011                              // PUSH{<c>}{<q>} <single_register_list> ; T4
11012                              push(CurrentCond(), Best, Register(rt));
11013                            }
11014                            return;
11015                          }
11016                          unsigned rt = (instr >> 12) & 0xf;
11017                          unsigned rn = (instr >> 16) & 0xf;
11018                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11019                          int32_t offset = instr & 0xff;
11020                          // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
11021                          str(CurrentCond(),
11022                              Best,
11023                              Register(rt),
11024                              MemOperand(Register(rn), sign, offset, PreIndex));
11025                          break;
11026                        }
11027                        default:
11028                          UnallocatedT32(instr);
11029                          break;
11030                      }
11031                      break;
11032                    }
11033                    case 0x00200000: {
11034                      // 0xf8200000
11035                      switch (instr & 0x00400d00) {
11036                        case 0x00000000: {
11037                          // 0xf8200000
11038                          if ((instr & 0x000002c0) == 0x00000000) {
11039                            if (((instr & 0xf0000) == 0xf0000)) {
11040                              UnallocatedT32(instr);
11041                              return;
11042                            }
11043                            unsigned rt = (instr >> 12) & 0xf;
11044                            unsigned rn = (instr >> 16) & 0xf;
11045                            Sign sign(plus);
11046                            unsigned rm = instr & 0xf;
11047                            Shift shift = LSL;
11048                            uint32_t amount = (instr >> 4) & 0x3;
11049                            AddrMode addrmode = Offset;
11050                            if ((rt < kNumberOfT32LowRegisters) &&
11051                                (rn < kNumberOfT32LowRegisters) &&
11052                                (rm < kNumberOfT32LowRegisters) &&
11053                                shift.IsLSL() && (amount == 0) &&
11054                                sign.IsPlus()) {
11055                              // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
11056                              strh(CurrentCond(),
11057                                   Wide,
11058                                   Register(rt),
11059                                   MemOperand(Register(rn),
11060                                              sign,
11061                                              Register(rm),
11062                                              addrmode));
11063                            } else {
11064                              // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
11065                              strh(CurrentCond(),
11066                                   Best,
11067                                   Register(rt),
11068                                   MemOperand(Register(rn),
11069                                              sign,
11070                                              Register(rm),
11071                                              shift,
11072                                              amount,
11073                                              addrmode));
11074                            }
11075                          } else {
11076                            UnallocatedT32(instr);
11077                          }
11078                          break;
11079                        }
11080                        case 0x00000900: {
11081                          // 0xf8200900
11082                          if (((instr & 0xf0000) == 0xf0000)) {
11083                            UnallocatedT32(instr);
11084                            return;
11085                          }
11086                          unsigned rt = (instr >> 12) & 0xf;
11087                          unsigned rn = (instr >> 16) & 0xf;
11088                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11089                          int32_t offset = instr & 0xff;
11090                          // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
11091                          strh(CurrentCond(),
11092                               Best,
11093                               Register(rt),
11094                               MemOperand(Register(rn),
11095                                          sign,
11096                                          offset,
11097                                          PostIndex));
11098                          break;
11099                        }
11100                        case 0x00000c00: {
11101                          // 0xf8200c00
11102                          switch (instr & 0x00000200) {
11103                            case 0x00000000: {
11104                              // 0xf8200c00
11105                              if (((instr & 0xf0000) == 0xf0000)) {
11106                                UnallocatedT32(instr);
11107                                return;
11108                              }
11109                              unsigned rt = (instr >> 12) & 0xf;
11110                              unsigned rn = (instr >> 16) & 0xf;
11111                              int32_t offset = instr & 0xff;
11112                              // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
11113                              strh(CurrentCond(),
11114                                   Best,
11115                                   Register(rt),
11116                                   MemOperand(Register(rn),
11117                                              minus,
11118                                              offset,
11119                                              Offset));
11120                              break;
11121                            }
11122                            case 0x00000200: {
11123                              // 0xf8200e00
11124                              if (((instr & 0xf0000) == 0xf0000)) {
11125                                UnallocatedT32(instr);
11126                                return;
11127                              }
11128                              UnimplementedT32_32("STRHT", instr);
11129                              break;
11130                            }
11131                          }
11132                          break;
11133                        }
11134                        case 0x00000d00: {
11135                          // 0xf8200d00
11136                          if (((instr & 0xf0000) == 0xf0000)) {
11137                            UnallocatedT32(instr);
11138                            return;
11139                          }
11140                          unsigned rt = (instr >> 12) & 0xf;
11141                          unsigned rn = (instr >> 16) & 0xf;
11142                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11143                          int32_t offset = instr & 0xff;
11144                          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
11145                          strh(CurrentCond(),
11146                               Best,
11147                               Register(rt),
11148                               MemOperand(Register(rn),
11149                                          sign,
11150                                          offset,
11151                                          PreIndex));
11152                          break;
11153                        }
11154                        default:
11155                          UnallocatedT32(instr);
11156                          break;
11157                      }
11158                      break;
11159                    }
11160                    case 0x00800000: {
11161                      // 0xf8800000
11162                      switch (instr & 0x00400000) {
11163                        case 0x00000000: {
11164                          // 0xf8800000
11165                          if (((instr & 0xf0000) == 0xf0000)) {
11166                            UnallocatedT32(instr);
11167                            return;
11168                          }
11169                          unsigned rt = (instr >> 12) & 0xf;
11170                          unsigned rn = (instr >> 16) & 0xf;
11171                          int32_t offset = instr & 0xfff;
11172                          if ((rt < kNumberOfT32LowRegisters) &&
11173                              (rn < kNumberOfT32LowRegisters) &&
11174                              ((offset >= 0) && (offset <= 31))) {
11175                            // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11176                            strb(CurrentCond(),
11177                                 Wide,
11178                                 Register(rt),
11179                                 MemOperand(Register(rn),
11180                                            plus,
11181                                            offset,
11182                                            Offset));
11183                          } else {
11184                            // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11185                            strb(CurrentCond(),
11186                                 Best,
11187                                 Register(rt),
11188                                 MemOperand(Register(rn),
11189                                            plus,
11190                                            offset,
11191                                            Offset));
11192                          }
11193                          break;
11194                        }
11195                        case 0x00400000: {
11196                          // 0xf8c00000
11197                          if (((instr & 0xf0000) == 0xf0000)) {
11198                            UnallocatedT32(instr);
11199                            return;
11200                          }
11201                          unsigned rt = (instr >> 12) & 0xf;
11202                          unsigned rn = (instr >> 16) & 0xf;
11203                          int32_t offset = instr & 0xfff;
11204                          if (((rt < kNumberOfT32LowRegisters) &&
11205                               (rn < kNumberOfT32LowRegisters) &&
11206                               ((offset >= 0) && (offset <= 124) &&
11207                                ((offset & 3) == 0))) ||
11208                              ((rt < kNumberOfT32LowRegisters) &&
11209                               (rn == sp.GetCode()) &&
11210                               ((offset >= 0) && (offset <= 1020) &&
11211                                ((offset & 3) == 0)))) {
11212                            // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
11213                            str(CurrentCond(),
11214                                Wide,
11215                                Register(rt),
11216                                MemOperand(Register(rn), plus, offset, Offset));
11217                          } else {
11218                            // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
11219                            str(CurrentCond(),
11220                                Best,
11221                                Register(rt),
11222                                MemOperand(Register(rn), plus, offset, Offset));
11223                          }
11224                          break;
11225                        }
11226                      }
11227                      break;
11228                    }
11229                    case 0x00a00000: {
11230                      // 0xf8a00000
11231                      if ((instr & 0x00400000) == 0x00000000) {
11232                        if (((instr & 0xf0000) == 0xf0000)) {
11233                          UnallocatedT32(instr);
11234                          return;
11235                        }
11236                        unsigned rt = (instr >> 12) & 0xf;
11237                        unsigned rn = (instr >> 16) & 0xf;
11238                        int32_t offset = instr & 0xfff;
11239                        if ((rt < kNumberOfT32LowRegisters) &&
11240                            (rn < kNumberOfT32LowRegisters) &&
11241                            ((offset >= 0) && (offset <= 62) &&
11242                             ((offset & 1) == 0))) {
11243                          // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11244                          strh(CurrentCond(),
11245                               Wide,
11246                               Register(rt),
11247                               MemOperand(Register(rn), plus, offset, Offset));
11248                        } else {
11249                          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11250                          strh(CurrentCond(),
11251                               Best,
11252                               Register(rt),
11253                               MemOperand(Register(rn), plus, offset, Offset));
11254                        }
11255                      } else {
11256                        UnallocatedT32(instr);
11257                      }
11258                      break;
11259                    }
11260                    case 0x01000000: {
11261                      // 0xf9000000
11262                      switch (instr & 0x0000000d) {
11263                        case 0x0000000d: {
11264                          // 0xf900000d
11265                          switch (instr & 0x00000002) {
11266                            case 0x00000000: {
11267                              // 0xf900000d
11268                              switch (instr & 0x00000f00) {
11269                                case 0x00000000: {
11270                                  // 0xf900000d
11271                                  DataType dt =
11272                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11273                                  if (dt.Is(kDataTypeValueInvalid)) {
11274                                    UnallocatedT32(instr);
11275                                    return;
11276                                  }
11277                                  Alignment align =
11278                                      Align_align_4_Decode((instr >> 4) & 0x3);
11279                                  if (dt.Is(kDataTypeValueInvalid) ||
11280                                      align.Is(kBadAlignment)) {
11281                                    UnallocatedT32(instr);
11282                                    return;
11283                                  }
11284                                  unsigned first =
11285                                      ExtractDRegister(instr, 22, 12);
11286                                  unsigned length;
11287                                  SpacingType spacing;
11288                                  switch ((instr >> 8) & 0xf) {
11289                                    default:
11290                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11291                                    case 0x0:
11292                                      length = 4;
11293                                      spacing = kSingle;
11294                                      break;
11295                                    case 0x1:
11296                                      length = 4;
11297                                      spacing = kDouble;
11298                                      break;
11299                                  }
11300                                  unsigned last =
11301                                      first +
11302                                      (length - 1) *
11303                                          (spacing == kSingle ? 1 : 2);
11304                                  TransferType transfer = kMultipleLanes;
11305                                  unsigned rn = (instr >> 16) & 0xf;
11306                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11307                                  vst4(CurrentCond(),
11308                                       dt,
11309                                       NeonRegisterList(DRegister(first),
11310                                                        DRegister(last),
11311                                                        spacing,
11312                                                        transfer),
11313                                       AlignedMemOperand(Register(rn),
11314                                                         align,
11315                                                         PostIndex));
11316                                  break;
11317                                }
11318                                case 0x00000100: {
11319                                  // 0xf900010d
11320                                  DataType dt =
11321                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11322                                  if (dt.Is(kDataTypeValueInvalid)) {
11323                                    UnallocatedT32(instr);
11324                                    return;
11325                                  }
11326                                  Alignment align =
11327                                      Align_align_4_Decode((instr >> 4) & 0x3);
11328                                  if (dt.Is(kDataTypeValueInvalid) ||
11329                                      align.Is(kBadAlignment)) {
11330                                    UnallocatedT32(instr);
11331                                    return;
11332                                  }
11333                                  unsigned first =
11334                                      ExtractDRegister(instr, 22, 12);
11335                                  unsigned length;
11336                                  SpacingType spacing;
11337                                  switch ((instr >> 8) & 0xf) {
11338                                    default:
11339                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11340                                    case 0x0:
11341                                      length = 4;
11342                                      spacing = kSingle;
11343                                      break;
11344                                    case 0x1:
11345                                      length = 4;
11346                                      spacing = kDouble;
11347                                      break;
11348                                  }
11349                                  unsigned last =
11350                                      first +
11351                                      (length - 1) *
11352                                          (spacing == kSingle ? 1 : 2);
11353                                  TransferType transfer = kMultipleLanes;
11354                                  unsigned rn = (instr >> 16) & 0xf;
11355                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11356                                  vst4(CurrentCond(),
11357                                       dt,
11358                                       NeonRegisterList(DRegister(first),
11359                                                        DRegister(last),
11360                                                        spacing,
11361                                                        transfer),
11362                                       AlignedMemOperand(Register(rn),
11363                                                         align,
11364                                                         PostIndex));
11365                                  break;
11366                                }
11367                                case 0x00000200: {
11368                                  // 0xf900020d
11369                                  if (((instr & 0xe20) == 0x620) ||
11370                                      ((instr & 0xf30) == 0xa30)) {
11371                                    UnallocatedT32(instr);
11372                                    return;
11373                                  }
11374                                  DataType dt =
11375                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11376                                  if (dt.Is(kDataTypeValueInvalid)) {
11377                                    UnallocatedT32(instr);
11378                                    return;
11379                                  }
11380                                  Alignment align =
11381                                      Align_align_5_Decode((instr >> 4) & 0x3);
11382                                  if (dt.Is(kDataTypeValueInvalid) ||
11383                                      align.Is(kBadAlignment)) {
11384                                    UnallocatedT32(instr);
11385                                    return;
11386                                  }
11387                                  unsigned first =
11388                                      ExtractDRegister(instr, 22, 12);
11389                                  unsigned length;
11390                                  SpacingType spacing = kSingle;
11391                                  switch ((instr >> 8) & 0xf) {
11392                                    default:
11393                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11394                                    case 0x7:
11395                                      length = 1;
11396                                      break;
11397                                    case 0xa:
11398                                      length = 2;
11399                                      break;
11400                                    case 0x6:
11401                                      length = 3;
11402                                      break;
11403                                    case 0x2:
11404                                      length = 4;
11405                                      break;
11406                                  }
11407                                  unsigned last = first + length - 1;
11408                                  TransferType transfer = kMultipleLanes;
11409                                  unsigned rn = (instr >> 16) & 0xf;
11410                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11411                                  vst1(CurrentCond(),
11412                                       dt,
11413                                       NeonRegisterList(DRegister(first),
11414                                                        DRegister(last),
11415                                                        spacing,
11416                                                        transfer),
11417                                       AlignedMemOperand(Register(rn),
11418                                                         align,
11419                                                         PostIndex));
11420                                  break;
11421                                }
11422                                case 0x00000300: {
11423                                  // 0xf900030d
11424                                  if (((instr & 0xe30) == 0x830)) {
11425                                    UnallocatedT32(instr);
11426                                    return;
11427                                  }
11428                                  DataType dt =
11429                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11430                                  if (dt.Is(kDataTypeValueInvalid)) {
11431                                    UnallocatedT32(instr);
11432                                    return;
11433                                  }
11434                                  Alignment align =
11435                                      Align_align_2_Decode((instr >> 4) & 0x3);
11436                                  if (dt.Is(kDataTypeValueInvalid) ||
11437                                      align.Is(kBadAlignment)) {
11438                                    UnallocatedT32(instr);
11439                                    return;
11440                                  }
11441                                  unsigned first =
11442                                      ExtractDRegister(instr, 22, 12);
11443                                  unsigned length;
11444                                  SpacingType spacing;
11445                                  switch ((instr >> 8) & 0xf) {
11446                                    default:
11447                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11448                                    case 0x8:
11449                                      length = 2;
11450                                      spacing = kSingle;
11451                                      break;
11452                                    case 0x9:
11453                                      length = 2;
11454                                      spacing = kDouble;
11455                                      break;
11456                                    case 0x3:
11457                                      length = 4;
11458                                      spacing = kSingle;
11459                                      break;
11460                                  }
11461                                  unsigned last =
11462                                      first +
11463                                      (length - 1) *
11464                                          (spacing == kSingle ? 1 : 2);
11465                                  TransferType transfer = kMultipleLanes;
11466                                  unsigned rn = (instr >> 16) & 0xf;
11467                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11468                                  vst2(CurrentCond(),
11469                                       dt,
11470                                       NeonRegisterList(DRegister(first),
11471                                                        DRegister(last),
11472                                                        spacing,
11473                                                        transfer),
11474                                       AlignedMemOperand(Register(rn),
11475                                                         align,
11476                                                         PostIndex));
11477                                  break;
11478                                }
11479                                case 0x00000400: {
11480                                  // 0xf900040d
11481                                  if (((instr & 0x20) == 0x20)) {
11482                                    UnallocatedT32(instr);
11483                                    return;
11484                                  }
11485                                  DataType dt =
11486                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11487                                  if (dt.Is(kDataTypeValueInvalid)) {
11488                                    UnallocatedT32(instr);
11489                                    return;
11490                                  }
11491                                  Alignment align =
11492                                      Align_align_3_Decode((instr >> 4) & 0x3);
11493                                  if (dt.Is(kDataTypeValueInvalid) ||
11494                                      align.Is(kBadAlignment)) {
11495                                    UnallocatedT32(instr);
11496                                    return;
11497                                  }
11498                                  unsigned first =
11499                                      ExtractDRegister(instr, 22, 12);
11500                                  unsigned length;
11501                                  SpacingType spacing;
11502                                  switch ((instr >> 8) & 0xf) {
11503                                    default:
11504                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11505                                    case 0x4:
11506                                      length = 3;
11507                                      spacing = kSingle;
11508                                      break;
11509                                    case 0x5:
11510                                      length = 3;
11511                                      spacing = kDouble;
11512                                      break;
11513                                  }
11514                                  unsigned last =
11515                                      first +
11516                                      (length - 1) *
11517                                          (spacing == kSingle ? 1 : 2);
11518                                  TransferType transfer = kMultipleLanes;
11519                                  unsigned rn = (instr >> 16) & 0xf;
11520                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11521                                  vst3(CurrentCond(),
11522                                       dt,
11523                                       NeonRegisterList(DRegister(first),
11524                                                        DRegister(last),
11525                                                        spacing,
11526                                                        transfer),
11527                                       AlignedMemOperand(Register(rn),
11528                                                         align,
11529                                                         PostIndex));
11530                                  break;
11531                                }
11532                                case 0x00000500: {
11533                                  // 0xf900050d
11534                                  if (((instr & 0x20) == 0x20)) {
11535                                    UnallocatedT32(instr);
11536                                    return;
11537                                  }
11538                                  DataType dt =
11539                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11540                                  if (dt.Is(kDataTypeValueInvalid)) {
11541                                    UnallocatedT32(instr);
11542                                    return;
11543                                  }
11544                                  Alignment align =
11545                                      Align_align_3_Decode((instr >> 4) & 0x3);
11546                                  if (dt.Is(kDataTypeValueInvalid) ||
11547                                      align.Is(kBadAlignment)) {
11548                                    UnallocatedT32(instr);
11549                                    return;
11550                                  }
11551                                  unsigned first =
11552                                      ExtractDRegister(instr, 22, 12);
11553                                  unsigned length;
11554                                  SpacingType spacing;
11555                                  switch ((instr >> 8) & 0xf) {
11556                                    default:
11557                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11558                                    case 0x4:
11559                                      length = 3;
11560                                      spacing = kSingle;
11561                                      break;
11562                                    case 0x5:
11563                                      length = 3;
11564                                      spacing = kDouble;
11565                                      break;
11566                                  }
11567                                  unsigned last =
11568                                      first +
11569                                      (length - 1) *
11570                                          (spacing == kSingle ? 1 : 2);
11571                                  TransferType transfer = kMultipleLanes;
11572                                  unsigned rn = (instr >> 16) & 0xf;
11573                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11574                                  vst3(CurrentCond(),
11575                                       dt,
11576                                       NeonRegisterList(DRegister(first),
11577                                                        DRegister(last),
11578                                                        spacing,
11579                                                        transfer),
11580                                       AlignedMemOperand(Register(rn),
11581                                                         align,
11582                                                         PostIndex));
11583                                  break;
11584                                }
11585                                case 0x00000600: {
11586                                  // 0xf900060d
11587                                  if (((instr & 0xe20) == 0x620) ||
11588                                      ((instr & 0xf30) == 0xa30)) {
11589                                    UnallocatedT32(instr);
11590                                    return;
11591                                  }
11592                                  DataType dt =
11593                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11594                                  if (dt.Is(kDataTypeValueInvalid)) {
11595                                    UnallocatedT32(instr);
11596                                    return;
11597                                  }
11598                                  Alignment align =
11599                                      Align_align_5_Decode((instr >> 4) & 0x3);
11600                                  if (dt.Is(kDataTypeValueInvalid) ||
11601                                      align.Is(kBadAlignment)) {
11602                                    UnallocatedT32(instr);
11603                                    return;
11604                                  }
11605                                  unsigned first =
11606                                      ExtractDRegister(instr, 22, 12);
11607                                  unsigned length;
11608                                  SpacingType spacing = kSingle;
11609                                  switch ((instr >> 8) & 0xf) {
11610                                    default:
11611                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11612                                    case 0x7:
11613                                      length = 1;
11614                                      break;
11615                                    case 0xa:
11616                                      length = 2;
11617                                      break;
11618                                    case 0x6:
11619                                      length = 3;
11620                                      break;
11621                                    case 0x2:
11622                                      length = 4;
11623                                      break;
11624                                  }
11625                                  unsigned last = first + length - 1;
11626                                  TransferType transfer = kMultipleLanes;
11627                                  unsigned rn = (instr >> 16) & 0xf;
11628                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11629                                  vst1(CurrentCond(),
11630                                       dt,
11631                                       NeonRegisterList(DRegister(first),
11632                                                        DRegister(last),
11633                                                        spacing,
11634                                                        transfer),
11635                                       AlignedMemOperand(Register(rn),
11636                                                         align,
11637                                                         PostIndex));
11638                                  break;
11639                                }
11640                                case 0x00000700: {
11641                                  // 0xf900070d
11642                                  if (((instr & 0xe20) == 0x620) ||
11643                                      ((instr & 0xf30) == 0xa30)) {
11644                                    UnallocatedT32(instr);
11645                                    return;
11646                                  }
11647                                  DataType dt =
11648                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11649                                  if (dt.Is(kDataTypeValueInvalid)) {
11650                                    UnallocatedT32(instr);
11651                                    return;
11652                                  }
11653                                  Alignment align =
11654                                      Align_align_5_Decode((instr >> 4) & 0x3);
11655                                  if (dt.Is(kDataTypeValueInvalid) ||
11656                                      align.Is(kBadAlignment)) {
11657                                    UnallocatedT32(instr);
11658                                    return;
11659                                  }
11660                                  unsigned first =
11661                                      ExtractDRegister(instr, 22, 12);
11662                                  unsigned length;
11663                                  SpacingType spacing = kSingle;
11664                                  switch ((instr >> 8) & 0xf) {
11665                                    default:
11666                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11667                                    case 0x7:
11668                                      length = 1;
11669                                      break;
11670                                    case 0xa:
11671                                      length = 2;
11672                                      break;
11673                                    case 0x6:
11674                                      length = 3;
11675                                      break;
11676                                    case 0x2:
11677                                      length = 4;
11678                                      break;
11679                                  }
11680                                  unsigned last = first + length - 1;
11681                                  TransferType transfer = kMultipleLanes;
11682                                  unsigned rn = (instr >> 16) & 0xf;
11683                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11684                                  vst1(CurrentCond(),
11685                                       dt,
11686                                       NeonRegisterList(DRegister(first),
11687                                                        DRegister(last),
11688                                                        spacing,
11689                                                        transfer),
11690                                       AlignedMemOperand(Register(rn),
11691                                                         align,
11692                                                         PostIndex));
11693                                  break;
11694                                }
11695                                case 0x00000800: {
11696                                  // 0xf900080d
11697                                  if (((instr & 0xe30) == 0x830)) {
11698                                    UnallocatedT32(instr);
11699                                    return;
11700                                  }
11701                                  DataType dt =
11702                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11703                                  if (dt.Is(kDataTypeValueInvalid)) {
11704                                    UnallocatedT32(instr);
11705                                    return;
11706                                  }
11707                                  Alignment align =
11708                                      Align_align_2_Decode((instr >> 4) & 0x3);
11709                                  if (dt.Is(kDataTypeValueInvalid) ||
11710                                      align.Is(kBadAlignment)) {
11711                                    UnallocatedT32(instr);
11712                                    return;
11713                                  }
11714                                  unsigned first =
11715                                      ExtractDRegister(instr, 22, 12);
11716                                  unsigned length;
11717                                  SpacingType spacing;
11718                                  switch ((instr >> 8) & 0xf) {
11719                                    default:
11720                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11721                                    case 0x8:
11722                                      length = 2;
11723                                      spacing = kSingle;
11724                                      break;
11725                                    case 0x9:
11726                                      length = 2;
11727                                      spacing = kDouble;
11728                                      break;
11729                                    case 0x3:
11730                                      length = 4;
11731                                      spacing = kSingle;
11732                                      break;
11733                                  }
11734                                  unsigned last =
11735                                      first +
11736                                      (length - 1) *
11737                                          (spacing == kSingle ? 1 : 2);
11738                                  TransferType transfer = kMultipleLanes;
11739                                  unsigned rn = (instr >> 16) & 0xf;
11740                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11741                                  vst2(CurrentCond(),
11742                                       dt,
11743                                       NeonRegisterList(DRegister(first),
11744                                                        DRegister(last),
11745                                                        spacing,
11746                                                        transfer),
11747                                       AlignedMemOperand(Register(rn),
11748                                                         align,
11749                                                         PostIndex));
11750                                  break;
11751                                }
11752                                case 0x00000900: {
11753                                  // 0xf900090d
11754                                  if (((instr & 0xe30) == 0x830)) {
11755                                    UnallocatedT32(instr);
11756                                    return;
11757                                  }
11758                                  DataType dt =
11759                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11760                                  if (dt.Is(kDataTypeValueInvalid)) {
11761                                    UnallocatedT32(instr);
11762                                    return;
11763                                  }
11764                                  Alignment align =
11765                                      Align_align_2_Decode((instr >> 4) & 0x3);
11766                                  if (dt.Is(kDataTypeValueInvalid) ||
11767                                      align.Is(kBadAlignment)) {
11768                                    UnallocatedT32(instr);
11769                                    return;
11770                                  }
11771                                  unsigned first =
11772                                      ExtractDRegister(instr, 22, 12);
11773                                  unsigned length;
11774                                  SpacingType spacing;
11775                                  switch ((instr >> 8) & 0xf) {
11776                                    default:
11777                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11778                                    case 0x8:
11779                                      length = 2;
11780                                      spacing = kSingle;
11781                                      break;
11782                                    case 0x9:
11783                                      length = 2;
11784                                      spacing = kDouble;
11785                                      break;
11786                                    case 0x3:
11787                                      length = 4;
11788                                      spacing = kSingle;
11789                                      break;
11790                                  }
11791                                  unsigned last =
11792                                      first +
11793                                      (length - 1) *
11794                                          (spacing == kSingle ? 1 : 2);
11795                                  TransferType transfer = kMultipleLanes;
11796                                  unsigned rn = (instr >> 16) & 0xf;
11797                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11798                                  vst2(CurrentCond(),
11799                                       dt,
11800                                       NeonRegisterList(DRegister(first),
11801                                                        DRegister(last),
11802                                                        spacing,
11803                                                        transfer),
11804                                       AlignedMemOperand(Register(rn),
11805                                                         align,
11806                                                         PostIndex));
11807                                  break;
11808                                }
11809                                case 0x00000a00: {
11810                                  // 0xf9000a0d
11811                                  if (((instr & 0xe20) == 0x620) ||
11812                                      ((instr & 0xf30) == 0xa30)) {
11813                                    UnallocatedT32(instr);
11814                                    return;
11815                                  }
11816                                  DataType dt =
11817                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11818                                  if (dt.Is(kDataTypeValueInvalid)) {
11819                                    UnallocatedT32(instr);
11820                                    return;
11821                                  }
11822                                  Alignment align =
11823                                      Align_align_5_Decode((instr >> 4) & 0x3);
11824                                  if (dt.Is(kDataTypeValueInvalid) ||
11825                                      align.Is(kBadAlignment)) {
11826                                    UnallocatedT32(instr);
11827                                    return;
11828                                  }
11829                                  unsigned first =
11830                                      ExtractDRegister(instr, 22, 12);
11831                                  unsigned length;
11832                                  SpacingType spacing = kSingle;
11833                                  switch ((instr >> 8) & 0xf) {
11834                                    default:
11835                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11836                                    case 0x7:
11837                                      length = 1;
11838                                      break;
11839                                    case 0xa:
11840                                      length = 2;
11841                                      break;
11842                                    case 0x6:
11843                                      length = 3;
11844                                      break;
11845                                    case 0x2:
11846                                      length = 4;
11847                                      break;
11848                                  }
11849                                  unsigned last = first + length - 1;
11850                                  TransferType transfer = kMultipleLanes;
11851                                  unsigned rn = (instr >> 16) & 0xf;
11852                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11853                                  vst1(CurrentCond(),
11854                                       dt,
11855                                       NeonRegisterList(DRegister(first),
11856                                                        DRegister(last),
11857                                                        spacing,
11858                                                        transfer),
11859                                       AlignedMemOperand(Register(rn),
11860                                                         align,
11861                                                         PostIndex));
11862                                  break;
11863                                }
11864                                default:
11865                                  UnallocatedT32(instr);
11866                                  break;
11867                              }
11868                              break;
11869                            }
11870                            case 0x00000002: {
11871                              // 0xf900000f
11872                              switch (instr & 0x00000f00) {
11873                                case 0x00000000: {
11874                                  // 0xf900000d
11875                                  DataType dt =
11876                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11877                                  if (dt.Is(kDataTypeValueInvalid)) {
11878                                    UnallocatedT32(instr);
11879                                    return;
11880                                  }
11881                                  Alignment align =
11882                                      Align_align_4_Decode((instr >> 4) & 0x3);
11883                                  if (dt.Is(kDataTypeValueInvalid) ||
11884                                      align.Is(kBadAlignment)) {
11885                                    UnallocatedT32(instr);
11886                                    return;
11887                                  }
11888                                  unsigned first =
11889                                      ExtractDRegister(instr, 22, 12);
11890                                  unsigned length;
11891                                  SpacingType spacing;
11892                                  switch ((instr >> 8) & 0xf) {
11893                                    default:
11894                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11895                                    case 0x0:
11896                                      length = 4;
11897                                      spacing = kSingle;
11898                                      break;
11899                                    case 0x1:
11900                                      length = 4;
11901                                      spacing = kDouble;
11902                                      break;
11903                                  }
11904                                  unsigned last =
11905                                      first +
11906                                      (length - 1) *
11907                                          (spacing == kSingle ? 1 : 2);
11908                                  TransferType transfer = kMultipleLanes;
11909                                  unsigned rn = (instr >> 16) & 0xf;
11910                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11911                                  vst4(CurrentCond(),
11912                                       dt,
11913                                       NeonRegisterList(DRegister(first),
11914                                                        DRegister(last),
11915                                                        spacing,
11916                                                        transfer),
11917                                       AlignedMemOperand(Register(rn),
11918                                                         align,
11919                                                         Offset));
11920                                  break;
11921                                }
11922                                case 0x00000100: {
11923                                  // 0xf900010d
11924                                  DataType dt =
11925                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11926                                  if (dt.Is(kDataTypeValueInvalid)) {
11927                                    UnallocatedT32(instr);
11928                                    return;
11929                                  }
11930                                  Alignment align =
11931                                      Align_align_4_Decode((instr >> 4) & 0x3);
11932                                  if (dt.Is(kDataTypeValueInvalid) ||
11933                                      align.Is(kBadAlignment)) {
11934                                    UnallocatedT32(instr);
11935                                    return;
11936                                  }
11937                                  unsigned first =
11938                                      ExtractDRegister(instr, 22, 12);
11939                                  unsigned length;
11940                                  SpacingType spacing;
11941                                  switch ((instr >> 8) & 0xf) {
11942                                    default:
11943                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11944                                    case 0x0:
11945                                      length = 4;
11946                                      spacing = kSingle;
11947                                      break;
11948                                    case 0x1:
11949                                      length = 4;
11950                                      spacing = kDouble;
11951                                      break;
11952                                  }
11953                                  unsigned last =
11954                                      first +
11955                                      (length - 1) *
11956                                          (spacing == kSingle ? 1 : 2);
11957                                  TransferType transfer = kMultipleLanes;
11958                                  unsigned rn = (instr >> 16) & 0xf;
11959                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11960                                  vst4(CurrentCond(),
11961                                       dt,
11962                                       NeonRegisterList(DRegister(first),
11963                                                        DRegister(last),
11964                                                        spacing,
11965                                                        transfer),
11966                                       AlignedMemOperand(Register(rn),
11967                                                         align,
11968                                                         Offset));
11969                                  break;
11970                                }
11971                                case 0x00000200: {
11972                                  // 0xf900020d
11973                                  if (((instr & 0xe20) == 0x620) ||
11974                                      ((instr & 0xf30) == 0xa30)) {
11975                                    UnallocatedT32(instr);
11976                                    return;
11977                                  }
11978                                  DataType dt =
11979                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11980                                  if (dt.Is(kDataTypeValueInvalid)) {
11981                                    UnallocatedT32(instr);
11982                                    return;
11983                                  }
11984                                  Alignment align =
11985                                      Align_align_5_Decode((instr >> 4) & 0x3);
11986                                  if (dt.Is(kDataTypeValueInvalid) ||
11987                                      align.Is(kBadAlignment)) {
11988                                    UnallocatedT32(instr);
11989                                    return;
11990                                  }
11991                                  unsigned first =
11992                                      ExtractDRegister(instr, 22, 12);
11993                                  unsigned length;
11994                                  SpacingType spacing = kSingle;
11995                                  switch ((instr >> 8) & 0xf) {
11996                                    default:
11997                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11998                                    case 0x7:
11999                                      length = 1;
12000                                      break;
12001                                    case 0xa:
12002                                      length = 2;
12003                                      break;
12004                                    case 0x6:
12005                                      length = 3;
12006                                      break;
12007                                    case 0x2:
12008                                      length = 4;
12009                                      break;
12010                                  }
12011                                  unsigned last = first + length - 1;
12012                                  TransferType transfer = kMultipleLanes;
12013                                  unsigned rn = (instr >> 16) & 0xf;
12014                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12015                                  vst1(CurrentCond(),
12016                                       dt,
12017                                       NeonRegisterList(DRegister(first),
12018                                                        DRegister(last),
12019                                                        spacing,
12020                                                        transfer),
12021                                       AlignedMemOperand(Register(rn),
12022                                                         align,
12023                                                         Offset));
12024                                  break;
12025                                }
12026                                case 0x00000300: {
12027                                  // 0xf900030d
12028                                  if (((instr & 0xe30) == 0x830)) {
12029                                    UnallocatedT32(instr);
12030                                    return;
12031                                  }
12032                                  DataType dt =
12033                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12034                                  if (dt.Is(kDataTypeValueInvalid)) {
12035                                    UnallocatedT32(instr);
12036                                    return;
12037                                  }
12038                                  Alignment align =
12039                                      Align_align_2_Decode((instr >> 4) & 0x3);
12040                                  if (dt.Is(kDataTypeValueInvalid) ||
12041                                      align.Is(kBadAlignment)) {
12042                                    UnallocatedT32(instr);
12043                                    return;
12044                                  }
12045                                  unsigned first =
12046                                      ExtractDRegister(instr, 22, 12);
12047                                  unsigned length;
12048                                  SpacingType spacing;
12049                                  switch ((instr >> 8) & 0xf) {
12050                                    default:
12051                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12052                                    case 0x8:
12053                                      length = 2;
12054                                      spacing = kSingle;
12055                                      break;
12056                                    case 0x9:
12057                                      length = 2;
12058                                      spacing = kDouble;
12059                                      break;
12060                                    case 0x3:
12061                                      length = 4;
12062                                      spacing = kSingle;
12063                                      break;
12064                                  }
12065                                  unsigned last =
12066                                      first +
12067                                      (length - 1) *
12068                                          (spacing == kSingle ? 1 : 2);
12069                                  TransferType transfer = kMultipleLanes;
12070                                  unsigned rn = (instr >> 16) & 0xf;
12071                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12072                                  vst2(CurrentCond(),
12073                                       dt,
12074                                       NeonRegisterList(DRegister(first),
12075                                                        DRegister(last),
12076                                                        spacing,
12077                                                        transfer),
12078                                       AlignedMemOperand(Register(rn),
12079                                                         align,
12080                                                         Offset));
12081                                  break;
12082                                }
12083                                case 0x00000400: {
12084                                  // 0xf900040d
12085                                  if (((instr & 0x20) == 0x20)) {
12086                                    UnallocatedT32(instr);
12087                                    return;
12088                                  }
12089                                  DataType dt =
12090                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12091                                  if (dt.Is(kDataTypeValueInvalid)) {
12092                                    UnallocatedT32(instr);
12093                                    return;
12094                                  }
12095                                  Alignment align =
12096                                      Align_align_3_Decode((instr >> 4) & 0x3);
12097                                  if (dt.Is(kDataTypeValueInvalid) ||
12098                                      align.Is(kBadAlignment)) {
12099                                    UnallocatedT32(instr);
12100                                    return;
12101                                  }
12102                                  unsigned first =
12103                                      ExtractDRegister(instr, 22, 12);
12104                                  unsigned length;
12105                                  SpacingType spacing;
12106                                  switch ((instr >> 8) & 0xf) {
12107                                    default:
12108                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12109                                    case 0x4:
12110                                      length = 3;
12111                                      spacing = kSingle;
12112                                      break;
12113                                    case 0x5:
12114                                      length = 3;
12115                                      spacing = kDouble;
12116                                      break;
12117                                  }
12118                                  unsigned last =
12119                                      first +
12120                                      (length - 1) *
12121                                          (spacing == kSingle ? 1 : 2);
12122                                  TransferType transfer = kMultipleLanes;
12123                                  unsigned rn = (instr >> 16) & 0xf;
12124                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12125                                  vst3(CurrentCond(),
12126                                       dt,
12127                                       NeonRegisterList(DRegister(first),
12128                                                        DRegister(last),
12129                                                        spacing,
12130                                                        transfer),
12131                                       AlignedMemOperand(Register(rn),
12132                                                         align,
12133                                                         Offset));
12134                                  break;
12135                                }
12136                                case 0x00000500: {
12137                                  // 0xf900050d
12138                                  if (((instr & 0x20) == 0x20)) {
12139                                    UnallocatedT32(instr);
12140                                    return;
12141                                  }
12142                                  DataType dt =
12143                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12144                                  if (dt.Is(kDataTypeValueInvalid)) {
12145                                    UnallocatedT32(instr);
12146                                    return;
12147                                  }
12148                                  Alignment align =
12149                                      Align_align_3_Decode((instr >> 4) & 0x3);
12150                                  if (dt.Is(kDataTypeValueInvalid) ||
12151                                      align.Is(kBadAlignment)) {
12152                                    UnallocatedT32(instr);
12153                                    return;
12154                                  }
12155                                  unsigned first =
12156                                      ExtractDRegister(instr, 22, 12);
12157                                  unsigned length;
12158                                  SpacingType spacing;
12159                                  switch ((instr >> 8) & 0xf) {
12160                                    default:
12161                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12162                                    case 0x4:
12163                                      length = 3;
12164                                      spacing = kSingle;
12165                                      break;
12166                                    case 0x5:
12167                                      length = 3;
12168                                      spacing = kDouble;
12169                                      break;
12170                                  }
12171                                  unsigned last =
12172                                      first +
12173                                      (length - 1) *
12174                                          (spacing == kSingle ? 1 : 2);
12175                                  TransferType transfer = kMultipleLanes;
12176                                  unsigned rn = (instr >> 16) & 0xf;
12177                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12178                                  vst3(CurrentCond(),
12179                                       dt,
12180                                       NeonRegisterList(DRegister(first),
12181                                                        DRegister(last),
12182                                                        spacing,
12183                                                        transfer),
12184                                       AlignedMemOperand(Register(rn),
12185                                                         align,
12186                                                         Offset));
12187                                  break;
12188                                }
12189                                case 0x00000600: {
12190                                  // 0xf900060d
12191                                  if (((instr & 0xe20) == 0x620) ||
12192                                      ((instr & 0xf30) == 0xa30)) {
12193                                    UnallocatedT32(instr);
12194                                    return;
12195                                  }
12196                                  DataType dt =
12197                                      Dt_size_6_Decode((instr >> 6) & 0x3);
12198                                  if (dt.Is(kDataTypeValueInvalid)) {
12199                                    UnallocatedT32(instr);
12200                                    return;
12201                                  }
12202                                  Alignment align =
12203                                      Align_align_5_Decode((instr >> 4) & 0x3);
12204                                  if (dt.Is(kDataTypeValueInvalid) ||
12205                                      align.Is(kBadAlignment)) {
12206                                    UnallocatedT32(instr);
12207                                    return;
12208                                  }
12209                                  unsigned first =
12210                                      ExtractDRegister(instr, 22, 12);
12211                                  unsigned length;
12212                                  SpacingType spacing = kSingle;
12213                                  switch ((instr >> 8) & 0xf) {
12214                                    default:
12215                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12216                                    case 0x7:
12217                                      length = 1;
12218                                      break;
12219                                    case 0xa:
12220                                      length = 2;
12221                                      break;
12222                                    case 0x6:
12223                                      length = 3;
12224                                      break;
12225                                    case 0x2:
12226                                      length = 4;
12227                                      break;
12228                                  }
12229                                  unsigned last = first + length - 1;
12230                                  TransferType transfer = kMultipleLanes;
12231                                  unsigned rn = (instr >> 16) & 0xf;
12232                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12233                                  vst1(CurrentCond(),
12234                                       dt,
12235                                       NeonRegisterList(DRegister(first),
12236                                                        DRegister(last),
12237                                                        spacing,
12238                                                        transfer),
12239                                       AlignedMemOperand(Register(rn),
12240                                                         align,
12241                                                         Offset));
12242                                  break;
12243                                }
12244                                case 0x00000700: {
12245                                  // 0xf900070d
12246                                  if (((instr & 0xe20) == 0x620) ||
12247                                      ((instr & 0xf30) == 0xa30)) {
12248                                    UnallocatedT32(instr);
12249                                    return;
12250                                  }
12251                                  DataType dt =
12252                                      Dt_size_6_Decode((instr >> 6) & 0x3);
12253                                  if (dt.Is(kDataTypeValueInvalid)) {
12254                                    UnallocatedT32(instr);
12255                                    return;
12256                                  }
12257                                  Alignment align =
12258                                      Align_align_5_Decode((instr >> 4) & 0x3);
12259                                  if (dt.Is(kDataTypeValueInvalid) ||
12260                                      align.Is(kBadAlignment)) {
12261                                    UnallocatedT32(instr);
12262                                    return;
12263                                  }
12264                                  unsigned first =
12265                                      ExtractDRegister(instr, 22, 12);
12266                                  unsigned length;
12267                                  SpacingType spacing = kSingle;
12268                                  switch ((instr >> 8) & 0xf) {
12269                                    default:
12270                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12271                                    case 0x7:
12272                                      length = 1;
12273                                      break;
12274                                    case 0xa:
12275                                      length = 2;
12276                                      break;
12277                                    case 0x6:
12278                                      length = 3;
12279                                      break;
12280                                    case 0x2:
12281                                      length = 4;
12282                                      break;
12283                                  }
12284                                  unsigned last = first + length - 1;
12285                                  TransferType transfer = kMultipleLanes;
12286                                  unsigned rn = (instr >> 16) & 0xf;
12287                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12288                                  vst1(CurrentCond(),
12289                                       dt,
12290                                       NeonRegisterList(DRegister(first),
12291                                                        DRegister(last),
12292                                                        spacing,
12293                                                        transfer),
12294                                       AlignedMemOperand(Register(rn),
12295                                                         align,
12296                                                         Offset));
12297                                  break;
12298                                }
12299                                case 0x00000800: {
12300                                  // 0xf900080d
12301                                  if (((instr & 0xe30) == 0x830)) {
12302                                    UnallocatedT32(instr);
12303                                    return;
12304                                  }
12305                                  DataType dt =
12306                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12307                                  if (dt.Is(kDataTypeValueInvalid)) {
12308                                    UnallocatedT32(instr);
12309                                    return;
12310                                  }
12311                                  Alignment align =
12312                                      Align_align_2_Decode((instr >> 4) & 0x3);
12313                                  if (dt.Is(kDataTypeValueInvalid) ||
12314                                      align.Is(kBadAlignment)) {
12315                                    UnallocatedT32(instr);
12316                                    return;
12317                                  }
12318                                  unsigned first =
12319                                      ExtractDRegister(instr, 22, 12);
12320                                  unsigned length;
12321                                  SpacingType spacing;
12322                                  switch ((instr >> 8) & 0xf) {
12323                                    default:
12324                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12325                                    case 0x8:
12326                                      length = 2;
12327                                      spacing = kSingle;
12328                                      break;
12329                                    case 0x9:
12330                                      length = 2;
12331                                      spacing = kDouble;
12332                                      break;
12333                                    case 0x3:
12334                                      length = 4;
12335                                      spacing = kSingle;
12336                                      break;
12337                                  }
12338                                  unsigned last =
12339                                      first +
12340                                      (length - 1) *
12341                                          (spacing == kSingle ? 1 : 2);
12342                                  TransferType transfer = kMultipleLanes;
12343                                  unsigned rn = (instr >> 16) & 0xf;
12344                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12345                                  vst2(CurrentCond(),
12346                                       dt,
12347                                       NeonRegisterList(DRegister(first),
12348                                                        DRegister(last),
12349                                                        spacing,
12350                                                        transfer),
12351                                       AlignedMemOperand(Register(rn),
12352                                                         align,
12353                                                         Offset));
12354                                  break;
12355                                }
12356                                case 0x00000900: {
12357                                  // 0xf900090d
12358                                  if (((instr & 0xe30) == 0x830)) {
12359                                    UnallocatedT32(instr);
12360                                    return;
12361                                  }
12362                                  DataType dt =
12363                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12364                                  if (dt.Is(kDataTypeValueInvalid)) {
12365                                    UnallocatedT32(instr);
12366                                    return;
12367                                  }
12368                                  Alignment align =
12369                                      Align_align_2_Decode((instr >> 4) & 0x3);
12370                                  if (dt.Is(kDataTypeValueInvalid) ||
12371                                      align.Is(kBadAlignment)) {
12372                                    UnallocatedT32(instr);
12373                                    return;
12374                                  }
12375                                  unsigned first =
12376                                      ExtractDRegister(instr, 22, 12);
12377                                  unsigned length;
12378                                  SpacingType spacing;
12379                                  switch ((instr >> 8) & 0xf) {
12380                                    default:
12381                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12382                                    case 0x8:
12383                                      length = 2;
12384                                      spacing = kSingle;
12385                                      break;
12386                                    case 0x9:
12387                                      length = 2;
12388                                      spacing = kDouble;
12389                                      break;
12390                                    case 0x3:
12391                                      length = 4;
12392                                      spacing = kSingle;
12393                                      break;
12394                                  }
12395                                  unsigned last =
12396                                      first +
12397                                      (length - 1) *
12398                                          (spacing == kSingle ? 1 : 2);
12399                                  TransferType transfer = kMultipleLanes;
12400                                  unsigned rn = (instr >> 16) & 0xf;
12401                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12402                                  vst2(CurrentCond(),
12403                                       dt,
12404                                       NeonRegisterList(DRegister(first),
12405                                                        DRegister(last),
12406                                                        spacing,
12407                                                        transfer),
12408                                       AlignedMemOperand(Register(rn),
12409                                                         align,
12410                                                         Offset));
12411                                  break;
12412                                }
12413                                case 0x00000a00: {
12414                                  // 0xf9000a0d
12415                                  if (((instr & 0xe20) == 0x620) ||
12416                                      ((instr & 0xf30) == 0xa30)) {
12417                                    UnallocatedT32(instr);
12418                                    return;
12419                                  }
12420                                  DataType dt =
12421                                      Dt_size_6_Decode((instr >> 6) & 0x3);
12422                                  if (dt.Is(kDataTypeValueInvalid)) {
12423                                    UnallocatedT32(instr);
12424                                    return;
12425                                  }
12426                                  Alignment align =
12427                                      Align_align_5_Decode((instr >> 4) & 0x3);
12428                                  if (dt.Is(kDataTypeValueInvalid) ||
12429                                      align.Is(kBadAlignment)) {
12430                                    UnallocatedT32(instr);
12431                                    return;
12432                                  }
12433                                  unsigned first =
12434                                      ExtractDRegister(instr, 22, 12);
12435                                  unsigned length;
12436                                  SpacingType spacing = kSingle;
12437                                  switch ((instr >> 8) & 0xf) {
12438                                    default:
12439                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12440                                    case 0x7:
12441                                      length = 1;
12442                                      break;
12443                                    case 0xa:
12444                                      length = 2;
12445                                      break;
12446                                    case 0x6:
12447                                      length = 3;
12448                                      break;
12449                                    case 0x2:
12450                                      length = 4;
12451                                      break;
12452                                  }
12453                                  unsigned last = first + length - 1;
12454                                  TransferType transfer = kMultipleLanes;
12455                                  unsigned rn = (instr >> 16) & 0xf;
12456                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12457                                  vst1(CurrentCond(),
12458                                       dt,
12459                                       NeonRegisterList(DRegister(first),
12460                                                        DRegister(last),
12461                                                        spacing,
12462                                                        transfer),
12463                                       AlignedMemOperand(Register(rn),
12464                                                         align,
12465                                                         Offset));
12466                                  break;
12467                                }
12468                                default:
12469                                  UnallocatedT32(instr);
12470                                  break;
12471                              }
12472                              break;
12473                            }
12474                          }
12475                          break;
12476                        }
12477                        default: {
12478                          switch (instr & 0x00000f00) {
12479                            case 0x00000000: {
12480                              // 0xf9000000
12481                              if (((instr & 0xd) == 0xd)) {
12482                                UnallocatedT32(instr);
12483                                return;
12484                              }
12485                              DataType dt =
12486                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12487                              if (dt.Is(kDataTypeValueInvalid)) {
12488                                UnallocatedT32(instr);
12489                                return;
12490                              }
12491                              Alignment align =
12492                                  Align_align_4_Decode((instr >> 4) & 0x3);
12493                              if (dt.Is(kDataTypeValueInvalid) ||
12494                                  align.Is(kBadAlignment)) {
12495                                UnallocatedT32(instr);
12496                                return;
12497                              }
12498                              unsigned first = ExtractDRegister(instr, 22, 12);
12499                              unsigned length;
12500                              SpacingType spacing;
12501                              switch ((instr >> 8) & 0xf) {
12502                                default:
12503                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12504                                case 0x0:
12505                                  length = 4;
12506                                  spacing = kSingle;
12507                                  break;
12508                                case 0x1:
12509                                  length = 4;
12510                                  spacing = kDouble;
12511                                  break;
12512                              }
12513                              unsigned last =
12514                                  first +
12515                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12516                              TransferType transfer = kMultipleLanes;
12517                              unsigned rn = (instr >> 16) & 0xf;
12518                              unsigned rm = instr & 0xf;
12519                              // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12520                              vst4(CurrentCond(),
12521                                   dt,
12522                                   NeonRegisterList(DRegister(first),
12523                                                    DRegister(last),
12524                                                    spacing,
12525                                                    transfer),
12526                                   AlignedMemOperand(Register(rn),
12527                                                     align,
12528                                                     Register(rm),
12529                                                     PostIndex));
12530                              break;
12531                            }
12532                            case 0x00000100: {
12533                              // 0xf9000100
12534                              if (((instr & 0xd) == 0xd)) {
12535                                UnallocatedT32(instr);
12536                                return;
12537                              }
12538                              DataType dt =
12539                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12540                              if (dt.Is(kDataTypeValueInvalid)) {
12541                                UnallocatedT32(instr);
12542                                return;
12543                              }
12544                              Alignment align =
12545                                  Align_align_4_Decode((instr >> 4) & 0x3);
12546                              if (dt.Is(kDataTypeValueInvalid) ||
12547                                  align.Is(kBadAlignment)) {
12548                                UnallocatedT32(instr);
12549                                return;
12550                              }
12551                              unsigned first = ExtractDRegister(instr, 22, 12);
12552                              unsigned length;
12553                              SpacingType spacing;
12554                              switch ((instr >> 8) & 0xf) {
12555                                default:
12556                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12557                                case 0x0:
12558                                  length = 4;
12559                                  spacing = kSingle;
12560                                  break;
12561                                case 0x1:
12562                                  length = 4;
12563                                  spacing = kDouble;
12564                                  break;
12565                              }
12566                              unsigned last =
12567                                  first +
12568                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12569                              TransferType transfer = kMultipleLanes;
12570                              unsigned rn = (instr >> 16) & 0xf;
12571                              unsigned rm = instr & 0xf;
12572                              // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12573                              vst4(CurrentCond(),
12574                                   dt,
12575                                   NeonRegisterList(DRegister(first),
12576                                                    DRegister(last),
12577                                                    spacing,
12578                                                    transfer),
12579                                   AlignedMemOperand(Register(rn),
12580                                                     align,
12581                                                     Register(rm),
12582                                                     PostIndex));
12583                              break;
12584                            }
12585                            case 0x00000200: {
12586                              // 0xf9000200
12587                              if (((instr & 0xd) == 0xd) ||
12588                                  ((instr & 0xe20) == 0x620) ||
12589                                  ((instr & 0xf30) == 0xa30)) {
12590                                UnallocatedT32(instr);
12591                                return;
12592                              }
12593                              DataType dt =
12594                                  Dt_size_6_Decode((instr >> 6) & 0x3);
12595                              if (dt.Is(kDataTypeValueInvalid)) {
12596                                UnallocatedT32(instr);
12597                                return;
12598                              }
12599                              Alignment align =
12600                                  Align_align_5_Decode((instr >> 4) & 0x3);
12601                              if (dt.Is(kDataTypeValueInvalid) ||
12602                                  align.Is(kBadAlignment)) {
12603                                UnallocatedT32(instr);
12604                                return;
12605                              }
12606                              unsigned first = ExtractDRegister(instr, 22, 12);
12607                              unsigned length;
12608                              SpacingType spacing = kSingle;
12609                              switch ((instr >> 8) & 0xf) {
12610                                default:
12611                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12612                                case 0x7:
12613                                  length = 1;
12614                                  break;
12615                                case 0xa:
12616                                  length = 2;
12617                                  break;
12618                                case 0x6:
12619                                  length = 3;
12620                                  break;
12621                                case 0x2:
12622                                  length = 4;
12623                                  break;
12624                              }
12625                              unsigned last = first + length - 1;
12626                              TransferType transfer = kMultipleLanes;
12627                              unsigned rn = (instr >> 16) & 0xf;
12628                              unsigned rm = instr & 0xf;
12629                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12630                              vst1(CurrentCond(),
12631                                   dt,
12632                                   NeonRegisterList(DRegister(first),
12633                                                    DRegister(last),
12634                                                    spacing,
12635                                                    transfer),
12636                                   AlignedMemOperand(Register(rn),
12637                                                     align,
12638                                                     Register(rm),
12639                                                     PostIndex));
12640                              break;
12641                            }
12642                            case 0x00000300: {
12643                              // 0xf9000300
12644                              if (((instr & 0xd) == 0xd) ||
12645                                  ((instr & 0xe30) == 0x830)) {
12646                                UnallocatedT32(instr);
12647                                return;
12648                              }
12649                              DataType dt =
12650                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12651                              if (dt.Is(kDataTypeValueInvalid)) {
12652                                UnallocatedT32(instr);
12653                                return;
12654                              }
12655                              Alignment align =
12656                                  Align_align_2_Decode((instr >> 4) & 0x3);
12657                              if (dt.Is(kDataTypeValueInvalid) ||
12658                                  align.Is(kBadAlignment)) {
12659                                UnallocatedT32(instr);
12660                                return;
12661                              }
12662                              unsigned first = ExtractDRegister(instr, 22, 12);
12663                              unsigned length;
12664                              SpacingType spacing;
12665                              switch ((instr >> 8) & 0xf) {
12666                                default:
12667                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12668                                case 0x8:
12669                                  length = 2;
12670                                  spacing = kSingle;
12671                                  break;
12672                                case 0x9:
12673                                  length = 2;
12674                                  spacing = kDouble;
12675                                  break;
12676                                case 0x3:
12677                                  length = 4;
12678                                  spacing = kSingle;
12679                                  break;
12680                              }
12681                              unsigned last =
12682                                  first +
12683                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12684                              TransferType transfer = kMultipleLanes;
12685                              unsigned rn = (instr >> 16) & 0xf;
12686                              unsigned rm = instr & 0xf;
12687                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12688                              vst2(CurrentCond(),
12689                                   dt,
12690                                   NeonRegisterList(DRegister(first),
12691                                                    DRegister(last),
12692                                                    spacing,
12693                                                    transfer),
12694                                   AlignedMemOperand(Register(rn),
12695                                                     align,
12696                                                     Register(rm),
12697                                                     PostIndex));
12698                              break;
12699                            }
12700                            case 0x00000400: {
12701                              // 0xf9000400
12702                              if (((instr & 0xd) == 0xd) ||
12703                                  ((instr & 0x20) == 0x20)) {
12704                                UnallocatedT32(instr);
12705                                return;
12706                              }
12707                              DataType dt =
12708                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12709                              if (dt.Is(kDataTypeValueInvalid)) {
12710                                UnallocatedT32(instr);
12711                                return;
12712                              }
12713                              Alignment align =
12714                                  Align_align_3_Decode((instr >> 4) & 0x3);
12715                              if (dt.Is(kDataTypeValueInvalid) ||
12716                                  align.Is(kBadAlignment)) {
12717                                UnallocatedT32(instr);
12718                                return;
12719                              }
12720                              unsigned first = ExtractDRegister(instr, 22, 12);
12721                              unsigned length;
12722                              SpacingType spacing;
12723                              switch ((instr >> 8) & 0xf) {
12724                                default:
12725                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12726                                case 0x4:
12727                                  length = 3;
12728                                  spacing = kSingle;
12729                                  break;
12730                                case 0x5:
12731                                  length = 3;
12732                                  spacing = kDouble;
12733                                  break;
12734                              }
12735                              unsigned last =
12736                                  first +
12737                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12738                              TransferType transfer = kMultipleLanes;
12739                              unsigned rn = (instr >> 16) & 0xf;
12740                              unsigned rm = instr & 0xf;
12741                              // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12742                              vst3(CurrentCond(),
12743                                   dt,
12744                                   NeonRegisterList(DRegister(first),
12745                                                    DRegister(last),
12746                                                    spacing,
12747                                                    transfer),
12748                                   AlignedMemOperand(Register(rn),
12749                                                     align,
12750                                                     Register(rm),
12751                                                     PostIndex));
12752                              break;
12753                            }
12754                            case 0x00000500: {
12755                              // 0xf9000500
12756                              if (((instr & 0xd) == 0xd) ||
12757                                  ((instr & 0x20) == 0x20)) {
12758                                UnallocatedT32(instr);
12759                                return;
12760                              }
12761                              DataType dt =
12762                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12763                              if (dt.Is(kDataTypeValueInvalid)) {
12764                                UnallocatedT32(instr);
12765                                return;
12766                              }
12767                              Alignment align =
12768                                  Align_align_3_Decode((instr >> 4) & 0x3);
12769                              if (dt.Is(kDataTypeValueInvalid) ||
12770                                  align.Is(kBadAlignment)) {
12771                                UnallocatedT32(instr);
12772                                return;
12773                              }
12774                              unsigned first = ExtractDRegister(instr, 22, 12);
12775                              unsigned length;
12776                              SpacingType spacing;
12777                              switch ((instr >> 8) & 0xf) {
12778                                default:
12779                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12780                                case 0x4:
12781                                  length = 3;
12782                                  spacing = kSingle;
12783                                  break;
12784                                case 0x5:
12785                                  length = 3;
12786                                  spacing = kDouble;
12787                                  break;
12788                              }
12789                              unsigned last =
12790                                  first +
12791                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12792                              TransferType transfer = kMultipleLanes;
12793                              unsigned rn = (instr >> 16) & 0xf;
12794                              unsigned rm = instr & 0xf;
12795                              // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12796                              vst3(CurrentCond(),
12797                                   dt,
12798                                   NeonRegisterList(DRegister(first),
12799                                                    DRegister(last),
12800                                                    spacing,
12801                                                    transfer),
12802                                   AlignedMemOperand(Register(rn),
12803                                                     align,
12804                                                     Register(rm),
12805                                                     PostIndex));
12806                              break;
12807                            }
12808                            case 0x00000600: {
12809                              // 0xf9000600
12810                              if (((instr & 0xd) == 0xd) ||
12811                                  ((instr & 0xe20) == 0x620) ||
12812                                  ((instr & 0xf30) == 0xa30)) {
12813                                UnallocatedT32(instr);
12814                                return;
12815                              }
12816                              DataType dt =
12817                                  Dt_size_6_Decode((instr >> 6) & 0x3);
12818                              if (dt.Is(kDataTypeValueInvalid)) {
12819                                UnallocatedT32(instr);
12820                                return;
12821                              }
12822                              Alignment align =
12823                                  Align_align_5_Decode((instr >> 4) & 0x3);
12824                              if (dt.Is(kDataTypeValueInvalid) ||
12825                                  align.Is(kBadAlignment)) {
12826                                UnallocatedT32(instr);
12827                                return;
12828                              }
12829                              unsigned first = ExtractDRegister(instr, 22, 12);
12830                              unsigned length;
12831                              SpacingType spacing = kSingle;
12832                              switch ((instr >> 8) & 0xf) {
12833                                default:
12834                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12835                                case 0x7:
12836                                  length = 1;
12837                                  break;
12838                                case 0xa:
12839                                  length = 2;
12840                                  break;
12841                                case 0x6:
12842                                  length = 3;
12843                                  break;
12844                                case 0x2:
12845                                  length = 4;
12846                                  break;
12847                              }
12848                              unsigned last = first + length - 1;
12849                              TransferType transfer = kMultipleLanes;
12850                              unsigned rn = (instr >> 16) & 0xf;
12851                              unsigned rm = instr & 0xf;
12852                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12853                              vst1(CurrentCond(),
12854                                   dt,
12855                                   NeonRegisterList(DRegister(first),
12856                                                    DRegister(last),
12857                                                    spacing,
12858                                                    transfer),
12859                                   AlignedMemOperand(Register(rn),
12860                                                     align,
12861                                                     Register(rm),
12862                                                     PostIndex));
12863                              break;
12864                            }
12865                            case 0x00000700: {
12866                              // 0xf9000700
12867                              if (((instr & 0xd) == 0xd) ||
12868                                  ((instr & 0xe20) == 0x620) ||
12869                                  ((instr & 0xf30) == 0xa30)) {
12870                                UnallocatedT32(instr);
12871                                return;
12872                              }
12873                              DataType dt =
12874                                  Dt_size_6_Decode((instr >> 6) & 0x3);
12875                              if (dt.Is(kDataTypeValueInvalid)) {
12876                                UnallocatedT32(instr);
12877                                return;
12878                              }
12879                              Alignment align =
12880                                  Align_align_5_Decode((instr >> 4) & 0x3);
12881                              if (dt.Is(kDataTypeValueInvalid) ||
12882                                  align.Is(kBadAlignment)) {
12883                                UnallocatedT32(instr);
12884                                return;
12885                              }
12886                              unsigned first = ExtractDRegister(instr, 22, 12);
12887                              unsigned length;
12888                              SpacingType spacing = kSingle;
12889                              switch ((instr >> 8) & 0xf) {
12890                                default:
12891                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12892                                case 0x7:
12893                                  length = 1;
12894                                  break;
12895                                case 0xa:
12896                                  length = 2;
12897                                  break;
12898                                case 0x6:
12899                                  length = 3;
12900                                  break;
12901                                case 0x2:
12902                                  length = 4;
12903                                  break;
12904                              }
12905                              unsigned last = first + length - 1;
12906                              TransferType transfer = kMultipleLanes;
12907                              unsigned rn = (instr >> 16) & 0xf;
12908                              unsigned rm = instr & 0xf;
12909                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12910                              vst1(CurrentCond(),
12911                                   dt,
12912                                   NeonRegisterList(DRegister(first),
12913                                                    DRegister(last),
12914                                                    spacing,
12915                                                    transfer),
12916                                   AlignedMemOperand(Register(rn),
12917                                                     align,
12918                                                     Register(rm),
12919                                                     PostIndex));
12920                              break;
12921                            }
12922                            case 0x00000800: {
12923                              // 0xf9000800
12924                              if (((instr & 0xd) == 0xd) ||
12925                                  ((instr & 0xe30) == 0x830)) {
12926                                UnallocatedT32(instr);
12927                                return;
12928                              }
12929                              DataType dt =
12930                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12931                              if (dt.Is(kDataTypeValueInvalid)) {
12932                                UnallocatedT32(instr);
12933                                return;
12934                              }
12935                              Alignment align =
12936                                  Align_align_2_Decode((instr >> 4) & 0x3);
12937                              if (dt.Is(kDataTypeValueInvalid) ||
12938                                  align.Is(kBadAlignment)) {
12939                                UnallocatedT32(instr);
12940                                return;
12941                              }
12942                              unsigned first = ExtractDRegister(instr, 22, 12);
12943                              unsigned length;
12944                              SpacingType spacing;
12945                              switch ((instr >> 8) & 0xf) {
12946                                default:
12947                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12948                                case 0x8:
12949                                  length = 2;
12950                                  spacing = kSingle;
12951                                  break;
12952                                case 0x9:
12953                                  length = 2;
12954                                  spacing = kDouble;
12955                                  break;
12956                                case 0x3:
12957                                  length = 4;
12958                                  spacing = kSingle;
12959                                  break;
12960                              }
12961                              unsigned last =
12962                                  first +
12963                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12964                              TransferType transfer = kMultipleLanes;
12965                              unsigned rn = (instr >> 16) & 0xf;
12966                              unsigned rm = instr & 0xf;
12967                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12968                              vst2(CurrentCond(),
12969                                   dt,
12970                                   NeonRegisterList(DRegister(first),
12971                                                    DRegister(last),
12972                                                    spacing,
12973                                                    transfer),
12974                                   AlignedMemOperand(Register(rn),
12975                                                     align,
12976                                                     Register(rm),
12977                                                     PostIndex));
12978                              break;
12979                            }
12980                            case 0x00000900: {
12981                              // 0xf9000900
12982                              if (((instr & 0xd) == 0xd) ||
12983                                  ((instr & 0xe30) == 0x830)) {
12984                                UnallocatedT32(instr);
12985                                return;
12986                              }
12987                              DataType dt =
12988                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12989                              if (dt.Is(kDataTypeValueInvalid)) {
12990                                UnallocatedT32(instr);
12991                                return;
12992                              }
12993                              Alignment align =
12994                                  Align_align_2_Decode((instr >> 4) & 0x3);
12995                              if (dt.Is(kDataTypeValueInvalid) ||
12996                                  align.Is(kBadAlignment)) {
12997                                UnallocatedT32(instr);
12998                                return;
12999                              }
13000                              unsigned first = ExtractDRegister(instr, 22, 12);
13001                              unsigned length;
13002                              SpacingType spacing;
13003                              switch ((instr >> 8) & 0xf) {
13004                                default:
13005                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
13006                                case 0x8:
13007                                  length = 2;
13008                                  spacing = kSingle;
13009                                  break;
13010                                case 0x9:
13011                                  length = 2;
13012                                  spacing = kDouble;
13013                                  break;
13014                                case 0x3:
13015                                  length = 4;
13016                                  spacing = kSingle;
13017                                  break;
13018                              }
13019                              unsigned last =
13020                                  first +
13021                                  (length - 1) * (spacing == kSingle ? 1 : 2);
13022                              TransferType transfer = kMultipleLanes;
13023                              unsigned rn = (instr >> 16) & 0xf;
13024                              unsigned rm = instr & 0xf;
13025                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
13026                              vst2(CurrentCond(),
13027                                   dt,
13028                                   NeonRegisterList(DRegister(first),
13029                                                    DRegister(last),
13030                                                    spacing,
13031                                                    transfer),
13032                                   AlignedMemOperand(Register(rn),
13033                                                     align,
13034                                                     Register(rm),
13035                                                     PostIndex));
13036                              break;
13037                            }
13038                            case 0x00000a00: {
13039                              // 0xf9000a00
13040                              if (((instr & 0xd) == 0xd) ||
13041                                  ((instr & 0xe20) == 0x620) ||
13042                                  ((instr & 0xf30) == 0xa30)) {
13043                                UnallocatedT32(instr);
13044                                return;
13045                              }
13046                              DataType dt =
13047                                  Dt_size_6_Decode((instr >> 6) & 0x3);
13048                              if (dt.Is(kDataTypeValueInvalid)) {
13049                                UnallocatedT32(instr);
13050                                return;
13051                              }
13052                              Alignment align =
13053                                  Align_align_5_Decode((instr >> 4) & 0x3);
13054                              if (dt.Is(kDataTypeValueInvalid) ||
13055                                  align.Is(kBadAlignment)) {
13056                                UnallocatedT32(instr);
13057                                return;
13058                              }
13059                              unsigned first = ExtractDRegister(instr, 22, 12);
13060                              unsigned length;
13061                              SpacingType spacing = kSingle;
13062                              switch ((instr >> 8) & 0xf) {
13063                                default:
13064                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
13065                                case 0x7:
13066                                  length = 1;
13067                                  break;
13068                                case 0xa:
13069                                  length = 2;
13070                                  break;
13071                                case 0x6:
13072                                  length = 3;
13073                                  break;
13074                                case 0x2:
13075                                  length = 4;
13076                                  break;
13077                              }
13078                              unsigned last = first + length - 1;
13079                              TransferType transfer = kMultipleLanes;
13080                              unsigned rn = (instr >> 16) & 0xf;
13081                              unsigned rm = instr & 0xf;
13082                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
13083                              vst1(CurrentCond(),
13084                                   dt,
13085                                   NeonRegisterList(DRegister(first),
13086                                                    DRegister(last),
13087                                                    spacing,
13088                                                    transfer),
13089                                   AlignedMemOperand(Register(rn),
13090                                                     align,
13091                                                     Register(rm),
13092                                                     PostIndex));
13093                              break;
13094                            }
13095                            default:
13096                              UnallocatedT32(instr);
13097                              break;
13098                          }
13099                          break;
13100                        }
13101                      }
13102                      break;
13103                    }
13104                    case 0x01200000: {
13105                      // 0xf9200000
13106                      switch (instr & 0x0000000d) {
13107                        case 0x0000000d: {
13108                          // 0xf920000d
13109                          switch (instr & 0x00000002) {
13110                            case 0x00000000: {
13111                              // 0xf920000d
13112                              switch (instr & 0x00000f00) {
13113                                case 0x00000000: {
13114                                  // 0xf920000d
13115                                  DataType dt =
13116                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13117                                  if (dt.Is(kDataTypeValueInvalid)) {
13118                                    UnallocatedT32(instr);
13119                                    return;
13120                                  }
13121                                  Alignment align =
13122                                      Align_align_4_Decode((instr >> 4) & 0x3);
13123                                  if (dt.Is(kDataTypeValueInvalid) ||
13124                                      align.Is(kBadAlignment)) {
13125                                    UnallocatedT32(instr);
13126                                    return;
13127                                  }
13128                                  unsigned first =
13129                                      ExtractDRegister(instr, 22, 12);
13130                                  unsigned length;
13131                                  SpacingType spacing;
13132                                  switch ((instr >> 8) & 0xf) {
13133                                    default:
13134                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13135                                    case 0x0:
13136                                      length = 4;
13137                                      spacing = kSingle;
13138                                      break;
13139                                    case 0x1:
13140                                      length = 4;
13141                                      spacing = kDouble;
13142                                      break;
13143                                  }
13144                                  unsigned last =
13145                                      first +
13146                                      (length - 1) *
13147                                          (spacing == kSingle ? 1 : 2);
13148                                  TransferType transfer = kMultipleLanes;
13149                                  unsigned rn = (instr >> 16) & 0xf;
13150                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13151                                  vld4(CurrentCond(),
13152                                       dt,
13153                                       NeonRegisterList(DRegister(first),
13154                                                        DRegister(last),
13155                                                        spacing,
13156                                                        transfer),
13157                                       AlignedMemOperand(Register(rn),
13158                                                         align,
13159                                                         PostIndex));
13160                                  break;
13161                                }
13162                                case 0x00000100: {
13163                                  // 0xf920010d
13164                                  DataType dt =
13165                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13166                                  if (dt.Is(kDataTypeValueInvalid)) {
13167                                    UnallocatedT32(instr);
13168                                    return;
13169                                  }
13170                                  Alignment align =
13171                                      Align_align_4_Decode((instr >> 4) & 0x3);
13172                                  if (dt.Is(kDataTypeValueInvalid) ||
13173                                      align.Is(kBadAlignment)) {
13174                                    UnallocatedT32(instr);
13175                                    return;
13176                                  }
13177                                  unsigned first =
13178                                      ExtractDRegister(instr, 22, 12);
13179                                  unsigned length;
13180                                  SpacingType spacing;
13181                                  switch ((instr >> 8) & 0xf) {
13182                                    default:
13183                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13184                                    case 0x0:
13185                                      length = 4;
13186                                      spacing = kSingle;
13187                                      break;
13188                                    case 0x1:
13189                                      length = 4;
13190                                      spacing = kDouble;
13191                                      break;
13192                                  }
13193                                  unsigned last =
13194                                      first +
13195                                      (length - 1) *
13196                                          (spacing == kSingle ? 1 : 2);
13197                                  TransferType transfer = kMultipleLanes;
13198                                  unsigned rn = (instr >> 16) & 0xf;
13199                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13200                                  vld4(CurrentCond(),
13201                                       dt,
13202                                       NeonRegisterList(DRegister(first),
13203                                                        DRegister(last),
13204                                                        spacing,
13205                                                        transfer),
13206                                       AlignedMemOperand(Register(rn),
13207                                                         align,
13208                                                         PostIndex));
13209                                  break;
13210                                }
13211                                case 0x00000200: {
13212                                  // 0xf920020d
13213                                  if (((instr & 0xe20) == 0x620) ||
13214                                      ((instr & 0xf30) == 0xa30)) {
13215                                    UnallocatedT32(instr);
13216                                    return;
13217                                  }
13218                                  DataType dt =
13219                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13220                                  if (dt.Is(kDataTypeValueInvalid)) {
13221                                    UnallocatedT32(instr);
13222                                    return;
13223                                  }
13224                                  Alignment align =
13225                                      Align_align_1_Decode((instr >> 4) & 0x3);
13226                                  if (dt.Is(kDataTypeValueInvalid) ||
13227                                      align.Is(kBadAlignment)) {
13228                                    UnallocatedT32(instr);
13229                                    return;
13230                                  }
13231                                  unsigned first =
13232                                      ExtractDRegister(instr, 22, 12);
13233                                  unsigned length;
13234                                  SpacingType spacing = kSingle;
13235                                  switch ((instr >> 8) & 0xf) {
13236                                    default:
13237                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13238                                    case 0x7:
13239                                      length = 1;
13240                                      break;
13241                                    case 0xa:
13242                                      length = 2;
13243                                      break;
13244                                    case 0x6:
13245                                      length = 3;
13246                                      break;
13247                                    case 0x2:
13248                                      length = 4;
13249                                      break;
13250                                  }
13251                                  unsigned last = first + length - 1;
13252                                  TransferType transfer = kMultipleLanes;
13253                                  unsigned rn = (instr >> 16) & 0xf;
13254                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13255                                  vld1(CurrentCond(),
13256                                       dt,
13257                                       NeonRegisterList(DRegister(first),
13258                                                        DRegister(last),
13259                                                        spacing,
13260                                                        transfer),
13261                                       AlignedMemOperand(Register(rn),
13262                                                         align,
13263                                                         PostIndex));
13264                                  break;
13265                                }
13266                                case 0x00000300: {
13267                                  // 0xf920030d
13268                                  if (((instr & 0xe30) == 0x830)) {
13269                                    UnallocatedT32(instr);
13270                                    return;
13271                                  }
13272                                  DataType dt =
13273                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13274                                  if (dt.Is(kDataTypeValueInvalid)) {
13275                                    UnallocatedT32(instr);
13276                                    return;
13277                                  }
13278                                  Alignment align =
13279                                      Align_align_2_Decode((instr >> 4) & 0x3);
13280                                  if (dt.Is(kDataTypeValueInvalid) ||
13281                                      align.Is(kBadAlignment)) {
13282                                    UnallocatedT32(instr);
13283                                    return;
13284                                  }
13285                                  unsigned first =
13286                                      ExtractDRegister(instr, 22, 12);
13287                                  unsigned length;
13288                                  SpacingType spacing;
13289                                  switch ((instr >> 8) & 0xf) {
13290                                    default:
13291                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13292                                    case 0x8:
13293                                      length = 2;
13294                                      spacing = kSingle;
13295                                      break;
13296                                    case 0x9:
13297                                      length = 2;
13298                                      spacing = kDouble;
13299                                      break;
13300                                    case 0x3:
13301                                      length = 4;
13302                                      spacing = kSingle;
13303                                      break;
13304                                  }
13305                                  unsigned last =
13306                                      first +
13307                                      (length - 1) *
13308                                          (spacing == kSingle ? 1 : 2);
13309                                  TransferType transfer = kMultipleLanes;
13310                                  unsigned rn = (instr >> 16) & 0xf;
13311                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13312                                  vld2(CurrentCond(),
13313                                       dt,
13314                                       NeonRegisterList(DRegister(first),
13315                                                        DRegister(last),
13316                                                        spacing,
13317                                                        transfer),
13318                                       AlignedMemOperand(Register(rn),
13319                                                         align,
13320                                                         PostIndex));
13321                                  break;
13322                                }
13323                                case 0x00000400: {
13324                                  // 0xf920040d
13325                                  DataType dt =
13326                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13327                                  if (dt.Is(kDataTypeValueInvalid)) {
13328                                    UnallocatedT32(instr);
13329                                    return;
13330                                  }
13331                                  Alignment align =
13332                                      Align_align_3_Decode((instr >> 4) & 0x3);
13333                                  if (dt.Is(kDataTypeValueInvalid) ||
13334                                      align.Is(kBadAlignment)) {
13335                                    UnallocatedT32(instr);
13336                                    return;
13337                                  }
13338                                  unsigned first =
13339                                      ExtractDRegister(instr, 22, 12);
13340                                  unsigned length;
13341                                  SpacingType spacing;
13342                                  switch ((instr >> 8) & 0xf) {
13343                                    default:
13344                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13345                                    case 0x4:
13346                                      length = 3;
13347                                      spacing = kSingle;
13348                                      break;
13349                                    case 0x5:
13350                                      length = 3;
13351                                      spacing = kDouble;
13352                                      break;
13353                                  }
13354                                  unsigned last =
13355                                      first +
13356                                      (length - 1) *
13357                                          (spacing == kSingle ? 1 : 2);
13358                                  TransferType transfer = kMultipleLanes;
13359                                  unsigned rn = (instr >> 16) & 0xf;
13360                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13361                                  vld3(CurrentCond(),
13362                                       dt,
13363                                       NeonRegisterList(DRegister(first),
13364                                                        DRegister(last),
13365                                                        spacing,
13366                                                        transfer),
13367                                       AlignedMemOperand(Register(rn),
13368                                                         align,
13369                                                         PostIndex));
13370                                  break;
13371                                }
13372                                case 0x00000500: {
13373                                  // 0xf920050d
13374                                  DataType dt =
13375                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13376                                  if (dt.Is(kDataTypeValueInvalid)) {
13377                                    UnallocatedT32(instr);
13378                                    return;
13379                                  }
13380                                  Alignment align =
13381                                      Align_align_3_Decode((instr >> 4) & 0x3);
13382                                  if (dt.Is(kDataTypeValueInvalid) ||
13383                                      align.Is(kBadAlignment)) {
13384                                    UnallocatedT32(instr);
13385                                    return;
13386                                  }
13387                                  unsigned first =
13388                                      ExtractDRegister(instr, 22, 12);
13389                                  unsigned length;
13390                                  SpacingType spacing;
13391                                  switch ((instr >> 8) & 0xf) {
13392                                    default:
13393                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13394                                    case 0x4:
13395                                      length = 3;
13396                                      spacing = kSingle;
13397                                      break;
13398                                    case 0x5:
13399                                      length = 3;
13400                                      spacing = kDouble;
13401                                      break;
13402                                  }
13403                                  unsigned last =
13404                                      first +
13405                                      (length - 1) *
13406                                          (spacing == kSingle ? 1 : 2);
13407                                  TransferType transfer = kMultipleLanes;
13408                                  unsigned rn = (instr >> 16) & 0xf;
13409                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13410                                  vld3(CurrentCond(),
13411                                       dt,
13412                                       NeonRegisterList(DRegister(first),
13413                                                        DRegister(last),
13414                                                        spacing,
13415                                                        transfer),
13416                                       AlignedMemOperand(Register(rn),
13417                                                         align,
13418                                                         PostIndex));
13419                                  break;
13420                                }
13421                                case 0x00000600: {
13422                                  // 0xf920060d
13423                                  if (((instr & 0xe20) == 0x620) ||
13424                                      ((instr & 0xf30) == 0xa30)) {
13425                                    UnallocatedT32(instr);
13426                                    return;
13427                                  }
13428                                  DataType dt =
13429                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13430                                  if (dt.Is(kDataTypeValueInvalid)) {
13431                                    UnallocatedT32(instr);
13432                                    return;
13433                                  }
13434                                  Alignment align =
13435                                      Align_align_1_Decode((instr >> 4) & 0x3);
13436                                  if (dt.Is(kDataTypeValueInvalid) ||
13437                                      align.Is(kBadAlignment)) {
13438                                    UnallocatedT32(instr);
13439                                    return;
13440                                  }
13441                                  unsigned first =
13442                                      ExtractDRegister(instr, 22, 12);
13443                                  unsigned length;
13444                                  SpacingType spacing = kSingle;
13445                                  switch ((instr >> 8) & 0xf) {
13446                                    default:
13447                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13448                                    case 0x7:
13449                                      length = 1;
13450                                      break;
13451                                    case 0xa:
13452                                      length = 2;
13453                                      break;
13454                                    case 0x6:
13455                                      length = 3;
13456                                      break;
13457                                    case 0x2:
13458                                      length = 4;
13459                                      break;
13460                                  }
13461                                  unsigned last = first + length - 1;
13462                                  TransferType transfer = kMultipleLanes;
13463                                  unsigned rn = (instr >> 16) & 0xf;
13464                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13465                                  vld1(CurrentCond(),
13466                                       dt,
13467                                       NeonRegisterList(DRegister(first),
13468                                                        DRegister(last),
13469                                                        spacing,
13470                                                        transfer),
13471                                       AlignedMemOperand(Register(rn),
13472                                                         align,
13473                                                         PostIndex));
13474                                  break;
13475                                }
13476                                case 0x00000700: {
13477                                  // 0xf920070d
13478                                  if (((instr & 0xe20) == 0x620) ||
13479                                      ((instr & 0xf30) == 0xa30)) {
13480                                    UnallocatedT32(instr);
13481                                    return;
13482                                  }
13483                                  DataType dt =
13484                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13485                                  if (dt.Is(kDataTypeValueInvalid)) {
13486                                    UnallocatedT32(instr);
13487                                    return;
13488                                  }
13489                                  Alignment align =
13490                                      Align_align_1_Decode((instr >> 4) & 0x3);
13491                                  if (dt.Is(kDataTypeValueInvalid) ||
13492                                      align.Is(kBadAlignment)) {
13493                                    UnallocatedT32(instr);
13494                                    return;
13495                                  }
13496                                  unsigned first =
13497                                      ExtractDRegister(instr, 22, 12);
13498                                  unsigned length;
13499                                  SpacingType spacing = kSingle;
13500                                  switch ((instr >> 8) & 0xf) {
13501                                    default:
13502                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13503                                    case 0x7:
13504                                      length = 1;
13505                                      break;
13506                                    case 0xa:
13507                                      length = 2;
13508                                      break;
13509                                    case 0x6:
13510                                      length = 3;
13511                                      break;
13512                                    case 0x2:
13513                                      length = 4;
13514                                      break;
13515                                  }
13516                                  unsigned last = first + length - 1;
13517                                  TransferType transfer = kMultipleLanes;
13518                                  unsigned rn = (instr >> 16) & 0xf;
13519                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13520                                  vld1(CurrentCond(),
13521                                       dt,
13522                                       NeonRegisterList(DRegister(first),
13523                                                        DRegister(last),
13524                                                        spacing,
13525                                                        transfer),
13526                                       AlignedMemOperand(Register(rn),
13527                                                         align,
13528                                                         PostIndex));
13529                                  break;
13530                                }
13531                                case 0x00000800: {
13532                                  // 0xf920080d
13533                                  if (((instr & 0xe30) == 0x830)) {
13534                                    UnallocatedT32(instr);
13535                                    return;
13536                                  }
13537                                  DataType dt =
13538                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13539                                  if (dt.Is(kDataTypeValueInvalid)) {
13540                                    UnallocatedT32(instr);
13541                                    return;
13542                                  }
13543                                  Alignment align =
13544                                      Align_align_2_Decode((instr >> 4) & 0x3);
13545                                  if (dt.Is(kDataTypeValueInvalid) ||
13546                                      align.Is(kBadAlignment)) {
13547                                    UnallocatedT32(instr);
13548                                    return;
13549                                  }
13550                                  unsigned first =
13551                                      ExtractDRegister(instr, 22, 12);
13552                                  unsigned length;
13553                                  SpacingType spacing;
13554                                  switch ((instr >> 8) & 0xf) {
13555                                    default:
13556                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13557                                    case 0x8:
13558                                      length = 2;
13559                                      spacing = kSingle;
13560                                      break;
13561                                    case 0x9:
13562                                      length = 2;
13563                                      spacing = kDouble;
13564                                      break;
13565                                    case 0x3:
13566                                      length = 4;
13567                                      spacing = kSingle;
13568                                      break;
13569                                  }
13570                                  unsigned last =
13571                                      first +
13572                                      (length - 1) *
13573                                          (spacing == kSingle ? 1 : 2);
13574                                  TransferType transfer = kMultipleLanes;
13575                                  unsigned rn = (instr >> 16) & 0xf;
13576                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13577                                  vld2(CurrentCond(),
13578                                       dt,
13579                                       NeonRegisterList(DRegister(first),
13580                                                        DRegister(last),
13581                                                        spacing,
13582                                                        transfer),
13583                                       AlignedMemOperand(Register(rn),
13584                                                         align,
13585                                                         PostIndex));
13586                                  break;
13587                                }
13588                                case 0x00000900: {
13589                                  // 0xf920090d
13590                                  if (((instr & 0xe30) == 0x830)) {
13591                                    UnallocatedT32(instr);
13592                                    return;
13593                                  }
13594                                  DataType dt =
13595                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13596                                  if (dt.Is(kDataTypeValueInvalid)) {
13597                                    UnallocatedT32(instr);
13598                                    return;
13599                                  }
13600                                  Alignment align =
13601                                      Align_align_2_Decode((instr >> 4) & 0x3);
13602                                  if (dt.Is(kDataTypeValueInvalid) ||
13603                                      align.Is(kBadAlignment)) {
13604                                    UnallocatedT32(instr);
13605                                    return;
13606                                  }
13607                                  unsigned first =
13608                                      ExtractDRegister(instr, 22, 12);
13609                                  unsigned length;
13610                                  SpacingType spacing;
13611                                  switch ((instr >> 8) & 0xf) {
13612                                    default:
13613                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13614                                    case 0x8:
13615                                      length = 2;
13616                                      spacing = kSingle;
13617                                      break;
13618                                    case 0x9:
13619                                      length = 2;
13620                                      spacing = kDouble;
13621                                      break;
13622                                    case 0x3:
13623                                      length = 4;
13624                                      spacing = kSingle;
13625                                      break;
13626                                  }
13627                                  unsigned last =
13628                                      first +
13629                                      (length - 1) *
13630                                          (spacing == kSingle ? 1 : 2);
13631                                  TransferType transfer = kMultipleLanes;
13632                                  unsigned rn = (instr >> 16) & 0xf;
13633                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13634                                  vld2(CurrentCond(),
13635                                       dt,
13636                                       NeonRegisterList(DRegister(first),
13637                                                        DRegister(last),
13638                                                        spacing,
13639                                                        transfer),
13640                                       AlignedMemOperand(Register(rn),
13641                                                         align,
13642                                                         PostIndex));
13643                                  break;
13644                                }
13645                                case 0x00000a00: {
13646                                  // 0xf9200a0d
13647                                  if (((instr & 0xe20) == 0x620) ||
13648                                      ((instr & 0xf30) == 0xa30)) {
13649                                    UnallocatedT32(instr);
13650                                    return;
13651                                  }
13652                                  DataType dt =
13653                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13654                                  if (dt.Is(kDataTypeValueInvalid)) {
13655                                    UnallocatedT32(instr);
13656                                    return;
13657                                  }
13658                                  Alignment align =
13659                                      Align_align_1_Decode((instr >> 4) & 0x3);
13660                                  if (dt.Is(kDataTypeValueInvalid) ||
13661                                      align.Is(kBadAlignment)) {
13662                                    UnallocatedT32(instr);
13663                                    return;
13664                                  }
13665                                  unsigned first =
13666                                      ExtractDRegister(instr, 22, 12);
13667                                  unsigned length;
13668                                  SpacingType spacing = kSingle;
13669                                  switch ((instr >> 8) & 0xf) {
13670                                    default:
13671                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13672                                    case 0x7:
13673                                      length = 1;
13674                                      break;
13675                                    case 0xa:
13676                                      length = 2;
13677                                      break;
13678                                    case 0x6:
13679                                      length = 3;
13680                                      break;
13681                                    case 0x2:
13682                                      length = 4;
13683                                      break;
13684                                  }
13685                                  unsigned last = first + length - 1;
13686                                  TransferType transfer = kMultipleLanes;
13687                                  unsigned rn = (instr >> 16) & 0xf;
13688                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13689                                  vld1(CurrentCond(),
13690                                       dt,
13691                                       NeonRegisterList(DRegister(first),
13692                                                        DRegister(last),
13693                                                        spacing,
13694                                                        transfer),
13695                                       AlignedMemOperand(Register(rn),
13696                                                         align,
13697                                                         PostIndex));
13698                                  break;
13699                                }
13700                                default:
13701                                  UnallocatedT32(instr);
13702                                  break;
13703                              }
13704                              break;
13705                            }
13706                            case 0x00000002: {
13707                              // 0xf920000f
13708                              switch (instr & 0x00000f00) {
13709                                case 0x00000000: {
13710                                  // 0xf920000d
13711                                  DataType dt =
13712                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13713                                  if (dt.Is(kDataTypeValueInvalid)) {
13714                                    UnallocatedT32(instr);
13715                                    return;
13716                                  }
13717                                  Alignment align =
13718                                      Align_align_4_Decode((instr >> 4) & 0x3);
13719                                  if (dt.Is(kDataTypeValueInvalid) ||
13720                                      align.Is(kBadAlignment)) {
13721                                    UnallocatedT32(instr);
13722                                    return;
13723                                  }
13724                                  unsigned first =
13725                                      ExtractDRegister(instr, 22, 12);
13726                                  unsigned length;
13727                                  SpacingType spacing;
13728                                  switch ((instr >> 8) & 0xf) {
13729                                    default:
13730                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13731                                    case 0x0:
13732                                      length = 4;
13733                                      spacing = kSingle;
13734                                      break;
13735                                    case 0x1:
13736                                      length = 4;
13737                                      spacing = kDouble;
13738                                      break;
13739                                  }
13740                                  unsigned last =
13741                                      first +
13742                                      (length - 1) *
13743                                          (spacing == kSingle ? 1 : 2);
13744                                  TransferType transfer = kMultipleLanes;
13745                                  unsigned rn = (instr >> 16) & 0xf;
13746                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13747                                  vld4(CurrentCond(),
13748                                       dt,
13749                                       NeonRegisterList(DRegister(first),
13750                                                        DRegister(last),
13751                                                        spacing,
13752                                                        transfer),
13753                                       AlignedMemOperand(Register(rn),
13754                                                         align,
13755                                                         Offset));
13756                                  break;
13757                                }
13758                                case 0x00000100: {
13759                                  // 0xf920010d
13760                                  DataType dt =
13761                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13762                                  if (dt.Is(kDataTypeValueInvalid)) {
13763                                    UnallocatedT32(instr);
13764                                    return;
13765                                  }
13766                                  Alignment align =
13767                                      Align_align_4_Decode((instr >> 4) & 0x3);
13768                                  if (dt.Is(kDataTypeValueInvalid) ||
13769                                      align.Is(kBadAlignment)) {
13770                                    UnallocatedT32(instr);
13771                                    return;
13772                                  }
13773                                  unsigned first =
13774                                      ExtractDRegister(instr, 22, 12);
13775                                  unsigned length;
13776                                  SpacingType spacing;
13777                                  switch ((instr >> 8) & 0xf) {
13778                                    default:
13779                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13780                                    case 0x0:
13781                                      length = 4;
13782                                      spacing = kSingle;
13783                                      break;
13784                                    case 0x1:
13785                                      length = 4;
13786                                      spacing = kDouble;
13787                                      break;
13788                                  }
13789                                  unsigned last =
13790                                      first +
13791                                      (length - 1) *
13792                                          (spacing == kSingle ? 1 : 2);
13793                                  TransferType transfer = kMultipleLanes;
13794                                  unsigned rn = (instr >> 16) & 0xf;
13795                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13796                                  vld4(CurrentCond(),
13797                                       dt,
13798                                       NeonRegisterList(DRegister(first),
13799                                                        DRegister(last),
13800                                                        spacing,
13801                                                        transfer),
13802                                       AlignedMemOperand(Register(rn),
13803                                                         align,
13804                                                         Offset));
13805                                  break;
13806                                }
13807                                case 0x00000200: {
13808                                  // 0xf920020d
13809                                  if (((instr & 0xe20) == 0x620) ||
13810                                      ((instr & 0xf30) == 0xa30)) {
13811                                    UnallocatedT32(instr);
13812                                    return;
13813                                  }
13814                                  DataType dt =
13815                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13816                                  if (dt.Is(kDataTypeValueInvalid)) {
13817                                    UnallocatedT32(instr);
13818                                    return;
13819                                  }
13820                                  Alignment align =
13821                                      Align_align_1_Decode((instr >> 4) & 0x3);
13822                                  if (dt.Is(kDataTypeValueInvalid) ||
13823                                      align.Is(kBadAlignment)) {
13824                                    UnallocatedT32(instr);
13825                                    return;
13826                                  }
13827                                  unsigned first =
13828                                      ExtractDRegister(instr, 22, 12);
13829                                  unsigned length;
13830                                  SpacingType spacing = kSingle;
13831                                  switch ((instr >> 8) & 0xf) {
13832                                    default:
13833                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13834                                    case 0x7:
13835                                      length = 1;
13836                                      break;
13837                                    case 0xa:
13838                                      length = 2;
13839                                      break;
13840                                    case 0x6:
13841                                      length = 3;
13842                                      break;
13843                                    case 0x2:
13844                                      length = 4;
13845                                      break;
13846                                  }
13847                                  unsigned last = first + length - 1;
13848                                  TransferType transfer = kMultipleLanes;
13849                                  unsigned rn = (instr >> 16) & 0xf;
13850                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13851                                  vld1(CurrentCond(),
13852                                       dt,
13853                                       NeonRegisterList(DRegister(first),
13854                                                        DRegister(last),
13855                                                        spacing,
13856                                                        transfer),
13857                                       AlignedMemOperand(Register(rn),
13858                                                         align,
13859                                                         Offset));
13860                                  break;
13861                                }
13862                                case 0x00000300: {
13863                                  // 0xf920030d
13864                                  if (((instr & 0xe30) == 0x830)) {
13865                                    UnallocatedT32(instr);
13866                                    return;
13867                                  }
13868                                  DataType dt =
13869                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13870                                  if (dt.Is(kDataTypeValueInvalid)) {
13871                                    UnallocatedT32(instr);
13872                                    return;
13873                                  }
13874                                  Alignment align =
13875                                      Align_align_2_Decode((instr >> 4) & 0x3);
13876                                  if (dt.Is(kDataTypeValueInvalid) ||
13877                                      align.Is(kBadAlignment)) {
13878                                    UnallocatedT32(instr);
13879                                    return;
13880                                  }
13881                                  unsigned first =
13882                                      ExtractDRegister(instr, 22, 12);
13883                                  unsigned length;
13884                                  SpacingType spacing;
13885                                  switch ((instr >> 8) & 0xf) {
13886                                    default:
13887                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13888                                    case 0x8:
13889                                      length = 2;
13890                                      spacing = kSingle;
13891                                      break;
13892                                    case 0x9:
13893                                      length = 2;
13894                                      spacing = kDouble;
13895                                      break;
13896                                    case 0x3:
13897                                      length = 4;
13898                                      spacing = kSingle;
13899                                      break;
13900                                  }
13901                                  unsigned last =
13902                                      first +
13903                                      (length - 1) *
13904                                          (spacing == kSingle ? 1 : 2);
13905                                  TransferType transfer = kMultipleLanes;
13906                                  unsigned rn = (instr >> 16) & 0xf;
13907                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13908                                  vld2(CurrentCond(),
13909                                       dt,
13910                                       NeonRegisterList(DRegister(first),
13911                                                        DRegister(last),
13912                                                        spacing,
13913                                                        transfer),
13914                                       AlignedMemOperand(Register(rn),
13915                                                         align,
13916                                                         Offset));
13917                                  break;
13918                                }
13919                                case 0x00000400: {
13920                                  // 0xf920040d
13921                                  DataType dt =
13922                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13923                                  if (dt.Is(kDataTypeValueInvalid)) {
13924                                    UnallocatedT32(instr);
13925                                    return;
13926                                  }
13927                                  Alignment align =
13928                                      Align_align_3_Decode((instr >> 4) & 0x3);
13929                                  if (dt.Is(kDataTypeValueInvalid) ||
13930                                      align.Is(kBadAlignment)) {
13931                                    UnallocatedT32(instr);
13932                                    return;
13933                                  }
13934                                  unsigned first =
13935                                      ExtractDRegister(instr, 22, 12);
13936                                  unsigned length;
13937                                  SpacingType spacing;
13938                                  switch ((instr >> 8) & 0xf) {
13939                                    default:
13940                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13941                                    case 0x4:
13942                                      length = 3;
13943                                      spacing = kSingle;
13944                                      break;
13945                                    case 0x5:
13946                                      length = 3;
13947                                      spacing = kDouble;
13948                                      break;
13949                                  }
13950                                  unsigned last =
13951                                      first +
13952                                      (length - 1) *
13953                                          (spacing == kSingle ? 1 : 2);
13954                                  TransferType transfer = kMultipleLanes;
13955                                  unsigned rn = (instr >> 16) & 0xf;
13956                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13957                                  vld3(CurrentCond(),
13958                                       dt,
13959                                       NeonRegisterList(DRegister(first),
13960                                                        DRegister(last),
13961                                                        spacing,
13962                                                        transfer),
13963                                       AlignedMemOperand(Register(rn),
13964                                                         align,
13965                                                         Offset));
13966                                  break;
13967                                }
13968                                case 0x00000500: {
13969                                  // 0xf920050d
13970                                  DataType dt =
13971                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13972                                  if (dt.Is(kDataTypeValueInvalid)) {
13973                                    UnallocatedT32(instr);
13974                                    return;
13975                                  }
13976                                  Alignment align =
13977                                      Align_align_3_Decode((instr >> 4) & 0x3);
13978                                  if (dt.Is(kDataTypeValueInvalid) ||
13979                                      align.Is(kBadAlignment)) {
13980                                    UnallocatedT32(instr);
13981                                    return;
13982                                  }
13983                                  unsigned first =
13984                                      ExtractDRegister(instr, 22, 12);
13985                                  unsigned length;
13986                                  SpacingType spacing;
13987                                  switch ((instr >> 8) & 0xf) {
13988                                    default:
13989                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13990                                    case 0x4:
13991                                      length = 3;
13992                                      spacing = kSingle;
13993                                      break;
13994                                    case 0x5:
13995                                      length = 3;
13996                                      spacing = kDouble;
13997                                      break;
13998                                  }
13999                                  unsigned last =
14000                                      first +
14001                                      (length - 1) *
14002                                          (spacing == kSingle ? 1 : 2);
14003                                  TransferType transfer = kMultipleLanes;
14004                                  unsigned rn = (instr >> 16) & 0xf;
14005                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14006                                  vld3(CurrentCond(),
14007                                       dt,
14008                                       NeonRegisterList(DRegister(first),
14009                                                        DRegister(last),
14010                                                        spacing,
14011                                                        transfer),
14012                                       AlignedMemOperand(Register(rn),
14013                                                         align,
14014                                                         Offset));
14015                                  break;
14016                                }
14017                                case 0x00000600: {
14018                                  // 0xf920060d
14019                                  if (((instr & 0xe20) == 0x620) ||
14020                                      ((instr & 0xf30) == 0xa30)) {
14021                                    UnallocatedT32(instr);
14022                                    return;
14023                                  }
14024                                  DataType dt =
14025                                      Dt_size_6_Decode((instr >> 6) & 0x3);
14026                                  if (dt.Is(kDataTypeValueInvalid)) {
14027                                    UnallocatedT32(instr);
14028                                    return;
14029                                  }
14030                                  Alignment align =
14031                                      Align_align_1_Decode((instr >> 4) & 0x3);
14032                                  if (dt.Is(kDataTypeValueInvalid) ||
14033                                      align.Is(kBadAlignment)) {
14034                                    UnallocatedT32(instr);
14035                                    return;
14036                                  }
14037                                  unsigned first =
14038                                      ExtractDRegister(instr, 22, 12);
14039                                  unsigned length;
14040                                  SpacingType spacing = kSingle;
14041                                  switch ((instr >> 8) & 0xf) {
14042                                    default:
14043                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14044                                    case 0x7:
14045                                      length = 1;
14046                                      break;
14047                                    case 0xa:
14048                                      length = 2;
14049                                      break;
14050                                    case 0x6:
14051                                      length = 3;
14052                                      break;
14053                                    case 0x2:
14054                                      length = 4;
14055                                      break;
14056                                  }
14057                                  unsigned last = first + length - 1;
14058                                  TransferType transfer = kMultipleLanes;
14059                                  unsigned rn = (instr >> 16) & 0xf;
14060                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14061                                  vld1(CurrentCond(),
14062                                       dt,
14063                                       NeonRegisterList(DRegister(first),
14064                                                        DRegister(last),
14065                                                        spacing,
14066                                                        transfer),
14067                                       AlignedMemOperand(Register(rn),
14068                                                         align,
14069                                                         Offset));
14070                                  break;
14071                                }
14072                                case 0x00000700: {
14073                                  // 0xf920070d
14074                                  if (((instr & 0xe20) == 0x620) ||
14075                                      ((instr & 0xf30) == 0xa30)) {
14076                                    UnallocatedT32(instr);
14077                                    return;
14078                                  }
14079                                  DataType dt =
14080                                      Dt_size_6_Decode((instr >> 6) & 0x3);
14081                                  if (dt.Is(kDataTypeValueInvalid)) {
14082                                    UnallocatedT32(instr);
14083                                    return;
14084                                  }
14085                                  Alignment align =
14086                                      Align_align_1_Decode((instr >> 4) & 0x3);
14087                                  if (dt.Is(kDataTypeValueInvalid) ||
14088                                      align.Is(kBadAlignment)) {
14089                                    UnallocatedT32(instr);
14090                                    return;
14091                                  }
14092                                  unsigned first =
14093                                      ExtractDRegister(instr, 22, 12);
14094                                  unsigned length;
14095                                  SpacingType spacing = kSingle;
14096                                  switch ((instr >> 8) & 0xf) {
14097                                    default:
14098                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14099                                    case 0x7:
14100                                      length = 1;
14101                                      break;
14102                                    case 0xa:
14103                                      length = 2;
14104                                      break;
14105                                    case 0x6:
14106                                      length = 3;
14107                                      break;
14108                                    case 0x2:
14109                                      length = 4;
14110                                      break;
14111                                  }
14112                                  unsigned last = first + length - 1;
14113                                  TransferType transfer = kMultipleLanes;
14114                                  unsigned rn = (instr >> 16) & 0xf;
14115                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14116                                  vld1(CurrentCond(),
14117                                       dt,
14118                                       NeonRegisterList(DRegister(first),
14119                                                        DRegister(last),
14120                                                        spacing,
14121                                                        transfer),
14122                                       AlignedMemOperand(Register(rn),
14123                                                         align,
14124                                                         Offset));
14125                                  break;
14126                                }
14127                                case 0x00000800: {
14128                                  // 0xf920080d
14129                                  if (((instr & 0xe30) == 0x830)) {
14130                                    UnallocatedT32(instr);
14131                                    return;
14132                                  }
14133                                  DataType dt =
14134                                      Dt_size_7_Decode((instr >> 6) & 0x3);
14135                                  if (dt.Is(kDataTypeValueInvalid)) {
14136                                    UnallocatedT32(instr);
14137                                    return;
14138                                  }
14139                                  Alignment align =
14140                                      Align_align_2_Decode((instr >> 4) & 0x3);
14141                                  if (dt.Is(kDataTypeValueInvalid) ||
14142                                      align.Is(kBadAlignment)) {
14143                                    UnallocatedT32(instr);
14144                                    return;
14145                                  }
14146                                  unsigned first =
14147                                      ExtractDRegister(instr, 22, 12);
14148                                  unsigned length;
14149                                  SpacingType spacing;
14150                                  switch ((instr >> 8) & 0xf) {
14151                                    default:
14152                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14153                                    case 0x8:
14154                                      length = 2;
14155                                      spacing = kSingle;
14156                                      break;
14157                                    case 0x9:
14158                                      length = 2;
14159                                      spacing = kDouble;
14160                                      break;
14161                                    case 0x3:
14162                                      length = 4;
14163                                      spacing = kSingle;
14164                                      break;
14165                                  }
14166                                  unsigned last =
14167                                      first +
14168                                      (length - 1) *
14169                                          (spacing == kSingle ? 1 : 2);
14170                                  TransferType transfer = kMultipleLanes;
14171                                  unsigned rn = (instr >> 16) & 0xf;
14172                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14173                                  vld2(CurrentCond(),
14174                                       dt,
14175                                       NeonRegisterList(DRegister(first),
14176                                                        DRegister(last),
14177                                                        spacing,
14178                                                        transfer),
14179                                       AlignedMemOperand(Register(rn),
14180                                                         align,
14181                                                         Offset));
14182                                  break;
14183                                }
14184                                case 0x00000900: {
14185                                  // 0xf920090d
14186                                  if (((instr & 0xe30) == 0x830)) {
14187                                    UnallocatedT32(instr);
14188                                    return;
14189                                  }
14190                                  DataType dt =
14191                                      Dt_size_7_Decode((instr >> 6) & 0x3);
14192                                  if (dt.Is(kDataTypeValueInvalid)) {
14193                                    UnallocatedT32(instr);
14194                                    return;
14195                                  }
14196                                  Alignment align =
14197                                      Align_align_2_Decode((instr >> 4) & 0x3);
14198                                  if (dt.Is(kDataTypeValueInvalid) ||
14199                                      align.Is(kBadAlignment)) {
14200                                    UnallocatedT32(instr);
14201                                    return;
14202                                  }
14203                                  unsigned first =
14204                                      ExtractDRegister(instr, 22, 12);
14205                                  unsigned length;
14206                                  SpacingType spacing;
14207                                  switch ((instr >> 8) & 0xf) {
14208                                    default:
14209                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14210                                    case 0x8:
14211                                      length = 2;
14212                                      spacing = kSingle;
14213                                      break;
14214                                    case 0x9:
14215                                      length = 2;
14216                                      spacing = kDouble;
14217                                      break;
14218                                    case 0x3:
14219                                      length = 4;
14220                                      spacing = kSingle;
14221                                      break;
14222                                  }
14223                                  unsigned last =
14224                                      first +
14225                                      (length - 1) *
14226                                          (spacing == kSingle ? 1 : 2);
14227                                  TransferType transfer = kMultipleLanes;
14228                                  unsigned rn = (instr >> 16) & 0xf;
14229                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14230                                  vld2(CurrentCond(),
14231                                       dt,
14232                                       NeonRegisterList(DRegister(first),
14233                                                        DRegister(last),
14234                                                        spacing,
14235                                                        transfer),
14236                                       AlignedMemOperand(Register(rn),
14237                                                         align,
14238                                                         Offset));
14239                                  break;
14240                                }
14241                                case 0x00000a00: {
14242                                  // 0xf9200a0d
14243                                  if (((instr & 0xe20) == 0x620) ||
14244                                      ((instr & 0xf30) == 0xa30)) {
14245                                    UnallocatedT32(instr);
14246                                    return;
14247                                  }
14248                                  DataType dt =
14249                                      Dt_size_6_Decode((instr >> 6) & 0x3);
14250                                  if (dt.Is(kDataTypeValueInvalid)) {
14251                                    UnallocatedT32(instr);
14252                                    return;
14253                                  }
14254                                  Alignment align =
14255                                      Align_align_1_Decode((instr >> 4) & 0x3);
14256                                  if (dt.Is(kDataTypeValueInvalid) ||
14257                                      align.Is(kBadAlignment)) {
14258                                    UnallocatedT32(instr);
14259                                    return;
14260                                  }
14261                                  unsigned first =
14262                                      ExtractDRegister(instr, 22, 12);
14263                                  unsigned length;
14264                                  SpacingType spacing = kSingle;
14265                                  switch ((instr >> 8) & 0xf) {
14266                                    default:
14267                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14268                                    case 0x7:
14269                                      length = 1;
14270                                      break;
14271                                    case 0xa:
14272                                      length = 2;
14273                                      break;
14274                                    case 0x6:
14275                                      length = 3;
14276                                      break;
14277                                    case 0x2:
14278                                      length = 4;
14279                                      break;
14280                                  }
14281                                  unsigned last = first + length - 1;
14282                                  TransferType transfer = kMultipleLanes;
14283                                  unsigned rn = (instr >> 16) & 0xf;
14284                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14285                                  vld1(CurrentCond(),
14286                                       dt,
14287                                       NeonRegisterList(DRegister(first),
14288                                                        DRegister(last),
14289                                                        spacing,
14290                                                        transfer),
14291                                       AlignedMemOperand(Register(rn),
14292                                                         align,
14293                                                         Offset));
14294                                  break;
14295                                }
14296                                default:
14297                                  UnallocatedT32(instr);
14298                                  break;
14299                              }
14300                              break;
14301                            }
14302                          }
14303                          break;
14304                        }
14305                        default: {
14306                          switch (instr & 0x00000f00) {
14307                            case 0x00000000: {
14308                              // 0xf9200000
14309                              if (((instr & 0xd) == 0xd)) {
14310                                UnallocatedT32(instr);
14311                                return;
14312                              }
14313                              DataType dt =
14314                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14315                              if (dt.Is(kDataTypeValueInvalid)) {
14316                                UnallocatedT32(instr);
14317                                return;
14318                              }
14319                              Alignment align =
14320                                  Align_align_4_Decode((instr >> 4) & 0x3);
14321                              if (dt.Is(kDataTypeValueInvalid) ||
14322                                  align.Is(kBadAlignment)) {
14323                                UnallocatedT32(instr);
14324                                return;
14325                              }
14326                              unsigned first = ExtractDRegister(instr, 22, 12);
14327                              unsigned length;
14328                              SpacingType spacing;
14329                              switch ((instr >> 8) & 0xf) {
14330                                default:
14331                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14332                                case 0x0:
14333                                  length = 4;
14334                                  spacing = kSingle;
14335                                  break;
14336                                case 0x1:
14337                                  length = 4;
14338                                  spacing = kDouble;
14339                                  break;
14340                              }
14341                              unsigned last =
14342                                  first +
14343                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14344                              TransferType transfer = kMultipleLanes;
14345                              unsigned rn = (instr >> 16) & 0xf;
14346                              unsigned rm = instr & 0xf;
14347                              // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14348                              vld4(CurrentCond(),
14349                                   dt,
14350                                   NeonRegisterList(DRegister(first),
14351                                                    DRegister(last),
14352                                                    spacing,
14353                                                    transfer),
14354                                   AlignedMemOperand(Register(rn),
14355                                                     align,
14356                                                     Register(rm),
14357                                                     PostIndex));
14358                              break;
14359                            }
14360                            case 0x00000100: {
14361                              // 0xf9200100
14362                              if (((instr & 0xd) == 0xd)) {
14363                                UnallocatedT32(instr);
14364                                return;
14365                              }
14366                              DataType dt =
14367                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14368                              if (dt.Is(kDataTypeValueInvalid)) {
14369                                UnallocatedT32(instr);
14370                                return;
14371                              }
14372                              Alignment align =
14373                                  Align_align_4_Decode((instr >> 4) & 0x3);
14374                              if (dt.Is(kDataTypeValueInvalid) ||
14375                                  align.Is(kBadAlignment)) {
14376                                UnallocatedT32(instr);
14377                                return;
14378                              }
14379                              unsigned first = ExtractDRegister(instr, 22, 12);
14380                              unsigned length;
14381                              SpacingType spacing;
14382                              switch ((instr >> 8) & 0xf) {
14383                                default:
14384                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14385                                case 0x0:
14386                                  length = 4;
14387                                  spacing = kSingle;
14388                                  break;
14389                                case 0x1:
14390                                  length = 4;
14391                                  spacing = kDouble;
14392                                  break;
14393                              }
14394                              unsigned last =
14395                                  first +
14396                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14397                              TransferType transfer = kMultipleLanes;
14398                              unsigned rn = (instr >> 16) & 0xf;
14399                              unsigned rm = instr & 0xf;
14400                              // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14401                              vld4(CurrentCond(),
14402                                   dt,
14403                                   NeonRegisterList(DRegister(first),
14404                                                    DRegister(last),
14405                                                    spacing,
14406                                                    transfer),
14407                                   AlignedMemOperand(Register(rn),
14408                                                     align,
14409                                                     Register(rm),
14410                                                     PostIndex));
14411                              break;
14412                            }
14413                            case 0x00000200: {
14414                              // 0xf9200200
14415                              if (((instr & 0xd) == 0xd) ||
14416                                  ((instr & 0xe20) == 0x620) ||
14417                                  ((instr & 0xf30) == 0xa30)) {
14418                                UnallocatedT32(instr);
14419                                return;
14420                              }
14421                              DataType dt =
14422                                  Dt_size_6_Decode((instr >> 6) & 0x3);
14423                              if (dt.Is(kDataTypeValueInvalid)) {
14424                                UnallocatedT32(instr);
14425                                return;
14426                              }
14427                              Alignment align =
14428                                  Align_align_1_Decode((instr >> 4) & 0x3);
14429                              if (dt.Is(kDataTypeValueInvalid) ||
14430                                  align.Is(kBadAlignment)) {
14431                                UnallocatedT32(instr);
14432                                return;
14433                              }
14434                              unsigned first = ExtractDRegister(instr, 22, 12);
14435                              unsigned length;
14436                              SpacingType spacing = kSingle;
14437                              switch ((instr >> 8) & 0xf) {
14438                                default:
14439                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14440                                case 0x7:
14441                                  length = 1;
14442                                  break;
14443                                case 0xa:
14444                                  length = 2;
14445                                  break;
14446                                case 0x6:
14447                                  length = 3;
14448                                  break;
14449                                case 0x2:
14450                                  length = 4;
14451                                  break;
14452                              }
14453                              unsigned last = first + length - 1;
14454                              TransferType transfer = kMultipleLanes;
14455                              unsigned rn = (instr >> 16) & 0xf;
14456                              unsigned rm = instr & 0xf;
14457                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14458                              vld1(CurrentCond(),
14459                                   dt,
14460                                   NeonRegisterList(DRegister(first),
14461                                                    DRegister(last),
14462                                                    spacing,
14463                                                    transfer),
14464                                   AlignedMemOperand(Register(rn),
14465                                                     align,
14466                                                     Register(rm),
14467                                                     PostIndex));
14468                              break;
14469                            }
14470                            case 0x00000300: {
14471                              // 0xf9200300
14472                              if (((instr & 0xd) == 0xd) ||
14473                                  ((instr & 0xe30) == 0x830)) {
14474                                UnallocatedT32(instr);
14475                                return;
14476                              }
14477                              DataType dt =
14478                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14479                              if (dt.Is(kDataTypeValueInvalid)) {
14480                                UnallocatedT32(instr);
14481                                return;
14482                              }
14483                              Alignment align =
14484                                  Align_align_2_Decode((instr >> 4) & 0x3);
14485                              if (dt.Is(kDataTypeValueInvalid) ||
14486                                  align.Is(kBadAlignment)) {
14487                                UnallocatedT32(instr);
14488                                return;
14489                              }
14490                              unsigned first = ExtractDRegister(instr, 22, 12);
14491                              unsigned length;
14492                              SpacingType spacing;
14493                              switch ((instr >> 8) & 0xf) {
14494                                default:
14495                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14496                                case 0x8:
14497                                  length = 2;
14498                                  spacing = kSingle;
14499                                  break;
14500                                case 0x9:
14501                                  length = 2;
14502                                  spacing = kDouble;
14503                                  break;
14504                                case 0x3:
14505                                  length = 4;
14506                                  spacing = kSingle;
14507                                  break;
14508                              }
14509                              unsigned last =
14510                                  first +
14511                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14512                              TransferType transfer = kMultipleLanes;
14513                              unsigned rn = (instr >> 16) & 0xf;
14514                              unsigned rm = instr & 0xf;
14515                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14516                              vld2(CurrentCond(),
14517                                   dt,
14518                                   NeonRegisterList(DRegister(first),
14519                                                    DRegister(last),
14520                                                    spacing,
14521                                                    transfer),
14522                                   AlignedMemOperand(Register(rn),
14523                                                     align,
14524                                                     Register(rm),
14525                                                     PostIndex));
14526                              break;
14527                            }
14528                            case 0x00000400: {
14529                              // 0xf9200400
14530                              if (((instr & 0xd) == 0xd)) {
14531                                UnallocatedT32(instr);
14532                                return;
14533                              }
14534                              DataType dt =
14535                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14536                              if (dt.Is(kDataTypeValueInvalid)) {
14537                                UnallocatedT32(instr);
14538                                return;
14539                              }
14540                              Alignment align =
14541                                  Align_align_3_Decode((instr >> 4) & 0x3);
14542                              if (dt.Is(kDataTypeValueInvalid) ||
14543                                  align.Is(kBadAlignment)) {
14544                                UnallocatedT32(instr);
14545                                return;
14546                              }
14547                              unsigned first = ExtractDRegister(instr, 22, 12);
14548                              unsigned length;
14549                              SpacingType spacing;
14550                              switch ((instr >> 8) & 0xf) {
14551                                default:
14552                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14553                                case 0x4:
14554                                  length = 3;
14555                                  spacing = kSingle;
14556                                  break;
14557                                case 0x5:
14558                                  length = 3;
14559                                  spacing = kDouble;
14560                                  break;
14561                              }
14562                              unsigned last =
14563                                  first +
14564                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14565                              TransferType transfer = kMultipleLanes;
14566                              unsigned rn = (instr >> 16) & 0xf;
14567                              unsigned rm = instr & 0xf;
14568                              // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14569                              vld3(CurrentCond(),
14570                                   dt,
14571                                   NeonRegisterList(DRegister(first),
14572                                                    DRegister(last),
14573                                                    spacing,
14574                                                    transfer),
14575                                   AlignedMemOperand(Register(rn),
14576                                                     align,
14577                                                     Register(rm),
14578                                                     PostIndex));
14579                              break;
14580                            }
14581                            case 0x00000500: {
14582                              // 0xf9200500
14583                              if (((instr & 0xd) == 0xd)) {
14584                                UnallocatedT32(instr);
14585                                return;
14586                              }
14587                              DataType dt =
14588                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14589                              if (dt.Is(kDataTypeValueInvalid)) {
14590                                UnallocatedT32(instr);
14591                                return;
14592                              }
14593                              Alignment align =
14594                                  Align_align_3_Decode((instr >> 4) & 0x3);
14595                              if (dt.Is(kDataTypeValueInvalid) ||
14596                                  align.Is(kBadAlignment)) {
14597                                UnallocatedT32(instr);
14598                                return;
14599                              }
14600                              unsigned first = ExtractDRegister(instr, 22, 12);
14601                              unsigned length;
14602                              SpacingType spacing;
14603                              switch ((instr >> 8) & 0xf) {
14604                                default:
14605                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14606                                case 0x4:
14607                                  length = 3;
14608                                  spacing = kSingle;
14609                                  break;
14610                                case 0x5:
14611                                  length = 3;
14612                                  spacing = kDouble;
14613                                  break;
14614                              }
14615                              unsigned last =
14616                                  first +
14617                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14618                              TransferType transfer = kMultipleLanes;
14619                              unsigned rn = (instr >> 16) & 0xf;
14620                              unsigned rm = instr & 0xf;
14621                              // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14622                              vld3(CurrentCond(),
14623                                   dt,
14624                                   NeonRegisterList(DRegister(first),
14625                                                    DRegister(last),
14626                                                    spacing,
14627                                                    transfer),
14628                                   AlignedMemOperand(Register(rn),
14629                                                     align,
14630                                                     Register(rm),
14631                                                     PostIndex));
14632                              break;
14633                            }
14634                            case 0x00000600: {
14635                              // 0xf9200600
14636                              if (((instr & 0xd) == 0xd) ||
14637                                  ((instr & 0xe20) == 0x620) ||
14638                                  ((instr & 0xf30) == 0xa30)) {
14639                                UnallocatedT32(instr);
14640                                return;
14641                              }
14642                              DataType dt =
14643                                  Dt_size_6_Decode((instr >> 6) & 0x3);
14644                              if (dt.Is(kDataTypeValueInvalid)) {
14645                                UnallocatedT32(instr);
14646                                return;
14647                              }
14648                              Alignment align =
14649                                  Align_align_1_Decode((instr >> 4) & 0x3);
14650                              if (dt.Is(kDataTypeValueInvalid) ||
14651                                  align.Is(kBadAlignment)) {
14652                                UnallocatedT32(instr);
14653                                return;
14654                              }
14655                              unsigned first = ExtractDRegister(instr, 22, 12);
14656                              unsigned length;
14657                              SpacingType spacing = kSingle;
14658                              switch ((instr >> 8) & 0xf) {
14659                                default:
14660                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14661                                case 0x7:
14662                                  length = 1;
14663                                  break;
14664                                case 0xa:
14665                                  length = 2;
14666                                  break;
14667                                case 0x6:
14668                                  length = 3;
14669                                  break;
14670                                case 0x2:
14671                                  length = 4;
14672                                  break;
14673                              }
14674                              unsigned last = first + length - 1;
14675                              TransferType transfer = kMultipleLanes;
14676                              unsigned rn = (instr >> 16) & 0xf;
14677                              unsigned rm = instr & 0xf;
14678                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14679                              vld1(CurrentCond(),
14680                                   dt,
14681                                   NeonRegisterList(DRegister(first),
14682                                                    DRegister(last),
14683                                                    spacing,
14684                                                    transfer),
14685                                   AlignedMemOperand(Register(rn),
14686                                                     align,
14687                                                     Register(rm),
14688                                                     PostIndex));
14689                              break;
14690                            }
14691                            case 0x00000700: {
14692                              // 0xf9200700
14693                              if (((instr & 0xd) == 0xd) ||
14694                                  ((instr & 0xe20) == 0x620) ||
14695                                  ((instr & 0xf30) == 0xa30)) {
14696                                UnallocatedT32(instr);
14697                                return;
14698                              }
14699                              DataType dt =
14700                                  Dt_size_6_Decode((instr >> 6) & 0x3);
14701                              if (dt.Is(kDataTypeValueInvalid)) {
14702                                UnallocatedT32(instr);
14703                                return;
14704                              }
14705                              Alignment align =
14706                                  Align_align_1_Decode((instr >> 4) & 0x3);
14707                              if (dt.Is(kDataTypeValueInvalid) ||
14708                                  align.Is(kBadAlignment)) {
14709                                UnallocatedT32(instr);
14710                                return;
14711                              }
14712                              unsigned first = ExtractDRegister(instr, 22, 12);
14713                              unsigned length;
14714                              SpacingType spacing = kSingle;
14715                              switch ((instr >> 8) & 0xf) {
14716                                default:
14717                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14718                                case 0x7:
14719                                  length = 1;
14720                                  break;
14721                                case 0xa:
14722                                  length = 2;
14723                                  break;
14724                                case 0x6:
14725                                  length = 3;
14726                                  break;
14727                                case 0x2:
14728                                  length = 4;
14729                                  break;
14730                              }
14731                              unsigned last = first + length - 1;
14732                              TransferType transfer = kMultipleLanes;
14733                              unsigned rn = (instr >> 16) & 0xf;
14734                              unsigned rm = instr & 0xf;
14735                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14736                              vld1(CurrentCond(),
14737                                   dt,
14738                                   NeonRegisterList(DRegister(first),
14739                                                    DRegister(last),
14740                                                    spacing,
14741                                                    transfer),
14742                                   AlignedMemOperand(Register(rn),
14743                                                     align,
14744                                                     Register(rm),
14745                                                     PostIndex));
14746                              break;
14747                            }
14748                            case 0x00000800: {
14749                              // 0xf9200800
14750                              if (((instr & 0xd) == 0xd) ||
14751                                  ((instr & 0xe30) == 0x830)) {
14752                                UnallocatedT32(instr);
14753                                return;
14754                              }
14755                              DataType dt =
14756                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14757                              if (dt.Is(kDataTypeValueInvalid)) {
14758                                UnallocatedT32(instr);
14759                                return;
14760                              }
14761                              Alignment align =
14762                                  Align_align_2_Decode((instr >> 4) & 0x3);
14763                              if (dt.Is(kDataTypeValueInvalid) ||
14764                                  align.Is(kBadAlignment)) {
14765                                UnallocatedT32(instr);
14766                                return;
14767                              }
14768                              unsigned first = ExtractDRegister(instr, 22, 12);
14769                              unsigned length;
14770                              SpacingType spacing;
14771                              switch ((instr >> 8) & 0xf) {
14772                                default:
14773                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14774                                case 0x8:
14775                                  length = 2;
14776                                  spacing = kSingle;
14777                                  break;
14778                                case 0x9:
14779                                  length = 2;
14780                                  spacing = kDouble;
14781                                  break;
14782                                case 0x3:
14783                                  length = 4;
14784                                  spacing = kSingle;
14785                                  break;
14786                              }
14787                              unsigned last =
14788                                  first +
14789                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14790                              TransferType transfer = kMultipleLanes;
14791                              unsigned rn = (instr >> 16) & 0xf;
14792                              unsigned rm = instr & 0xf;
14793                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14794                              vld2(CurrentCond(),
14795                                   dt,
14796                                   NeonRegisterList(DRegister(first),
14797                                                    DRegister(last),
14798                                                    spacing,
14799                                                    transfer),
14800                                   AlignedMemOperand(Register(rn),
14801                                                     align,
14802                                                     Register(rm),
14803                                                     PostIndex));
14804                              break;
14805                            }
14806                            case 0x00000900: {
14807                              // 0xf9200900
14808                              if (((instr & 0xd) == 0xd) ||
14809                                  ((instr & 0xe30) == 0x830)) {
14810                                UnallocatedT32(instr);
14811                                return;
14812                              }
14813                              DataType dt =
14814                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14815                              if (dt.Is(kDataTypeValueInvalid)) {
14816                                UnallocatedT32(instr);
14817                                return;
14818                              }
14819                              Alignment align =
14820                                  Align_align_2_Decode((instr >> 4) & 0x3);
14821                              if (dt.Is(kDataTypeValueInvalid) ||
14822                                  align.Is(kBadAlignment)) {
14823                                UnallocatedT32(instr);
14824                                return;
14825                              }
14826                              unsigned first = ExtractDRegister(instr, 22, 12);
14827                              unsigned length;
14828                              SpacingType spacing;
14829                              switch ((instr >> 8) & 0xf) {
14830                                default:
14831                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14832                                case 0x8:
14833                                  length = 2;
14834                                  spacing = kSingle;
14835                                  break;
14836                                case 0x9:
14837                                  length = 2;
14838                                  spacing = kDouble;
14839                                  break;
14840                                case 0x3:
14841                                  length = 4;
14842                                  spacing = kSingle;
14843                                  break;
14844                              }
14845                              unsigned last =
14846                                  first +
14847                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14848                              TransferType transfer = kMultipleLanes;
14849                              unsigned rn = (instr >> 16) & 0xf;
14850                              unsigned rm = instr & 0xf;
14851                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14852                              vld2(CurrentCond(),
14853                                   dt,
14854                                   NeonRegisterList(DRegister(first),
14855                                                    DRegister(last),
14856                                                    spacing,
14857                                                    transfer),
14858                                   AlignedMemOperand(Register(rn),
14859                                                     align,
14860                                                     Register(rm),
14861                                                     PostIndex));
14862                              break;
14863                            }
14864                            case 0x00000a00: {
14865                              // 0xf9200a00
14866                              if (((instr & 0xd) == 0xd) ||
14867                                  ((instr & 0xe20) == 0x620) ||
14868                                  ((instr & 0xf30) == 0xa30)) {
14869                                UnallocatedT32(instr);
14870                                return;
14871                              }
14872                              DataType dt =
14873                                  Dt_size_6_Decode((instr >> 6) & 0x3);
14874                              if (dt.Is(kDataTypeValueInvalid)) {
14875                                UnallocatedT32(instr);
14876                                return;
14877                              }
14878                              Alignment align =
14879                                  Align_align_1_Decode((instr >> 4) & 0x3);
14880                              if (dt.Is(kDataTypeValueInvalid) ||
14881                                  align.Is(kBadAlignment)) {
14882                                UnallocatedT32(instr);
14883                                return;
14884                              }
14885                              unsigned first = ExtractDRegister(instr, 22, 12);
14886                              unsigned length;
14887                              SpacingType spacing = kSingle;
14888                              switch ((instr >> 8) & 0xf) {
14889                                default:
14890                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14891                                case 0x7:
14892                                  length = 1;
14893                                  break;
14894                                case 0xa:
14895                                  length = 2;
14896                                  break;
14897                                case 0x6:
14898                                  length = 3;
14899                                  break;
14900                                case 0x2:
14901                                  length = 4;
14902                                  break;
14903                              }
14904                              unsigned last = first + length - 1;
14905                              TransferType transfer = kMultipleLanes;
14906                              unsigned rn = (instr >> 16) & 0xf;
14907                              unsigned rm = instr & 0xf;
14908                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14909                              vld1(CurrentCond(),
14910                                   dt,
14911                                   NeonRegisterList(DRegister(first),
14912                                                    DRegister(last),
14913                                                    spacing,
14914                                                    transfer),
14915                                   AlignedMemOperand(Register(rn),
14916                                                     align,
14917                                                     Register(rm),
14918                                                     PostIndex));
14919                              break;
14920                            }
14921                            default:
14922                              UnallocatedT32(instr);
14923                              break;
14924                          }
14925                          break;
14926                        }
14927                      }
14928                      break;
14929                    }
14930                    case 0x01800000: {
14931                      // 0xf9800000
14932                      switch (instr & 0x00000300) {
14933                        case 0x00000000: {
14934                          // 0xf9800000
14935                          switch (instr & 0x00000c00) {
14936                            case 0x00000c00: {
14937                              // 0xf9800c00
14938                              UnallocatedT32(instr);
14939                              break;
14940                            }
14941                            default: {
14942                              switch (instr & 0x0000000d) {
14943                                case 0x0000000d: {
14944                                  // 0xf980000d
14945                                  switch (instr & 0x00000002) {
14946                                    case 0x00000000: {
14947                                      // 0xf980000d
14948                                      if (((instr & 0xc00) == 0xc00)) {
14949                                        UnallocatedT32(instr);
14950                                        return;
14951                                      }
14952                                      DataType dt =
14953                                          Dt_size_7_Decode((instr >> 10) & 0x3);
14954                                      if (dt.Is(kDataTypeValueInvalid)) {
14955                                        UnallocatedT32(instr);
14956                                        return;
14957                                      }
14958                                      DecodeNeonAndAlign decode_neon =
14959                                          Align_index_align_1_Decode((instr >>
14960                                                                      4) &
14961                                                                         0xf,
14962                                                                     dt);
14963                                      if (!decode_neon.IsValid()) {
14964                                        UnallocatedT32(instr);
14965                                        return;
14966                                      }
14967                                      Alignment align = decode_neon.GetAlign();
14968                                      int lane = decode_neon.GetLane();
14969                                      SpacingType spacing =
14970                                          decode_neon.GetSpacing();
14971                                      unsigned first =
14972                                          ExtractDRegister(instr, 22, 12);
14973                                      unsigned length = 1;
14974                                      unsigned last = first + length - 1;
14975                                      unsigned rn = (instr >> 16) & 0xf;
14976                                      // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
14977                                      vst1(CurrentCond(),
14978                                           dt,
14979                                           NeonRegisterList(DRegister(first),
14980                                                            DRegister(last),
14981                                                            spacing,
14982                                                            lane),
14983                                           AlignedMemOperand(Register(rn),
14984                                                             align,
14985                                                             PostIndex));
14986                                      break;
14987                                    }
14988                                    case 0x00000002: {
14989                                      // 0xf980000f
14990                                      if (((instr & 0xc00) == 0xc00)) {
14991                                        UnallocatedT32(instr);
14992                                        return;
14993                                      }
14994                                      DataType dt =
14995                                          Dt_size_7_Decode((instr >> 10) & 0x3);
14996                                      if (dt.Is(kDataTypeValueInvalid)) {
14997                                        UnallocatedT32(instr);
14998                                        return;
14999                                      }
15000                                      DecodeNeonAndAlign decode_neon =
15001                                          Align_index_align_1_Decode((instr >>
15002                                                                      4) &
15003                                                                         0xf,
15004                                                                     dt);
15005                                      if (!decode_neon.IsValid()) {
15006                                        UnallocatedT32(instr);
15007                                        return;
15008                                      }
15009                                      Alignment align = decode_neon.GetAlign();
15010                                      int lane = decode_neon.GetLane();
15011                                      SpacingType spacing =
15012                                          decode_neon.GetSpacing();
15013                                      unsigned first =
15014                                          ExtractDRegister(instr, 22, 12);
15015                                      unsigned length = 1;
15016                                      unsigned last = first + length - 1;
15017                                      unsigned rn = (instr >> 16) & 0xf;
15018                                      // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15019                                      vst1(CurrentCond(),
15020                                           dt,
15021                                           NeonRegisterList(DRegister(first),
15022                                                            DRegister(last),
15023                                                            spacing,
15024                                                            lane),
15025                                           AlignedMemOperand(Register(rn),
15026                                                             align,
15027                                                             Offset));
15028                                      break;
15029                                    }
15030                                  }
15031                                  break;
15032                                }
15033                                default: {
15034                                  if (((instr & 0xc00) == 0xc00) ||
15035                                      ((instr & 0xd) == 0xd)) {
15036                                    UnallocatedT32(instr);
15037                                    return;
15038                                  }
15039                                  DataType dt =
15040                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15041                                  if (dt.Is(kDataTypeValueInvalid)) {
15042                                    UnallocatedT32(instr);
15043                                    return;
15044                                  }
15045                                  DecodeNeonAndAlign decode_neon =
15046                                      Align_index_align_1_Decode((instr >> 4) &
15047                                                                     0xf,
15048                                                                 dt);
15049                                  if (!decode_neon.IsValid()) {
15050                                    UnallocatedT32(instr);
15051                                    return;
15052                                  }
15053                                  Alignment align = decode_neon.GetAlign();
15054                                  int lane = decode_neon.GetLane();
15055                                  SpacingType spacing =
15056                                      decode_neon.GetSpacing();
15057                                  unsigned first =
15058                                      ExtractDRegister(instr, 22, 12);
15059                                  unsigned length = 1;
15060                                  unsigned last = first + length - 1;
15061                                  unsigned rn = (instr >> 16) & 0xf;
15062                                  unsigned rm = instr & 0xf;
15063                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15064                                  vst1(CurrentCond(),
15065                                       dt,
15066                                       NeonRegisterList(DRegister(first),
15067                                                        DRegister(last),
15068                                                        spacing,
15069                                                        lane),
15070                                       AlignedMemOperand(Register(rn),
15071                                                         align,
15072                                                         Register(rm),
15073                                                         PostIndex));
15074                                  break;
15075                                }
15076                              }
15077                              break;
15078                            }
15079                          }
15080                          break;
15081                        }
15082                        case 0x00000100: {
15083                          // 0xf9800100
15084                          switch (instr & 0x00000c00) {
15085                            case 0x00000c00: {
15086                              // 0xf9800d00
15087                              UnallocatedT32(instr);
15088                              break;
15089                            }
15090                            default: {
15091                              switch (instr & 0x0000000d) {
15092                                case 0x0000000d: {
15093                                  // 0xf980010d
15094                                  switch (instr & 0x00000002) {
15095                                    case 0x00000000: {
15096                                      // 0xf980010d
15097                                      if (((instr & 0xc00) == 0xc00)) {
15098                                        UnallocatedT32(instr);
15099                                        return;
15100                                      }
15101                                      DataType dt =
15102                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15103                                      if (dt.Is(kDataTypeValueInvalid)) {
15104                                        UnallocatedT32(instr);
15105                                        return;
15106                                      }
15107                                      DecodeNeonAndAlign decode_neon =
15108                                          Align_index_align_2_Decode((instr >>
15109                                                                      4) &
15110                                                                         0xf,
15111                                                                     dt);
15112                                      if (!decode_neon.IsValid()) {
15113                                        UnallocatedT32(instr);
15114                                        return;
15115                                      }
15116                                      Alignment align = decode_neon.GetAlign();
15117                                      int lane = decode_neon.GetLane();
15118                                      SpacingType spacing =
15119                                          decode_neon.GetSpacing();
15120                                      unsigned first =
15121                                          ExtractDRegister(instr, 22, 12);
15122                                      unsigned length = 2;
15123                                      unsigned last =
15124                                          first +
15125                                          (length - 1) *
15126                                              (spacing == kSingle ? 1 : 2);
15127                                      unsigned rn = (instr >> 16) & 0xf;
15128                                      // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15129                                      vst2(CurrentCond(),
15130                                           dt,
15131                                           NeonRegisterList(DRegister(first),
15132                                                            DRegister(last),
15133                                                            spacing,
15134                                                            lane),
15135                                           AlignedMemOperand(Register(rn),
15136                                                             align,
15137                                                             PostIndex));
15138                                      break;
15139                                    }
15140                                    case 0x00000002: {
15141                                      // 0xf980010f
15142                                      if (((instr & 0xc00) == 0xc00)) {
15143                                        UnallocatedT32(instr);
15144                                        return;
15145                                      }
15146                                      DataType dt =
15147                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15148                                      if (dt.Is(kDataTypeValueInvalid)) {
15149                                        UnallocatedT32(instr);
15150                                        return;
15151                                      }
15152                                      DecodeNeonAndAlign decode_neon =
15153                                          Align_index_align_2_Decode((instr >>
15154                                                                      4) &
15155                                                                         0xf,
15156                                                                     dt);
15157                                      if (!decode_neon.IsValid()) {
15158                                        UnallocatedT32(instr);
15159                                        return;
15160                                      }
15161                                      Alignment align = decode_neon.GetAlign();
15162                                      int lane = decode_neon.GetLane();
15163                                      SpacingType spacing =
15164                                          decode_neon.GetSpacing();
15165                                      unsigned first =
15166                                          ExtractDRegister(instr, 22, 12);
15167                                      unsigned length = 2;
15168                                      unsigned last =
15169                                          first +
15170                                          (length - 1) *
15171                                              (spacing == kSingle ? 1 : 2);
15172                                      unsigned rn = (instr >> 16) & 0xf;
15173                                      // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15174                                      vst2(CurrentCond(),
15175                                           dt,
15176                                           NeonRegisterList(DRegister(first),
15177                                                            DRegister(last),
15178                                                            spacing,
15179                                                            lane),
15180                                           AlignedMemOperand(Register(rn),
15181                                                             align,
15182                                                             Offset));
15183                                      break;
15184                                    }
15185                                  }
15186                                  break;
15187                                }
15188                                default: {
15189                                  if (((instr & 0xc00) == 0xc00) ||
15190                                      ((instr & 0xd) == 0xd)) {
15191                                    UnallocatedT32(instr);
15192                                    return;
15193                                  }
15194                                  DataType dt =
15195                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15196                                  if (dt.Is(kDataTypeValueInvalid)) {
15197                                    UnallocatedT32(instr);
15198                                    return;
15199                                  }
15200                                  DecodeNeonAndAlign decode_neon =
15201                                      Align_index_align_2_Decode((instr >> 4) &
15202                                                                     0xf,
15203                                                                 dt);
15204                                  if (!decode_neon.IsValid()) {
15205                                    UnallocatedT32(instr);
15206                                    return;
15207                                  }
15208                                  Alignment align = decode_neon.GetAlign();
15209                                  int lane = decode_neon.GetLane();
15210                                  SpacingType spacing =
15211                                      decode_neon.GetSpacing();
15212                                  unsigned first =
15213                                      ExtractDRegister(instr, 22, 12);
15214                                  unsigned length = 2;
15215                                  unsigned last =
15216                                      first +
15217                                      (length - 1) *
15218                                          (spacing == kSingle ? 1 : 2);
15219                                  unsigned rn = (instr >> 16) & 0xf;
15220                                  unsigned rm = instr & 0xf;
15221                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15222                                  vst2(CurrentCond(),
15223                                       dt,
15224                                       NeonRegisterList(DRegister(first),
15225                                                        DRegister(last),
15226                                                        spacing,
15227                                                        lane),
15228                                       AlignedMemOperand(Register(rn),
15229                                                         align,
15230                                                         Register(rm),
15231                                                         PostIndex));
15232                                  break;
15233                                }
15234                              }
15235                              break;
15236                            }
15237                          }
15238                          break;
15239                        }
15240                        case 0x00000200: {
15241                          // 0xf9800200
15242                          switch (instr & 0x00000c30) {
15243                            case 0x00000010: {
15244                              // 0xf9800210
15245                              UnallocatedT32(instr);
15246                              break;
15247                            }
15248                            case 0x00000030: {
15249                              // 0xf9800230
15250                              UnallocatedT32(instr);
15251                              break;
15252                            }
15253                            case 0x00000410: {
15254                              // 0xf9800610
15255                              UnallocatedT32(instr);
15256                              break;
15257                            }
15258                            case 0x00000430: {
15259                              // 0xf9800630
15260                              UnallocatedT32(instr);
15261                              break;
15262                            }
15263                            case 0x00000810: {
15264                              // 0xf9800a10
15265                              UnallocatedT32(instr);
15266                              break;
15267                            }
15268                            case 0x00000820: {
15269                              // 0xf9800a20
15270                              UnallocatedT32(instr);
15271                              break;
15272                            }
15273                            case 0x00000830: {
15274                              // 0xf9800a30
15275                              UnallocatedT32(instr);
15276                              break;
15277                            }
15278                            case 0x00000c00: {
15279                              // 0xf9800e00
15280                              UnallocatedT32(instr);
15281                              break;
15282                            }
15283                            case 0x00000c10: {
15284                              // 0xf9800e10
15285                              UnallocatedT32(instr);
15286                              break;
15287                            }
15288                            case 0x00000c20: {
15289                              // 0xf9800e20
15290                              UnallocatedT32(instr);
15291                              break;
15292                            }
15293                            case 0x00000c30: {
15294                              // 0xf9800e30
15295                              UnallocatedT32(instr);
15296                              break;
15297                            }
15298                            default: {
15299                              switch (instr & 0x0000000d) {
15300                                case 0x0000000d: {
15301                                  // 0xf980020d
15302                                  switch (instr & 0x00000002) {
15303                                    case 0x00000000: {
15304                                      // 0xf980020d
15305                                      if (((instr & 0xc00) == 0xc00) ||
15306                                          ((instr & 0x810) == 0x10) ||
15307                                          ((instr & 0xc30) == 0x810) ||
15308                                          ((instr & 0xc30) == 0x820) ||
15309                                          ((instr & 0xc30) == 0x830)) {
15310                                        UnallocatedT32(instr);
15311                                        return;
15312                                      }
15313                                      DataType dt =
15314                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15315                                      if (dt.Is(kDataTypeValueInvalid)) {
15316                                        UnallocatedT32(instr);
15317                                        return;
15318                                      }
15319                                      DecodeNeon decode_neon =
15320                                          Index_1_Decode((instr >> 4) & 0xf,
15321                                                         dt);
15322                                      if (!decode_neon.IsValid()) {
15323                                        UnallocatedT32(instr);
15324                                        return;
15325                                      }
15326                                      int lane = decode_neon.GetLane();
15327                                      SpacingType spacing =
15328                                          decode_neon.GetSpacing();
15329                                      unsigned first =
15330                                          ExtractDRegister(instr, 22, 12);
15331                                      unsigned length = 3;
15332                                      unsigned last =
15333                                          first +
15334                                          (length - 1) *
15335                                              (spacing == kSingle ? 1 : 2);
15336                                      unsigned rn = (instr >> 16) & 0xf;
15337                                      // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
15338                                      vst3(CurrentCond(),
15339                                           dt,
15340                                           NeonRegisterList(DRegister(first),
15341                                                            DRegister(last),
15342                                                            spacing,
15343                                                            lane),
15344                                           MemOperand(Register(rn), PostIndex));
15345                                      break;
15346                                    }
15347                                    case 0x00000002: {
15348                                      // 0xf980020f
15349                                      if (((instr & 0xc00) == 0xc00) ||
15350                                          ((instr & 0x810) == 0x10) ||
15351                                          ((instr & 0xc30) == 0x810) ||
15352                                          ((instr & 0xc30) == 0x820) ||
15353                                          ((instr & 0xc30) == 0x830)) {
15354                                        UnallocatedT32(instr);
15355                                        return;
15356                                      }
15357                                      DataType dt =
15358                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15359                                      if (dt.Is(kDataTypeValueInvalid)) {
15360                                        UnallocatedT32(instr);
15361                                        return;
15362                                      }
15363                                      DecodeNeon decode_neon =
15364                                          Index_1_Decode((instr >> 4) & 0xf,
15365                                                         dt);
15366                                      if (!decode_neon.IsValid()) {
15367                                        UnallocatedT32(instr);
15368                                        return;
15369                                      }
15370                                      int lane = decode_neon.GetLane();
15371                                      SpacingType spacing =
15372                                          decode_neon.GetSpacing();
15373                                      unsigned first =
15374                                          ExtractDRegister(instr, 22, 12);
15375                                      unsigned length = 3;
15376                                      unsigned last =
15377                                          first +
15378                                          (length - 1) *
15379                                              (spacing == kSingle ? 1 : 2);
15380                                      unsigned rn = (instr >> 16) & 0xf;
15381                                      // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
15382                                      vst3(CurrentCond(),
15383                                           dt,
15384                                           NeonRegisterList(DRegister(first),
15385                                                            DRegister(last),
15386                                                            spacing,
15387                                                            lane),
15388                                           MemOperand(Register(rn), Offset));
15389                                      break;
15390                                    }
15391                                  }
15392                                  break;
15393                                }
15394                                default: {
15395                                  if (((instr & 0xc00) == 0xc00) ||
15396                                      ((instr & 0xd) == 0xd) ||
15397                                      ((instr & 0x810) == 0x10) ||
15398                                      ((instr & 0xc30) == 0x810) ||
15399                                      ((instr & 0xc30) == 0x820) ||
15400                                      ((instr & 0xc30) == 0x830)) {
15401                                    UnallocatedT32(instr);
15402                                    return;
15403                                  }
15404                                  DataType dt =
15405                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15406                                  if (dt.Is(kDataTypeValueInvalid)) {
15407                                    UnallocatedT32(instr);
15408                                    return;
15409                                  }
15410                                  DecodeNeon decode_neon =
15411                                      Index_1_Decode((instr >> 4) & 0xf, dt);
15412                                  if (!decode_neon.IsValid()) {
15413                                    UnallocatedT32(instr);
15414                                    return;
15415                                  }
15416                                  int lane = decode_neon.GetLane();
15417                                  SpacingType spacing =
15418                                      decode_neon.GetSpacing();
15419                                  unsigned first =
15420                                      ExtractDRegister(instr, 22, 12);
15421                                  unsigned length = 3;
15422                                  unsigned last =
15423                                      first +
15424                                      (length - 1) *
15425                                          (spacing == kSingle ? 1 : 2);
15426                                  unsigned rn = (instr >> 16) & 0xf;
15427                                  Sign sign(plus);
15428                                  unsigned rm = instr & 0xf;
15429                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
15430                                  vst3(CurrentCond(),
15431                                       dt,
15432                                       NeonRegisterList(DRegister(first),
15433                                                        DRegister(last),
15434                                                        spacing,
15435                                                        lane),
15436                                       MemOperand(Register(rn),
15437                                                  sign,
15438                                                  Register(rm),
15439                                                  PostIndex));
15440                                  break;
15441                                }
15442                              }
15443                              break;
15444                            }
15445                          }
15446                          break;
15447                        }
15448                        case 0x00000300: {
15449                          // 0xf9800300
15450                          switch (instr & 0x00000c00) {
15451                            case 0x00000c00: {
15452                              // 0xf9800f00
15453                              UnallocatedT32(instr);
15454                              break;
15455                            }
15456                            default: {
15457                              switch (instr & 0x0000000d) {
15458                                case 0x0000000d: {
15459                                  // 0xf980030d
15460                                  switch (instr & 0x00000002) {
15461                                    case 0x00000000: {
15462                                      // 0xf980030d
15463                                      if (((instr & 0xc00) == 0xc00)) {
15464                                        UnallocatedT32(instr);
15465                                        return;
15466                                      }
15467                                      DataType dt =
15468                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15469                                      if (dt.Is(kDataTypeValueInvalid)) {
15470                                        UnallocatedT32(instr);
15471                                        return;
15472                                      }
15473                                      DecodeNeonAndAlign decode_neon =
15474                                          Align_index_align_3_Decode((instr >>
15475                                                                      4) &
15476                                                                         0xf,
15477                                                                     dt);
15478                                      if (!decode_neon.IsValid()) {
15479                                        UnallocatedT32(instr);
15480                                        return;
15481                                      }
15482                                      Alignment align = decode_neon.GetAlign();
15483                                      int lane = decode_neon.GetLane();
15484                                      SpacingType spacing =
15485                                          decode_neon.GetSpacing();
15486                                      unsigned first =
15487                                          ExtractDRegister(instr, 22, 12);
15488                                      unsigned length = 4;
15489                                      unsigned last =
15490                                          first +
15491                                          (length - 1) *
15492                                              (spacing == kSingle ? 1 : 2);
15493                                      unsigned rn = (instr >> 16) & 0xf;
15494                                      // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15495                                      vst4(CurrentCond(),
15496                                           dt,
15497                                           NeonRegisterList(DRegister(first),
15498                                                            DRegister(last),
15499                                                            spacing,
15500                                                            lane),
15501                                           AlignedMemOperand(Register(rn),
15502                                                             align,
15503                                                             PostIndex));
15504                                      break;
15505                                    }
15506                                    case 0x00000002: {
15507                                      // 0xf980030f
15508                                      if (((instr & 0xc00) == 0xc00)) {
15509                                        UnallocatedT32(instr);
15510                                        return;
15511                                      }
15512                                      DataType dt =
15513                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15514                                      if (dt.Is(kDataTypeValueInvalid)) {
15515                                        UnallocatedT32(instr);
15516                                        return;
15517                                      }
15518                                      DecodeNeonAndAlign decode_neon =
15519                                          Align_index_align_3_Decode((instr >>
15520                                                                      4) &
15521                                                                         0xf,
15522                                                                     dt);
15523                                      if (!decode_neon.IsValid()) {
15524                                        UnallocatedT32(instr);
15525                                        return;
15526                                      }
15527                                      Alignment align = decode_neon.GetAlign();
15528                                      int lane = decode_neon.GetLane();
15529                                      SpacingType spacing =
15530                                          decode_neon.GetSpacing();
15531                                      unsigned first =
15532                                          ExtractDRegister(instr, 22, 12);
15533                                      unsigned length = 4;
15534                                      unsigned last =
15535                                          first +
15536                                          (length - 1) *
15537                                              (spacing == kSingle ? 1 : 2);
15538                                      unsigned rn = (instr >> 16) & 0xf;
15539                                      // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15540                                      vst4(CurrentCond(),
15541                                           dt,
15542                                           NeonRegisterList(DRegister(first),
15543                                                            DRegister(last),
15544                                                            spacing,
15545                                                            lane),
15546                                           AlignedMemOperand(Register(rn),
15547                                                             align,
15548                                                             Offset));
15549                                      break;
15550                                    }
15551                                  }
15552                                  break;
15553                                }
15554                                default: {
15555                                  if (((instr & 0xc00) == 0xc00) ||
15556                                      ((instr & 0xd) == 0xd)) {
15557                                    UnallocatedT32(instr);
15558                                    return;
15559                                  }
15560                                  DataType dt =
15561                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15562                                  if (dt.Is(kDataTypeValueInvalid)) {
15563                                    UnallocatedT32(instr);
15564                                    return;
15565                                  }
15566                                  DecodeNeonAndAlign decode_neon =
15567                                      Align_index_align_3_Decode((instr >> 4) &
15568                                                                     0xf,
15569                                                                 dt);
15570                                  if (!decode_neon.IsValid()) {
15571                                    UnallocatedT32(instr);
15572                                    return;
15573                                  }
15574                                  Alignment align = decode_neon.GetAlign();
15575                                  int lane = decode_neon.GetLane();
15576                                  SpacingType spacing =
15577                                      decode_neon.GetSpacing();
15578                                  unsigned first =
15579                                      ExtractDRegister(instr, 22, 12);
15580                                  unsigned length = 4;
15581                                  unsigned last =
15582                                      first +
15583                                      (length - 1) *
15584                                          (spacing == kSingle ? 1 : 2);
15585                                  unsigned rn = (instr >> 16) & 0xf;
15586                                  unsigned rm = instr & 0xf;
15587                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15588                                  vst4(CurrentCond(),
15589                                       dt,
15590                                       NeonRegisterList(DRegister(first),
15591                                                        DRegister(last),
15592                                                        spacing,
15593                                                        lane),
15594                                       AlignedMemOperand(Register(rn),
15595                                                         align,
15596                                                         Register(rm),
15597                                                         PostIndex));
15598                                  break;
15599                                }
15600                              }
15601                              break;
15602                            }
15603                          }
15604                          break;
15605                        }
15606                      }
15607                      break;
15608                    }
15609                    case 0x01a00000: {
15610                      // 0xf9a00000
15611                      switch (instr & 0x00000300) {
15612                        case 0x00000000: {
15613                          // 0xf9a00000
15614                          switch (instr & 0x00000c00) {
15615                            case 0x00000c00: {
15616                              // 0xf9a00c00
15617                              switch (instr & 0x0000000d) {
15618                                case 0x0000000d: {
15619                                  // 0xf9a00c0d
15620                                  switch (instr & 0x00000002) {
15621                                    case 0x00000000: {
15622                                      // 0xf9a00c0d
15623                                      DataType dt =
15624                                          Dt_size_7_Decode((instr >> 6) & 0x3);
15625                                      if (dt.Is(kDataTypeValueInvalid)) {
15626                                        UnallocatedT32(instr);
15627                                        return;
15628                                      }
15629                                      Alignment align =
15630                                          Align_a_1_Decode((instr >> 4) & 0x1,
15631                                                           dt);
15632                                      if (dt.Is(kDataTypeValueInvalid) ||
15633                                          align.Is(kBadAlignment)) {
15634                                        UnallocatedT32(instr);
15635                                        return;
15636                                      }
15637                                      unsigned first =
15638                                          ExtractDRegister(instr, 22, 12);
15639                                      unsigned length;
15640                                      SpacingType spacing = kSingle;
15641                                      switch ((instr >> 5) & 0x1) {
15642                                        default:
15643                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
15644                                        case 0x0:
15645                                          length = 1;
15646                                          break;
15647                                        case 0x1:
15648                                          length = 2;
15649                                          break;
15650                                      }
15651                                      unsigned last = first + length - 1;
15652                                      TransferType transfer = kAllLanes;
15653                                      unsigned rn = (instr >> 16) & 0xf;
15654                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15655                                      vld1(CurrentCond(),
15656                                           dt,
15657                                           NeonRegisterList(DRegister(first),
15658                                                            DRegister(last),
15659                                                            spacing,
15660                                                            transfer),
15661                                           AlignedMemOperand(Register(rn),
15662                                                             align,
15663                                                             PostIndex));
15664                                      break;
15665                                    }
15666                                    case 0x00000002: {
15667                                      // 0xf9a00c0f
15668                                      DataType dt =
15669                                          Dt_size_7_Decode((instr >> 6) & 0x3);
15670                                      if (dt.Is(kDataTypeValueInvalid)) {
15671                                        UnallocatedT32(instr);
15672                                        return;
15673                                      }
15674                                      Alignment align =
15675                                          Align_a_1_Decode((instr >> 4) & 0x1,
15676                                                           dt);
15677                                      if (dt.Is(kDataTypeValueInvalid) ||
15678                                          align.Is(kBadAlignment)) {
15679                                        UnallocatedT32(instr);
15680                                        return;
15681                                      }
15682                                      unsigned first =
15683                                          ExtractDRegister(instr, 22, 12);
15684                                      unsigned length;
15685                                      SpacingType spacing = kSingle;
15686                                      switch ((instr >> 5) & 0x1) {
15687                                        default:
15688                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
15689                                        case 0x0:
15690                                          length = 1;
15691                                          break;
15692                                        case 0x1:
15693                                          length = 2;
15694                                          break;
15695                                      }
15696                                      unsigned last = first + length - 1;
15697                                      TransferType transfer = kAllLanes;
15698                                      unsigned rn = (instr >> 16) & 0xf;
15699                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15700                                      vld1(CurrentCond(),
15701                                           dt,
15702                                           NeonRegisterList(DRegister(first),
15703                                                            DRegister(last),
15704                                                            spacing,
15705                                                            transfer),
15706                                           AlignedMemOperand(Register(rn),
15707                                                             align,
15708                                                             Offset));
15709                                      break;
15710                                    }
15711                                  }
15712                                  break;
15713                                }
15714                                default: {
15715                                  if (((instr & 0xd) == 0xd)) {
15716                                    UnallocatedT32(instr);
15717                                    return;
15718                                  }
15719                                  DataType dt =
15720                                      Dt_size_7_Decode((instr >> 6) & 0x3);
15721                                  if (dt.Is(kDataTypeValueInvalid)) {
15722                                    UnallocatedT32(instr);
15723                                    return;
15724                                  }
15725                                  Alignment align =
15726                                      Align_a_1_Decode((instr >> 4) & 0x1, dt);
15727                                  if (dt.Is(kDataTypeValueInvalid) ||
15728                                      align.Is(kBadAlignment)) {
15729                                    UnallocatedT32(instr);
15730                                    return;
15731                                  }
15732                                  unsigned first =
15733                                      ExtractDRegister(instr, 22, 12);
15734                                  unsigned length;
15735                                  SpacingType spacing = kSingle;
15736                                  switch ((instr >> 5) & 0x1) {
15737                                    default:
15738                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
15739                                    case 0x0:
15740                                      length = 1;
15741                                      break;
15742                                    case 0x1:
15743                                      length = 2;
15744                                      break;
15745                                  }
15746                                  unsigned last = first + length - 1;
15747                                  TransferType transfer = kAllLanes;
15748                                  unsigned rn = (instr >> 16) & 0xf;
15749                                  unsigned rm = instr & 0xf;
15750                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15751                                  vld1(CurrentCond(),
15752                                       dt,
15753                                       NeonRegisterList(DRegister(first),
15754                                                        DRegister(last),
15755                                                        spacing,
15756                                                        transfer),
15757                                       AlignedMemOperand(Register(rn),
15758                                                         align,
15759                                                         Register(rm),
15760                                                         PostIndex));
15761                                  break;
15762                                }
15763                              }
15764                              break;
15765                            }
15766                            default: {
15767                              switch (instr & 0x0000000d) {
15768                                case 0x0000000d: {
15769                                  // 0xf9a0000d
15770                                  switch (instr & 0x00000002) {
15771                                    case 0x00000000: {
15772                                      // 0xf9a0000d
15773                                      if (((instr & 0xc00) == 0xc00)) {
15774                                        UnallocatedT32(instr);
15775                                        return;
15776                                      }
15777                                      DataType dt =
15778                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15779                                      if (dt.Is(kDataTypeValueInvalid)) {
15780                                        UnallocatedT32(instr);
15781                                        return;
15782                                      }
15783                                      DecodeNeonAndAlign decode_neon =
15784                                          Align_index_align_1_Decode((instr >>
15785                                                                      4) &
15786                                                                         0xf,
15787                                                                     dt);
15788                                      if (!decode_neon.IsValid()) {
15789                                        UnallocatedT32(instr);
15790                                        return;
15791                                      }
15792                                      Alignment align = decode_neon.GetAlign();
15793                                      int lane = decode_neon.GetLane();
15794                                      SpacingType spacing =
15795                                          decode_neon.GetSpacing();
15796                                      unsigned first =
15797                                          ExtractDRegister(instr, 22, 12);
15798                                      unsigned length = 1;
15799                                      unsigned last = first + length - 1;
15800                                      unsigned rn = (instr >> 16) & 0xf;
15801                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15802                                      vld1(CurrentCond(),
15803                                           dt,
15804                                           NeonRegisterList(DRegister(first),
15805                                                            DRegister(last),
15806                                                            spacing,
15807                                                            lane),
15808                                           AlignedMemOperand(Register(rn),
15809                                                             align,
15810                                                             PostIndex));
15811                                      break;
15812                                    }
15813                                    case 0x00000002: {
15814                                      // 0xf9a0000f
15815                                      if (((instr & 0xc00) == 0xc00)) {
15816                                        UnallocatedT32(instr);
15817                                        return;
15818                                      }
15819                                      DataType dt =
15820                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15821                                      if (dt.Is(kDataTypeValueInvalid)) {
15822                                        UnallocatedT32(instr);
15823                                        return;
15824                                      }
15825                                      DecodeNeonAndAlign decode_neon =
15826                                          Align_index_align_1_Decode((instr >>
15827                                                                      4) &
15828                                                                         0xf,
15829                                                                     dt);
15830                                      if (!decode_neon.IsValid()) {
15831                                        UnallocatedT32(instr);
15832                                        return;
15833                                      }
15834                                      Alignment align = decode_neon.GetAlign();
15835                                      int lane = decode_neon.GetLane();
15836                                      SpacingType spacing =
15837                                          decode_neon.GetSpacing();
15838                                      unsigned first =
15839                                          ExtractDRegister(instr, 22, 12);
15840                                      unsigned length = 1;
15841                                      unsigned last = first + length - 1;
15842                                      unsigned rn = (instr >> 16) & 0xf;
15843                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15844                                      vld1(CurrentCond(),
15845                                           dt,
15846                                           NeonRegisterList(DRegister(first),
15847                                                            DRegister(last),
15848                                                            spacing,
15849                                                            lane),
15850                                           AlignedMemOperand(Register(rn),
15851                                                             align,
15852                                                             Offset));
15853                                      break;
15854                                    }
15855                                  }
15856                                  break;
15857                                }
15858                                default: {
15859                                  if (((instr & 0xc00) == 0xc00) ||
15860                                      ((instr & 0xd) == 0xd)) {
15861                                    UnallocatedT32(instr);
15862                                    return;
15863                                  }
15864                                  DataType dt =
15865                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15866                                  if (dt.Is(kDataTypeValueInvalid)) {
15867                                    UnallocatedT32(instr);
15868                                    return;
15869                                  }
15870                                  DecodeNeonAndAlign decode_neon =
15871                                      Align_index_align_1_Decode((instr >> 4) &
15872                                                                     0xf,
15873                                                                 dt);
15874                                  if (!decode_neon.IsValid()) {
15875                                    UnallocatedT32(instr);
15876                                    return;
15877                                  }
15878                                  Alignment align = decode_neon.GetAlign();
15879                                  int lane = decode_neon.GetLane();
15880                                  SpacingType spacing =
15881                                      decode_neon.GetSpacing();
15882                                  unsigned first =
15883                                      ExtractDRegister(instr, 22, 12);
15884                                  unsigned length = 1;
15885                                  unsigned last = first + length - 1;
15886                                  unsigned rn = (instr >> 16) & 0xf;
15887                                  unsigned rm = instr & 0xf;
15888                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15889                                  vld1(CurrentCond(),
15890                                       dt,
15891                                       NeonRegisterList(DRegister(first),
15892                                                        DRegister(last),
15893                                                        spacing,
15894                                                        lane),
15895                                       AlignedMemOperand(Register(rn),
15896                                                         align,
15897                                                         Register(rm),
15898                                                         PostIndex));
15899                                  break;
15900                                }
15901                              }
15902                              break;
15903                            }
15904                          }
15905                          break;
15906                        }
15907                        case 0x00000100: {
15908                          // 0xf9a00100
15909                          switch (instr & 0x00000c00) {
15910                            case 0x00000c00: {
15911                              // 0xf9a00d00
15912                              switch (instr & 0x0000000d) {
15913                                case 0x0000000d: {
15914                                  // 0xf9a00d0d
15915                                  switch (instr & 0x00000002) {
15916                                    case 0x00000000: {
15917                                      // 0xf9a00d0d
15918                                      DataType dt =
15919                                          Dt_size_7_Decode((instr >> 6) & 0x3);
15920                                      if (dt.Is(kDataTypeValueInvalid)) {
15921                                        UnallocatedT32(instr);
15922                                        return;
15923                                      }
15924                                      Alignment align =
15925                                          Align_a_2_Decode((instr >> 4) & 0x1,
15926                                                           dt);
15927                                      if (dt.Is(kDataTypeValueInvalid) ||
15928                                          align.Is(kBadAlignment)) {
15929                                        UnallocatedT32(instr);
15930                                        return;
15931                                      }
15932                                      unsigned first =
15933                                          ExtractDRegister(instr, 22, 12);
15934                                      unsigned length;
15935                                      SpacingType spacing;
15936                                      switch ((instr >> 5) & 0x1) {
15937                                        default:
15938                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
15939                                        case 0x0:
15940                                          length = 2;
15941                                          spacing = kSingle;
15942                                          break;
15943                                        case 0x1:
15944                                          length = 2;
15945                                          spacing = kDouble;
15946                                          break;
15947                                      }
15948                                      unsigned last =
15949                                          first +
15950                                          (length - 1) *
15951                                              (spacing == kSingle ? 1 : 2);
15952                                      TransferType transfer = kAllLanes;
15953                                      unsigned rn = (instr >> 16) & 0xf;
15954                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15955                                      vld2(CurrentCond(),
15956                                           dt,
15957                                           NeonRegisterList(DRegister(first),
15958                                                            DRegister(last),
15959                                                            spacing,
15960                                                            transfer),
15961                                           AlignedMemOperand(Register(rn),
15962                                                             align,
15963                                                             PostIndex));
15964                                      break;
15965                                    }
15966                                    case 0x00000002: {
15967                                      // 0xf9a00d0f
15968                                      DataType dt =
15969                                          Dt_size_7_Decode((instr >> 6) & 0x3);
15970                                      if (dt.Is(kDataTypeValueInvalid)) {
15971                                        UnallocatedT32(instr);
15972                                        return;
15973                                      }
15974                                      Alignment align =
15975                                          Align_a_2_Decode((instr >> 4) & 0x1,
15976                                                           dt);
15977                                      if (dt.Is(kDataTypeValueInvalid) ||
15978                                          align.Is(kBadAlignment)) {
15979                                        UnallocatedT32(instr);
15980                                        return;
15981                                      }
15982                                      unsigned first =
15983                                          ExtractDRegister(instr, 22, 12);
15984                                      unsigned length;
15985                                      SpacingType spacing;
15986                                      switch ((instr >> 5) & 0x1) {
15987                                        default:
15988                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
15989                                        case 0x0:
15990                                          length = 2;
15991                                          spacing = kSingle;
15992                                          break;
15993                                        case 0x1:
15994                                          length = 2;
15995                                          spacing = kDouble;
15996                                          break;
15997                                      }
15998                                      unsigned last =
15999                                          first +
16000                                          (length - 1) *
16001                                              (spacing == kSingle ? 1 : 2);
16002                                      TransferType transfer = kAllLanes;
16003                                      unsigned rn = (instr >> 16) & 0xf;
16004                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16005                                      vld2(CurrentCond(),
16006                                           dt,
16007                                           NeonRegisterList(DRegister(first),
16008                                                            DRegister(last),
16009                                                            spacing,
16010                                                            transfer),
16011                                           AlignedMemOperand(Register(rn),
16012                                                             align,
16013                                                             Offset));
16014                                      break;
16015                                    }
16016                                  }
16017                                  break;
16018                                }
16019                                default: {
16020                                  if (((instr & 0xd) == 0xd)) {
16021                                    UnallocatedT32(instr);
16022                                    return;
16023                                  }
16024                                  DataType dt =
16025                                      Dt_size_7_Decode((instr >> 6) & 0x3);
16026                                  if (dt.Is(kDataTypeValueInvalid)) {
16027                                    UnallocatedT32(instr);
16028                                    return;
16029                                  }
16030                                  Alignment align =
16031                                      Align_a_2_Decode((instr >> 4) & 0x1, dt);
16032                                  if (dt.Is(kDataTypeValueInvalid) ||
16033                                      align.Is(kBadAlignment)) {
16034                                    UnallocatedT32(instr);
16035                                    return;
16036                                  }
16037                                  unsigned first =
16038                                      ExtractDRegister(instr, 22, 12);
16039                                  unsigned length;
16040                                  SpacingType spacing;
16041                                  switch ((instr >> 5) & 0x1) {
16042                                    default:
16043                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
16044                                    case 0x0:
16045                                      length = 2;
16046                                      spacing = kSingle;
16047                                      break;
16048                                    case 0x1:
16049                                      length = 2;
16050                                      spacing = kDouble;
16051                                      break;
16052                                  }
16053                                  unsigned last =
16054                                      first +
16055                                      (length - 1) *
16056                                          (spacing == kSingle ? 1 : 2);
16057                                  TransferType transfer = kAllLanes;
16058                                  unsigned rn = (instr >> 16) & 0xf;
16059                                  unsigned rm = instr & 0xf;
16060                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16061                                  vld2(CurrentCond(),
16062                                       dt,
16063                                       NeonRegisterList(DRegister(first),
16064                                                        DRegister(last),
16065                                                        spacing,
16066                                                        transfer),
16067                                       AlignedMemOperand(Register(rn),
16068                                                         align,
16069                                                         Register(rm),
16070                                                         PostIndex));
16071                                  break;
16072                                }
16073                              }
16074                              break;
16075                            }
16076                            default: {
16077                              switch (instr & 0x0000000d) {
16078                                case 0x0000000d: {
16079                                  // 0xf9a0010d
16080                                  switch (instr & 0x00000002) {
16081                                    case 0x00000000: {
16082                                      // 0xf9a0010d
16083                                      if (((instr & 0xc00) == 0xc00)) {
16084                                        UnallocatedT32(instr);
16085                                        return;
16086                                      }
16087                                      DataType dt =
16088                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16089                                      if (dt.Is(kDataTypeValueInvalid)) {
16090                                        UnallocatedT32(instr);
16091                                        return;
16092                                      }
16093                                      DecodeNeonAndAlign decode_neon =
16094                                          Align_index_align_2_Decode((instr >>
16095                                                                      4) &
16096                                                                         0xf,
16097                                                                     dt);
16098                                      if (!decode_neon.IsValid()) {
16099                                        UnallocatedT32(instr);
16100                                        return;
16101                                      }
16102                                      Alignment align = decode_neon.GetAlign();
16103                                      int lane = decode_neon.GetLane();
16104                                      SpacingType spacing =
16105                                          decode_neon.GetSpacing();
16106                                      unsigned first =
16107                                          ExtractDRegister(instr, 22, 12);
16108                                      unsigned length = 2;
16109                                      unsigned last =
16110                                          first +
16111                                          (length - 1) *
16112                                              (spacing == kSingle ? 1 : 2);
16113                                      unsigned rn = (instr >> 16) & 0xf;
16114                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16115                                      vld2(CurrentCond(),
16116                                           dt,
16117                                           NeonRegisterList(DRegister(first),
16118                                                            DRegister(last),
16119                                                            spacing,
16120                                                            lane),
16121                                           AlignedMemOperand(Register(rn),
16122                                                             align,
16123                                                             PostIndex));
16124                                      break;
16125                                    }
16126                                    case 0x00000002: {
16127                                      // 0xf9a0010f
16128                                      if (((instr & 0xc00) == 0xc00)) {
16129                                        UnallocatedT32(instr);
16130                                        return;
16131                                      }
16132                                      DataType dt =
16133                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16134                                      if (dt.Is(kDataTypeValueInvalid)) {
16135                                        UnallocatedT32(instr);
16136                                        return;
16137                                      }
16138                                      DecodeNeonAndAlign decode_neon =
16139                                          Align_index_align_2_Decode((instr >>
16140                                                                      4) &
16141                                                                         0xf,
16142                                                                     dt);
16143                                      if (!decode_neon.IsValid()) {
16144                                        UnallocatedT32(instr);
16145                                        return;
16146                                      }
16147                                      Alignment align = decode_neon.GetAlign();
16148                                      int lane = decode_neon.GetLane();
16149                                      SpacingType spacing =
16150                                          decode_neon.GetSpacing();
16151                                      unsigned first =
16152                                          ExtractDRegister(instr, 22, 12);
16153                                      unsigned length = 2;
16154                                      unsigned last =
16155                                          first +
16156                                          (length - 1) *
16157                                              (spacing == kSingle ? 1 : 2);
16158                                      unsigned rn = (instr >> 16) & 0xf;
16159                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16160                                      vld2(CurrentCond(),
16161                                           dt,
16162                                           NeonRegisterList(DRegister(first),
16163                                                            DRegister(last),
16164                                                            spacing,
16165                                                            lane),
16166                                           AlignedMemOperand(Register(rn),
16167                                                             align,
16168                                                             Offset));
16169                                      break;
16170                                    }
16171                                  }
16172                                  break;
16173                                }
16174                                default: {
16175                                  if (((instr & 0xc00) == 0xc00) ||
16176                                      ((instr & 0xd) == 0xd)) {
16177                                    UnallocatedT32(instr);
16178                                    return;
16179                                  }
16180                                  DataType dt =
16181                                      Dt_size_7_Decode((instr >> 10) & 0x3);
16182                                  if (dt.Is(kDataTypeValueInvalid)) {
16183                                    UnallocatedT32(instr);
16184                                    return;
16185                                  }
16186                                  DecodeNeonAndAlign decode_neon =
16187                                      Align_index_align_2_Decode((instr >> 4) &
16188                                                                     0xf,
16189                                                                 dt);
16190                                  if (!decode_neon.IsValid()) {
16191                                    UnallocatedT32(instr);
16192                                    return;
16193                                  }
16194                                  Alignment align = decode_neon.GetAlign();
16195                                  int lane = decode_neon.GetLane();
16196                                  SpacingType spacing =
16197                                      decode_neon.GetSpacing();
16198                                  unsigned first =
16199                                      ExtractDRegister(instr, 22, 12);
16200                                  unsigned length = 2;
16201                                  unsigned last =
16202                                      first +
16203                                      (length - 1) *
16204                                          (spacing == kSingle ? 1 : 2);
16205                                  unsigned rn = (instr >> 16) & 0xf;
16206                                  unsigned rm = instr & 0xf;
16207                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16208                                  vld2(CurrentCond(),
16209                                       dt,
16210                                       NeonRegisterList(DRegister(first),
16211                                                        DRegister(last),
16212                                                        spacing,
16213                                                        lane),
16214                                       AlignedMemOperand(Register(rn),
16215                                                         align,
16216                                                         Register(rm),
16217                                                         PostIndex));
16218                                  break;
16219                                }
16220                              }
16221                              break;
16222                            }
16223                          }
16224                          break;
16225                        }
16226                        case 0x00000200: {
16227                          // 0xf9a00200
16228                          switch (instr & 0x00000c00) {
16229                            case 0x00000c00: {
16230                              // 0xf9a00e00
16231                              switch (instr & 0x00000010) {
16232                                case 0x00000000: {
16233                                  // 0xf9a00e00
16234                                  switch (instr & 0x0000000d) {
16235                                    case 0x0000000d: {
16236                                      // 0xf9a00e0d
16237                                      switch (instr & 0x00000002) {
16238                                        case 0x00000000: {
16239                                          // 0xf9a00e0d
16240                                          DataType dt = Dt_size_7_Decode(
16241                                              (instr >> 6) & 0x3);
16242                                          if (dt.Is(kDataTypeValueInvalid)) {
16243                                            UnallocatedT32(instr);
16244                                            return;
16245                                          }
16246                                          unsigned first =
16247                                              ExtractDRegister(instr, 22, 12);
16248                                          unsigned length;
16249                                          SpacingType spacing;
16250                                          switch ((instr >> 5) & 0x1) {
16251                                            default:
16252                                              VIXL_UNREACHABLE_OR_FALLTHROUGH();
16253                                            case 0x0:
16254                                              length = 3;
16255                                              spacing = kSingle;
16256                                              break;
16257                                            case 0x1:
16258                                              length = 3;
16259                                              spacing = kDouble;
16260                                              break;
16261                                          }
16262                                          unsigned last =
16263                                              first +
16264                                              (length - 1) *
16265                                                  (spacing == kSingle ? 1 : 2);
16266                                          TransferType transfer = kAllLanes;
16267                                          unsigned rn = (instr >> 16) & 0xf;
16268                                          // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
16269                                          vld3(CurrentCond(),
16270                                               dt,
16271                                               NeonRegisterList(DRegister(
16272                                                                    first),
16273                                                                DRegister(last),
16274                                                                spacing,
16275                                                                transfer),
16276                                               MemOperand(Register(rn),
16277                                                          PostIndex));
16278                                          break;
16279                                        }
16280                                        case 0x00000002: {
16281                                          // 0xf9a00e0f
16282                                          DataType dt = Dt_size_7_Decode(
16283                                              (instr >> 6) & 0x3);
16284                                          if (dt.Is(kDataTypeValueInvalid)) {
16285                                            UnallocatedT32(instr);
16286                                            return;
16287                                          }
16288                                          unsigned first =
16289                                              ExtractDRegister(instr, 22, 12);
16290                                          unsigned length;
16291                                          SpacingType spacing;
16292                                          switch ((instr >> 5) & 0x1) {
16293                                            default:
16294                                              VIXL_UNREACHABLE_OR_FALLTHROUGH();
16295                                            case 0x0:
16296                                              length = 3;
16297                                              spacing = kSingle;
16298                                              break;
16299                                            case 0x1:
16300                                              length = 3;
16301                                              spacing = kDouble;
16302                                              break;
16303                                          }
16304                                          unsigned last =
16305                                              first +
16306                                              (length - 1) *
16307                                                  (spacing == kSingle ? 1 : 2);
16308                                          TransferType transfer = kAllLanes;
16309                                          unsigned rn = (instr >> 16) & 0xf;
16310                                          // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
16311                                          vld3(CurrentCond(),
16312                                               dt,
16313                                               NeonRegisterList(DRegister(
16314                                                                    first),
16315                                                                DRegister(last),
16316                                                                spacing,
16317                                                                transfer),
16318                                               MemOperand(Register(rn),
16319                                                          Offset));
16320                                          break;
16321                                        }
16322                                      }
16323                                      break;
16324                                    }
16325                                    default: {
16326                                      if (((instr & 0xd) == 0xd)) {
16327                                        UnallocatedT32(instr);
16328                                        return;
16329                                      }
16330                                      DataType dt =
16331                                          Dt_size_7_Decode((instr >> 6) & 0x3);
16332                                      if (dt.Is(kDataTypeValueInvalid)) {
16333                                        UnallocatedT32(instr);
16334                                        return;
16335                                      }
16336                                      unsigned first =
16337                                          ExtractDRegister(instr, 22, 12);
16338                                      unsigned length;
16339                                      SpacingType spacing;
16340                                      switch ((instr >> 5) & 0x1) {
16341                                        default:
16342                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
16343                                        case 0x0:
16344                                          length = 3;
16345                                          spacing = kSingle;
16346                                          break;
16347                                        case 0x1:
16348                                          length = 3;
16349                                          spacing = kDouble;
16350                                          break;
16351                                      }
16352                                      unsigned last =
16353                                          first +
16354                                          (length - 1) *
16355                                              (spacing == kSingle ? 1 : 2);
16356                                      TransferType transfer = kAllLanes;
16357                                      unsigned rn = (instr >> 16) & 0xf;
16358                                      Sign sign(plus);
16359                                      unsigned rm = instr & 0xf;
16360                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
16361                                      vld3(CurrentCond(),
16362                                           dt,
16363                                           NeonRegisterList(DRegister(first),
16364                                                            DRegister(last),
16365                                                            spacing,
16366                                                            transfer),
16367                                           MemOperand(Register(rn),
16368                                                      sign,
16369                                                      Register(rm),
16370                                                      PostIndex));
16371                                      break;
16372                                    }
16373                                  }
16374                                  break;
16375                                }
16376                                default:
16377                                  UnallocatedT32(instr);
16378                                  break;
16379                              }
16380                              break;
16381                            }
16382                            default: {
16383                              switch (instr & 0x0000000d) {
16384                                case 0x0000000d: {
16385                                  // 0xf9a0020d
16386                                  switch (instr & 0x00000002) {
16387                                    case 0x00000000: {
16388                                      // 0xf9a0020d
16389                                      if (((instr & 0xc00) == 0xc00)) {
16390                                        UnallocatedT32(instr);
16391                                        return;
16392                                      }
16393                                      DataType dt =
16394                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16395                                      if (dt.Is(kDataTypeValueInvalid)) {
16396                                        UnallocatedT32(instr);
16397                                        return;
16398                                      }
16399                                      DecodeNeon decode_neon =
16400                                          Index_1_Decode((instr >> 4) & 0xf,
16401                                                         dt);
16402                                      if (!decode_neon.IsValid()) {
16403                                        UnallocatedT32(instr);
16404                                        return;
16405                                      }
16406                                      int lane = decode_neon.GetLane();
16407                                      SpacingType spacing =
16408                                          decode_neon.GetSpacing();
16409                                      unsigned first =
16410                                          ExtractDRegister(instr, 22, 12);
16411                                      unsigned length = 3;
16412                                      unsigned last =
16413                                          first +
16414                                          (length - 1) *
16415                                              (spacing == kSingle ? 1 : 2);
16416                                      unsigned rn = (instr >> 16) & 0xf;
16417                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
16418                                      vld3(CurrentCond(),
16419                                           dt,
16420                                           NeonRegisterList(DRegister(first),
16421                                                            DRegister(last),
16422                                                            spacing,
16423                                                            lane),
16424                                           MemOperand(Register(rn), PostIndex));
16425                                      break;
16426                                    }
16427                                    case 0x00000002: {
16428                                      // 0xf9a0020f
16429                                      if (((instr & 0xc00) == 0xc00)) {
16430                                        UnallocatedT32(instr);
16431                                        return;
16432                                      }
16433                                      DataType dt =
16434                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16435                                      if (dt.Is(kDataTypeValueInvalid)) {
16436                                        UnallocatedT32(instr);
16437                                        return;
16438                                      }
16439                                      DecodeNeon decode_neon =
16440                                          Index_1_Decode((instr >> 4) & 0xf,
16441                                                         dt);
16442                                      if (!decode_neon.IsValid()) {
16443                                        UnallocatedT32(instr);
16444                                        return;
16445                                      }
16446                                      int lane = decode_neon.GetLane();
16447                                      SpacingType spacing =
16448                                          decode_neon.GetSpacing();
16449                                      unsigned first =
16450                                          ExtractDRegister(instr, 22, 12);
16451                                      unsigned length = 3;
16452                                      unsigned last =
16453                                          first +
16454                                          (length - 1) *
16455                                              (spacing == kSingle ? 1 : 2);
16456                                      unsigned rn = (instr >> 16) & 0xf;
16457                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
16458                                      vld3(CurrentCond(),
16459                                           dt,
16460                                           NeonRegisterList(DRegister(first),
16461                                                            DRegister(last),
16462                                                            spacing,
16463                                                            lane),
16464                                           MemOperand(Register(rn), Offset));
16465                                      break;
16466                                    }
16467                                  }
16468                                  break;
16469                                }
16470                                default: {
16471                                  if (((instr & 0xc00) == 0xc00) ||
16472                                      ((instr & 0xd) == 0xd)) {
16473                                    UnallocatedT32(instr);
16474                                    return;
16475                                  }
16476                                  DataType dt =
16477                                      Dt_size_7_Decode((instr >> 10) & 0x3);
16478                                  if (dt.Is(kDataTypeValueInvalid)) {
16479                                    UnallocatedT32(instr);
16480                                    return;
16481                                  }
16482                                  DecodeNeon decode_neon =
16483                                      Index_1_Decode((instr >> 4) & 0xf, dt);
16484                                  if (!decode_neon.IsValid()) {
16485                                    UnallocatedT32(instr);
16486                                    return;
16487                                  }
16488                                  int lane = decode_neon.GetLane();
16489                                  SpacingType spacing =
16490                                      decode_neon.GetSpacing();
16491                                  unsigned first =
16492                                      ExtractDRegister(instr, 22, 12);
16493                                  unsigned length = 3;
16494                                  unsigned last =
16495                                      first +
16496                                      (length - 1) *
16497                                          (spacing == kSingle ? 1 : 2);
16498                                  unsigned rn = (instr >> 16) & 0xf;
16499                                  Sign sign(plus);
16500                                  unsigned rm = instr & 0xf;
16501                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
16502                                  vld3(CurrentCond(),
16503                                       dt,
16504                                       NeonRegisterList(DRegister(first),
16505                                                        DRegister(last),
16506                                                        spacing,
16507                                                        lane),
16508                                       MemOperand(Register(rn),
16509                                                  sign,
16510                                                  Register(rm),
16511                                                  PostIndex));
16512                                  break;
16513                                }
16514                              }
16515                              break;
16516                            }
16517                          }
16518                          break;
16519                        }
16520                        case 0x00000300: {
16521                          // 0xf9a00300
16522                          switch (instr & 0x00000c00) {
16523                            case 0x00000c00: {
16524                              // 0xf9a00f00
16525                              switch (instr & 0x0000000d) {
16526                                case 0x0000000d: {
16527                                  // 0xf9a00f0d
16528                                  switch (instr & 0x00000002) {
16529                                    case 0x00000000: {
16530                                      // 0xf9a00f0d
16531                                      DataType dt =
16532                                          Dt_size_8_Decode((instr >> 6) & 0x3);
16533                                      if (dt.Is(kDataTypeValueInvalid)) {
16534                                        UnallocatedT32(instr);
16535                                        return;
16536                                      }
16537                                      Alignment align =
16538                                          Align_a_3_Decode((instr >> 4) & 0x1,
16539                                                           dt,
16540                                                           (instr >> 6) & 0x3);
16541                                      if (dt.Is(kDataTypeValueInvalid) ||
16542                                          align.Is(kBadAlignment)) {
16543                                        UnallocatedT32(instr);
16544                                        return;
16545                                      }
16546                                      unsigned first =
16547                                          ExtractDRegister(instr, 22, 12);
16548                                      unsigned length;
16549                                      SpacingType spacing;
16550                                      switch ((instr >> 5) & 0x1) {
16551                                        default:
16552                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
16553                                        case 0x0:
16554                                          length = 4;
16555                                          spacing = kSingle;
16556                                          break;
16557                                        case 0x1:
16558                                          length = 4;
16559                                          spacing = kDouble;
16560                                          break;
16561                                      }
16562                                      unsigned last =
16563                                          first +
16564                                          (length - 1) *
16565                                              (spacing == kSingle ? 1 : 2);
16566                                      TransferType transfer = kAllLanes;
16567                                      unsigned rn = (instr >> 16) & 0xf;
16568                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16569                                      vld4(CurrentCond(),
16570                                           dt,
16571                                           NeonRegisterList(DRegister(first),
16572                                                            DRegister(last),
16573                                                            spacing,
16574                                                            transfer),
16575                                           AlignedMemOperand(Register(rn),
16576                                                             align,
16577                                                             PostIndex));
16578                                      break;
16579                                    }
16580                                    case 0x00000002: {
16581                                      // 0xf9a00f0f
16582                                      DataType dt =
16583                                          Dt_size_8_Decode((instr >> 6) & 0x3);
16584                                      if (dt.Is(kDataTypeValueInvalid)) {
16585                                        UnallocatedT32(instr);
16586                                        return;
16587                                      }
16588                                      Alignment align =
16589                                          Align_a_3_Decode((instr >> 4) & 0x1,
16590                                                           dt,
16591                                                           (instr >> 6) & 0x3);
16592                                      if (dt.Is(kDataTypeValueInvalid) ||
16593                                          align.Is(kBadAlignment)) {
16594                                        UnallocatedT32(instr);
16595                                        return;
16596                                      }
16597                                      unsigned first =
16598                                          ExtractDRegister(instr, 22, 12);
16599                                      unsigned length;
16600                                      SpacingType spacing;
16601                                      switch ((instr >> 5) & 0x1) {
16602                                        default:
16603                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
16604                                        case 0x0:
16605                                          length = 4;
16606                                          spacing = kSingle;
16607                                          break;
16608                                        case 0x1:
16609                                          length = 4;
16610                                          spacing = kDouble;
16611                                          break;
16612                                      }
16613                                      unsigned last =
16614                                          first +
16615                                          (length - 1) *
16616                                              (spacing == kSingle ? 1 : 2);
16617                                      TransferType transfer = kAllLanes;
16618                                      unsigned rn = (instr >> 16) & 0xf;
16619                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16620                                      vld4(CurrentCond(),
16621                                           dt,
16622                                           NeonRegisterList(DRegister(first),
16623                                                            DRegister(last),
16624                                                            spacing,
16625                                                            transfer),
16626                                           AlignedMemOperand(Register(rn),
16627                                                             align,
16628                                                             Offset));
16629                                      break;
16630                                    }
16631                                  }
16632                                  break;
16633                                }
16634                                default: {
16635                                  if (((instr & 0xd) == 0xd)) {
16636                                    UnallocatedT32(instr);
16637                                    return;
16638                                  }
16639                                  DataType dt =
16640                                      Dt_size_8_Decode((instr >> 6) & 0x3);
16641                                  if (dt.Is(kDataTypeValueInvalid)) {
16642                                    UnallocatedT32(instr);
16643                                    return;
16644                                  }
16645                                  Alignment align =
16646                                      Align_a_3_Decode((instr >> 4) & 0x1,
16647                                                       dt,
16648                                                       (instr >> 6) & 0x3);
16649                                  if (dt.Is(kDataTypeValueInvalid) ||
16650                                      align.Is(kBadAlignment)) {
16651                                    UnallocatedT32(instr);
16652                                    return;
16653                                  }
16654                                  unsigned first =
16655                                      ExtractDRegister(instr, 22, 12);
16656                                  unsigned length;
16657                                  SpacingType spacing;
16658                                  switch ((instr >> 5) & 0x1) {
16659                                    default:
16660                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
16661                                    case 0x0:
16662                                      length = 4;
16663                                      spacing = kSingle;
16664                                      break;
16665                                    case 0x1:
16666                                      length = 4;
16667                                      spacing = kDouble;
16668                                      break;
16669                                  }
16670                                  unsigned last =
16671                                      first +
16672                                      (length - 1) *
16673                                          (spacing == kSingle ? 1 : 2);
16674                                  TransferType transfer = kAllLanes;
16675                                  unsigned rn = (instr >> 16) & 0xf;
16676                                  unsigned rm = instr & 0xf;
16677                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16678                                  vld4(CurrentCond(),
16679                                       dt,
16680                                       NeonRegisterList(DRegister(first),
16681                                                        DRegister(last),
16682                                                        spacing,
16683                                                        transfer),
16684                                       AlignedMemOperand(Register(rn),
16685                                                         align,
16686                                                         Register(rm),
16687                                                         PostIndex));
16688                                  break;
16689                                }
16690                              }
16691                              break;
16692                            }
16693                            default: {
16694                              switch (instr & 0x0000000d) {
16695                                case 0x0000000d: {
16696                                  // 0xf9a0030d
16697                                  switch (instr & 0x00000002) {
16698                                    case 0x00000000: {
16699                                      // 0xf9a0030d
16700                                      if (((instr & 0xc00) == 0xc00)) {
16701                                        UnallocatedT32(instr);
16702                                        return;
16703                                      }
16704                                      DataType dt =
16705                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16706                                      if (dt.Is(kDataTypeValueInvalid)) {
16707                                        UnallocatedT32(instr);
16708                                        return;
16709                                      }
16710                                      DecodeNeonAndAlign decode_neon =
16711                                          Align_index_align_3_Decode((instr >>
16712                                                                      4) &
16713                                                                         0xf,
16714                                                                     dt);
16715                                      if (!decode_neon.IsValid()) {
16716                                        UnallocatedT32(instr);
16717                                        return;
16718                                      }
16719                                      Alignment align = decode_neon.GetAlign();
16720                                      int lane = decode_neon.GetLane();
16721                                      SpacingType spacing =
16722                                          decode_neon.GetSpacing();
16723                                      unsigned first =
16724                                          ExtractDRegister(instr, 22, 12);
16725                                      unsigned length = 4;
16726                                      unsigned last =
16727                                          first +
16728                                          (length - 1) *
16729                                              (spacing == kSingle ? 1 : 2);
16730                                      unsigned rn = (instr >> 16) & 0xf;
16731                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16732                                      vld4(CurrentCond(),
16733                                           dt,
16734                                           NeonRegisterList(DRegister(first),
16735                                                            DRegister(last),
16736                                                            spacing,
16737                                                            lane),
16738                                           AlignedMemOperand(Register(rn),
16739                                                             align,
16740                                                             PostIndex));
16741                                      break;
16742                                    }
16743                                    case 0x00000002: {
16744                                      // 0xf9a0030f
16745                                      if (((instr & 0xc00) == 0xc00)) {
16746                                        UnallocatedT32(instr);
16747                                        return;
16748                                      }
16749                                      DataType dt =
16750                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16751                                      if (dt.Is(kDataTypeValueInvalid)) {
16752                                        UnallocatedT32(instr);
16753                                        return;
16754                                      }
16755                                      DecodeNeonAndAlign decode_neon =
16756                                          Align_index_align_3_Decode((instr >>
16757                                                                      4) &
16758                                                                         0xf,
16759                                                                     dt);
16760                                      if (!decode_neon.IsValid()) {
16761                                        UnallocatedT32(instr);
16762                                        return;
16763                                      }
16764                                      Alignment align = decode_neon.GetAlign();
16765                                      int lane = decode_neon.GetLane();
16766                                      SpacingType spacing =
16767                                          decode_neon.GetSpacing();
16768                                      unsigned first =
16769                                          ExtractDRegister(instr, 22, 12);
16770                                      unsigned length = 4;
16771                                      unsigned last =
16772                                          first +
16773                                          (length - 1) *
16774                                              (spacing == kSingle ? 1 : 2);
16775                                      unsigned rn = (instr >> 16) & 0xf;
16776                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16777                                      vld4(CurrentCond(),
16778                                           dt,
16779                                           NeonRegisterList(DRegister(first),
16780                                                            DRegister(last),
16781                                                            spacing,
16782                                                            lane),
16783                                           AlignedMemOperand(Register(rn),
16784                                                             align,
16785                                                             Offset));
16786                                      break;
16787                                    }
16788                                  }
16789                                  break;
16790                                }
16791                                default: {
16792                                  if (((instr & 0xc00) == 0xc00) ||
16793                                      ((instr & 0xd) == 0xd)) {
16794                                    UnallocatedT32(instr);
16795                                    return;
16796                                  }
16797                                  DataType dt =
16798                                      Dt_size_7_Decode((instr >> 10) & 0x3);
16799                                  if (dt.Is(kDataTypeValueInvalid)) {
16800                                    UnallocatedT32(instr);
16801                                    return;
16802                                  }
16803                                  DecodeNeonAndAlign decode_neon =
16804                                      Align_index_align_3_Decode((instr >> 4) &
16805                                                                     0xf,
16806                                                                 dt);
16807                                  if (!decode_neon.IsValid()) {
16808                                    UnallocatedT32(instr);
16809                                    return;
16810                                  }
16811                                  Alignment align = decode_neon.GetAlign();
16812                                  int lane = decode_neon.GetLane();
16813                                  SpacingType spacing =
16814                                      decode_neon.GetSpacing();
16815                                  unsigned first =
16816                                      ExtractDRegister(instr, 22, 12);
16817                                  unsigned length = 4;
16818                                  unsigned last =
16819                                      first +
16820                                      (length - 1) *
16821                                          (spacing == kSingle ? 1 : 2);
16822                                  unsigned rn = (instr >> 16) & 0xf;
16823                                  unsigned rm = instr & 0xf;
16824                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16825                                  vld4(CurrentCond(),
16826                                       dt,
16827                                       NeonRegisterList(DRegister(first),
16828                                                        DRegister(last),
16829                                                        spacing,
16830                                                        lane),
16831                                       AlignedMemOperand(Register(rn),
16832                                                         align,
16833                                                         Register(rm),
16834                                                         PostIndex));
16835                                  break;
16836                                }
16837                              }
16838                              break;
16839                            }
16840                          }
16841                          break;
16842                        }
16843                      }
16844                      break;
16845                    }
16846                  }
16847                  break;
16848                }
16849                case 0x10100000: {
16850                  // 0xf8100000
16851                  switch (instr & 0x01400000) {
16852                    case 0x00000000: {
16853                      // 0xf8100000
16854                      switch (instr & 0x000f0000) {
16855                        case 0x000f0000: {
16856                          // 0xf81f0000
16857                          switch (instr & 0x0000f000) {
16858                            case 0x0000f000: {
16859                              // 0xf81ff000
16860                              uint32_t U = (instr >> 23) & 0x1;
16861                              int32_t imm = instr & 0xfff;
16862                              if (U == 0) imm = -imm;
16863                              bool minus_zero = (imm == 0) && (U == 0);
16864                              Location location(imm, kT32PcDelta);
16865                              // PLD{<c>}{<q>} <label> ; T1
16866                              if (minus_zero) {
16867                                pld(CurrentCond(), MemOperand(pc, minus, 0));
16868                              } else {
16869                                pld(CurrentCond(), &location);
16870                              }
16871                              if (((instr & 0xff7ff000) != 0xf81ff000)) {
16872                                UnpredictableT32(instr);
16873                              }
16874                              break;
16875                            }
16876                            default: {
16877                              switch (instr & 0x00200000) {
16878                                case 0x00000000: {
16879                                  // 0xf81f0000
16880                                  if (((instr & 0xf000) == 0xf000)) {
16881                                    UnallocatedT32(instr);
16882                                    return;
16883                                  }
16884                                  unsigned rt = (instr >> 12) & 0xf;
16885                                  uint32_t U = (instr >> 23) & 0x1;
16886                                  int32_t imm = instr & 0xfff;
16887                                  if (U == 0) imm = -imm;
16888                                  bool minus_zero = (imm == 0) && (U == 0);
16889                                  Location location(imm, kT32PcDelta);
16890                                  // LDRB{<c>}{<q>} <Rt>, <label> ; T1
16891                                  if (minus_zero) {
16892                                    ldrb(CurrentCond(),
16893                                         Best,
16894                                         Register(rt),
16895                                         MemOperand(pc, minus, 0));
16896                                  } else {
16897                                    ldrb(CurrentCond(),
16898                                         Register(rt),
16899                                         &location);
16900                                  }
16901                                  break;
16902                                }
16903                                case 0x00200000: {
16904                                  // 0xf83f0000
16905                                  if (((instr & 0xf000) == 0xf000)) {
16906                                    UnallocatedT32(instr);
16907                                    return;
16908                                  }
16909                                  unsigned rt = (instr >> 12) & 0xf;
16910                                  uint32_t U = (instr >> 23) & 0x1;
16911                                  int32_t imm = instr & 0xfff;
16912                                  if (U == 0) imm = -imm;
16913                                  bool minus_zero = (imm == 0) && (U == 0);
16914                                  Location location(imm, kT32PcDelta);
16915                                  // LDRH{<c>}{<q>} <Rt>, <label> ; T1
16916                                  if (minus_zero) {
16917                                    ldrh(CurrentCond(),
16918                                         Best,
16919                                         Register(rt),
16920                                         MemOperand(pc, minus, 0));
16921                                  } else {
16922                                    ldrh(CurrentCond(),
16923                                         Register(rt),
16924                                         &location);
16925                                  }
16926                                  break;
16927                                }
16928                              }
16929                              break;
16930                            }
16931                          }
16932                          break;
16933                        }
16934                        default: {
16935                          switch (instr & 0x00a00000) {
16936                            case 0x00000000: {
16937                              // 0xf8100000
16938                              switch (instr & 0x00000d00) {
16939                                case 0x00000000: {
16940                                  // 0xf8100000
16941                                  switch (instr & 0x000002c0) {
16942                                    case 0x00000000: {
16943                                      // 0xf8100000
16944                                      switch (instr & 0x0000f000) {
16945                                        case 0x0000f000: {
16946                                          // 0xf810f000
16947                                          if (((instr & 0xf0000) == 0xf0000)) {
16948                                            UnallocatedT32(instr);
16949                                            return;
16950                                          }
16951                                          unsigned rn = (instr >> 16) & 0xf;
16952                                          Sign sign(plus);
16953                                          unsigned rm = instr & 0xf;
16954                                          Shift shift = LSL;
16955                                          uint32_t amount = (instr >> 4) & 0x3;
16956                                          AddrMode addrmode = Offset;
16957                                          // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
16958                                          pld(CurrentCond(),
16959                                              MemOperand(Register(rn),
16960                                                         sign,
16961                                                         Register(rm),
16962                                                         shift,
16963                                                         amount,
16964                                                         addrmode));
16965                                          break;
16966                                        }
16967                                        default: {
16968                                          if (((instr & 0xf0000) == 0xf0000) ||
16969                                              ((instr & 0xf000) == 0xf000)) {
16970                                            UnallocatedT32(instr);
16971                                            return;
16972                                          }
16973                                          unsigned rt = (instr >> 12) & 0xf;
16974                                          unsigned rn = (instr >> 16) & 0xf;
16975                                          Sign sign(plus);
16976                                          unsigned rm = instr & 0xf;
16977                                          Shift shift = LSL;
16978                                          uint32_t amount = (instr >> 4) & 0x3;
16979                                          AddrMode addrmode = Offset;
16980                                          if ((rt < kNumberOfT32LowRegisters) &&
16981                                              (rn < kNumberOfT32LowRegisters) &&
16982                                              (rm < kNumberOfT32LowRegisters) &&
16983                                              shift.IsLSL() && (amount == 0) &&
16984                                              sign.IsPlus()) {
16985                                            // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
16986                                            ldrb(CurrentCond(),
16987                                                 Wide,
16988                                                 Register(rt),
16989                                                 MemOperand(Register(rn),
16990                                                            sign,
16991                                                            Register(rm),
16992                                                            addrmode));
16993                                          } else {
16994                                            // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
16995                                            ldrb(CurrentCond(),
16996                                                 Best,
16997                                                 Register(rt),
16998                                                 MemOperand(Register(rn),
16999                                                            sign,
17000                                                            Register(rm),
17001                                                            shift,
17002                                                            amount,
17003                                                            addrmode));
17004                                          }
17005                                          break;
17006                                        }
17007                                      }
17008                                      break;
17009                                    }
17010                                    default:
17011                                      UnallocatedT32(instr);
17012                                      break;
17013                                  }
17014                                  break;
17015                                }
17016                                case 0x00000900: {
17017                                  // 0xf8100900
17018                                  if (((instr & 0xf0000) == 0xf0000)) {
17019                                    UnallocatedT32(instr);
17020                                    return;
17021                                  }
17022                                  unsigned rt = (instr >> 12) & 0xf;
17023                                  unsigned rn = (instr >> 16) & 0xf;
17024                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17025                                                                        : plus);
17026                                  int32_t offset = instr & 0xff;
17027                                  // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
17028                                  ldrb(CurrentCond(),
17029                                       Best,
17030                                       Register(rt),
17031                                       MemOperand(Register(rn),
17032                                                  sign,
17033                                                  offset,
17034                                                  PostIndex));
17035                                  break;
17036                                }
17037                                case 0x00000c00: {
17038                                  // 0xf8100c00
17039                                  switch (instr & 0x00000200) {
17040                                    case 0x00000000: {
17041                                      // 0xf8100c00
17042                                      switch (instr & 0x0000f000) {
17043                                        case 0x0000f000: {
17044                                          // 0xf810fc00
17045                                          if (((instr & 0xf0000) == 0xf0000)) {
17046                                            UnallocatedT32(instr);
17047                                            return;
17048                                          }
17049                                          unsigned rn = (instr >> 16) & 0xf;
17050                                          int32_t offset = instr & 0xff;
17051                                          // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17052                                          pld(CurrentCond(),
17053                                              MemOperand(Register(rn),
17054                                                         minus,
17055                                                         offset,
17056                                                         Offset));
17057                                          break;
17058                                        }
17059                                        default: {
17060                                          if (((instr & 0xf0000) == 0xf0000) ||
17061                                              ((instr & 0xf000) == 0xf000)) {
17062                                            UnallocatedT32(instr);
17063                                            return;
17064                                          }
17065                                          unsigned rt = (instr >> 12) & 0xf;
17066                                          unsigned rn = (instr >> 16) & 0xf;
17067                                          int32_t offset = instr & 0xff;
17068                                          // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
17069                                          ldrb(CurrentCond(),
17070                                               Best,
17071                                               Register(rt),
17072                                               MemOperand(Register(rn),
17073                                                          minus,
17074                                                          offset,
17075                                                          Offset));
17076                                          break;
17077                                        }
17078                                      }
17079                                      break;
17080                                    }
17081                                    case 0x00000200: {
17082                                      // 0xf8100e00
17083                                      if (((instr & 0xf0000) == 0xf0000)) {
17084                                        UnallocatedT32(instr);
17085                                        return;
17086                                      }
17087                                      UnimplementedT32_32("LDRBT", instr);
17088                                      break;
17089                                    }
17090                                  }
17091                                  break;
17092                                }
17093                                case 0x00000d00: {
17094                                  // 0xf8100d00
17095                                  if (((instr & 0xf0000) == 0xf0000)) {
17096                                    UnallocatedT32(instr);
17097                                    return;
17098                                  }
17099                                  unsigned rt = (instr >> 12) & 0xf;
17100                                  unsigned rn = (instr >> 16) & 0xf;
17101                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17102                                                                        : plus);
17103                                  int32_t offset = instr & 0xff;
17104                                  // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
17105                                  ldrb(CurrentCond(),
17106                                       Best,
17107                                       Register(rt),
17108                                       MemOperand(Register(rn),
17109                                                  sign,
17110                                                  offset,
17111                                                  PreIndex));
17112                                  break;
17113                                }
17114                                default:
17115                                  UnallocatedT32(instr);
17116                                  break;
17117                              }
17118                              break;
17119                            }
17120                            case 0x00200000: {
17121                              // 0xf8300000
17122                              switch (instr & 0x00000d00) {
17123                                case 0x00000000: {
17124                                  // 0xf8300000
17125                                  switch (instr & 0x000002c0) {
17126                                    case 0x00000000: {
17127                                      // 0xf8300000
17128                                      switch (instr & 0x0000f000) {
17129                                        case 0x0000f000: {
17130                                          // 0xf830f000
17131                                          if (((instr & 0xf0000) == 0xf0000)) {
17132                                            UnallocatedT32(instr);
17133                                            return;
17134                                          }
17135                                          unsigned rn = (instr >> 16) & 0xf;
17136                                          Sign sign(plus);
17137                                          unsigned rm = instr & 0xf;
17138                                          Shift shift = LSL;
17139                                          uint32_t amount = (instr >> 4) & 0x3;
17140                                          AddrMode addrmode = Offset;
17141                                          // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
17142                                          pldw(CurrentCond(),
17143                                               MemOperand(Register(rn),
17144                                                          sign,
17145                                                          Register(rm),
17146                                                          shift,
17147                                                          amount,
17148                                                          addrmode));
17149                                          break;
17150                                        }
17151                                        default: {
17152                                          if (((instr & 0xf0000) == 0xf0000) ||
17153                                              ((instr & 0xf000) == 0xf000)) {
17154                                            UnallocatedT32(instr);
17155                                            return;
17156                                          }
17157                                          unsigned rt = (instr >> 12) & 0xf;
17158                                          unsigned rn = (instr >> 16) & 0xf;
17159                                          Sign sign(plus);
17160                                          unsigned rm = instr & 0xf;
17161                                          Shift shift = LSL;
17162                                          uint32_t amount = (instr >> 4) & 0x3;
17163                                          AddrMode addrmode = Offset;
17164                                          if ((rt < kNumberOfT32LowRegisters) &&
17165                                              (rn < kNumberOfT32LowRegisters) &&
17166                                              (rm < kNumberOfT32LowRegisters) &&
17167                                              shift.IsLSL() && (amount == 0) &&
17168                                              sign.IsPlus()) {
17169                                            // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17170                                            ldrh(CurrentCond(),
17171                                                 Wide,
17172                                                 Register(rt),
17173                                                 MemOperand(Register(rn),
17174                                                            sign,
17175                                                            Register(rm),
17176                                                            addrmode));
17177                                          } else {
17178                                            // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17179                                            ldrh(CurrentCond(),
17180                                                 Best,
17181                                                 Register(rt),
17182                                                 MemOperand(Register(rn),
17183                                                            sign,
17184                                                            Register(rm),
17185                                                            shift,
17186                                                            amount,
17187                                                            addrmode));
17188                                          }
17189                                          break;
17190                                        }
17191                                      }
17192                                      break;
17193                                    }
17194                                    default:
17195                                      UnallocatedT32(instr);
17196                                      break;
17197                                  }
17198                                  break;
17199                                }
17200                                case 0x00000900: {
17201                                  // 0xf8300900
17202                                  if (((instr & 0xf0000) == 0xf0000)) {
17203                                    UnallocatedT32(instr);
17204                                    return;
17205                                  }
17206                                  unsigned rt = (instr >> 12) & 0xf;
17207                                  unsigned rn = (instr >> 16) & 0xf;
17208                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17209                                                                        : plus);
17210                                  int32_t offset = instr & 0xff;
17211                                  // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
17212                                  ldrh(CurrentCond(),
17213                                       Best,
17214                                       Register(rt),
17215                                       MemOperand(Register(rn),
17216                                                  sign,
17217                                                  offset,
17218                                                  PostIndex));
17219                                  break;
17220                                }
17221                                case 0x00000c00: {
17222                                  // 0xf8300c00
17223                                  switch (instr & 0x00000200) {
17224                                    case 0x00000000: {
17225                                      // 0xf8300c00
17226                                      switch (instr & 0x0000f000) {
17227                                        case 0x0000f000: {
17228                                          // 0xf830fc00
17229                                          if (((instr & 0xf0000) == 0xf0000)) {
17230                                            UnallocatedT32(instr);
17231                                            return;
17232                                          }
17233                                          unsigned rn = (instr >> 16) & 0xf;
17234                                          int32_t offset = instr & 0xff;
17235                                          // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17236                                          pldw(CurrentCond(),
17237                                               MemOperand(Register(rn),
17238                                                          minus,
17239                                                          offset,
17240                                                          Offset));
17241                                          break;
17242                                        }
17243                                        default: {
17244                                          if (((instr & 0xf0000) == 0xf0000) ||
17245                                              ((instr & 0xf000) == 0xf000)) {
17246                                            UnallocatedT32(instr);
17247                                            return;
17248                                          }
17249                                          unsigned rt = (instr >> 12) & 0xf;
17250                                          unsigned rn = (instr >> 16) & 0xf;
17251                                          int32_t offset = instr & 0xff;
17252                                          // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
17253                                          ldrh(CurrentCond(),
17254                                               Best,
17255                                               Register(rt),
17256                                               MemOperand(Register(rn),
17257                                                          minus,
17258                                                          offset,
17259                                                          Offset));
17260                                          break;
17261                                        }
17262                                      }
17263                                      break;
17264                                    }
17265                                    case 0x00000200: {
17266                                      // 0xf8300e00
17267                                      if (((instr & 0xf0000) == 0xf0000)) {
17268                                        UnallocatedT32(instr);
17269                                        return;
17270                                      }
17271                                      UnimplementedT32_32("LDRHT", instr);
17272                                      break;
17273                                    }
17274                                  }
17275                                  break;
17276                                }
17277                                case 0x00000d00: {
17278                                  // 0xf8300d00
17279                                  if (((instr & 0xf0000) == 0xf0000)) {
17280                                    UnallocatedT32(instr);
17281                                    return;
17282                                  }
17283                                  unsigned rt = (instr >> 12) & 0xf;
17284                                  unsigned rn = (instr >> 16) & 0xf;
17285                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17286                                                                        : plus);
17287                                  int32_t offset = instr & 0xff;
17288                                  // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
17289                                  ldrh(CurrentCond(),
17290                                       Best,
17291                                       Register(rt),
17292                                       MemOperand(Register(rn),
17293                                                  sign,
17294                                                  offset,
17295                                                  PreIndex));
17296                                  break;
17297                                }
17298                                default:
17299                                  UnallocatedT32(instr);
17300                                  break;
17301                              }
17302                              break;
17303                            }
17304                            case 0x00800000: {
17305                              // 0xf8900000
17306                              switch (instr & 0x0000f000) {
17307                                case 0x0000f000: {
17308                                  // 0xf890f000
17309                                  if (((instr & 0xf0000) == 0xf0000)) {
17310                                    UnallocatedT32(instr);
17311                                    return;
17312                                  }
17313                                  unsigned rn = (instr >> 16) & 0xf;
17314                                  int32_t offset = instr & 0xfff;
17315                                  // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17316                                  pld(CurrentCond(),
17317                                      MemOperand(Register(rn),
17318                                                 plus,
17319                                                 offset,
17320                                                 Offset));
17321                                  break;
17322                                }
17323                                default: {
17324                                  if (((instr & 0xf0000) == 0xf0000) ||
17325                                      ((instr & 0xf000) == 0xf000)) {
17326                                    UnallocatedT32(instr);
17327                                    return;
17328                                  }
17329                                  unsigned rt = (instr >> 12) & 0xf;
17330                                  unsigned rn = (instr >> 16) & 0xf;
17331                                  int32_t offset = instr & 0xfff;
17332                                  if ((rt < kNumberOfT32LowRegisters) &&
17333                                      (rn < kNumberOfT32LowRegisters) &&
17334                                      ((offset >= 0) && (offset <= 31))) {
17335                                    // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17336                                    ldrb(CurrentCond(),
17337                                         Wide,
17338                                         Register(rt),
17339                                         MemOperand(Register(rn),
17340                                                    plus,
17341                                                    offset,
17342                                                    Offset));
17343                                  } else {
17344                                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17345                                    ldrb(CurrentCond(),
17346                                         Best,
17347                                         Register(rt),
17348                                         MemOperand(Register(rn),
17349                                                    plus,
17350                                                    offset,
17351                                                    Offset));
17352                                  }
17353                                  break;
17354                                }
17355                              }
17356                              break;
17357                            }
17358                            case 0x00a00000: {
17359                              // 0xf8b00000
17360                              switch (instr & 0x0000f000) {
17361                                case 0x0000f000: {
17362                                  // 0xf8b0f000
17363                                  if (((instr & 0xf0000) == 0xf0000)) {
17364                                    UnallocatedT32(instr);
17365                                    return;
17366                                  }
17367                                  unsigned rn = (instr >> 16) & 0xf;
17368                                  int32_t offset = instr & 0xfff;
17369                                  // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17370                                  pldw(CurrentCond(),
17371                                       MemOperand(Register(rn),
17372                                                  plus,
17373                                                  offset,
17374                                                  Offset));
17375                                  break;
17376                                }
17377                                default: {
17378                                  if (((instr & 0xf0000) == 0xf0000) ||
17379                                      ((instr & 0xf000) == 0xf000)) {
17380                                    UnallocatedT32(instr);
17381                                    return;
17382                                  }
17383                                  unsigned rt = (instr >> 12) & 0xf;
17384                                  unsigned rn = (instr >> 16) & 0xf;
17385                                  int32_t offset = instr & 0xfff;
17386                                  if ((rt < kNumberOfT32LowRegisters) &&
17387                                      (rn < kNumberOfT32LowRegisters) &&
17388                                      ((offset >= 0) && (offset <= 62) &&
17389                                       ((offset & 1) == 0))) {
17390                                    // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17391                                    ldrh(CurrentCond(),
17392                                         Wide,
17393                                         Register(rt),
17394                                         MemOperand(Register(rn),
17395                                                    plus,
17396                                                    offset,
17397                                                    Offset));
17398                                  } else {
17399                                    // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17400                                    ldrh(CurrentCond(),
17401                                         Best,
17402                                         Register(rt),
17403                                         MemOperand(Register(rn),
17404                                                    plus,
17405                                                    offset,
17406                                                    Offset));
17407                                  }
17408                                  break;
17409                                }
17410                              }
17411                              break;
17412                            }
17413                          }
17414                          break;
17415                        }
17416                      }
17417                      break;
17418                    }
17419                    case 0x00400000: {
17420                      // 0xf8500000
17421                      switch (instr & 0x00200000) {
17422                        case 0x00000000: {
17423                          // 0xf8500000
17424                          switch (instr & 0x000f0000) {
17425                            case 0x000f0000: {
17426                              // 0xf85f0000
17427                              unsigned rt = (instr >> 12) & 0xf;
17428                              uint32_t U = (instr >> 23) & 0x1;
17429                              int32_t imm = instr & 0xfff;
17430                              if (U == 0) imm = -imm;
17431                              bool minus_zero = (imm == 0) && (U == 0);
17432                              Location location(imm, kT32PcDelta);
17433                              if ((imm >= -4095) && (imm <= 4095) &&
17434                                  ((rt < kNumberOfT32LowRegisters) &&
17435                                   (imm >= 0) && (imm <= 1020) &&
17436                                   ((imm & 3) == 0))) {
17437                                // LDR{<c>}.W <Rt>, <label> ; T2
17438                                if (minus_zero) {
17439                                  ldr(CurrentCond(),
17440                                      Wide,
17441                                      Register(rt),
17442                                      MemOperand(pc, minus, 0));
17443                                } else {
17444                                  ldr(CurrentCond(),
17445                                      Wide,
17446                                      Register(rt),
17447                                      &location);
17448                                }
17449                              } else if ((imm >= -4095) && (imm <= 4095)) {
17450                                // LDR{<c>}{<q>} <Rt>, <label> ; T2
17451                                if (minus_zero) {
17452                                  ldr(CurrentCond(),
17453                                      Best,
17454                                      Register(rt),
17455                                      MemOperand(pc, minus, 0));
17456                                } else {
17457                                  ldr(CurrentCond(),
17458                                      Best,
17459                                      Register(rt),
17460                                      &location);
17461                                }
17462                              } else {
17463                                UnallocatedT32(instr);
17464                              }
17465                              break;
17466                            }
17467                            default: {
17468                              switch (instr & 0x00800000) {
17469                                case 0x00000000: {
17470                                  // 0xf8500000
17471                                  switch (instr & 0x00000d00) {
17472                                    case 0x00000000: {
17473                                      // 0xf8500000
17474                                      if ((instr & 0x000002c0) == 0x00000000) {
17475                                        if (((instr & 0xf0000) == 0xf0000)) {
17476                                          UnallocatedT32(instr);
17477                                          return;
17478                                        }
17479                                        unsigned rt = (instr >> 12) & 0xf;
17480                                        unsigned rn = (instr >> 16) & 0xf;
17481                                        Sign sign(plus);
17482                                        unsigned rm = instr & 0xf;
17483                                        Shift shift = LSL;
17484                                        uint32_t amount = (instr >> 4) & 0x3;
17485                                        AddrMode addrmode = Offset;
17486                                        if ((rt < kNumberOfT32LowRegisters) &&
17487                                            (rn < kNumberOfT32LowRegisters) &&
17488                                            (rm < kNumberOfT32LowRegisters) &&
17489                                            shift.IsLSL() && (amount == 0) &&
17490                                            sign.IsPlus()) {
17491                                          // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17492                                          ldr(CurrentCond(),
17493                                              Wide,
17494                                              Register(rt),
17495                                              MemOperand(Register(rn),
17496                                                         sign,
17497                                                         Register(rm),
17498                                                         addrmode));
17499                                        } else {
17500                                          // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17501                                          ldr(CurrentCond(),
17502                                              Best,
17503                                              Register(rt),
17504                                              MemOperand(Register(rn),
17505                                                         sign,
17506                                                         Register(rm),
17507                                                         shift,
17508                                                         amount,
17509                                                         addrmode));
17510                                        }
17511                                      } else {
17512                                        UnallocatedT32(instr);
17513                                      }
17514                                      break;
17515                                    }
17516                                    case 0x00000900: {
17517                                      // 0xf8500900
17518                                      if (((instr & 0xf0000) == 0xf0000)) {
17519                                        UnallocatedT32(instr);
17520                                        return;
17521                                      }
17522                                      if (((Uint32((instr >> 16)) &
17523                                            Uint32(0xf)) == Uint32(0xd)) &&
17524                                          ((Uint32((instr >> 9)) &
17525                                            Uint32(0x1)) == Uint32(0x1)) &&
17526                                          ((Uint32(instr) & Uint32(0xff)) ==
17527                                           Uint32(0x4))) {
17528                                        unsigned rt = (instr >> 12) & 0xf;
17529                                        if ((rt <= 7) || (rt == kPCRegNum)) {
17530                                          // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length)
17531                                          pop(CurrentCond(),
17532                                              Wide,
17533                                              Register(rt));
17534                                        } else {
17535                                          // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length)
17536                                          pop(CurrentCond(),
17537                                              Best,
17538                                              Register(rt));
17539                                        }
17540                                        return;
17541                                      }
17542                                      unsigned rt = (instr >> 12) & 0xf;
17543                                      unsigned rn = (instr >> 16) & 0xf;
17544                                      Sign sign((((instr >> 9) & 0x1) == 0)
17545                                                    ? minus
17546                                                    : plus);
17547                                      int32_t offset = instr & 0xff;
17548                                      // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length)
17549                                      ldr(CurrentCond(),
17550                                          Best,
17551                                          Register(rt),
17552                                          MemOperand(Register(rn),
17553                                                     sign,
17554                                                     offset,
17555                                                     PostIndex));
17556                                      break;
17557                                    }
17558                                    case 0x00000c00: {
17559                                      // 0xf8500c00
17560                                      switch (instr & 0x00000200) {
17561                                        case 0x00000000: {
17562                                          // 0xf8500c00
17563                                          if (((instr & 0xf0000) == 0xf0000)) {
17564                                            UnallocatedT32(instr);
17565                                            return;
17566                                          }
17567                                          unsigned rt = (instr >> 12) & 0xf;
17568                                          unsigned rn = (instr >> 16) & 0xf;
17569                                          int32_t offset = instr & 0xff;
17570                                          // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length)
17571                                          ldr(CurrentCond(),
17572                                              Best,
17573                                              Register(rt),
17574                                              MemOperand(Register(rn),
17575                                                         minus,
17576                                                         offset,
17577                                                         Offset));
17578                                          break;
17579                                        }
17580                                        case 0x00000200: {
17581                                          // 0xf8500e00
17582                                          if (((instr & 0xf0000) == 0xf0000)) {
17583                                            UnallocatedT32(instr);
17584                                            return;
17585                                          }
17586                                          UnimplementedT32_32("LDRT", instr);
17587                                          break;
17588                                        }
17589                                      }
17590                                      break;
17591                                    }
17592                                    case 0x00000d00: {
17593                                      // 0xf8500d00
17594                                      if (((instr & 0xf0000) == 0xf0000)) {
17595                                        UnallocatedT32(instr);
17596                                        return;
17597                                      }
17598                                      unsigned rt = (instr >> 12) & 0xf;
17599                                      unsigned rn = (instr >> 16) & 0xf;
17600                                      Sign sign((((instr >> 9) & 0x1) == 0)
17601                                                    ? minus
17602                                                    : plus);
17603                                      int32_t offset = instr & 0xff;
17604                                      // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length)
17605                                      ldr(CurrentCond(),
17606                                          Best,
17607                                          Register(rt),
17608                                          MemOperand(Register(rn),
17609                                                     sign,
17610                                                     offset,
17611                                                     PreIndex));
17612                                      break;
17613                                    }
17614                                    default:
17615                                      UnallocatedT32(instr);
17616                                      break;
17617                                  }
17618                                  break;
17619                                }
17620                                case 0x00800000: {
17621                                  // 0xf8d00000
17622                                  if (((instr & 0xf0000) == 0xf0000)) {
17623                                    UnallocatedT32(instr);
17624                                    return;
17625                                  }
17626                                  unsigned rt = (instr >> 12) & 0xf;
17627                                  unsigned rn = (instr >> 16) & 0xf;
17628                                  int32_t offset = instr & 0xfff;
17629                                  if (((rt < kNumberOfT32LowRegisters) &&
17630                                       (rn < kNumberOfT32LowRegisters) &&
17631                                       ((offset >= 0) && (offset <= 124) &&
17632                                        ((offset & 3) == 0))) ||
17633                                      ((rt < kNumberOfT32LowRegisters) &&
17634                                       (rn == sp.GetCode()) &&
17635                                       ((offset >= 0) && (offset <= 1020) &&
17636                                        ((offset & 3) == 0)))) {
17637                                    // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
17638                                    ldr(CurrentCond(),
17639                                        Wide,
17640                                        Register(rt),
17641                                        MemOperand(Register(rn),
17642                                                   plus,
17643                                                   offset,
17644                                                   Offset));
17645                                  } else {
17646                                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
17647                                    ldr(CurrentCond(),
17648                                        Best,
17649                                        Register(rt),
17650                                        MemOperand(Register(rn),
17651                                                   plus,
17652                                                   offset,
17653                                                   Offset));
17654                                  }
17655                                  break;
17656                                }
17657                              }
17658                              break;
17659                            }
17660                          }
17661                          break;
17662                        }
17663                        default:
17664                          UnallocatedT32(instr);
17665                          break;
17666                      }
17667                      break;
17668                    }
17669                    case 0x01000000: {
17670                      // 0xf9100000
17671                      switch (instr & 0x00200000) {
17672                        case 0x00000000: {
17673                          // 0xf9100000
17674                          switch (instr & 0x000f0000) {
17675                            case 0x000f0000: {
17676                              // 0xf91f0000
17677                              switch (instr & 0x0000f000) {
17678                                case 0x0000f000: {
17679                                  // 0xf91ff000
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                                  // PLI{<c>}{<q>} <label> ; T3
17686                                  if (minus_zero) {
17687                                    pli(CurrentCond(),
17688                                        MemOperand(pc, minus, 0));
17689                                  } else {
17690                                    pli(CurrentCond(), &location);
17691                                  }
17692                                  break;
17693                                }
17694                                default: {
17695                                  if (((instr & 0xf000) == 0xf000)) {
17696                                    UnallocatedT32(instr);
17697                                    return;
17698                                  }
17699                                  unsigned rt = (instr >> 12) & 0xf;
17700                                  uint32_t U = (instr >> 23) & 0x1;
17701                                  int32_t imm = instr & 0xfff;
17702                                  if (U == 0) imm = -imm;
17703                                  bool minus_zero = (imm == 0) && (U == 0);
17704                                  Location location(imm, kT32PcDelta);
17705                                  // LDRSB{<c>}{<q>} <Rt>, <label> ; T1
17706                                  if (minus_zero) {
17707                                    ldrsb(CurrentCond(),
17708                                          Best,
17709                                          Register(rt),
17710                                          MemOperand(pc, minus, 0));
17711                                  } else {
17712                                    ldrsb(CurrentCond(),
17713                                          Register(rt),
17714                                          &location);
17715                                  }
17716                                  break;
17717                                }
17718                              }
17719                              break;
17720                            }
17721                            default: {
17722                              switch (instr & 0x00800000) {
17723                                case 0x00000000: {
17724                                  // 0xf9100000
17725                                  switch (instr & 0x00000d00) {
17726                                    case 0x00000000: {
17727                                      // 0xf9100000
17728                                      switch (instr & 0x000002c0) {
17729                                        case 0x00000000: {
17730                                          // 0xf9100000
17731                                          switch (instr & 0x0000f000) {
17732                                            case 0x0000f000: {
17733                                              // 0xf910f000
17734                                              if (((instr & 0xf0000) ==
17735                                                   0xf0000)) {
17736                                                UnallocatedT32(instr);
17737                                                return;
17738                                              }
17739                                              unsigned rn = (instr >> 16) & 0xf;
17740                                              Sign sign(plus);
17741                                              unsigned rm = instr & 0xf;
17742                                              Shift shift = LSL;
17743                                              uint32_t amount =
17744                                                  (instr >> 4) & 0x3;
17745                                              AddrMode addrmode = Offset;
17746                                              // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
17747                                              pli(CurrentCond(),
17748                                                  MemOperand(Register(rn),
17749                                                             sign,
17750                                                             Register(rm),
17751                                                             shift,
17752                                                             amount,
17753                                                             addrmode));
17754                                              break;
17755                                            }
17756                                            default: {
17757                                              if (((instr & 0xf0000) ==
17758                                                   0xf0000) ||
17759                                                  ((instr & 0xf000) ==
17760                                                   0xf000)) {
17761                                                UnallocatedT32(instr);
17762                                                return;
17763                                              }
17764                                              unsigned rt = (instr >> 12) & 0xf;
17765                                              unsigned rn = (instr >> 16) & 0xf;
17766                                              Sign sign(plus);
17767                                              unsigned rm = instr & 0xf;
17768                                              Shift shift = LSL;
17769                                              uint32_t amount =
17770                                                  (instr >> 4) & 0x3;
17771                                              AddrMode addrmode = Offset;
17772                                              if ((rt <
17773                                                   kNumberOfT32LowRegisters) &&
17774                                                  (rn <
17775                                                   kNumberOfT32LowRegisters) &&
17776                                                  (rm <
17777                                                   kNumberOfT32LowRegisters) &&
17778                                                  shift.IsLSL() &&
17779                                                  (amount == 0) &&
17780                                                  sign.IsPlus()) {
17781                                                // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17782                                                ldrsb(CurrentCond(),
17783                                                      Wide,
17784                                                      Register(rt),
17785                                                      MemOperand(Register(rn),
17786                                                                 sign,
17787                                                                 Register(rm),
17788                                                                 addrmode));
17789                                              } else {
17790                                                // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17791                                                ldrsb(CurrentCond(),
17792                                                      Best,
17793                                                      Register(rt),
17794                                                      MemOperand(Register(rn),
17795                                                                 sign,
17796                                                                 Register(rm),
17797                                                                 shift,
17798                                                                 amount,
17799                                                                 addrmode));
17800                                              }
17801                                              break;
17802                                            }
17803                                          }
17804                                          break;
17805                                        }
17806                                        default:
17807                                          UnallocatedT32(instr);
17808                                          break;
17809                                      }
17810                                      break;
17811                                    }
17812                                    case 0x00000900: {
17813                                      // 0xf9100900
17814                                      if (((instr & 0xf0000) == 0xf0000)) {
17815                                        UnallocatedT32(instr);
17816                                        return;
17817                                      }
17818                                      unsigned rt = (instr >> 12) & 0xf;
17819                                      unsigned rn = (instr >> 16) & 0xf;
17820                                      Sign sign((((instr >> 9) & 0x1) == 0)
17821                                                    ? minus
17822                                                    : plus);
17823                                      int32_t offset = instr & 0xff;
17824                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
17825                                      ldrsb(CurrentCond(),
17826                                            Best,
17827                                            Register(rt),
17828                                            MemOperand(Register(rn),
17829                                                       sign,
17830                                                       offset,
17831                                                       PostIndex));
17832                                      break;
17833                                    }
17834                                    case 0x00000c00: {
17835                                      // 0xf9100c00
17836                                      switch (instr & 0x00000200) {
17837                                        case 0x00000000: {
17838                                          // 0xf9100c00
17839                                          switch (instr & 0x0000f000) {
17840                                            case 0x0000f000: {
17841                                              // 0xf910fc00
17842                                              if (((instr & 0xf0000) ==
17843                                                   0xf0000)) {
17844                                                UnallocatedT32(instr);
17845                                                return;
17846                                              }
17847                                              unsigned rn = (instr >> 16) & 0xf;
17848                                              int32_t offset = instr & 0xff;
17849                                              // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17850                                              pli(CurrentCond(),
17851                                                  MemOperand(Register(rn),
17852                                                             minus,
17853                                                             offset,
17854                                                             Offset));
17855                                              break;
17856                                            }
17857                                            default: {
17858                                              if (((instr & 0xf0000) ==
17859                                                   0xf0000) ||
17860                                                  ((instr & 0xf000) ==
17861                                                   0xf000)) {
17862                                                UnallocatedT32(instr);
17863                                                return;
17864                                              }
17865                                              unsigned rt = (instr >> 12) & 0xf;
17866                                              unsigned rn = (instr >> 16) & 0xf;
17867                                              int32_t offset = instr & 0xff;
17868                                              // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17869                                              ldrsb(CurrentCond(),
17870                                                    Best,
17871                                                    Register(rt),
17872                                                    MemOperand(Register(rn),
17873                                                               minus,
17874                                                               offset,
17875                                                               Offset));
17876                                              break;
17877                                            }
17878                                          }
17879                                          break;
17880                                        }
17881                                        case 0x00000200: {
17882                                          // 0xf9100e00
17883                                          if (((instr & 0xf0000) == 0xf0000)) {
17884                                            UnallocatedT32(instr);
17885                                            return;
17886                                          }
17887                                          UnimplementedT32_32("LDRSBT", instr);
17888                                          break;
17889                                        }
17890                                      }
17891                                      break;
17892                                    }
17893                                    case 0x00000d00: {
17894                                      // 0xf9100d00
17895                                      if (((instr & 0xf0000) == 0xf0000)) {
17896                                        UnallocatedT32(instr);
17897                                        return;
17898                                      }
17899                                      unsigned rt = (instr >> 12) & 0xf;
17900                                      unsigned rn = (instr >> 16) & 0xf;
17901                                      Sign sign((((instr >> 9) & 0x1) == 0)
17902                                                    ? minus
17903                                                    : plus);
17904                                      int32_t offset = instr & 0xff;
17905                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
17906                                      ldrsb(CurrentCond(),
17907                                            Best,
17908                                            Register(rt),
17909                                            MemOperand(Register(rn),
17910                                                       sign,
17911                                                       offset,
17912                                                       PreIndex));
17913                                      break;
17914                                    }
17915                                    default:
17916                                      UnallocatedT32(instr);
17917                                      break;
17918                                  }
17919                                  break;
17920                                }
17921                                case 0x00800000: {
17922                                  // 0xf9900000
17923                                  switch (instr & 0x0000f000) {
17924                                    case 0x0000f000: {
17925                                      // 0xf990f000
17926                                      if (((instr & 0xf0000) == 0xf0000)) {
17927                                        UnallocatedT32(instr);
17928                                        return;
17929                                      }
17930                                      unsigned rn = (instr >> 16) & 0xf;
17931                                      int32_t offset = instr & 0xfff;
17932                                      // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17933                                      pli(CurrentCond(),
17934                                          MemOperand(Register(rn),
17935                                                     plus,
17936                                                     offset,
17937                                                     Offset));
17938                                      break;
17939                                    }
17940                                    default: {
17941                                      if (((instr & 0xf0000) == 0xf0000) ||
17942                                          ((instr & 0xf000) == 0xf000)) {
17943                                        UnallocatedT32(instr);
17944                                        return;
17945                                      }
17946                                      unsigned rt = (instr >> 12) & 0xf;
17947                                      unsigned rn = (instr >> 16) & 0xf;
17948                                      int32_t offset = instr & 0xfff;
17949                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
17950                                      ldrsb(CurrentCond(),
17951                                            Best,
17952                                            Register(rt),
17953                                            MemOperand(Register(rn),
17954                                                       plus,
17955                                                       offset,
17956                                                       Offset));
17957                                      break;
17958                                    }
17959                                  }
17960                                  break;
17961                                }
17962                              }
17963                              break;
17964                            }
17965                          }
17966                          break;
17967                        }
17968                        case 0x00200000: {
17969                          // 0xf9300000
17970                          switch (instr & 0x000f0000) {
17971                            case 0x000f0000: {
17972                              // 0xf93f0000
17973                              if (((instr & 0xf000) == 0xf000)) {
17974                                UnallocatedT32(instr);
17975                                return;
17976                              }
17977                              unsigned rt = (instr >> 12) & 0xf;
17978                              uint32_t U = (instr >> 23) & 0x1;
17979                              int32_t imm = instr & 0xfff;
17980                              if (U == 0) imm = -imm;
17981                              bool minus_zero = (imm == 0) && (U == 0);
17982                              Location location(imm, kT32PcDelta);
17983                              // LDRSH{<c>}{<q>} <Rt>, <label> ; T1
17984                              if (minus_zero) {
17985                                ldrsh(CurrentCond(),
17986                                      Best,
17987                                      Register(rt),
17988                                      MemOperand(pc, minus, 0));
17989                              } else {
17990                                ldrsh(CurrentCond(), Register(rt), &location);
17991                              }
17992                              break;
17993                            }
17994                            default: {
17995                              switch (instr & 0x00800000) {
17996                                case 0x00000000: {
17997                                  // 0xf9300000
17998                                  switch (instr & 0x00000d00) {
17999                                    case 0x00000000: {
18000                                      // 0xf9300000
18001                                      if ((instr & 0x000002c0) == 0x00000000) {
18002                                        if (((instr & 0xf0000) == 0xf0000) ||
18003                                            ((instr & 0xf000) == 0xf000)) {
18004                                          UnallocatedT32(instr);
18005                                          return;
18006                                        }
18007                                        unsigned rt = (instr >> 12) & 0xf;
18008                                        unsigned rn = (instr >> 16) & 0xf;
18009                                        Sign sign(plus);
18010                                        unsigned rm = instr & 0xf;
18011                                        Shift shift = LSL;
18012                                        uint32_t amount = (instr >> 4) & 0x3;
18013                                        AddrMode addrmode = Offset;
18014                                        if ((rt < kNumberOfT32LowRegisters) &&
18015                                            (rn < kNumberOfT32LowRegisters) &&
18016                                            (rm < kNumberOfT32LowRegisters) &&
18017                                            shift.IsLSL() && (amount == 0) &&
18018                                            sign.IsPlus()) {
18019                                          // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
18020                                          ldrsh(CurrentCond(),
18021                                                Wide,
18022                                                Register(rt),
18023                                                MemOperand(Register(rn),
18024                                                           sign,
18025                                                           Register(rm),
18026                                                           addrmode));
18027                                        } else {
18028                                          // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
18029                                          ldrsh(CurrentCond(),
18030                                                Best,
18031                                                Register(rt),
18032                                                MemOperand(Register(rn),
18033                                                           sign,
18034                                                           Register(rm),
18035                                                           shift,
18036                                                           amount,
18037                                                           addrmode));
18038                                        }
18039                                      } else {
18040                                        UnallocatedT32(instr);
18041                                      }
18042                                      break;
18043                                    }
18044                                    case 0x00000900: {
18045                                      // 0xf9300900
18046                                      if (((instr & 0xf0000) == 0xf0000)) {
18047                                        UnallocatedT32(instr);
18048                                        return;
18049                                      }
18050                                      unsigned rt = (instr >> 12) & 0xf;
18051                                      unsigned rn = (instr >> 16) & 0xf;
18052                                      Sign sign((((instr >> 9) & 0x1) == 0)
18053                                                    ? minus
18054                                                    : plus);
18055                                      int32_t offset = instr & 0xff;
18056                                      // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
18057                                      ldrsh(CurrentCond(),
18058                                            Best,
18059                                            Register(rt),
18060                                            MemOperand(Register(rn),
18061                                                       sign,
18062                                                       offset,
18063                                                       PostIndex));
18064                                      break;
18065                                    }
18066                                    case 0x00000c00: {
18067                                      // 0xf9300c00
18068                                      switch (instr & 0x00000200) {
18069                                        case 0x00000000: {
18070                                          // 0xf9300c00
18071                                          if (((instr & 0xf0000) == 0xf0000) ||
18072                                              ((instr & 0xf000) == 0xf000)) {
18073                                            UnallocatedT32(instr);
18074                                            return;
18075                                          }
18076                                          unsigned rt = (instr >> 12) & 0xf;
18077                                          unsigned rn = (instr >> 16) & 0xf;
18078                                          int32_t offset = instr & 0xff;
18079                                          // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
18080                                          ldrsh(CurrentCond(),
18081                                                Best,
18082                                                Register(rt),
18083                                                MemOperand(Register(rn),
18084                                                           minus,
18085                                                           offset,
18086                                                           Offset));
18087                                          break;
18088                                        }
18089                                        case 0x00000200: {
18090                                          // 0xf9300e00
18091                                          if (((instr & 0xf0000) == 0xf0000)) {
18092                                            UnallocatedT32(instr);
18093                                            return;
18094                                          }
18095                                          UnimplementedT32_32("LDRSHT", instr);
18096                                          break;
18097                                        }
18098                                      }
18099                                      break;
18100                                    }
18101                                    case 0x00000d00: {
18102                                      // 0xf9300d00
18103                                      if (((instr & 0xf0000) == 0xf0000)) {
18104                                        UnallocatedT32(instr);
18105                                        return;
18106                                      }
18107                                      unsigned rt = (instr >> 12) & 0xf;
18108                                      unsigned rn = (instr >> 16) & 0xf;
18109                                      Sign sign((((instr >> 9) & 0x1) == 0)
18110                                                    ? minus
18111                                                    : plus);
18112                                      int32_t offset = instr & 0xff;
18113                                      // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
18114                                      ldrsh(CurrentCond(),
18115                                            Best,
18116                                            Register(rt),
18117                                            MemOperand(Register(rn),
18118                                                       sign,
18119                                                       offset,
18120                                                       PreIndex));
18121                                      break;
18122                                    }
18123                                    default:
18124                                      UnallocatedT32(instr);
18125                                      break;
18126                                  }
18127                                  break;
18128                                }
18129                                case 0x00800000: {
18130                                  // 0xf9b00000
18131                                  if (((instr & 0xf0000) == 0xf0000) ||
18132                                      ((instr & 0xf000) == 0xf000)) {
18133                                    UnallocatedT32(instr);
18134                                    return;
18135                                  }
18136                                  unsigned rt = (instr >> 12) & 0xf;
18137                                  unsigned rn = (instr >> 16) & 0xf;
18138                                  int32_t offset = instr & 0xfff;
18139                                  // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
18140                                  ldrsh(CurrentCond(),
18141                                        Best,
18142                                        Register(rt),
18143                                        MemOperand(Register(rn),
18144                                                   plus,
18145                                                   offset,
18146                                                   Offset));
18147                                  break;
18148                                }
18149                              }
18150                              break;
18151                            }
18152                          }
18153                          break;
18154                        }
18155                      }
18156                      break;
18157                    }
18158                    default:
18159                      UnallocatedT32(instr);
18160                      break;
18161                  }
18162                  break;
18163                }
18164              }
18165              break;
18166            }
18167            case 0x02000000: {
18168              // 0xea000000
18169              switch (instr & 0x11900000) {
18170                case 0x00000000: {
18171                  // 0xea000000
18172                  switch (instr & 0x00600000) {
18173                    case 0x00000000: {
18174                      // 0xea000000
18175                      switch (instr & 0x000070f0) {
18176                        case 0x00000030: {
18177                          // 0xea000030
18178                          unsigned rd = (instr >> 8) & 0xf;
18179                          unsigned rn = (instr >> 16) & 0xf;
18180                          unsigned rm = instr & 0xf;
18181                          // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18182                          and_(CurrentCond(),
18183                               Best,
18184                               Register(rd),
18185                               Register(rn),
18186                               Operand(Register(rm), RRX));
18187                          if (((instr & 0xfff0f0f0) != 0xea000030)) {
18188                            UnpredictableT32(instr);
18189                          }
18190                          break;
18191                        }
18192                        default: {
18193                          if (((instr & 0x70f0) == 0x30)) {
18194                            UnallocatedT32(instr);
18195                            return;
18196                          }
18197                          unsigned rd = (instr >> 8) & 0xf;
18198                          unsigned rn = (instr >> 16) & 0xf;
18199                          unsigned rm = instr & 0xf;
18200                          ImmediateShiftOperand
18201                              shift_operand((instr >> 4) & 0x3,
18202                                            ((instr >> 6) & 0x3) |
18203                                                ((instr >> 10) & 0x1c));
18204                          if (InITBlock() &&
18205                              (instr & 0x00100000) == 0x00000000 &&
18206                              shift_operand.GetShift().IsLSL() &&
18207                              (shift_operand.GetAmount() == 0) &&
18208                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18209                               (rm < kNumberOfT32LowRegisters))) {
18210                            // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18211                            and_(CurrentCond(),
18212                                 Wide,
18213                                 Register(rd),
18214                                 Register(rn),
18215                                 Register(rm));
18216                            if (((instr & 0xfff08000) != 0xea000000)) {
18217                              UnpredictableT32(instr);
18218                            }
18219                          } else if ((instr & 0x00100000) == 0x00000000) {
18220                            // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18221                            and_(CurrentCond(),
18222                                 Best,
18223                                 Register(rd),
18224                                 Register(rn),
18225                                 Operand(Register(rm),
18226                                         shift_operand.GetType(),
18227                                         shift_operand.GetAmount()));
18228                            if (((instr & 0xfff08000) != 0xea000000)) {
18229                              UnpredictableT32(instr);
18230                            }
18231                          } else {
18232                            UnallocatedT32(instr);
18233                          }
18234                          break;
18235                        }
18236                      }
18237                      break;
18238                    }
18239                    case 0x00200000: {
18240                      // 0xea200000
18241                      switch (instr & 0x000070f0) {
18242                        case 0x00000030: {
18243                          // 0xea200030
18244                          unsigned rd = (instr >> 8) & 0xf;
18245                          unsigned rn = (instr >> 16) & 0xf;
18246                          unsigned rm = instr & 0xf;
18247                          // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18248                          bic(CurrentCond(),
18249                              Best,
18250                              Register(rd),
18251                              Register(rn),
18252                              Operand(Register(rm), RRX));
18253                          if (((instr & 0xfff0f0f0) != 0xea200030)) {
18254                            UnpredictableT32(instr);
18255                          }
18256                          break;
18257                        }
18258                        default: {
18259                          if (((instr & 0x70f0) == 0x30)) {
18260                            UnallocatedT32(instr);
18261                            return;
18262                          }
18263                          unsigned rd = (instr >> 8) & 0xf;
18264                          unsigned rn = (instr >> 16) & 0xf;
18265                          unsigned rm = instr & 0xf;
18266                          ImmediateShiftOperand
18267                              shift_operand((instr >> 4) & 0x3,
18268                                            ((instr >> 6) & 0x3) |
18269                                                ((instr >> 10) & 0x1c));
18270                          if (InITBlock() &&
18271                              (instr & 0x00100000) == 0x00000000 &&
18272                              shift_operand.GetShift().IsLSL() &&
18273                              (shift_operand.GetAmount() == 0) &&
18274                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18275                               (rm < kNumberOfT32LowRegisters))) {
18276                            // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18277                            bic(CurrentCond(),
18278                                Wide,
18279                                Register(rd),
18280                                Register(rn),
18281                                Register(rm));
18282                            if (((instr & 0xfff08000) != 0xea200000)) {
18283                              UnpredictableT32(instr);
18284                            }
18285                          } else if ((instr & 0x00100000) == 0x00000000) {
18286                            // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18287                            bic(CurrentCond(),
18288                                Best,
18289                                Register(rd),
18290                                Register(rn),
18291                                Operand(Register(rm),
18292                                        shift_operand.GetType(),
18293                                        shift_operand.GetAmount()));
18294                            if (((instr & 0xfff08000) != 0xea200000)) {
18295                              UnpredictableT32(instr);
18296                            }
18297                          } else {
18298                            UnallocatedT32(instr);
18299                          }
18300                          break;
18301                        }
18302                      }
18303                      break;
18304                    }
18305                    case 0x00400000: {
18306                      // 0xea400000
18307                      switch (instr & 0x000f0000) {
18308                        case 0x000f0000: {
18309                          // 0xea4f0000
18310                          switch (instr & 0x000070f0) {
18311                            case 0x00000030: {
18312                              // 0xea4f0030
18313                              unsigned rd = (instr >> 8) & 0xf;
18314                              unsigned rm = instr & 0xf;
18315                              // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3
18316                              rrx(CurrentCond(), Register(rd), Register(rm));
18317                              if (((instr & 0xfffff0f0) != 0xea4f0030)) {
18318                                UnpredictableT32(instr);
18319                              }
18320                              break;
18321                            }
18322                            default: {
18323                              if (((instr & 0x70f0) == 0x30)) {
18324                                UnallocatedT32(instr);
18325                                return;
18326                              }
18327                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18328                                   Uint32(0x2))) {
18329                                unsigned rd = (instr >> 8) & 0xf;
18330                                unsigned rm = instr & 0xf;
18331                                uint32_t amount = ((instr >> 6) & 0x3) |
18332                                                  ((instr >> 10) & 0x1c);
18333                                if (amount == 0) amount = 32;
18334                                if (InITBlock() &&
18335                                    ((rd < kNumberOfT32LowRegisters) &&
18336                                     (rm < kNumberOfT32LowRegisters) &&
18337                                     ((amount >= 1) && (amount <= 32)))) {
18338                                  // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18339                                  asr(CurrentCond(),
18340                                      Wide,
18341                                      Register(rd),
18342                                      Register(rm),
18343                                      amount);
18344                                  if (((instr & 0xffff8030) != 0xea4f0020)) {
18345                                    UnpredictableT32(instr);
18346                                  }
18347                                } else {
18348                                  // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18349                                  asr(CurrentCond(),
18350                                      Best,
18351                                      Register(rd),
18352                                      Register(rm),
18353                                      amount);
18354                                  if (((instr & 0xffff8030) != 0xea4f0020)) {
18355                                    UnpredictableT32(instr);
18356                                  }
18357                                }
18358                                return;
18359                              }
18360                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18361                                   Uint32(0x0)) &&
18362                                  ((instr & 0x000070c0) != 0x00000000)) {
18363                                unsigned rd = (instr >> 8) & 0xf;
18364                                unsigned rm = instr & 0xf;
18365                                uint32_t amount = ((instr >> 6) & 0x3) |
18366                                                  ((instr >> 10) & 0x1c);
18367                                if (InITBlock() &&
18368                                    ((rd < kNumberOfT32LowRegisters) &&
18369                                     (rm < kNumberOfT32LowRegisters) &&
18370                                     ((amount >= 1) && (amount <= 31)))) {
18371                                  // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18372                                  lsl(CurrentCond(),
18373                                      Wide,
18374                                      Register(rd),
18375                                      Register(rm),
18376                                      amount);
18377                                  if (((instr & 0xffff8030) != 0xea4f0000)) {
18378                                    UnpredictableT32(instr);
18379                                  }
18380                                } else {
18381                                  // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18382                                  lsl(CurrentCond(),
18383                                      Best,
18384                                      Register(rd),
18385                                      Register(rm),
18386                                      amount);
18387                                  if (((instr & 0xffff8030) != 0xea4f0000)) {
18388                                    UnpredictableT32(instr);
18389                                  }
18390                                }
18391                                return;
18392                              }
18393                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18394                                   Uint32(0x1))) {
18395                                unsigned rd = (instr >> 8) & 0xf;
18396                                unsigned rm = instr & 0xf;
18397                                uint32_t amount = ((instr >> 6) & 0x3) |
18398                                                  ((instr >> 10) & 0x1c);
18399                                if (amount == 0) amount = 32;
18400                                if (InITBlock() &&
18401                                    ((rd < kNumberOfT32LowRegisters) &&
18402                                     (rm < kNumberOfT32LowRegisters) &&
18403                                     ((amount >= 1) && (amount <= 32)))) {
18404                                  // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18405                                  lsr(CurrentCond(),
18406                                      Wide,
18407                                      Register(rd),
18408                                      Register(rm),
18409                                      amount);
18410                                  if (((instr & 0xffff8030) != 0xea4f0010)) {
18411                                    UnpredictableT32(instr);
18412                                  }
18413                                } else {
18414                                  // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18415                                  lsr(CurrentCond(),
18416                                      Best,
18417                                      Register(rd),
18418                                      Register(rm),
18419                                      amount);
18420                                  if (((instr & 0xffff8030) != 0xea4f0010)) {
18421                                    UnpredictableT32(instr);
18422                                  }
18423                                }
18424                                return;
18425                              }
18426                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18427                                   Uint32(0x3)) &&
18428                                  ((instr & 0x000070c0) != 0x00000000)) {
18429                                unsigned rd = (instr >> 8) & 0xf;
18430                                unsigned rm = instr & 0xf;
18431                                uint32_t amount = ((instr >> 6) & 0x3) |
18432                                                  ((instr >> 10) & 0x1c);
18433                                // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18434                                ror(CurrentCond(),
18435                                    Best,
18436                                    Register(rd),
18437                                    Register(rm),
18438                                    amount);
18439                                if (((instr & 0xffff8030) != 0xea4f0030)) {
18440                                  UnpredictableT32(instr);
18441                                }
18442                                return;
18443                              }
18444                              unsigned rd = (instr >> 8) & 0xf;
18445                              unsigned rm = instr & 0xf;
18446                              ImmediateShiftOperand
18447                                  shift_operand((instr >> 4) & 0x3,
18448                                                ((instr >> 6) & 0x3) |
18449                                                    ((instr >> 10) & 0x1c));
18450                              if ((instr & 0x00100000) == 0x00000000 &&
18451                                  (shift_operand.GetShift().IsLSL() &&
18452                                   (shift_operand.GetAmount() == 0))) {
18453                                // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18454                                mov(CurrentCond(),
18455                                    Wide,
18456                                    Register(rd),
18457                                    Operand(Register(rm),
18458                                            shift_operand.GetType(),
18459                                            shift_operand.GetAmount()));
18460                                if (((instr & 0xffff8000) != 0xea4f0000)) {
18461                                  UnpredictableT32(instr);
18462                                }
18463                              } else if (InITBlock() &&
18464                                         (instr & 0x00100000) == 0x00000000 &&
18465                                         ((rd < kNumberOfT32LowRegisters) &&
18466                                          (rm < kNumberOfT32LowRegisters))) {
18467                                // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18468                                mov(CurrentCond(),
18469                                    Wide,
18470                                    Register(rd),
18471                                    Operand(Register(rm),
18472                                            shift_operand.GetType(),
18473                                            shift_operand.GetAmount()));
18474                                if (((instr & 0xffff8000) != 0xea4f0000)) {
18475                                  UnpredictableT32(instr);
18476                                }
18477                              } else if ((instr & 0x00100000) == 0x00000000) {
18478                                // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18479                                mov(CurrentCond(),
18480                                    Best,
18481                                    Register(rd),
18482                                    Operand(Register(rm),
18483                                            shift_operand.GetType(),
18484                                            shift_operand.GetAmount()));
18485                                if (((instr & 0xffff8000) != 0xea4f0000)) {
18486                                  UnpredictableT32(instr);
18487                                }
18488                              } else {
18489                                UnallocatedT32(instr);
18490                              }
18491                              break;
18492                            }
18493                          }
18494                          break;
18495                        }
18496                        default: {
18497                          switch (instr & 0x000070f0) {
18498                            case 0x00000030: {
18499                              // 0xea400030
18500                              if (((instr & 0xf0000) == 0xf0000)) {
18501                                UnallocatedT32(instr);
18502                                return;
18503                              }
18504                              unsigned rd = (instr >> 8) & 0xf;
18505                              unsigned rn = (instr >> 16) & 0xf;
18506                              unsigned rm = instr & 0xf;
18507                              // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18508                              orr(CurrentCond(),
18509                                  Best,
18510                                  Register(rd),
18511                                  Register(rn),
18512                                  Operand(Register(rm), RRX));
18513                              if (((instr & 0xfff0f0f0) != 0xea400030)) {
18514                                UnpredictableT32(instr);
18515                              }
18516                              break;
18517                            }
18518                            default: {
18519                              if (((instr & 0xf0000) == 0xf0000) ||
18520                                  ((instr & 0x70f0) == 0x30)) {
18521                                UnallocatedT32(instr);
18522                                return;
18523                              }
18524                              unsigned rd = (instr >> 8) & 0xf;
18525                              unsigned rn = (instr >> 16) & 0xf;
18526                              unsigned rm = instr & 0xf;
18527                              ImmediateShiftOperand
18528                                  shift_operand((instr >> 4) & 0x3,
18529                                                ((instr >> 6) & 0x3) |
18530                                                    ((instr >> 10) & 0x1c));
18531                              if (InITBlock() &&
18532                                  (instr & 0x00100000) == 0x00000000 &&
18533                                  shift_operand.GetShift().IsLSL() &&
18534                                  (shift_operand.GetAmount() == 0) &&
18535                                  ((rd == rn) &&
18536                                   (rd < kNumberOfT32LowRegisters) &&
18537                                   (rm < kNumberOfT32LowRegisters))) {
18538                                // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18539                                orr(CurrentCond(),
18540                                    Wide,
18541                                    Register(rd),
18542                                    Register(rn),
18543                                    Register(rm));
18544                                if (((instr & 0xfff08000) != 0xea400000)) {
18545                                  UnpredictableT32(instr);
18546                                }
18547                              } else if ((instr & 0x00100000) == 0x00000000) {
18548                                // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18549                                orr(CurrentCond(),
18550                                    Best,
18551                                    Register(rd),
18552                                    Register(rn),
18553                                    Operand(Register(rm),
18554                                            shift_operand.GetType(),
18555                                            shift_operand.GetAmount()));
18556                                if (((instr & 0xfff08000) != 0xea400000)) {
18557                                  UnpredictableT32(instr);
18558                                }
18559                              } else {
18560                                UnallocatedT32(instr);
18561                              }
18562                              break;
18563                            }
18564                          }
18565                          break;
18566                        }
18567                      }
18568                      break;
18569                    }
18570                    case 0x00600000: {
18571                      // 0xea600000
18572                      switch (instr & 0x000f0000) {
18573                        case 0x000f0000: {
18574                          // 0xea6f0000
18575                          switch (instr & 0x000070f0) {
18576                            case 0x00000030: {
18577                              // 0xea6f0030
18578                              unsigned rd = (instr >> 8) & 0xf;
18579                              unsigned rm = instr & 0xf;
18580                              // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
18581                              mvn(CurrentCond(),
18582                                  Best,
18583                                  Register(rd),
18584                                  Operand(Register(rm), RRX));
18585                              if (((instr & 0xfffff0f0) != 0xea6f0030)) {
18586                                UnpredictableT32(instr);
18587                              }
18588                              break;
18589                            }
18590                            default: {
18591                              if (((instr & 0x70f0) == 0x30)) {
18592                                UnallocatedT32(instr);
18593                                return;
18594                              }
18595                              unsigned rd = (instr >> 8) & 0xf;
18596                              unsigned rm = instr & 0xf;
18597                              ImmediateShiftOperand
18598                                  shift_operand((instr >> 4) & 0x3,
18599                                                ((instr >> 6) & 0x3) |
18600                                                    ((instr >> 10) & 0x1c));
18601                              if (InITBlock() &&
18602                                  (instr & 0x00100000) == 0x00000000 &&
18603                                  shift_operand.GetShift().IsLSL() &&
18604                                  (shift_operand.GetAmount() == 0) &&
18605                                  ((rd < kNumberOfT32LowRegisters) &&
18606                                   (rm < kNumberOfT32LowRegisters))) {
18607                                // MVN<c>.W <Rd>, <Rm> ; T2
18608                                mvn(CurrentCond(),
18609                                    Wide,
18610                                    Register(rd),
18611                                    Register(rm));
18612                                if (((instr & 0xffff8000) != 0xea6f0000)) {
18613                                  UnpredictableT32(instr);
18614                                }
18615                              } else if ((instr & 0x00100000) == 0x00000000) {
18616                                // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18617                                mvn(CurrentCond(),
18618                                    Best,
18619                                    Register(rd),
18620                                    Operand(Register(rm),
18621                                            shift_operand.GetType(),
18622                                            shift_operand.GetAmount()));
18623                                if (((instr & 0xffff8000) != 0xea6f0000)) {
18624                                  UnpredictableT32(instr);
18625                                }
18626                              } else {
18627                                UnallocatedT32(instr);
18628                              }
18629                              break;
18630                            }
18631                          }
18632                          break;
18633                        }
18634                        default: {
18635                          switch (instr & 0x000070f0) {
18636                            case 0x00000030: {
18637                              // 0xea600030
18638                              if (((instr & 0xf0000) == 0xf0000)) {
18639                                UnallocatedT32(instr);
18640                                return;
18641                              }
18642                              unsigned rd = (instr >> 8) & 0xf;
18643                              unsigned rn = (instr >> 16) & 0xf;
18644                              unsigned rm = instr & 0xf;
18645                              // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
18646                              orn(CurrentCond(),
18647                                  Register(rd),
18648                                  Register(rn),
18649                                  Operand(Register(rm), RRX));
18650                              if (((instr & 0xfff0f0f0) != 0xea600030)) {
18651                                UnpredictableT32(instr);
18652                              }
18653                              break;
18654                            }
18655                            default: {
18656                              if (((instr & 0xf0000) == 0xf0000) ||
18657                                  ((instr & 0x70f0) == 0x30)) {
18658                                UnallocatedT32(instr);
18659                                return;
18660                              }
18661                              unsigned rd = (instr >> 8) & 0xf;
18662                              unsigned rn = (instr >> 16) & 0xf;
18663                              unsigned rm = instr & 0xf;
18664                              ImmediateShiftOperand
18665                                  shift_operand((instr >> 4) & 0x3,
18666                                                ((instr >> 6) & 0x3) |
18667                                                    ((instr >> 10) & 0x1c));
18668                              // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
18669                              orn(CurrentCond(),
18670                                  Register(rd),
18671                                  Register(rn),
18672                                  Operand(Register(rm),
18673                                          shift_operand.GetType(),
18674                                          shift_operand.GetAmount()));
18675                              if (((instr & 0xfff08000) != 0xea600000)) {
18676                                UnpredictableT32(instr);
18677                              }
18678                              break;
18679                            }
18680                          }
18681                          break;
18682                        }
18683                      }
18684                      break;
18685                    }
18686                  }
18687                  break;
18688                }
18689                case 0x00100000: {
18690                  // 0xea100000
18691                  switch (instr & 0x00600000) {
18692                    case 0x00000000: {
18693                      // 0xea100000
18694                      switch (instr & 0x00000f00) {
18695                        case 0x00000f00: {
18696                          // 0xea100f00
18697                          switch (instr & 0x000070f0) {
18698                            case 0x00000030: {
18699                              // 0xea100f30
18700                              unsigned rn = (instr >> 16) & 0xf;
18701                              unsigned rm = instr & 0xf;
18702                              // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
18703                              tst(CurrentCond(),
18704                                  Best,
18705                                  Register(rn),
18706                                  Operand(Register(rm), RRX));
18707                              if (((instr & 0xfff0fff0) != 0xea100f30)) {
18708                                UnpredictableT32(instr);
18709                              }
18710                              break;
18711                            }
18712                            default: {
18713                              if (((instr & 0x70f0) == 0x30)) {
18714                                UnallocatedT32(instr);
18715                                return;
18716                              }
18717                              unsigned rn = (instr >> 16) & 0xf;
18718                              unsigned rm = instr & 0xf;
18719                              ImmediateShiftOperand
18720                                  shift_operand((instr >> 4) & 0x3,
18721                                                ((instr >> 6) & 0x3) |
18722                                                    ((instr >> 10) & 0x1c));
18723                              if (shift_operand.GetShift().IsLSL() &&
18724                                  (shift_operand.GetAmount() == 0) &&
18725                                  ((rn < kNumberOfT32LowRegisters) &&
18726                                   (rm < kNumberOfT32LowRegisters))) {
18727                                // TST{<c>}.W <Rn>, <Rm> ; T2
18728                                tst(CurrentCond(),
18729                                    Wide,
18730                                    Register(rn),
18731                                    Register(rm));
18732                                if (((instr & 0xfff08f00) != 0xea100f00)) {
18733                                  UnpredictableT32(instr);
18734                                }
18735                              } else {
18736                                // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18737                                tst(CurrentCond(),
18738                                    Best,
18739                                    Register(rn),
18740                                    Operand(Register(rm),
18741                                            shift_operand.GetType(),
18742                                            shift_operand.GetAmount()));
18743                                if (((instr & 0xfff08f00) != 0xea100f00)) {
18744                                  UnpredictableT32(instr);
18745                                }
18746                              }
18747                              break;
18748                            }
18749                          }
18750                          break;
18751                        }
18752                        default: {
18753                          switch (instr & 0x000070f0) {
18754                            case 0x00000030: {
18755                              // 0xea100030
18756                              if (((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                              // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18764                              ands(CurrentCond(),
18765                                   Best,
18766                                   Register(rd),
18767                                   Register(rn),
18768                                   Operand(Register(rm), RRX));
18769                              if (((instr & 0xfff0f0f0) != 0xea100030)) {
18770                                UnpredictableT32(instr);
18771                              }
18772                              break;
18773                            }
18774                            default: {
18775                              if (((instr & 0x70f0) == 0x30) ||
18776                                  ((instr & 0xf00) == 0xf00)) {
18777                                UnallocatedT32(instr);
18778                                return;
18779                              }
18780                              unsigned rd = (instr >> 8) & 0xf;
18781                              unsigned rn = (instr >> 16) & 0xf;
18782                              unsigned rm = instr & 0xf;
18783                              ImmediateShiftOperand
18784                                  shift_operand((instr >> 4) & 0x3,
18785                                                ((instr >> 6) & 0x3) |
18786                                                    ((instr >> 10) & 0x1c));
18787                              if (OutsideITBlock() &&
18788                                  (instr & 0x00100000) == 0x00100000 &&
18789                                  shift_operand.GetShift().IsLSL() &&
18790                                  (shift_operand.GetAmount() == 0) &&
18791                                  ((rd == rn) &&
18792                                   (rd < kNumberOfT32LowRegisters) &&
18793                                   (rm < kNumberOfT32LowRegisters))) {
18794                                // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2
18795                                ands(Condition::None(),
18796                                     Wide,
18797                                     Register(rd),
18798                                     Register(rn),
18799                                     Register(rm));
18800                                if (((instr & 0xfff08000) != 0xea100000)) {
18801                                  UnpredictableT32(instr);
18802                                }
18803                              } else if ((instr & 0x00100000) == 0x00100000) {
18804                                // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18805                                ands(CurrentCond(),
18806                                     Best,
18807                                     Register(rd),
18808                                     Register(rn),
18809                                     Operand(Register(rm),
18810                                             shift_operand.GetType(),
18811                                             shift_operand.GetAmount()));
18812                                if (((instr & 0xfff08000) != 0xea100000)) {
18813                                  UnpredictableT32(instr);
18814                                }
18815                              } else {
18816                                UnallocatedT32(instr);
18817                              }
18818                              break;
18819                            }
18820                          }
18821                          break;
18822                        }
18823                      }
18824                      break;
18825                    }
18826                    case 0x00200000: {
18827                      // 0xea300000
18828                      switch (instr & 0x000070f0) {
18829                        case 0x00000030: {
18830                          // 0xea300030
18831                          unsigned rd = (instr >> 8) & 0xf;
18832                          unsigned rn = (instr >> 16) & 0xf;
18833                          unsigned rm = instr & 0xf;
18834                          // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18835                          bics(CurrentCond(),
18836                               Best,
18837                               Register(rd),
18838                               Register(rn),
18839                               Operand(Register(rm), RRX));
18840                          if (((instr & 0xfff0f0f0) != 0xea300030)) {
18841                            UnpredictableT32(instr);
18842                          }
18843                          break;
18844                        }
18845                        default: {
18846                          if (((instr & 0x70f0) == 0x30)) {
18847                            UnallocatedT32(instr);
18848                            return;
18849                          }
18850                          unsigned rd = (instr >> 8) & 0xf;
18851                          unsigned rn = (instr >> 16) & 0xf;
18852                          unsigned rm = instr & 0xf;
18853                          ImmediateShiftOperand
18854                              shift_operand((instr >> 4) & 0x3,
18855                                            ((instr >> 6) & 0x3) |
18856                                                ((instr >> 10) & 0x1c));
18857                          if (OutsideITBlock() &&
18858                              (instr & 0x00100000) == 0x00100000 &&
18859                              shift_operand.GetShift().IsLSL() &&
18860                              (shift_operand.GetAmount() == 0) &&
18861                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18862                               (rm < kNumberOfT32LowRegisters))) {
18863                            // BICS.W {<Rd>}, <Rn>, <Rm> ; T2
18864                            bics(Condition::None(),
18865                                 Wide,
18866                                 Register(rd),
18867                                 Register(rn),
18868                                 Register(rm));
18869                            if (((instr & 0xfff08000) != 0xea300000)) {
18870                              UnpredictableT32(instr);
18871                            }
18872                          } else if ((instr & 0x00100000) == 0x00100000) {
18873                            // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18874                            bics(CurrentCond(),
18875                                 Best,
18876                                 Register(rd),
18877                                 Register(rn),
18878                                 Operand(Register(rm),
18879                                         shift_operand.GetType(),
18880                                         shift_operand.GetAmount()));
18881                            if (((instr & 0xfff08000) != 0xea300000)) {
18882                              UnpredictableT32(instr);
18883                            }
18884                          } else {
18885                            UnallocatedT32(instr);
18886                          }
18887                          break;
18888                        }
18889                      }
18890                      break;
18891                    }
18892                    case 0x00400000: {
18893                      // 0xea500000
18894                      switch (instr & 0x000f0000) {
18895                        case 0x000f0000: {
18896                          // 0xea5f0000
18897                          switch (instr & 0x000070f0) {
18898                            case 0x00000030: {
18899                              // 0xea5f0030
18900                              unsigned rd = (instr >> 8) & 0xf;
18901                              unsigned rm = instr & 0xf;
18902                              // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3
18903                              rrxs(CurrentCond(), Register(rd), Register(rm));
18904                              if (((instr & 0xfffff0f0) != 0xea5f0030)) {
18905                                UnpredictableT32(instr);
18906                              }
18907                              break;
18908                            }
18909                            default: {
18910                              if (((instr & 0x70f0) == 0x30)) {
18911                                UnallocatedT32(instr);
18912                                return;
18913                              }
18914                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18915                                   Uint32(0x2))) {
18916                                unsigned rd = (instr >> 8) & 0xf;
18917                                unsigned rm = instr & 0xf;
18918                                uint32_t amount = ((instr >> 6) & 0x3) |
18919                                                  ((instr >> 10) & 0x1c);
18920                                if (amount == 0) amount = 32;
18921                                if (OutsideITBlock() &&
18922                                    ((rd < kNumberOfT32LowRegisters) &&
18923                                     (rm < kNumberOfT32LowRegisters) &&
18924                                     ((amount >= 1) && (amount <= 32)))) {
18925                                  // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3
18926                                  asrs(Condition::None(),
18927                                       Wide,
18928                                       Register(rd),
18929                                       Register(rm),
18930                                       amount);
18931                                  if (((instr & 0xffff8030) != 0xea5f0020)) {
18932                                    UnpredictableT32(instr);
18933                                  }
18934                                } else {
18935                                  // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18936                                  asrs(CurrentCond(),
18937                                       Best,
18938                                       Register(rd),
18939                                       Register(rm),
18940                                       amount);
18941                                  if (((instr & 0xffff8030) != 0xea5f0020)) {
18942                                    UnpredictableT32(instr);
18943                                  }
18944                                }
18945                                return;
18946                              }
18947                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18948                                   Uint32(0x0)) &&
18949                                  ((instr & 0x000070c0) != 0x00000000)) {
18950                                unsigned rd = (instr >> 8) & 0xf;
18951                                unsigned rm = instr & 0xf;
18952                                uint32_t amount = ((instr >> 6) & 0x3) |
18953                                                  ((instr >> 10) & 0x1c);
18954                                if (OutsideITBlock() &&
18955                                    ((rd < kNumberOfT32LowRegisters) &&
18956                                     (rm < kNumberOfT32LowRegisters) &&
18957                                     ((amount >= 1) && (amount <= 31)))) {
18958                                  // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3
18959                                  lsls(Condition::None(),
18960                                       Wide,
18961                                       Register(rd),
18962                                       Register(rm),
18963                                       amount);
18964                                  if (((instr & 0xffff8030) != 0xea5f0000)) {
18965                                    UnpredictableT32(instr);
18966                                  }
18967                                } else {
18968                                  // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18969                                  lsls(CurrentCond(),
18970                                       Best,
18971                                       Register(rd),
18972                                       Register(rm),
18973                                       amount);
18974                                  if (((instr & 0xffff8030) != 0xea5f0000)) {
18975                                    UnpredictableT32(instr);
18976                                  }
18977                                }
18978                                return;
18979                              }
18980                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18981                                   Uint32(0x1))) {
18982                                unsigned rd = (instr >> 8) & 0xf;
18983                                unsigned rm = instr & 0xf;
18984                                uint32_t amount = ((instr >> 6) & 0x3) |
18985                                                  ((instr >> 10) & 0x1c);
18986                                if (amount == 0) amount = 32;
18987                                if (OutsideITBlock() &&
18988                                    ((rd < kNumberOfT32LowRegisters) &&
18989                                     (rm < kNumberOfT32LowRegisters) &&
18990                                     ((amount >= 1) && (amount <= 32)))) {
18991                                  // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3
18992                                  lsrs(Condition::None(),
18993                                       Wide,
18994                                       Register(rd),
18995                                       Register(rm),
18996                                       amount);
18997                                  if (((instr & 0xffff8030) != 0xea5f0010)) {
18998                                    UnpredictableT32(instr);
18999                                  }
19000                                } else {
19001                                  // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
19002                                  lsrs(CurrentCond(),
19003                                       Best,
19004                                       Register(rd),
19005                                       Register(rm),
19006                                       amount);
19007                                  if (((instr & 0xffff8030) != 0xea5f0010)) {
19008                                    UnpredictableT32(instr);
19009                                  }
19010                                }
19011                                return;
19012                              }
19013                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
19014                                   Uint32(0x3)) &&
19015                                  ((instr & 0x000070c0) != 0x00000000)) {
19016                                unsigned rd = (instr >> 8) & 0xf;
19017                                unsigned rm = instr & 0xf;
19018                                uint32_t amount = ((instr >> 6) & 0x3) |
19019                                                  ((instr >> 10) & 0x1c);
19020                                // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
19021                                rors(CurrentCond(),
19022                                     Best,
19023                                     Register(rd),
19024                                     Register(rm),
19025                                     amount);
19026                                if (((instr & 0xffff8030) != 0xea5f0030)) {
19027                                  UnpredictableT32(instr);
19028                                }
19029                                return;
19030                              }
19031                              unsigned rd = (instr >> 8) & 0xf;
19032                              unsigned rm = instr & 0xf;
19033                              ImmediateShiftOperand
19034                                  shift_operand((instr >> 4) & 0x3,
19035                                                ((instr >> 6) & 0x3) |
19036                                                    ((instr >> 10) & 0x1c));
19037                              if (OutsideITBlock() &&
19038                                  (instr & 0x00100000) == 0x00100000 &&
19039                                  ((rd < kNumberOfT32LowRegisters) &&
19040                                   (rm < kNumberOfT32LowRegisters))) {
19041                                // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3
19042                                movs(Condition::None(),
19043                                     Wide,
19044                                     Register(rd),
19045                                     Operand(Register(rm),
19046                                             shift_operand.GetType(),
19047                                             shift_operand.GetAmount()));
19048                                if (((instr & 0xffff8000) != 0xea5f0000)) {
19049                                  UnpredictableT32(instr);
19050                                }
19051                              } else if ((instr & 0x00100000) == 0x00100000) {
19052                                // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19053                                movs(CurrentCond(),
19054                                     Best,
19055                                     Register(rd),
19056                                     Operand(Register(rm),
19057                                             shift_operand.GetType(),
19058                                             shift_operand.GetAmount()));
19059                                if (((instr & 0xffff8000) != 0xea5f0000)) {
19060                                  UnpredictableT32(instr);
19061                                }
19062                              } else {
19063                                UnallocatedT32(instr);
19064                              }
19065                              break;
19066                            }
19067                          }
19068                          break;
19069                        }
19070                        default: {
19071                          switch (instr & 0x000070f0) {
19072                            case 0x00000030: {
19073                              // 0xea500030
19074                              if (((instr & 0xf0000) == 0xf0000)) {
19075                                UnallocatedT32(instr);
19076                                return;
19077                              }
19078                              unsigned rd = (instr >> 8) & 0xf;
19079                              unsigned rn = (instr >> 16) & 0xf;
19080                              unsigned rm = instr & 0xf;
19081                              // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19082                              orrs(CurrentCond(),
19083                                   Best,
19084                                   Register(rd),
19085                                   Register(rn),
19086                                   Operand(Register(rm), RRX));
19087                              if (((instr & 0xfff0f0f0) != 0xea500030)) {
19088                                UnpredictableT32(instr);
19089                              }
19090                              break;
19091                            }
19092                            default: {
19093                              if (((instr & 0xf0000) == 0xf0000) ||
19094                                  ((instr & 0x70f0) == 0x30)) {
19095                                UnallocatedT32(instr);
19096                                return;
19097                              }
19098                              unsigned rd = (instr >> 8) & 0xf;
19099                              unsigned rn = (instr >> 16) & 0xf;
19100                              unsigned rm = instr & 0xf;
19101                              ImmediateShiftOperand
19102                                  shift_operand((instr >> 4) & 0x3,
19103                                                ((instr >> 6) & 0x3) |
19104                                                    ((instr >> 10) & 0x1c));
19105                              if (OutsideITBlock() &&
19106                                  (instr & 0x00100000) == 0x00100000 &&
19107                                  shift_operand.GetShift().IsLSL() &&
19108                                  (shift_operand.GetAmount() == 0) &&
19109                                  ((rd == rn) &&
19110                                   (rd < kNumberOfT32LowRegisters) &&
19111                                   (rm < kNumberOfT32LowRegisters))) {
19112                                // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2
19113                                orrs(Condition::None(),
19114                                     Wide,
19115                                     Register(rd),
19116                                     Register(rn),
19117                                     Register(rm));
19118                                if (((instr & 0xfff08000) != 0xea500000)) {
19119                                  UnpredictableT32(instr);
19120                                }
19121                              } else if ((instr & 0x00100000) == 0x00100000) {
19122                                // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19123                                orrs(CurrentCond(),
19124                                     Best,
19125                                     Register(rd),
19126                                     Register(rn),
19127                                     Operand(Register(rm),
19128                                             shift_operand.GetType(),
19129                                             shift_operand.GetAmount()));
19130                                if (((instr & 0xfff08000) != 0xea500000)) {
19131                                  UnpredictableT32(instr);
19132                                }
19133                              } else {
19134                                UnallocatedT32(instr);
19135                              }
19136                              break;
19137                            }
19138                          }
19139                          break;
19140                        }
19141                      }
19142                      break;
19143                    }
19144                    case 0x00600000: {
19145                      // 0xea700000
19146                      switch (instr & 0x000f0000) {
19147                        case 0x000f0000: {
19148                          // 0xea7f0000
19149                          switch (instr & 0x000070f0) {
19150                            case 0x00000030: {
19151                              // 0xea7f0030
19152                              unsigned rd = (instr >> 8) & 0xf;
19153                              unsigned rm = instr & 0xf;
19154                              // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
19155                              mvns(CurrentCond(),
19156                                   Best,
19157                                   Register(rd),
19158                                   Operand(Register(rm), RRX));
19159                              if (((instr & 0xfffff0f0) != 0xea7f0030)) {
19160                                UnpredictableT32(instr);
19161                              }
19162                              break;
19163                            }
19164                            default: {
19165                              if (((instr & 0x70f0) == 0x30)) {
19166                                UnallocatedT32(instr);
19167                                return;
19168                              }
19169                              unsigned rd = (instr >> 8) & 0xf;
19170                              unsigned rm = instr & 0xf;
19171                              ImmediateShiftOperand
19172                                  shift_operand((instr >> 4) & 0x3,
19173                                                ((instr >> 6) & 0x3) |
19174                                                    ((instr >> 10) & 0x1c));
19175                              if (OutsideITBlock() &&
19176                                  (instr & 0x00100000) == 0x00100000 &&
19177                                  shift_operand.GetShift().IsLSL() &&
19178                                  (shift_operand.GetAmount() == 0) &&
19179                                  ((rd < kNumberOfT32LowRegisters) &&
19180                                   (rm < kNumberOfT32LowRegisters))) {
19181                                // MVNS.W <Rd>, <Rm> ; T2
19182                                mvns(Condition::None(),
19183                                     Wide,
19184                                     Register(rd),
19185                                     Register(rm));
19186                                if (((instr & 0xffff8000) != 0xea7f0000)) {
19187                                  UnpredictableT32(instr);
19188                                }
19189                              } else if ((instr & 0x00100000) == 0x00100000) {
19190                                // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19191                                mvns(CurrentCond(),
19192                                     Best,
19193                                     Register(rd),
19194                                     Operand(Register(rm),
19195                                             shift_operand.GetType(),
19196                                             shift_operand.GetAmount()));
19197                                if (((instr & 0xffff8000) != 0xea7f0000)) {
19198                                  UnpredictableT32(instr);
19199                                }
19200                              } else {
19201                                UnallocatedT32(instr);
19202                              }
19203                              break;
19204                            }
19205                          }
19206                          break;
19207                        }
19208                        default: {
19209                          switch (instr & 0x000070f0) {
19210                            case 0x00000030: {
19211                              // 0xea700030
19212                              if (((instr & 0xf0000) == 0xf0000)) {
19213                                UnallocatedT32(instr);
19214                                return;
19215                              }
19216                              unsigned rd = (instr >> 8) & 0xf;
19217                              unsigned rn = (instr >> 16) & 0xf;
19218                              unsigned rm = instr & 0xf;
19219                              // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
19220                              orns(CurrentCond(),
19221                                   Register(rd),
19222                                   Register(rn),
19223                                   Operand(Register(rm), RRX));
19224                              if (((instr & 0xfff0f0f0) != 0xea700030)) {
19225                                UnpredictableT32(instr);
19226                              }
19227                              break;
19228                            }
19229                            default: {
19230                              if (((instr & 0xf0000) == 0xf0000) ||
19231                                  ((instr & 0x70f0) == 0x30)) {
19232                                UnallocatedT32(instr);
19233                                return;
19234                              }
19235                              unsigned rd = (instr >> 8) & 0xf;
19236                              unsigned rn = (instr >> 16) & 0xf;
19237                              unsigned rm = instr & 0xf;
19238                              ImmediateShiftOperand
19239                                  shift_operand((instr >> 4) & 0x3,
19240                                                ((instr >> 6) & 0x3) |
19241                                                    ((instr >> 10) & 0x1c));
19242                              // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
19243                              orns(CurrentCond(),
19244                                   Register(rd),
19245                                   Register(rn),
19246                                   Operand(Register(rm),
19247                                           shift_operand.GetType(),
19248                                           shift_operand.GetAmount()));
19249                              if (((instr & 0xfff08000) != 0xea700000)) {
19250                                UnpredictableT32(instr);
19251                              }
19252                              break;
19253                            }
19254                          }
19255                          break;
19256                        }
19257                      }
19258                      break;
19259                    }
19260                  }
19261                  break;
19262                }
19263                case 0x00800000: {
19264                  // 0xea800000
19265                  switch (instr & 0x00600000) {
19266                    case 0x00000000: {
19267                      // 0xea800000
19268                      switch (instr & 0x000070f0) {
19269                        case 0x00000030: {
19270                          // 0xea800030
19271                          unsigned rd = (instr >> 8) & 0xf;
19272                          unsigned rn = (instr >> 16) & 0xf;
19273                          unsigned rm = instr & 0xf;
19274                          // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19275                          eor(CurrentCond(),
19276                              Best,
19277                              Register(rd),
19278                              Register(rn),
19279                              Operand(Register(rm), RRX));
19280                          if (((instr & 0xfff0f0f0) != 0xea800030)) {
19281                            UnpredictableT32(instr);
19282                          }
19283                          break;
19284                        }
19285                        default: {
19286                          if (((instr & 0x70f0) == 0x30)) {
19287                            UnallocatedT32(instr);
19288                            return;
19289                          }
19290                          unsigned rd = (instr >> 8) & 0xf;
19291                          unsigned rn = (instr >> 16) & 0xf;
19292                          unsigned rm = instr & 0xf;
19293                          ImmediateShiftOperand
19294                              shift_operand((instr >> 4) & 0x3,
19295                                            ((instr >> 6) & 0x3) |
19296                                                ((instr >> 10) & 0x1c));
19297                          if (InITBlock() &&
19298                              (instr & 0x00100000) == 0x00000000 &&
19299                              shift_operand.GetShift().IsLSL() &&
19300                              (shift_operand.GetAmount() == 0) &&
19301                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19302                               (rm < kNumberOfT32LowRegisters))) {
19303                            // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19304                            eor(CurrentCond(),
19305                                Wide,
19306                                Register(rd),
19307                                Register(rn),
19308                                Register(rm));
19309                            if (((instr & 0xfff08000) != 0xea800000)) {
19310                              UnpredictableT32(instr);
19311                            }
19312                          } else if ((instr & 0x00100000) == 0x00000000) {
19313                            // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19314                            eor(CurrentCond(),
19315                                Best,
19316                                Register(rd),
19317                                Register(rn),
19318                                Operand(Register(rm),
19319                                        shift_operand.GetType(),
19320                                        shift_operand.GetAmount()));
19321                            if (((instr & 0xfff08000) != 0xea800000)) {
19322                              UnpredictableT32(instr);
19323                            }
19324                          } else {
19325                            UnallocatedT32(instr);
19326                          }
19327                          break;
19328                        }
19329                      }
19330                      break;
19331                    }
19332                    case 0x00400000: {
19333                      // 0xeac00000
19334                      switch (instr & 0x00000030) {
19335                        case 0x00000000: {
19336                          // 0xeac00000
19337                          unsigned rd = (instr >> 8) & 0xf;
19338                          unsigned rn = (instr >> 16) & 0xf;
19339                          unsigned rm = instr & 0xf;
19340                          uint32_t amount =
19341                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
19342                          // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length)
19343                          pkhbt(CurrentCond(),
19344                                Register(rd),
19345                                Register(rn),
19346                                Operand(Register(rm), LSL, amount));
19347                          if (((instr & 0xfff08030) != 0xeac00000)) {
19348                            UnpredictableT32(instr);
19349                          }
19350                          break;
19351                        }
19352                        case 0x00000020: {
19353                          // 0xeac00020
19354                          unsigned rd = (instr >> 8) & 0xf;
19355                          unsigned rn = (instr >> 16) & 0xf;
19356                          unsigned rm = instr & 0xf;
19357                          uint32_t amount =
19358                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
19359                          if (amount == 0) amount = 32;
19360                          // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length)
19361                          pkhtb(CurrentCond(),
19362                                Register(rd),
19363                                Register(rn),
19364                                Operand(Register(rm), ASR, amount));
19365                          if (((instr & 0xfff08030) != 0xeac00020)) {
19366                            UnpredictableT32(instr);
19367                          }
19368                          break;
19369                        }
19370                        default:
19371                          UnallocatedT32(instr);
19372                          break;
19373                      }
19374                      break;
19375                    }
19376                    default:
19377                      UnallocatedT32(instr);
19378                      break;
19379                  }
19380                  break;
19381                }
19382                case 0x00900000: {
19383                  // 0xea900000
19384                  switch (instr & 0x00600000) {
19385                    case 0x00000000: {
19386                      // 0xea900000
19387                      switch (instr & 0x00000f00) {
19388                        case 0x00000f00: {
19389                          // 0xea900f00
19390                          switch (instr & 0x000070f0) {
19391                            case 0x00000030: {
19392                              // 0xea900f30
19393                              unsigned rn = (instr >> 16) & 0xf;
19394                              unsigned rm = instr & 0xf;
19395                              // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1
19396                              teq(CurrentCond(),
19397                                  Register(rn),
19398                                  Operand(Register(rm), RRX));
19399                              if (((instr & 0xfff0fff0) != 0xea900f30)) {
19400                                UnpredictableT32(instr);
19401                              }
19402                              break;
19403                            }
19404                            default: {
19405                              if (((instr & 0x70f0) == 0x30)) {
19406                                UnallocatedT32(instr);
19407                                return;
19408                              }
19409                              unsigned rn = (instr >> 16) & 0xf;
19410                              unsigned rm = instr & 0xf;
19411                              ImmediateShiftOperand
19412                                  shift_operand((instr >> 4) & 0x3,
19413                                                ((instr >> 6) & 0x3) |
19414                                                    ((instr >> 10) & 0x1c));
19415                              // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
19416                              teq(CurrentCond(),
19417                                  Register(rn),
19418                                  Operand(Register(rm),
19419                                          shift_operand.GetType(),
19420                                          shift_operand.GetAmount()));
19421                              if (((instr & 0xfff08f00) != 0xea900f00)) {
19422                                UnpredictableT32(instr);
19423                              }
19424                              break;
19425                            }
19426                          }
19427                          break;
19428                        }
19429                        default: {
19430                          switch (instr & 0x000070f0) {
19431                            case 0x00000030: {
19432                              // 0xea900030
19433                              if (((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                              // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19441                              eors(CurrentCond(),
19442                                   Best,
19443                                   Register(rd),
19444                                   Register(rn),
19445                                   Operand(Register(rm), RRX));
19446                              if (((instr & 0xfff0f0f0) != 0xea900030)) {
19447                                UnpredictableT32(instr);
19448                              }
19449                              break;
19450                            }
19451                            default: {
19452                              if (((instr & 0x70f0) == 0x30) ||
19453                                  ((instr & 0xf00) == 0xf00)) {
19454                                UnallocatedT32(instr);
19455                                return;
19456                              }
19457                              unsigned rd = (instr >> 8) & 0xf;
19458                              unsigned rn = (instr >> 16) & 0xf;
19459                              unsigned rm = instr & 0xf;
19460                              ImmediateShiftOperand
19461                                  shift_operand((instr >> 4) & 0x3,
19462                                                ((instr >> 6) & 0x3) |
19463                                                    ((instr >> 10) & 0x1c));
19464                              if (OutsideITBlock() &&
19465                                  (instr & 0x00100000) == 0x00100000 &&
19466                                  shift_operand.GetShift().IsLSL() &&
19467                                  (shift_operand.GetAmount() == 0) &&
19468                                  ((rd == rn) &&
19469                                   (rd < kNumberOfT32LowRegisters) &&
19470                                   (rm < kNumberOfT32LowRegisters))) {
19471                                // EORS.W {<Rd>}, <Rn>, <Rm> ; T2
19472                                eors(Condition::None(),
19473                                     Wide,
19474                                     Register(rd),
19475                                     Register(rn),
19476                                     Register(rm));
19477                                if (((instr & 0xfff08000) != 0xea900000)) {
19478                                  UnpredictableT32(instr);
19479                                }
19480                              } else if ((instr & 0x00100000) == 0x00100000) {
19481                                // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19482                                eors(CurrentCond(),
19483                                     Best,
19484                                     Register(rd),
19485                                     Register(rn),
19486                                     Operand(Register(rm),
19487                                             shift_operand.GetType(),
19488                                             shift_operand.GetAmount()));
19489                                if (((instr & 0xfff08000) != 0xea900000)) {
19490                                  UnpredictableT32(instr);
19491                                }
19492                              } else {
19493                                UnallocatedT32(instr);
19494                              }
19495                              break;
19496                            }
19497                          }
19498                          break;
19499                        }
19500                      }
19501                      break;
19502                    }
19503                    default:
19504                      UnallocatedT32(instr);
19505                      break;
19506                  }
19507                  break;
19508                }
19509                case 0x01000000: {
19510                  // 0xeb000000
19511                  switch (instr & 0x00600000) {
19512                    case 0x00000000: {
19513                      // 0xeb000000
19514                      switch (instr & 0x000f0000) {
19515                        case 0x000d0000: {
19516                          // 0xeb0d0000
19517                          switch (instr & 0x000070f0) {
19518                            case 0x00000030: {
19519                              // 0xeb0d0030
19520                              unsigned rd = (instr >> 8) & 0xf;
19521                              unsigned rm = instr & 0xf;
19522                              // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
19523                              add(CurrentCond(),
19524                                  Best,
19525                                  Register(rd),
19526                                  sp,
19527                                  Operand(Register(rm), RRX));
19528                              if (((instr & 0xfffff0f0) != 0xeb0d0030)) {
19529                                UnpredictableT32(instr);
19530                              }
19531                              break;
19532                            }
19533                            default: {
19534                              if (((instr & 0x70f0) == 0x30)) {
19535                                UnallocatedT32(instr);
19536                                return;
19537                              }
19538                              unsigned rd = (instr >> 8) & 0xf;
19539                              unsigned rm = instr & 0xf;
19540                              ImmediateShiftOperand
19541                                  shift_operand((instr >> 4) & 0x3,
19542                                                ((instr >> 6) & 0x3) |
19543                                                    ((instr >> 10) & 0x1c));
19544                              if ((instr & 0x00100000) == 0x00000000 &&
19545                                  shift_operand.GetShift().IsLSL() &&
19546                                  (shift_operand.GetAmount() == 0) &&
19547                                  (((rd == rm)) || ((rd == sp.GetCode())))) {
19548                                // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3
19549                                add(CurrentCond(),
19550                                    Wide,
19551                                    Register(rd),
19552                                    sp,
19553                                    Register(rm));
19554                                if (((instr & 0xffff8000) != 0xeb0d0000)) {
19555                                  UnpredictableT32(instr);
19556                                }
19557                              } else if ((instr & 0x00100000) == 0x00000000) {
19558                                // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19559                                add(CurrentCond(),
19560                                    Best,
19561                                    Register(rd),
19562                                    sp,
19563                                    Operand(Register(rm),
19564                                            shift_operand.GetType(),
19565                                            shift_operand.GetAmount()));
19566                                if (((instr & 0xffff8000) != 0xeb0d0000)) {
19567                                  UnpredictableT32(instr);
19568                                }
19569                              } else {
19570                                UnallocatedT32(instr);
19571                              }
19572                              break;
19573                            }
19574                          }
19575                          break;
19576                        }
19577                        default: {
19578                          switch (instr & 0x000070f0) {
19579                            case 0x00000030: {
19580                              // 0xeb000030
19581                              if (((instr & 0xf0000) == 0xd0000)) {
19582                                UnallocatedT32(instr);
19583                                return;
19584                              }
19585                              unsigned rd = (instr >> 8) & 0xf;
19586                              unsigned rn = (instr >> 16) & 0xf;
19587                              unsigned rm = instr & 0xf;
19588                              // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
19589                              add(CurrentCond(),
19590                                  Best,
19591                                  Register(rd),
19592                                  Register(rn),
19593                                  Operand(Register(rm), RRX));
19594                              if (((instr & 0xfff0f0f0) != 0xeb000030)) {
19595                                UnpredictableT32(instr);
19596                              }
19597                              break;
19598                            }
19599                            default: {
19600                              if (((instr & 0xf0000) == 0xd0000) ||
19601                                  ((instr & 0x70f0) == 0x30)) {
19602                                UnallocatedT32(instr);
19603                                return;
19604                              }
19605                              unsigned rd = (instr >> 8) & 0xf;
19606                              unsigned rn = (instr >> 16) & 0xf;
19607                              unsigned rm = instr & 0xf;
19608                              ImmediateShiftOperand
19609                                  shift_operand((instr >> 4) & 0x3,
19610                                                ((instr >> 6) & 0x3) |
19611                                                    ((instr >> 10) & 0x1c));
19612                              if (InITBlock() &&
19613                                  (instr & 0x00100000) == 0x00000000 &&
19614                                  shift_operand.GetShift().IsLSL() &&
19615                                  (shift_operand.GetAmount() == 0) &&
19616                                  ((rd < kNumberOfT32LowRegisters) &&
19617                                   (rn < kNumberOfT32LowRegisters) &&
19618                                   (rm < kNumberOfT32LowRegisters))) {
19619                                // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
19620                                add(CurrentCond(),
19621                                    Wide,
19622                                    Register(rd),
19623                                    Register(rn),
19624                                    Register(rm));
19625                                if (((instr & 0xfff08000) != 0xeb000000)) {
19626                                  UnpredictableT32(instr);
19627                                }
19628                              } else if ((instr & 0x00100000) == 0x00000000 &&
19629                                         shift_operand.GetShift().IsLSL() &&
19630                                         (shift_operand.GetAmount() == 0) &&
19631                                         ((rd == rn))) {
19632                                // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
19633                                add(CurrentCond(),
19634                                    Wide,
19635                                    Register(rd),
19636                                    Register(rn),
19637                                    Register(rm));
19638                                if (((instr & 0xfff08000) != 0xeb000000)) {
19639                                  UnpredictableT32(instr);
19640                                }
19641                              } else if ((instr & 0x00100000) == 0x00000000) {
19642                                // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19643                                add(CurrentCond(),
19644                                    Best,
19645                                    Register(rd),
19646                                    Register(rn),
19647                                    Operand(Register(rm),
19648                                            shift_operand.GetType(),
19649                                            shift_operand.GetAmount()));
19650                                if (((instr & 0xfff08000) != 0xeb000000)) {
19651                                  UnpredictableT32(instr);
19652                                }
19653                              } else {
19654                                UnallocatedT32(instr);
19655                              }
19656                              break;
19657                            }
19658                          }
19659                          break;
19660                        }
19661                      }
19662                      break;
19663                    }
19664                    case 0x00400000: {
19665                      // 0xeb400000
19666                      switch (instr & 0x000070f0) {
19667                        case 0x00000030: {
19668                          // 0xeb400030
19669                          unsigned rd = (instr >> 8) & 0xf;
19670                          unsigned rn = (instr >> 16) & 0xf;
19671                          unsigned rm = instr & 0xf;
19672                          // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19673                          adc(CurrentCond(),
19674                              Best,
19675                              Register(rd),
19676                              Register(rn),
19677                              Operand(Register(rm), RRX));
19678                          if (((instr & 0xfff0f0f0) != 0xeb400030)) {
19679                            UnpredictableT32(instr);
19680                          }
19681                          break;
19682                        }
19683                        default: {
19684                          if (((instr & 0x70f0) == 0x30)) {
19685                            UnallocatedT32(instr);
19686                            return;
19687                          }
19688                          unsigned rd = (instr >> 8) & 0xf;
19689                          unsigned rn = (instr >> 16) & 0xf;
19690                          unsigned rm = instr & 0xf;
19691                          ImmediateShiftOperand
19692                              shift_operand((instr >> 4) & 0x3,
19693                                            ((instr >> 6) & 0x3) |
19694                                                ((instr >> 10) & 0x1c));
19695                          if (InITBlock() &&
19696                              (instr & 0x00100000) == 0x00000000 &&
19697                              shift_operand.GetShift().IsLSL() &&
19698                              (shift_operand.GetAmount() == 0) &&
19699                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19700                               (rm < kNumberOfT32LowRegisters))) {
19701                            // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19702                            adc(CurrentCond(),
19703                                Wide,
19704                                Register(rd),
19705                                Register(rn),
19706                                Register(rm));
19707                            if (((instr & 0xfff08000) != 0xeb400000)) {
19708                              UnpredictableT32(instr);
19709                            }
19710                          } else if ((instr & 0x00100000) == 0x00000000) {
19711                            // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19712                            adc(CurrentCond(),
19713                                Best,
19714                                Register(rd),
19715                                Register(rn),
19716                                Operand(Register(rm),
19717                                        shift_operand.GetType(),
19718                                        shift_operand.GetAmount()));
19719                            if (((instr & 0xfff08000) != 0xeb400000)) {
19720                              UnpredictableT32(instr);
19721                            }
19722                          } else {
19723                            UnallocatedT32(instr);
19724                          }
19725                          break;
19726                        }
19727                      }
19728                      break;
19729                    }
19730                    case 0x00600000: {
19731                      // 0xeb600000
19732                      switch (instr & 0x000070f0) {
19733                        case 0x00000030: {
19734                          // 0xeb600030
19735                          unsigned rd = (instr >> 8) & 0xf;
19736                          unsigned rn = (instr >> 16) & 0xf;
19737                          unsigned rm = instr & 0xf;
19738                          // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19739                          sbc(CurrentCond(),
19740                              Best,
19741                              Register(rd),
19742                              Register(rn),
19743                              Operand(Register(rm), RRX));
19744                          if (((instr & 0xfff0f0f0) != 0xeb600030)) {
19745                            UnpredictableT32(instr);
19746                          }
19747                          break;
19748                        }
19749                        default: {
19750                          if (((instr & 0x70f0) == 0x30)) {
19751                            UnallocatedT32(instr);
19752                            return;
19753                          }
19754                          unsigned rd = (instr >> 8) & 0xf;
19755                          unsigned rn = (instr >> 16) & 0xf;
19756                          unsigned rm = instr & 0xf;
19757                          ImmediateShiftOperand
19758                              shift_operand((instr >> 4) & 0x3,
19759                                            ((instr >> 6) & 0x3) |
19760                                                ((instr >> 10) & 0x1c));
19761                          if (InITBlock() &&
19762                              (instr & 0x00100000) == 0x00000000 &&
19763                              shift_operand.GetShift().IsLSL() &&
19764                              (shift_operand.GetAmount() == 0) &&
19765                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19766                               (rm < kNumberOfT32LowRegisters))) {
19767                            // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19768                            sbc(CurrentCond(),
19769                                Wide,
19770                                Register(rd),
19771                                Register(rn),
19772                                Register(rm));
19773                            if (((instr & 0xfff08000) != 0xeb600000)) {
19774                              UnpredictableT32(instr);
19775                            }
19776                          } else if ((instr & 0x00100000) == 0x00000000) {
19777                            // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19778                            sbc(CurrentCond(),
19779                                Best,
19780                                Register(rd),
19781                                Register(rn),
19782                                Operand(Register(rm),
19783                                        shift_operand.GetType(),
19784                                        shift_operand.GetAmount()));
19785                            if (((instr & 0xfff08000) != 0xeb600000)) {
19786                              UnpredictableT32(instr);
19787                            }
19788                          } else {
19789                            UnallocatedT32(instr);
19790                          }
19791                          break;
19792                        }
19793                      }
19794                      break;
19795                    }
19796                    default:
19797                      UnallocatedT32(instr);
19798                      break;
19799                  }
19800                  break;
19801                }
19802                case 0x01100000: {
19803                  // 0xeb100000
19804                  switch (instr & 0x00600000) {
19805                    case 0x00000000: {
19806                      // 0xeb100000
19807                      switch (instr & 0x00000f00) {
19808                        case 0x00000f00: {
19809                          // 0xeb100f00
19810                          switch (instr & 0x000070f0) {
19811                            case 0x00000030: {
19812                              // 0xeb100f30
19813                              unsigned rn = (instr >> 16) & 0xf;
19814                              unsigned rm = instr & 0xf;
19815                              // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
19816                              cmn(CurrentCond(),
19817                                  Best,
19818                                  Register(rn),
19819                                  Operand(Register(rm), RRX));
19820                              if (((instr & 0xfff0fff0) != 0xeb100f30)) {
19821                                UnpredictableT32(instr);
19822                              }
19823                              break;
19824                            }
19825                            default: {
19826                              if (((instr & 0x70f0) == 0x30)) {
19827                                UnallocatedT32(instr);
19828                                return;
19829                              }
19830                              unsigned rn = (instr >> 16) & 0xf;
19831                              unsigned rm = instr & 0xf;
19832                              ImmediateShiftOperand
19833                                  shift_operand((instr >> 4) & 0x3,
19834                                                ((instr >> 6) & 0x3) |
19835                                                    ((instr >> 10) & 0x1c));
19836                              if (shift_operand.GetShift().IsLSL() &&
19837                                  (shift_operand.GetAmount() == 0) &&
19838                                  ((rn < kNumberOfT32LowRegisters) &&
19839                                   (rm < kNumberOfT32LowRegisters))) {
19840                                // CMN{<c>}.W <Rn>, <Rm> ; T2
19841                                cmn(CurrentCond(),
19842                                    Wide,
19843                                    Register(rn),
19844                                    Register(rm));
19845                                if (((instr & 0xfff08f00) != 0xeb100f00)) {
19846                                  UnpredictableT32(instr);
19847                                }
19848                              } else {
19849                                // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19850                                cmn(CurrentCond(),
19851                                    Best,
19852                                    Register(rn),
19853                                    Operand(Register(rm),
19854                                            shift_operand.GetType(),
19855                                            shift_operand.GetAmount()));
19856                                if (((instr & 0xfff08f00) != 0xeb100f00)) {
19857                                  UnpredictableT32(instr);
19858                                }
19859                              }
19860                              break;
19861                            }
19862                          }
19863                          break;
19864                        }
19865                        default: {
19866                          switch (instr & 0x000f0000) {
19867                            case 0x000d0000: {
19868                              // 0xeb1d0000
19869                              switch (instr & 0x000070f0) {
19870                                case 0x00000030: {
19871                                  // 0xeb1d0030
19872                                  if (((instr & 0xf00) == 0xf00)) {
19873                                    UnallocatedT32(instr);
19874                                    return;
19875                                  }
19876                                  unsigned rd = (instr >> 8) & 0xf;
19877                                  unsigned rm = instr & 0xf;
19878                                  // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
19879                                  adds(CurrentCond(),
19880                                       Best,
19881                                       Register(rd),
19882                                       sp,
19883                                       Operand(Register(rm), RRX));
19884                                  if (((instr & 0xfffff0f0) != 0xeb1d0030)) {
19885                                    UnpredictableT32(instr);
19886                                  }
19887                                  break;
19888                                }
19889                                default: {
19890                                  if (((instr & 0x70f0) == 0x30) ||
19891                                      ((instr & 0xf00) == 0xf00)) {
19892                                    UnallocatedT32(instr);
19893                                    return;
19894                                  }
19895                                  unsigned rd = (instr >> 8) & 0xf;
19896                                  unsigned rm = instr & 0xf;
19897                                  ImmediateShiftOperand
19898                                      shift_operand((instr >> 4) & 0x3,
19899                                                    ((instr >> 6) & 0x3) |
19900                                                        ((instr >> 10) & 0x1c));
19901                                  // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19902                                  adds(CurrentCond(),
19903                                       Best,
19904                                       Register(rd),
19905                                       sp,
19906                                       Operand(Register(rm),
19907                                               shift_operand.GetType(),
19908                                               shift_operand.GetAmount()));
19909                                  if (((instr & 0xffff8000) != 0xeb1d0000)) {
19910                                    UnpredictableT32(instr);
19911                                  }
19912                                  break;
19913                                }
19914                              }
19915                              break;
19916                            }
19917                            default: {
19918                              switch (instr & 0x000070f0) {
19919                                case 0x00000030: {
19920                                  // 0xeb100030
19921                                  if (((instr & 0xf0000) == 0xd0000) ||
19922                                      ((instr & 0xf00) == 0xf00)) {
19923                                    UnallocatedT32(instr);
19924                                    return;
19925                                  }
19926                                  unsigned rd = (instr >> 8) & 0xf;
19927                                  unsigned rn = (instr >> 16) & 0xf;
19928                                  unsigned rm = instr & 0xf;
19929                                  // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
19930                                  adds(CurrentCond(),
19931                                       Best,
19932                                       Register(rd),
19933                                       Register(rn),
19934                                       Operand(Register(rm), RRX));
19935                                  if (((instr & 0xfff0f0f0) != 0xeb100030)) {
19936                                    UnpredictableT32(instr);
19937                                  }
19938                                  break;
19939                                }
19940                                default: {
19941                                  if (((instr & 0xf0000) == 0xd0000) ||
19942                                      ((instr & 0x70f0) == 0x30) ||
19943                                      ((instr & 0xf00) == 0xf00)) {
19944                                    UnallocatedT32(instr);
19945                                    return;
19946                                  }
19947                                  unsigned rd = (instr >> 8) & 0xf;
19948                                  unsigned rn = (instr >> 16) & 0xf;
19949                                  unsigned rm = instr & 0xf;
19950                                  ImmediateShiftOperand
19951                                      shift_operand((instr >> 4) & 0x3,
19952                                                    ((instr >> 6) & 0x3) |
19953                                                        ((instr >> 10) & 0x1c));
19954                                  if (OutsideITBlock() &&
19955                                      (instr & 0x00100000) == 0x00100000 &&
19956                                      shift_operand.GetShift().IsLSL() &&
19957                                      (shift_operand.GetAmount() == 0) &&
19958                                      ((rd < kNumberOfT32LowRegisters) &&
19959                                       (rn < kNumberOfT32LowRegisters) &&
19960                                       (rm < kNumberOfT32LowRegisters))) {
19961                                    // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3
19962                                    adds(Condition::None(),
19963                                         Wide,
19964                                         Register(rd),
19965                                         Register(rn),
19966                                         Register(rm));
19967                                    if (((instr & 0xfff08000) != 0xeb100000)) {
19968                                      UnpredictableT32(instr);
19969                                    }
19970                                  } else if ((instr & 0x00100000) ==
19971                                             0x00100000) {
19972                                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19973                                    adds(CurrentCond(),
19974                                         Best,
19975                                         Register(rd),
19976                                         Register(rn),
19977                                         Operand(Register(rm),
19978                                                 shift_operand.GetType(),
19979                                                 shift_operand.GetAmount()));
19980                                    if (((instr & 0xfff08000) != 0xeb100000)) {
19981                                      UnpredictableT32(instr);
19982                                    }
19983                                  } else {
19984                                    UnallocatedT32(instr);
19985                                  }
19986                                  break;
19987                                }
19988                              }
19989                              break;
19990                            }
19991                          }
19992                          break;
19993                        }
19994                      }
19995                      break;
19996                    }
19997                    case 0x00400000: {
19998                      // 0xeb500000
19999                      switch (instr & 0x000070f0) {
20000                        case 0x00000030: {
20001                          // 0xeb500030
20002                          unsigned rd = (instr >> 8) & 0xf;
20003                          unsigned rn = (instr >> 16) & 0xf;
20004                          unsigned rm = instr & 0xf;
20005                          // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20006                          adcs(CurrentCond(),
20007                               Best,
20008                               Register(rd),
20009                               Register(rn),
20010                               Operand(Register(rm), RRX));
20011                          if (((instr & 0xfff0f0f0) != 0xeb500030)) {
20012                            UnpredictableT32(instr);
20013                          }
20014                          break;
20015                        }
20016                        default: {
20017                          if (((instr & 0x70f0) == 0x30)) {
20018                            UnallocatedT32(instr);
20019                            return;
20020                          }
20021                          unsigned rd = (instr >> 8) & 0xf;
20022                          unsigned rn = (instr >> 16) & 0xf;
20023                          unsigned rm = instr & 0xf;
20024                          ImmediateShiftOperand
20025                              shift_operand((instr >> 4) & 0x3,
20026                                            ((instr >> 6) & 0x3) |
20027                                                ((instr >> 10) & 0x1c));
20028                          if (OutsideITBlock() &&
20029                              (instr & 0x00100000) == 0x00100000 &&
20030                              shift_operand.GetShift().IsLSL() &&
20031                              (shift_operand.GetAmount() == 0) &&
20032                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
20033                               (rm < kNumberOfT32LowRegisters))) {
20034                            // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2
20035                            adcs(Condition::None(),
20036                                 Wide,
20037                                 Register(rd),
20038                                 Register(rn),
20039                                 Register(rm));
20040                            if (((instr & 0xfff08000) != 0xeb500000)) {
20041                              UnpredictableT32(instr);
20042                            }
20043                          } else if ((instr & 0x00100000) == 0x00100000) {
20044                            // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20045                            adcs(CurrentCond(),
20046                                 Best,
20047                                 Register(rd),
20048                                 Register(rn),
20049                                 Operand(Register(rm),
20050                                         shift_operand.GetType(),
20051                                         shift_operand.GetAmount()));
20052                            if (((instr & 0xfff08000) != 0xeb500000)) {
20053                              UnpredictableT32(instr);
20054                            }
20055                          } else {
20056                            UnallocatedT32(instr);
20057                          }
20058                          break;
20059                        }
20060                      }
20061                      break;
20062                    }
20063                    case 0x00600000: {
20064                      // 0xeb700000
20065                      switch (instr & 0x000070f0) {
20066                        case 0x00000030: {
20067                          // 0xeb700030
20068                          unsigned rd = (instr >> 8) & 0xf;
20069                          unsigned rn = (instr >> 16) & 0xf;
20070                          unsigned rm = instr & 0xf;
20071                          // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20072                          sbcs(CurrentCond(),
20073                               Best,
20074                               Register(rd),
20075                               Register(rn),
20076                               Operand(Register(rm), RRX));
20077                          if (((instr & 0xfff0f0f0) != 0xeb700030)) {
20078                            UnpredictableT32(instr);
20079                          }
20080                          break;
20081                        }
20082                        default: {
20083                          if (((instr & 0x70f0) == 0x30)) {
20084                            UnallocatedT32(instr);
20085                            return;
20086                          }
20087                          unsigned rd = (instr >> 8) & 0xf;
20088                          unsigned rn = (instr >> 16) & 0xf;
20089                          unsigned rm = instr & 0xf;
20090                          ImmediateShiftOperand
20091                              shift_operand((instr >> 4) & 0x3,
20092                                            ((instr >> 6) & 0x3) |
20093                                                ((instr >> 10) & 0x1c));
20094                          if (OutsideITBlock() &&
20095                              (instr & 0x00100000) == 0x00100000 &&
20096                              shift_operand.GetShift().IsLSL() &&
20097                              (shift_operand.GetAmount() == 0) &&
20098                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
20099                               (rm < kNumberOfT32LowRegisters))) {
20100                            // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2
20101                            sbcs(Condition::None(),
20102                                 Wide,
20103                                 Register(rd),
20104                                 Register(rn),
20105                                 Register(rm));
20106                            if (((instr & 0xfff08000) != 0xeb700000)) {
20107                              UnpredictableT32(instr);
20108                            }
20109                          } else if ((instr & 0x00100000) == 0x00100000) {
20110                            // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20111                            sbcs(CurrentCond(),
20112                                 Best,
20113                                 Register(rd),
20114                                 Register(rn),
20115                                 Operand(Register(rm),
20116                                         shift_operand.GetType(),
20117                                         shift_operand.GetAmount()));
20118                            if (((instr & 0xfff08000) != 0xeb700000)) {
20119                              UnpredictableT32(instr);
20120                            }
20121                          } else {
20122                            UnallocatedT32(instr);
20123                          }
20124                          break;
20125                        }
20126                      }
20127                      break;
20128                    }
20129                    default:
20130                      UnallocatedT32(instr);
20131                      break;
20132                  }
20133                  break;
20134                }
20135                case 0x01800000: {
20136                  // 0xeb800000
20137                  switch (instr & 0x00600000) {
20138                    case 0x00200000: {
20139                      // 0xeba00000
20140                      switch (instr & 0x000f0000) {
20141                        case 0x000d0000: {
20142                          // 0xebad0000
20143                          switch (instr & 0x000070f0) {
20144                            case 0x00000030: {
20145                              // 0xebad0030
20146                              unsigned rd = (instr >> 8) & 0xf;
20147                              unsigned rm = instr & 0xf;
20148                              // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
20149                              sub(CurrentCond(),
20150                                  Best,
20151                                  Register(rd),
20152                                  sp,
20153                                  Operand(Register(rm), RRX));
20154                              if (((instr & 0xfffff0f0) != 0xebad0030)) {
20155                                UnpredictableT32(instr);
20156                              }
20157                              break;
20158                            }
20159                            default: {
20160                              if (((instr & 0x70f0) == 0x30)) {
20161                                UnallocatedT32(instr);
20162                                return;
20163                              }
20164                              unsigned rd = (instr >> 8) & 0xf;
20165                              unsigned rm = instr & 0xf;
20166                              ImmediateShiftOperand
20167                                  shift_operand((instr >> 4) & 0x3,
20168                                                ((instr >> 6) & 0x3) |
20169                                                    ((instr >> 10) & 0x1c));
20170                              if ((instr & 0x00100000) == 0x00000000 &&
20171                                  shift_operand.GetShift().IsLSL() &&
20172                                  (shift_operand.GetAmount() == 0)) {
20173                                // SUB{<c>} {<Rd>}, SP, <Rm> ; T1
20174                                sub(CurrentCond(),
20175                                    Best,
20176                                    Register(rd),
20177                                    sp,
20178                                    Register(rm));
20179                                if (((instr & 0xffff8000) != 0xebad0000)) {
20180                                  UnpredictableT32(instr);
20181                                }
20182                              } else if ((instr & 0x00100000) == 0x00000000) {
20183                                // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20184                                sub(CurrentCond(),
20185                                    Best,
20186                                    Register(rd),
20187                                    sp,
20188                                    Operand(Register(rm),
20189                                            shift_operand.GetType(),
20190                                            shift_operand.GetAmount()));
20191                                if (((instr & 0xffff8000) != 0xebad0000)) {
20192                                  UnpredictableT32(instr);
20193                                }
20194                              } else {
20195                                UnallocatedT32(instr);
20196                              }
20197                              break;
20198                            }
20199                          }
20200                          break;
20201                        }
20202                        default: {
20203                          switch (instr & 0x000070f0) {
20204                            case 0x00000030: {
20205                              // 0xeba00030
20206                              if (((instr & 0xf0000) == 0xd0000)) {
20207                                UnallocatedT32(instr);
20208                                return;
20209                              }
20210                              unsigned rd = (instr >> 8) & 0xf;
20211                              unsigned rn = (instr >> 16) & 0xf;
20212                              unsigned rm = instr & 0xf;
20213                              // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20214                              sub(CurrentCond(),
20215                                  Best,
20216                                  Register(rd),
20217                                  Register(rn),
20218                                  Operand(Register(rm), RRX));
20219                              if (((instr & 0xfff0f0f0) != 0xeba00030)) {
20220                                UnpredictableT32(instr);
20221                              }
20222                              break;
20223                            }
20224                            default: {
20225                              if (((instr & 0xf0000) == 0xd0000) ||
20226                                  ((instr & 0x70f0) == 0x30)) {
20227                                UnallocatedT32(instr);
20228                                return;
20229                              }
20230                              unsigned rd = (instr >> 8) & 0xf;
20231                              unsigned rn = (instr >> 16) & 0xf;
20232                              unsigned rm = instr & 0xf;
20233                              ImmediateShiftOperand
20234                                  shift_operand((instr >> 4) & 0x3,
20235                                                ((instr >> 6) & 0x3) |
20236                                                    ((instr >> 10) & 0x1c));
20237                              if (InITBlock() &&
20238                                  (instr & 0x00100000) == 0x00000000 &&
20239                                  shift_operand.GetShift().IsLSL() &&
20240                                  (shift_operand.GetAmount() == 0) &&
20241                                  ((rd < kNumberOfT32LowRegisters) &&
20242                                   (rn < kNumberOfT32LowRegisters) &&
20243                                   (rm < kNumberOfT32LowRegisters))) {
20244                                // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2
20245                                sub(CurrentCond(),
20246                                    Wide,
20247                                    Register(rd),
20248                                    Register(rn),
20249                                    Register(rm));
20250                                if (((instr & 0xfff08000) != 0xeba00000)) {
20251                                  UnpredictableT32(instr);
20252                                }
20253                              } else if ((instr & 0x00100000) == 0x00000000) {
20254                                // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20255                                sub(CurrentCond(),
20256                                    Best,
20257                                    Register(rd),
20258                                    Register(rn),
20259                                    Operand(Register(rm),
20260                                            shift_operand.GetType(),
20261                                            shift_operand.GetAmount()));
20262                                if (((instr & 0xfff08000) != 0xeba00000)) {
20263                                  UnpredictableT32(instr);
20264                                }
20265                              } else {
20266                                UnallocatedT32(instr);
20267                              }
20268                              break;
20269                            }
20270                          }
20271                          break;
20272                        }
20273                      }
20274                      break;
20275                    }
20276                    case 0x00400000: {
20277                      // 0xebc00000
20278                      switch (instr & 0x000070f0) {
20279                        case 0x00000030: {
20280                          // 0xebc00030
20281                          unsigned rd = (instr >> 8) & 0xf;
20282                          unsigned rn = (instr >> 16) & 0xf;
20283                          unsigned rm = instr & 0xf;
20284                          // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
20285                          rsb(CurrentCond(),
20286                              Best,
20287                              Register(rd),
20288                              Register(rn),
20289                              Operand(Register(rm), RRX));
20290                          if (((instr & 0xfff0f0f0) != 0xebc00030)) {
20291                            UnpredictableT32(instr);
20292                          }
20293                          break;
20294                        }
20295                        default: {
20296                          if (((instr & 0x70f0) == 0x30)) {
20297                            UnallocatedT32(instr);
20298                            return;
20299                          }
20300                          unsigned rd = (instr >> 8) & 0xf;
20301                          unsigned rn = (instr >> 16) & 0xf;
20302                          unsigned rm = instr & 0xf;
20303                          ImmediateShiftOperand
20304                              shift_operand((instr >> 4) & 0x3,
20305                                            ((instr >> 6) & 0x3) |
20306                                                ((instr >> 10) & 0x1c));
20307                          // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20308                          rsb(CurrentCond(),
20309                              Best,
20310                              Register(rd),
20311                              Register(rn),
20312                              Operand(Register(rm),
20313                                      shift_operand.GetType(),
20314                                      shift_operand.GetAmount()));
20315                          if (((instr & 0xfff08000) != 0xebc00000)) {
20316                            UnpredictableT32(instr);
20317                          }
20318                          break;
20319                        }
20320                      }
20321                      break;
20322                    }
20323                    default:
20324                      UnallocatedT32(instr);
20325                      break;
20326                  }
20327                  break;
20328                }
20329                case 0x01900000: {
20330                  // 0xeb900000
20331                  switch (instr & 0x00600000) {
20332                    case 0x00200000: {
20333                      // 0xebb00000
20334                      switch (instr & 0x00000f00) {
20335                        case 0x00000f00: {
20336                          // 0xebb00f00
20337                          switch (instr & 0x000070f0) {
20338                            case 0x00000030: {
20339                              // 0xebb00f30
20340                              unsigned rn = (instr >> 16) & 0xf;
20341                              unsigned rm = instr & 0xf;
20342                              // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3
20343                              cmp(CurrentCond(),
20344                                  Best,
20345                                  Register(rn),
20346                                  Operand(Register(rm), RRX));
20347                              if (((instr & 0xfff0fff0) != 0xebb00f30)) {
20348                                UnpredictableT32(instr);
20349                              }
20350                              break;
20351                            }
20352                            default: {
20353                              if (((instr & 0x70f0) == 0x30)) {
20354                                UnallocatedT32(instr);
20355                                return;
20356                              }
20357                              unsigned rn = (instr >> 16) & 0xf;
20358                              unsigned rm = instr & 0xf;
20359                              ImmediateShiftOperand
20360                                  shift_operand((instr >> 4) & 0x3,
20361                                                ((instr >> 6) & 0x3) |
20362                                                    ((instr >> 10) & 0x1c));
20363                              if (shift_operand.GetShift().IsLSL() &&
20364                                  (shift_operand.GetAmount() == 0)) {
20365                                // CMP{<c>}.W <Rn>, <Rm> ; T3
20366                                cmp(CurrentCond(),
20367                                    Wide,
20368                                    Register(rn),
20369                                    Register(rm));
20370                                if (((instr & 0xfff08f00) != 0xebb00f00)) {
20371                                  UnpredictableT32(instr);
20372                                }
20373                              } else {
20374                                // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length)
20375                                cmp(CurrentCond(),
20376                                    Best,
20377                                    Register(rn),
20378                                    Operand(Register(rm),
20379                                            shift_operand.GetType(),
20380                                            shift_operand.GetAmount()));
20381                                if (((instr & 0xfff08f00) != 0xebb00f00)) {
20382                                  UnpredictableT32(instr);
20383                                }
20384                              }
20385                              break;
20386                            }
20387                          }
20388                          break;
20389                        }
20390                        default: {
20391                          switch (instr & 0x000f0000) {
20392                            case 0x000d0000: {
20393                              // 0xebbd0000
20394                              switch (instr & 0x000070f0) {
20395                                case 0x00000030: {
20396                                  // 0xebbd0030
20397                                  if (((instr & 0xf00) == 0xf00)) {
20398                                    UnallocatedT32(instr);
20399                                    return;
20400                                  }
20401                                  unsigned rd = (instr >> 8) & 0xf;
20402                                  unsigned rm = instr & 0xf;
20403                                  // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
20404                                  subs(CurrentCond(),
20405                                       Best,
20406                                       Register(rd),
20407                                       sp,
20408                                       Operand(Register(rm), RRX));
20409                                  if (((instr & 0xfffff0f0) != 0xebbd0030)) {
20410                                    UnpredictableT32(instr);
20411                                  }
20412                                  break;
20413                                }
20414                                default: {
20415                                  if (((instr & 0x70f0) == 0x30) ||
20416                                      ((instr & 0xf00) == 0xf00)) {
20417                                    UnallocatedT32(instr);
20418                                    return;
20419                                  }
20420                                  unsigned rd = (instr >> 8) & 0xf;
20421                                  unsigned rm = instr & 0xf;
20422                                  ImmediateShiftOperand
20423                                      shift_operand((instr >> 4) & 0x3,
20424                                                    ((instr >> 6) & 0x3) |
20425                                                        ((instr >> 10) & 0x1c));
20426                                  // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20427                                  subs(CurrentCond(),
20428                                       Best,
20429                                       Register(rd),
20430                                       sp,
20431                                       Operand(Register(rm),
20432                                               shift_operand.GetType(),
20433                                               shift_operand.GetAmount()));
20434                                  if (((instr & 0xffff8000) != 0xebbd0000)) {
20435                                    UnpredictableT32(instr);
20436                                  }
20437                                  break;
20438                                }
20439                              }
20440                              break;
20441                            }
20442                            default: {
20443                              switch (instr & 0x000070f0) {
20444                                case 0x00000030: {
20445                                  // 0xebb00030
20446                                  if (((instr & 0xf0000) == 0xd0000) ||
20447                                      ((instr & 0xf00) == 0xf00)) {
20448                                    UnallocatedT32(instr);
20449                                    return;
20450                                  }
20451                                  unsigned rd = (instr >> 8) & 0xf;
20452                                  unsigned rn = (instr >> 16) & 0xf;
20453                                  unsigned rm = instr & 0xf;
20454                                  // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20455                                  subs(CurrentCond(),
20456                                       Best,
20457                                       Register(rd),
20458                                       Register(rn),
20459                                       Operand(Register(rm), RRX));
20460                                  if (((instr & 0xfff0f0f0) != 0xebb00030)) {
20461                                    UnpredictableT32(instr);
20462                                  }
20463                                  break;
20464                                }
20465                                default: {
20466                                  if (((instr & 0xf0000) == 0xd0000) ||
20467                                      ((instr & 0x70f0) == 0x30) ||
20468                                      ((instr & 0xf00) == 0xf00)) {
20469                                    UnallocatedT32(instr);
20470                                    return;
20471                                  }
20472                                  unsigned rd = (instr >> 8) & 0xf;
20473                                  unsigned rn = (instr >> 16) & 0xf;
20474                                  unsigned rm = instr & 0xf;
20475                                  ImmediateShiftOperand
20476                                      shift_operand((instr >> 4) & 0x3,
20477                                                    ((instr >> 6) & 0x3) |
20478                                                        ((instr >> 10) & 0x1c));
20479                                  if (OutsideITBlock() &&
20480                                      (instr & 0x00100000) == 0x00100000 &&
20481                                      shift_operand.GetShift().IsLSL() &&
20482                                      (shift_operand.GetAmount() == 0) &&
20483                                      ((rd < kNumberOfT32LowRegisters) &&
20484                                       (rn < kNumberOfT32LowRegisters) &&
20485                                       (rm < kNumberOfT32LowRegisters))) {
20486                                    // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2
20487                                    subs(Condition::None(),
20488                                         Wide,
20489                                         Register(rd),
20490                                         Register(rn),
20491                                         Register(rm));
20492                                    if (((instr & 0xfff08000) != 0xebb00000)) {
20493                                      UnpredictableT32(instr);
20494                                    }
20495                                  } else if ((instr & 0x00100000) ==
20496                                             0x00100000) {
20497                                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20498                                    subs(CurrentCond(),
20499                                         Best,
20500                                         Register(rd),
20501                                         Register(rn),
20502                                         Operand(Register(rm),
20503                                                 shift_operand.GetType(),
20504                                                 shift_operand.GetAmount()));
20505                                    if (((instr & 0xfff08000) != 0xebb00000)) {
20506                                      UnpredictableT32(instr);
20507                                    }
20508                                  } else {
20509                                    UnallocatedT32(instr);
20510                                  }
20511                                  break;
20512                                }
20513                              }
20514                              break;
20515                            }
20516                          }
20517                          break;
20518                        }
20519                      }
20520                      break;
20521                    }
20522                    case 0x00400000: {
20523                      // 0xebd00000
20524                      switch (instr & 0x000070f0) {
20525                        case 0x00000030: {
20526                          // 0xebd00030
20527                          unsigned rd = (instr >> 8) & 0xf;
20528                          unsigned rn = (instr >> 16) & 0xf;
20529                          unsigned rm = instr & 0xf;
20530                          // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
20531                          rsbs(CurrentCond(),
20532                               Best,
20533                               Register(rd),
20534                               Register(rn),
20535                               Operand(Register(rm), RRX));
20536                          if (((instr & 0xfff0f0f0) != 0xebd00030)) {
20537                            UnpredictableT32(instr);
20538                          }
20539                          break;
20540                        }
20541                        default: {
20542                          if (((instr & 0x70f0) == 0x30)) {
20543                            UnallocatedT32(instr);
20544                            return;
20545                          }
20546                          unsigned rd = (instr >> 8) & 0xf;
20547                          unsigned rn = (instr >> 16) & 0xf;
20548                          unsigned rm = instr & 0xf;
20549                          ImmediateShiftOperand
20550                              shift_operand((instr >> 4) & 0x3,
20551                                            ((instr >> 6) & 0x3) |
20552                                                ((instr >> 10) & 0x1c));
20553                          // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20554                          rsbs(CurrentCond(),
20555                               Best,
20556                               Register(rd),
20557                               Register(rn),
20558                               Operand(Register(rm),
20559                                       shift_operand.GetType(),
20560                                       shift_operand.GetAmount()));
20561                          if (((instr & 0xfff08000) != 0xebd00000)) {
20562                            UnpredictableT32(instr);
20563                          }
20564                          break;
20565                        }
20566                      }
20567                      break;
20568                    }
20569                    default:
20570                      UnallocatedT32(instr);
20571                      break;
20572                  }
20573                  break;
20574                }
20575                case 0x10000000: {
20576                  // 0xfa000000
20577                  switch (instr & 0x0000f080) {
20578                    case 0x0000f000: {
20579                      // 0xfa00f000
20580                      if ((instr & 0x00000070) == 0x00000000) {
20581                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20582                             Uint32(0x2))) {
20583                          unsigned rd = (instr >> 8) & 0xf;
20584                          unsigned rm = (instr >> 16) & 0xf;
20585                          unsigned rs = instr & 0xf;
20586                          if (InITBlock() &&
20587                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20588                               (rs < kNumberOfT32LowRegisters))) {
20589                            // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20590                            asr(CurrentCond(),
20591                                Wide,
20592                                Register(rd),
20593                                Register(rm),
20594                                Register(rs));
20595                          } else {
20596                            // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20597                            asr(CurrentCond(),
20598                                Best,
20599                                Register(rd),
20600                                Register(rm),
20601                                Register(rs));
20602                          }
20603                          return;
20604                        }
20605                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20606                             Uint32(0x0))) {
20607                          unsigned rd = (instr >> 8) & 0xf;
20608                          unsigned rm = (instr >> 16) & 0xf;
20609                          unsigned rs = instr & 0xf;
20610                          if (InITBlock() &&
20611                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20612                               (rs < kNumberOfT32LowRegisters))) {
20613                            // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20614                            lsl(CurrentCond(),
20615                                Wide,
20616                                Register(rd),
20617                                Register(rm),
20618                                Register(rs));
20619                          } else {
20620                            // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20621                            lsl(CurrentCond(),
20622                                Best,
20623                                Register(rd),
20624                                Register(rm),
20625                                Register(rs));
20626                          }
20627                          return;
20628                        }
20629                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20630                             Uint32(0x1))) {
20631                          unsigned rd = (instr >> 8) & 0xf;
20632                          unsigned rm = (instr >> 16) & 0xf;
20633                          unsigned rs = instr & 0xf;
20634                          if (InITBlock() &&
20635                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20636                               (rs < kNumberOfT32LowRegisters))) {
20637                            // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20638                            lsr(CurrentCond(),
20639                                Wide,
20640                                Register(rd),
20641                                Register(rm),
20642                                Register(rs));
20643                          } else {
20644                            // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20645                            lsr(CurrentCond(),
20646                                Best,
20647                                Register(rd),
20648                                Register(rm),
20649                                Register(rs));
20650                          }
20651                          return;
20652                        }
20653                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20654                             Uint32(0x3))) {
20655                          unsigned rd = (instr >> 8) & 0xf;
20656                          unsigned rm = (instr >> 16) & 0xf;
20657                          unsigned rs = instr & 0xf;
20658                          if (InITBlock() &&
20659                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20660                               (rs < kNumberOfT32LowRegisters))) {
20661                            // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20662                            ror(CurrentCond(),
20663                                Wide,
20664                                Register(rd),
20665                                Register(rm),
20666                                Register(rs));
20667                          } else {
20668                            // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20669                            ror(CurrentCond(),
20670                                Best,
20671                                Register(rd),
20672                                Register(rm),
20673                                Register(rs));
20674                          }
20675                          return;
20676                        }
20677                        unsigned rd = (instr >> 8) & 0xf;
20678                        unsigned rm = (instr >> 16) & 0xf;
20679                        Shift shift((instr >> 21) & 0x3);
20680                        unsigned rs = instr & 0xf;
20681                        if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
20682                            ((rd < kNumberOfT32LowRegisters) &&
20683                             (rm < kNumberOfT32LowRegisters) &&
20684                             (rs < kNumberOfT32LowRegisters))) {
20685                          // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2
20686                          mov(CurrentCond(),
20687                              Wide,
20688                              Register(rd),
20689                              Operand(Register(rm),
20690                                      shift.GetType(),
20691                                      Register(rs)));
20692                        } else if ((instr & 0x00100000) == 0x00000000) {
20693                          // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
20694                          mov(CurrentCond(),
20695                              Best,
20696                              Register(rd),
20697                              Operand(Register(rm),
20698                                      shift.GetType(),
20699                                      Register(rs)));
20700                        } else {
20701                          UnallocatedT32(instr);
20702                        }
20703                      } else {
20704                        UnallocatedT32(instr);
20705                      }
20706                      break;
20707                    }
20708                    case 0x0000f080: {
20709                      // 0xfa00f080
20710                      switch (instr & 0x00600000) {
20711                        case 0x00000000: {
20712                          // 0xfa00f080
20713                          switch (instr & 0x000f0000) {
20714                            case 0x000f0000: {
20715                              // 0xfa0ff080
20716                              unsigned rd = (instr >> 8) & 0xf;
20717                              unsigned rm = instr & 0xf;
20718                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20719                              if ((amount == 0) &&
20720                                  ((rd < kNumberOfT32LowRegisters) &&
20721                                   (rm < kNumberOfT32LowRegisters))) {
20722                                // SXTH{<c>}.W {<Rd>}, <Rm> ; T2
20723                                sxth(CurrentCond(),
20724                                     Wide,
20725                                     Register(rd),
20726                                     Register(rm));
20727                                if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
20728                                  UnpredictableT32(instr);
20729                                }
20730                              } else {
20731                                // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20732                                sxth(CurrentCond(),
20733                                     Best,
20734                                     Register(rd),
20735                                     Operand(Register(rm), ROR, amount));
20736                                if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
20737                                  UnpredictableT32(instr);
20738                                }
20739                              }
20740                              break;
20741                            }
20742                            default: {
20743                              if (((instr & 0xf0000) == 0xf0000)) {
20744                                UnallocatedT32(instr);
20745                                return;
20746                              }
20747                              unsigned rd = (instr >> 8) & 0xf;
20748                              unsigned rn = (instr >> 16) & 0xf;
20749                              unsigned rm = instr & 0xf;
20750                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20751                              // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20752                              sxtah(CurrentCond(),
20753                                    Register(rd),
20754                                    Register(rn),
20755                                    Operand(Register(rm), ROR, amount));
20756                              if (((instr & 0xfff0f0c0) != 0xfa00f080)) {
20757                                UnpredictableT32(instr);
20758                              }
20759                              break;
20760                            }
20761                          }
20762                          break;
20763                        }
20764                        case 0x00200000: {
20765                          // 0xfa20f080
20766                          switch (instr & 0x000f0000) {
20767                            case 0x000f0000: {
20768                              // 0xfa2ff080
20769                              unsigned rd = (instr >> 8) & 0xf;
20770                              unsigned rm = instr & 0xf;
20771                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20772                              // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20773                              sxtb16(CurrentCond(),
20774                                     Register(rd),
20775                                     Operand(Register(rm), ROR, amount));
20776                              if (((instr & 0xfffff0c0) != 0xfa2ff080)) {
20777                                UnpredictableT32(instr);
20778                              }
20779                              break;
20780                            }
20781                            default: {
20782                              if (((instr & 0xf0000) == 0xf0000)) {
20783                                UnallocatedT32(instr);
20784                                return;
20785                              }
20786                              unsigned rd = (instr >> 8) & 0xf;
20787                              unsigned rn = (instr >> 16) & 0xf;
20788                              unsigned rm = instr & 0xf;
20789                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20790                              // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20791                              sxtab16(CurrentCond(),
20792                                      Register(rd),
20793                                      Register(rn),
20794                                      Operand(Register(rm), ROR, amount));
20795                              if (((instr & 0xfff0f0c0) != 0xfa20f080)) {
20796                                UnpredictableT32(instr);
20797                              }
20798                              break;
20799                            }
20800                          }
20801                          break;
20802                        }
20803                        case 0x00400000: {
20804                          // 0xfa40f080
20805                          switch (instr & 0x000f0000) {
20806                            case 0x000f0000: {
20807                              // 0xfa4ff080
20808                              unsigned rd = (instr >> 8) & 0xf;
20809                              unsigned rm = instr & 0xf;
20810                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20811                              if ((amount == 0) &&
20812                                  ((rd < kNumberOfT32LowRegisters) &&
20813                                   (rm < kNumberOfT32LowRegisters))) {
20814                                // SXTB{<c>}.W {<Rd>}, <Rm> ; T2
20815                                sxtb(CurrentCond(),
20816                                     Wide,
20817                                     Register(rd),
20818                                     Register(rm));
20819                                if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
20820                                  UnpredictableT32(instr);
20821                                }
20822                              } else {
20823                                // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20824                                sxtb(CurrentCond(),
20825                                     Best,
20826                                     Register(rd),
20827                                     Operand(Register(rm), ROR, amount));
20828                                if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
20829                                  UnpredictableT32(instr);
20830                                }
20831                              }
20832                              break;
20833                            }
20834                            default: {
20835                              if (((instr & 0xf0000) == 0xf0000)) {
20836                                UnallocatedT32(instr);
20837                                return;
20838                              }
20839                              unsigned rd = (instr >> 8) & 0xf;
20840                              unsigned rn = (instr >> 16) & 0xf;
20841                              unsigned rm = instr & 0xf;
20842                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20843                              // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20844                              sxtab(CurrentCond(),
20845                                    Register(rd),
20846                                    Register(rn),
20847                                    Operand(Register(rm), ROR, amount));
20848                              if (((instr & 0xfff0f0c0) != 0xfa40f080)) {
20849                                UnpredictableT32(instr);
20850                              }
20851                              break;
20852                            }
20853                          }
20854                          break;
20855                        }
20856                        default:
20857                          UnallocatedT32(instr);
20858                          break;
20859                      }
20860                      break;
20861                    }
20862                    default:
20863                      UnallocatedT32(instr);
20864                      break;
20865                  }
20866                  break;
20867                }
20868                case 0x10100000: {
20869                  // 0xfa100000
20870                  switch (instr & 0x0000f080) {
20871                    case 0x0000f000: {
20872                      // 0xfa10f000
20873                      if ((instr & 0x00000070) == 0x00000000) {
20874                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20875                             Uint32(0x2))) {
20876                          unsigned rd = (instr >> 8) & 0xf;
20877                          unsigned rm = (instr >> 16) & 0xf;
20878                          unsigned rs = instr & 0xf;
20879                          if (OutsideITBlock() &&
20880                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20881                               (rs < kNumberOfT32LowRegisters))) {
20882                            // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2
20883                            asrs(Condition::None(),
20884                                 Wide,
20885                                 Register(rd),
20886                                 Register(rm),
20887                                 Register(rs));
20888                          } else {
20889                            // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20890                            asrs(CurrentCond(),
20891                                 Best,
20892                                 Register(rd),
20893                                 Register(rm),
20894                                 Register(rs));
20895                          }
20896                          return;
20897                        }
20898                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20899                             Uint32(0x0))) {
20900                          unsigned rd = (instr >> 8) & 0xf;
20901                          unsigned rm = (instr >> 16) & 0xf;
20902                          unsigned rs = instr & 0xf;
20903                          if (OutsideITBlock() &&
20904                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20905                               (rs < kNumberOfT32LowRegisters))) {
20906                            // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2
20907                            lsls(Condition::None(),
20908                                 Wide,
20909                                 Register(rd),
20910                                 Register(rm),
20911                                 Register(rs));
20912                          } else {
20913                            // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20914                            lsls(CurrentCond(),
20915                                 Best,
20916                                 Register(rd),
20917                                 Register(rm),
20918                                 Register(rs));
20919                          }
20920                          return;
20921                        }
20922                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20923                             Uint32(0x1))) {
20924                          unsigned rd = (instr >> 8) & 0xf;
20925                          unsigned rm = (instr >> 16) & 0xf;
20926                          unsigned rs = instr & 0xf;
20927                          if (OutsideITBlock() &&
20928                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20929                               (rs < kNumberOfT32LowRegisters))) {
20930                            // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2
20931                            lsrs(Condition::None(),
20932                                 Wide,
20933                                 Register(rd),
20934                                 Register(rm),
20935                                 Register(rs));
20936                          } else {
20937                            // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20938                            lsrs(CurrentCond(),
20939                                 Best,
20940                                 Register(rd),
20941                                 Register(rm),
20942                                 Register(rs));
20943                          }
20944                          return;
20945                        }
20946                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20947                             Uint32(0x3))) {
20948                          unsigned rd = (instr >> 8) & 0xf;
20949                          unsigned rm = (instr >> 16) & 0xf;
20950                          unsigned rs = instr & 0xf;
20951                          if (OutsideITBlock() &&
20952                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20953                               (rs < kNumberOfT32LowRegisters))) {
20954                            // RORS.W {<Rd>}, <Rm>, <Rs> ; T2
20955                            rors(Condition::None(),
20956                                 Wide,
20957                                 Register(rd),
20958                                 Register(rm),
20959                                 Register(rs));
20960                          } else {
20961                            // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20962                            rors(CurrentCond(),
20963                                 Best,
20964                                 Register(rd),
20965                                 Register(rm),
20966                                 Register(rs));
20967                          }
20968                          return;
20969                        }
20970                        unsigned rd = (instr >> 8) & 0xf;
20971                        unsigned rm = (instr >> 16) & 0xf;
20972                        Shift shift((instr >> 21) & 0x3);
20973                        unsigned rs = instr & 0xf;
20974                        if (OutsideITBlock() &&
20975                            (instr & 0x00100000) == 0x00100000 &&
20976                            ((rd < kNumberOfT32LowRegisters) &&
20977                             (rm < kNumberOfT32LowRegisters) &&
20978                             (rs < kNumberOfT32LowRegisters))) {
20979                          // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2
20980                          movs(Condition::None(),
20981                               Wide,
20982                               Register(rd),
20983                               Operand(Register(rm),
20984                                       shift.GetType(),
20985                                       Register(rs)));
20986                        } else if ((instr & 0x00100000) == 0x00100000) {
20987                          // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
20988                          movs(CurrentCond(),
20989                               Best,
20990                               Register(rd),
20991                               Operand(Register(rm),
20992                                       shift.GetType(),
20993                                       Register(rs)));
20994                        } else {
20995                          UnallocatedT32(instr);
20996                        }
20997                      } else {
20998                        UnallocatedT32(instr);
20999                      }
21000                      break;
21001                    }
21002                    case 0x0000f080: {
21003                      // 0xfa10f080
21004                      switch (instr & 0x00600000) {
21005                        case 0x00000000: {
21006                          // 0xfa10f080
21007                          switch (instr & 0x000f0000) {
21008                            case 0x000f0000: {
21009                              // 0xfa1ff080
21010                              unsigned rd = (instr >> 8) & 0xf;
21011                              unsigned rm = instr & 0xf;
21012                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21013                              if ((amount == 0) &&
21014                                  ((rd < kNumberOfT32LowRegisters) &&
21015                                   (rm < kNumberOfT32LowRegisters))) {
21016                                // UXTH{<c>}.W {<Rd>}, <Rm> ; T2
21017                                uxth(CurrentCond(),
21018                                     Wide,
21019                                     Register(rd),
21020                                     Register(rm));
21021                                if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
21022                                  UnpredictableT32(instr);
21023                                }
21024                              } else {
21025                                // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
21026                                uxth(CurrentCond(),
21027                                     Best,
21028                                     Register(rd),
21029                                     Operand(Register(rm), ROR, amount));
21030                                if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
21031                                  UnpredictableT32(instr);
21032                                }
21033                              }
21034                              break;
21035                            }
21036                            default: {
21037                              if (((instr & 0xf0000) == 0xf0000)) {
21038                                UnallocatedT32(instr);
21039                                return;
21040                              }
21041                              unsigned rd = (instr >> 8) & 0xf;
21042                              unsigned rn = (instr >> 16) & 0xf;
21043                              unsigned rm = instr & 0xf;
21044                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21045                              // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21046                              uxtah(CurrentCond(),
21047                                    Register(rd),
21048                                    Register(rn),
21049                                    Operand(Register(rm), ROR, amount));
21050                              if (((instr & 0xfff0f0c0) != 0xfa10f080)) {
21051                                UnpredictableT32(instr);
21052                              }
21053                              break;
21054                            }
21055                          }
21056                          break;
21057                        }
21058                        case 0x00200000: {
21059                          // 0xfa30f080
21060                          switch (instr & 0x000f0000) {
21061                            case 0x000f0000: {
21062                              // 0xfa3ff080
21063                              unsigned rd = (instr >> 8) & 0xf;
21064                              unsigned rm = instr & 0xf;
21065                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21066                              // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21067                              uxtb16(CurrentCond(),
21068                                     Register(rd),
21069                                     Operand(Register(rm), ROR, amount));
21070                              if (((instr & 0xfffff0c0) != 0xfa3ff080)) {
21071                                UnpredictableT32(instr);
21072                              }
21073                              break;
21074                            }
21075                            default: {
21076                              if (((instr & 0xf0000) == 0xf0000)) {
21077                                UnallocatedT32(instr);
21078                                return;
21079                              }
21080                              unsigned rd = (instr >> 8) & 0xf;
21081                              unsigned rn = (instr >> 16) & 0xf;
21082                              unsigned rm = instr & 0xf;
21083                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21084                              // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21085                              uxtab16(CurrentCond(),
21086                                      Register(rd),
21087                                      Register(rn),
21088                                      Operand(Register(rm), ROR, amount));
21089                              if (((instr & 0xfff0f0c0) != 0xfa30f080)) {
21090                                UnpredictableT32(instr);
21091                              }
21092                              break;
21093                            }
21094                          }
21095                          break;
21096                        }
21097                        case 0x00400000: {
21098                          // 0xfa50f080
21099                          switch (instr & 0x000f0000) {
21100                            case 0x000f0000: {
21101                              // 0xfa5ff080
21102                              unsigned rd = (instr >> 8) & 0xf;
21103                              unsigned rm = instr & 0xf;
21104                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21105                              if ((amount == 0) &&
21106                                  ((rd < kNumberOfT32LowRegisters) &&
21107                                   (rm < kNumberOfT32LowRegisters))) {
21108                                // UXTB{<c>}.W {<Rd>}, <Rm> ; T2
21109                                uxtb(CurrentCond(),
21110                                     Wide,
21111                                     Register(rd),
21112                                     Register(rm));
21113                                if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
21114                                  UnpredictableT32(instr);
21115                                }
21116                              } else {
21117                                // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
21118                                uxtb(CurrentCond(),
21119                                     Best,
21120                                     Register(rd),
21121                                     Operand(Register(rm), ROR, amount));
21122                                if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
21123                                  UnpredictableT32(instr);
21124                                }
21125                              }
21126                              break;
21127                            }
21128                            default: {
21129                              if (((instr & 0xf0000) == 0xf0000)) {
21130                                UnallocatedT32(instr);
21131                                return;
21132                              }
21133                              unsigned rd = (instr >> 8) & 0xf;
21134                              unsigned rn = (instr >> 16) & 0xf;
21135                              unsigned rm = instr & 0xf;
21136                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21137                              // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21138                              uxtab(CurrentCond(),
21139                                    Register(rd),
21140                                    Register(rn),
21141                                    Operand(Register(rm), ROR, amount));
21142                              if (((instr & 0xfff0f0c0) != 0xfa50f080)) {
21143                                UnpredictableT32(instr);
21144                              }
21145                              break;
21146                            }
21147                          }
21148                          break;
21149                        }
21150                        default:
21151                          UnallocatedT32(instr);
21152                          break;
21153                      }
21154                      break;
21155                    }
21156                    default:
21157                      UnallocatedT32(instr);
21158                      break;
21159                  }
21160                  break;
21161                }
21162                case 0x10800000: {
21163                  // 0xfa800000
21164                  switch (instr & 0x0060f0f0) {
21165                    case 0x0000f000: {
21166                      // 0xfa80f000
21167                      unsigned rd = (instr >> 8) & 0xf;
21168                      unsigned rn = (instr >> 16) & 0xf;
21169                      unsigned rm = instr & 0xf;
21170                      // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21171                      sadd8(CurrentCond(),
21172                            Register(rd),
21173                            Register(rn),
21174                            Register(rm));
21175                      break;
21176                    }
21177                    case 0x0000f010: {
21178                      // 0xfa80f010
21179                      unsigned rd = (instr >> 8) & 0xf;
21180                      unsigned rn = (instr >> 16) & 0xf;
21181                      unsigned rm = instr & 0xf;
21182                      // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21183                      qadd8(CurrentCond(),
21184                            Register(rd),
21185                            Register(rn),
21186                            Register(rm));
21187                      break;
21188                    }
21189                    case 0x0000f020: {
21190                      // 0xfa80f020
21191                      unsigned rd = (instr >> 8) & 0xf;
21192                      unsigned rn = (instr >> 16) & 0xf;
21193                      unsigned rm = instr & 0xf;
21194                      // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21195                      shadd8(CurrentCond(),
21196                             Register(rd),
21197                             Register(rn),
21198                             Register(rm));
21199                      break;
21200                    }
21201                    case 0x0000f040: {
21202                      // 0xfa80f040
21203                      unsigned rd = (instr >> 8) & 0xf;
21204                      unsigned rn = (instr >> 16) & 0xf;
21205                      unsigned rm = instr & 0xf;
21206                      // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21207                      uadd8(CurrentCond(),
21208                            Register(rd),
21209                            Register(rn),
21210                            Register(rm));
21211                      break;
21212                    }
21213                    case 0x0000f050: {
21214                      // 0xfa80f050
21215                      unsigned rd = (instr >> 8) & 0xf;
21216                      unsigned rn = (instr >> 16) & 0xf;
21217                      unsigned rm = instr & 0xf;
21218                      // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21219                      uqadd8(CurrentCond(),
21220                             Register(rd),
21221                             Register(rn),
21222                             Register(rm));
21223                      break;
21224                    }
21225                    case 0x0000f060: {
21226                      // 0xfa80f060
21227                      unsigned rd = (instr >> 8) & 0xf;
21228                      unsigned rn = (instr >> 16) & 0xf;
21229                      unsigned rm = instr & 0xf;
21230                      // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21231                      uhadd8(CurrentCond(),
21232                             Register(rd),
21233                             Register(rn),
21234                             Register(rm));
21235                      break;
21236                    }
21237                    case 0x0000f080: {
21238                      // 0xfa80f080
21239                      unsigned rd = (instr >> 8) & 0xf;
21240                      unsigned rm = instr & 0xf;
21241                      unsigned rn = (instr >> 16) & 0xf;
21242                      // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21243                      qadd(CurrentCond(),
21244                           Register(rd),
21245                           Register(rm),
21246                           Register(rn));
21247                      break;
21248                    }
21249                    case 0x0000f090: {
21250                      // 0xfa80f090
21251                      unsigned rd = (instr >> 8) & 0xf;
21252                      unsigned rm = instr & 0xf;
21253                      unsigned rn = (instr >> 16) & 0xf;
21254                      // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21255                      qdadd(CurrentCond(),
21256                            Register(rd),
21257                            Register(rm),
21258                            Register(rn));
21259                      break;
21260                    }
21261                    case 0x0000f0a0: {
21262                      // 0xfa80f0a0
21263                      unsigned rd = (instr >> 8) & 0xf;
21264                      unsigned rm = instr & 0xf;
21265                      unsigned rn = (instr >> 16) & 0xf;
21266                      // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21267                      qsub(CurrentCond(),
21268                           Register(rd),
21269                           Register(rm),
21270                           Register(rn));
21271                      break;
21272                    }
21273                    case 0x0000f0b0: {
21274                      // 0xfa80f0b0
21275                      unsigned rd = (instr >> 8) & 0xf;
21276                      unsigned rm = instr & 0xf;
21277                      unsigned rn = (instr >> 16) & 0xf;
21278                      // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21279                      qdsub(CurrentCond(),
21280                            Register(rd),
21281                            Register(rm),
21282                            Register(rn));
21283                      break;
21284                    }
21285                    case 0x0020f000: {
21286                      // 0xfaa0f000
21287                      unsigned rd = (instr >> 8) & 0xf;
21288                      unsigned rn = (instr >> 16) & 0xf;
21289                      unsigned rm = instr & 0xf;
21290                      // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21291                      sasx(CurrentCond(),
21292                           Register(rd),
21293                           Register(rn),
21294                           Register(rm));
21295                      break;
21296                    }
21297                    case 0x0020f010: {
21298                      // 0xfaa0f010
21299                      unsigned rd = (instr >> 8) & 0xf;
21300                      unsigned rn = (instr >> 16) & 0xf;
21301                      unsigned rm = instr & 0xf;
21302                      // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21303                      qasx(CurrentCond(),
21304                           Register(rd),
21305                           Register(rn),
21306                           Register(rm));
21307                      break;
21308                    }
21309                    case 0x0020f020: {
21310                      // 0xfaa0f020
21311                      unsigned rd = (instr >> 8) & 0xf;
21312                      unsigned rn = (instr >> 16) & 0xf;
21313                      unsigned rm = instr & 0xf;
21314                      // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21315                      shasx(CurrentCond(),
21316                            Register(rd),
21317                            Register(rn),
21318                            Register(rm));
21319                      break;
21320                    }
21321                    case 0x0020f040: {
21322                      // 0xfaa0f040
21323                      unsigned rd = (instr >> 8) & 0xf;
21324                      unsigned rn = (instr >> 16) & 0xf;
21325                      unsigned rm = instr & 0xf;
21326                      // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21327                      uasx(CurrentCond(),
21328                           Register(rd),
21329                           Register(rn),
21330                           Register(rm));
21331                      break;
21332                    }
21333                    case 0x0020f050: {
21334                      // 0xfaa0f050
21335                      unsigned rd = (instr >> 8) & 0xf;
21336                      unsigned rn = (instr >> 16) & 0xf;
21337                      unsigned rm = instr & 0xf;
21338                      // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21339                      uqasx(CurrentCond(),
21340                            Register(rd),
21341                            Register(rn),
21342                            Register(rm));
21343                      break;
21344                    }
21345                    case 0x0020f060: {
21346                      // 0xfaa0f060
21347                      unsigned rd = (instr >> 8) & 0xf;
21348                      unsigned rn = (instr >> 16) & 0xf;
21349                      unsigned rm = instr & 0xf;
21350                      // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21351                      uhasx(CurrentCond(),
21352                            Register(rd),
21353                            Register(rn),
21354                            Register(rm));
21355                      break;
21356                    }
21357                    case 0x0020f080: {
21358                      // 0xfaa0f080
21359                      unsigned rd = (instr >> 8) & 0xf;
21360                      unsigned rn = (instr >> 16) & 0xf;
21361                      unsigned rm = instr & 0xf;
21362                      // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21363                      sel(CurrentCond(),
21364                          Register(rd),
21365                          Register(rn),
21366                          Register(rm));
21367                      break;
21368                    }
21369                    case 0x0040f000: {
21370                      // 0xfac0f000
21371                      unsigned rd = (instr >> 8) & 0xf;
21372                      unsigned rn = (instr >> 16) & 0xf;
21373                      unsigned rm = instr & 0xf;
21374                      // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21375                      ssub8(CurrentCond(),
21376                            Register(rd),
21377                            Register(rn),
21378                            Register(rm));
21379                      break;
21380                    }
21381                    case 0x0040f010: {
21382                      // 0xfac0f010
21383                      unsigned rd = (instr >> 8) & 0xf;
21384                      unsigned rn = (instr >> 16) & 0xf;
21385                      unsigned rm = instr & 0xf;
21386                      // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21387                      qsub8(CurrentCond(),
21388                            Register(rd),
21389                            Register(rn),
21390                            Register(rm));
21391                      break;
21392                    }
21393                    case 0x0040f020: {
21394                      // 0xfac0f020
21395                      unsigned rd = (instr >> 8) & 0xf;
21396                      unsigned rn = (instr >> 16) & 0xf;
21397                      unsigned rm = instr & 0xf;
21398                      // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21399                      shsub8(CurrentCond(),
21400                             Register(rd),
21401                             Register(rn),
21402                             Register(rm));
21403                      break;
21404                    }
21405                    case 0x0040f040: {
21406                      // 0xfac0f040
21407                      unsigned rd = (instr >> 8) & 0xf;
21408                      unsigned rn = (instr >> 16) & 0xf;
21409                      unsigned rm = instr & 0xf;
21410                      // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21411                      usub8(CurrentCond(),
21412                            Register(rd),
21413                            Register(rn),
21414                            Register(rm));
21415                      break;
21416                    }
21417                    case 0x0040f050: {
21418                      // 0xfac0f050
21419                      unsigned rd = (instr >> 8) & 0xf;
21420                      unsigned rn = (instr >> 16) & 0xf;
21421                      unsigned rm = instr & 0xf;
21422                      // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21423                      uqsub8(CurrentCond(),
21424                             Register(rd),
21425                             Register(rn),
21426                             Register(rm));
21427                      break;
21428                    }
21429                    case 0x0040f060: {
21430                      // 0xfac0f060
21431                      unsigned rd = (instr >> 8) & 0xf;
21432                      unsigned rn = (instr >> 16) & 0xf;
21433                      unsigned rm = instr & 0xf;
21434                      // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21435                      uhsub8(CurrentCond(),
21436                             Register(rd),
21437                             Register(rn),
21438                             Register(rm));
21439                      break;
21440                    }
21441                    case 0x0040f080: {
21442                      // 0xfac0f080
21443                      unsigned rd = (instr >> 8) & 0xf;
21444                      unsigned rn = (instr >> 16) & 0xf;
21445                      unsigned rm = instr & 0xf;
21446                      // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1
21447                      crc32b(Condition::None(),
21448                             Register(rd),
21449                             Register(rn),
21450                             Register(rm));
21451                      break;
21452                    }
21453                    case 0x0040f090: {
21454                      // 0xfac0f090
21455                      unsigned rd = (instr >> 8) & 0xf;
21456                      unsigned rn = (instr >> 16) & 0xf;
21457                      unsigned rm = instr & 0xf;
21458                      // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1
21459                      crc32h(Condition::None(),
21460                             Register(rd),
21461                             Register(rn),
21462                             Register(rm));
21463                      break;
21464                    }
21465                    case 0x0040f0a0: {
21466                      // 0xfac0f0a0
21467                      unsigned rd = (instr >> 8) & 0xf;
21468                      unsigned rn = (instr >> 16) & 0xf;
21469                      unsigned rm = instr & 0xf;
21470                      // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1
21471                      crc32w(Condition::None(),
21472                             Register(rd),
21473                             Register(rn),
21474                             Register(rm));
21475                      break;
21476                    }
21477                    case 0x0060f000: {
21478                      // 0xfae0f000
21479                      unsigned rd = (instr >> 8) & 0xf;
21480                      unsigned rn = (instr >> 16) & 0xf;
21481                      unsigned rm = instr & 0xf;
21482                      // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21483                      ssax(CurrentCond(),
21484                           Register(rd),
21485                           Register(rn),
21486                           Register(rm));
21487                      break;
21488                    }
21489                    case 0x0060f010: {
21490                      // 0xfae0f010
21491                      unsigned rd = (instr >> 8) & 0xf;
21492                      unsigned rn = (instr >> 16) & 0xf;
21493                      unsigned rm = instr & 0xf;
21494                      // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21495                      qsax(CurrentCond(),
21496                           Register(rd),
21497                           Register(rn),
21498                           Register(rm));
21499                      break;
21500                    }
21501                    case 0x0060f020: {
21502                      // 0xfae0f020
21503                      unsigned rd = (instr >> 8) & 0xf;
21504                      unsigned rn = (instr >> 16) & 0xf;
21505                      unsigned rm = instr & 0xf;
21506                      // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21507                      shsax(CurrentCond(),
21508                            Register(rd),
21509                            Register(rn),
21510                            Register(rm));
21511                      break;
21512                    }
21513                    case 0x0060f040: {
21514                      // 0xfae0f040
21515                      unsigned rd = (instr >> 8) & 0xf;
21516                      unsigned rn = (instr >> 16) & 0xf;
21517                      unsigned rm = instr & 0xf;
21518                      // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21519                      usax(CurrentCond(),
21520                           Register(rd),
21521                           Register(rn),
21522                           Register(rm));
21523                      break;
21524                    }
21525                    case 0x0060f050: {
21526                      // 0xfae0f050
21527                      unsigned rd = (instr >> 8) & 0xf;
21528                      unsigned rn = (instr >> 16) & 0xf;
21529                      unsigned rm = instr & 0xf;
21530                      // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21531                      uqsax(CurrentCond(),
21532                            Register(rd),
21533                            Register(rn),
21534                            Register(rm));
21535                      break;
21536                    }
21537                    case 0x0060f060: {
21538                      // 0xfae0f060
21539                      unsigned rd = (instr >> 8) & 0xf;
21540                      unsigned rn = (instr >> 16) & 0xf;
21541                      unsigned rm = instr & 0xf;
21542                      // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21543                      uhsax(CurrentCond(),
21544                            Register(rd),
21545                            Register(rn),
21546                            Register(rm));
21547                      break;
21548                    }
21549                    default:
21550                      UnallocatedT32(instr);
21551                      break;
21552                  }
21553                  break;
21554                }
21555                case 0x10900000: {
21556                  // 0xfa900000
21557                  switch (instr & 0x0060f0f0) {
21558                    case 0x0000f000: {
21559                      // 0xfa90f000
21560                      unsigned rd = (instr >> 8) & 0xf;
21561                      unsigned rn = (instr >> 16) & 0xf;
21562                      unsigned rm = instr & 0xf;
21563                      // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21564                      sadd16(CurrentCond(),
21565                             Register(rd),
21566                             Register(rn),
21567                             Register(rm));
21568                      break;
21569                    }
21570                    case 0x0000f010: {
21571                      // 0xfa90f010
21572                      unsigned rd = (instr >> 8) & 0xf;
21573                      unsigned rn = (instr >> 16) & 0xf;
21574                      unsigned rm = instr & 0xf;
21575                      // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21576                      qadd16(CurrentCond(),
21577                             Register(rd),
21578                             Register(rn),
21579                             Register(rm));
21580                      break;
21581                    }
21582                    case 0x0000f020: {
21583                      // 0xfa90f020
21584                      unsigned rd = (instr >> 8) & 0xf;
21585                      unsigned rn = (instr >> 16) & 0xf;
21586                      unsigned rm = instr & 0xf;
21587                      // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21588                      shadd16(CurrentCond(),
21589                              Register(rd),
21590                              Register(rn),
21591                              Register(rm));
21592                      break;
21593                    }
21594                    case 0x0000f040: {
21595                      // 0xfa90f040
21596                      unsigned rd = (instr >> 8) & 0xf;
21597                      unsigned rn = (instr >> 16) & 0xf;
21598                      unsigned rm = instr & 0xf;
21599                      // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21600                      uadd16(CurrentCond(),
21601                             Register(rd),
21602                             Register(rn),
21603                             Register(rm));
21604                      break;
21605                    }
21606                    case 0x0000f050: {
21607                      // 0xfa90f050
21608                      unsigned rd = (instr >> 8) & 0xf;
21609                      unsigned rn = (instr >> 16) & 0xf;
21610                      unsigned rm = instr & 0xf;
21611                      // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21612                      uqadd16(CurrentCond(),
21613                              Register(rd),
21614                              Register(rn),
21615                              Register(rm));
21616                      break;
21617                    }
21618                    case 0x0000f060: {
21619                      // 0xfa90f060
21620                      unsigned rd = (instr >> 8) & 0xf;
21621                      unsigned rn = (instr >> 16) & 0xf;
21622                      unsigned rm = instr & 0xf;
21623                      // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21624                      uhadd16(CurrentCond(),
21625                              Register(rd),
21626                              Register(rn),
21627                              Register(rm));
21628                      break;
21629                    }
21630                    case 0x0000f080: {
21631                      // 0xfa90f080
21632                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21633                        unsigned rd = (instr >> 8) & 0xf;
21634                        unsigned rm = instr & 0xf;
21635                        if ((rd < kNumberOfT32LowRegisters) &&
21636                            (rm < kNumberOfT32LowRegisters)) {
21637                          // REV{<c>}.W <Rd>, <Rm> ; T2
21638                          rev(CurrentCond(), Wide, Register(rd), Register(rm));
21639                        } else {
21640                          // REV{<c>}{<q>} <Rd>, <Rm> ; T2
21641                          rev(CurrentCond(), Best, Register(rd), Register(rm));
21642                        }
21643                      } else {
21644                        UnallocatedT32(instr);
21645                      }
21646                      break;
21647                    }
21648                    case 0x0000f090: {
21649                      // 0xfa90f090
21650                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21651                        unsigned rd = (instr >> 8) & 0xf;
21652                        unsigned rm = instr & 0xf;
21653                        if ((rd < kNumberOfT32LowRegisters) &&
21654                            (rm < kNumberOfT32LowRegisters)) {
21655                          // REV16{<c>}.W <Rd>, <Rm> ; T2
21656                          rev16(CurrentCond(),
21657                                Wide,
21658                                Register(rd),
21659                                Register(rm));
21660                        } else {
21661                          // REV16{<c>}{<q>} <Rd>, <Rm> ; T2
21662                          rev16(CurrentCond(),
21663                                Best,
21664                                Register(rd),
21665                                Register(rm));
21666                        }
21667                      } else {
21668                        UnallocatedT32(instr);
21669                      }
21670                      break;
21671                    }
21672                    case 0x0000f0a0: {
21673                      // 0xfa90f0a0
21674                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21675                        unsigned rd = (instr >> 8) & 0xf;
21676                        unsigned rm = instr & 0xf;
21677                        // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1
21678                        rbit(CurrentCond(), Register(rd), Register(rm));
21679                      } else {
21680                        UnallocatedT32(instr);
21681                      }
21682                      break;
21683                    }
21684                    case 0x0000f0b0: {
21685                      // 0xfa90f0b0
21686                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21687                        unsigned rd = (instr >> 8) & 0xf;
21688                        unsigned rm = instr & 0xf;
21689                        if ((rd < kNumberOfT32LowRegisters) &&
21690                            (rm < kNumberOfT32LowRegisters)) {
21691                          // REVSH{<c>}.W <Rd>, <Rm> ; T2
21692                          revsh(CurrentCond(),
21693                                Wide,
21694                                Register(rd),
21695                                Register(rm));
21696                        } else {
21697                          // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2
21698                          revsh(CurrentCond(),
21699                                Best,
21700                                Register(rd),
21701                                Register(rm));
21702                        }
21703                      } else {
21704                        UnallocatedT32(instr);
21705                      }
21706                      break;
21707                    }
21708                    case 0x0020f080: {
21709                      // 0xfab0f080
21710                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21711                        unsigned rd = (instr >> 8) & 0xf;
21712                        unsigned rm = instr & 0xf;
21713                        // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1
21714                        clz(CurrentCond(), Register(rd), Register(rm));
21715                      } else {
21716                        UnallocatedT32(instr);
21717                      }
21718                      break;
21719                    }
21720                    case 0x0040f000: {
21721                      // 0xfad0f000
21722                      unsigned rd = (instr >> 8) & 0xf;
21723                      unsigned rn = (instr >> 16) & 0xf;
21724                      unsigned rm = instr & 0xf;
21725                      // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21726                      ssub16(CurrentCond(),
21727                             Register(rd),
21728                             Register(rn),
21729                             Register(rm));
21730                      break;
21731                    }
21732                    case 0x0040f010: {
21733                      // 0xfad0f010
21734                      unsigned rd = (instr >> 8) & 0xf;
21735                      unsigned rn = (instr >> 16) & 0xf;
21736                      unsigned rm = instr & 0xf;
21737                      // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21738                      qsub16(CurrentCond(),
21739                             Register(rd),
21740                             Register(rn),
21741                             Register(rm));
21742                      break;
21743                    }
21744                    case 0x0040f020: {
21745                      // 0xfad0f020
21746                      unsigned rd = (instr >> 8) & 0xf;
21747                      unsigned rn = (instr >> 16) & 0xf;
21748                      unsigned rm = instr & 0xf;
21749                      // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21750                      shsub16(CurrentCond(),
21751                              Register(rd),
21752                              Register(rn),
21753                              Register(rm));
21754                      break;
21755                    }
21756                    case 0x0040f040: {
21757                      // 0xfad0f040
21758                      unsigned rd = (instr >> 8) & 0xf;
21759                      unsigned rn = (instr >> 16) & 0xf;
21760                      unsigned rm = instr & 0xf;
21761                      // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21762                      usub16(CurrentCond(),
21763                             Register(rd),
21764                             Register(rn),
21765                             Register(rm));
21766                      break;
21767                    }
21768                    case 0x0040f050: {
21769                      // 0xfad0f050
21770                      unsigned rd = (instr >> 8) & 0xf;
21771                      unsigned rn = (instr >> 16) & 0xf;
21772                      unsigned rm = instr & 0xf;
21773                      // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21774                      uqsub16(CurrentCond(),
21775                              Register(rd),
21776                              Register(rn),
21777                              Register(rm));
21778                      break;
21779                    }
21780                    case 0x0040f060: {
21781                      // 0xfad0f060
21782                      unsigned rd = (instr >> 8) & 0xf;
21783                      unsigned rn = (instr >> 16) & 0xf;
21784                      unsigned rm = instr & 0xf;
21785                      // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21786                      uhsub16(CurrentCond(),
21787                              Register(rd),
21788                              Register(rn),
21789                              Register(rm));
21790                      break;
21791                    }
21792                    case 0x0040f080: {
21793                      // 0xfad0f080
21794                      unsigned rd = (instr >> 8) & 0xf;
21795                      unsigned rn = (instr >> 16) & 0xf;
21796                      unsigned rm = instr & 0xf;
21797                      // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1
21798                      crc32cb(Condition::None(),
21799                              Register(rd),
21800                              Register(rn),
21801                              Register(rm));
21802                      break;
21803                    }
21804                    case 0x0040f090: {
21805                      // 0xfad0f090
21806                      unsigned rd = (instr >> 8) & 0xf;
21807                      unsigned rn = (instr >> 16) & 0xf;
21808                      unsigned rm = instr & 0xf;
21809                      // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1
21810                      crc32ch(Condition::None(),
21811                              Register(rd),
21812                              Register(rn),
21813                              Register(rm));
21814                      break;
21815                    }
21816                    case 0x0040f0a0: {
21817                      // 0xfad0f0a0
21818                      unsigned rd = (instr >> 8) & 0xf;
21819                      unsigned rn = (instr >> 16) & 0xf;
21820                      unsigned rm = instr & 0xf;
21821                      // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1
21822                      crc32cw(Condition::None(),
21823                              Register(rd),
21824                              Register(rn),
21825                              Register(rm));
21826                      break;
21827                    }
21828                    default:
21829                      UnallocatedT32(instr);
21830                      break;
21831                  }
21832                  break;
21833                }
21834                case 0x11000000: {
21835                  // 0xfb000000
21836                  switch (instr & 0x006000f0) {
21837                    case 0x00000000: {
21838                      // 0xfb000000
21839                      switch (instr & 0x0000f000) {
21840                        case 0x0000f000: {
21841                          // 0xfb00f000
21842                          unsigned rd = (instr >> 8) & 0xf;
21843                          unsigned rn = (instr >> 16) & 0xf;
21844                          unsigned rm = instr & 0xf;
21845                          if (InITBlock() &&
21846                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
21847                               (rn < kNumberOfT32LowRegisters))) {
21848                            // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2
21849                            mul(CurrentCond(),
21850                                Wide,
21851                                Register(rd),
21852                                Register(rn),
21853                                Register(rm));
21854                          } else {
21855                            // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2
21856                            mul(CurrentCond(),
21857                                Best,
21858                                Register(rd),
21859                                Register(rn),
21860                                Register(rm));
21861                          }
21862                          break;
21863                        }
21864                        default: {
21865                          if (((instr & 0xf000) == 0xf000)) {
21866                            UnallocatedT32(instr);
21867                            return;
21868                          }
21869                          unsigned rd = (instr >> 8) & 0xf;
21870                          unsigned rn = (instr >> 16) & 0xf;
21871                          unsigned rm = instr & 0xf;
21872                          unsigned ra = (instr >> 12) & 0xf;
21873                          // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21874                          mla(CurrentCond(),
21875                              Register(rd),
21876                              Register(rn),
21877                              Register(rm),
21878                              Register(ra));
21879                          break;
21880                        }
21881                      }
21882                      break;
21883                    }
21884                    case 0x00000010: {
21885                      // 0xfb000010
21886                      unsigned rd = (instr >> 8) & 0xf;
21887                      unsigned rn = (instr >> 16) & 0xf;
21888                      unsigned rm = instr & 0xf;
21889                      unsigned ra = (instr >> 12) & 0xf;
21890                      // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21891                      mls(CurrentCond(),
21892                          Register(rd),
21893                          Register(rn),
21894                          Register(rm),
21895                          Register(ra));
21896                      break;
21897                    }
21898                    case 0x00200000: {
21899                      // 0xfb200000
21900                      switch (instr & 0x0000f000) {
21901                        case 0x0000f000: {
21902                          // 0xfb20f000
21903                          unsigned rd = (instr >> 8) & 0xf;
21904                          unsigned rn = (instr >> 16) & 0xf;
21905                          unsigned rm = instr & 0xf;
21906                          // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21907                          smuad(CurrentCond(),
21908                                Register(rd),
21909                                Register(rn),
21910                                Register(rm));
21911                          break;
21912                        }
21913                        default: {
21914                          if (((instr & 0xf000) == 0xf000)) {
21915                            UnallocatedT32(instr);
21916                            return;
21917                          }
21918                          unsigned rd = (instr >> 8) & 0xf;
21919                          unsigned rn = (instr >> 16) & 0xf;
21920                          unsigned rm = instr & 0xf;
21921                          unsigned ra = (instr >> 12) & 0xf;
21922                          // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21923                          smlad(CurrentCond(),
21924                                Register(rd),
21925                                Register(rn),
21926                                Register(rm),
21927                                Register(ra));
21928                          break;
21929                        }
21930                      }
21931                      break;
21932                    }
21933                    case 0x00200010: {
21934                      // 0xfb200010
21935                      switch (instr & 0x0000f000) {
21936                        case 0x0000f000: {
21937                          // 0xfb20f010
21938                          unsigned rd = (instr >> 8) & 0xf;
21939                          unsigned rn = (instr >> 16) & 0xf;
21940                          unsigned rm = instr & 0xf;
21941                          // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21942                          smuadx(CurrentCond(),
21943                                 Register(rd),
21944                                 Register(rn),
21945                                 Register(rm));
21946                          break;
21947                        }
21948                        default: {
21949                          if (((instr & 0xf000) == 0xf000)) {
21950                            UnallocatedT32(instr);
21951                            return;
21952                          }
21953                          unsigned rd = (instr >> 8) & 0xf;
21954                          unsigned rn = (instr >> 16) & 0xf;
21955                          unsigned rm = instr & 0xf;
21956                          unsigned ra = (instr >> 12) & 0xf;
21957                          // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21958                          smladx(CurrentCond(),
21959                                 Register(rd),
21960                                 Register(rn),
21961                                 Register(rm),
21962                                 Register(ra));
21963                          break;
21964                        }
21965                      }
21966                      break;
21967                    }
21968                    case 0x00400000: {
21969                      // 0xfb400000
21970                      switch (instr & 0x0000f000) {
21971                        case 0x0000f000: {
21972                          // 0xfb40f000
21973                          unsigned rd = (instr >> 8) & 0xf;
21974                          unsigned rn = (instr >> 16) & 0xf;
21975                          unsigned rm = instr & 0xf;
21976                          // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21977                          smusd(CurrentCond(),
21978                                Register(rd),
21979                                Register(rn),
21980                                Register(rm));
21981                          break;
21982                        }
21983                        default: {
21984                          if (((instr & 0xf000) == 0xf000)) {
21985                            UnallocatedT32(instr);
21986                            return;
21987                          }
21988                          unsigned rd = (instr >> 8) & 0xf;
21989                          unsigned rn = (instr >> 16) & 0xf;
21990                          unsigned rm = instr & 0xf;
21991                          unsigned ra = (instr >> 12) & 0xf;
21992                          // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21993                          smlsd(CurrentCond(),
21994                                Register(rd),
21995                                Register(rn),
21996                                Register(rm),
21997                                Register(ra));
21998                          break;
21999                        }
22000                      }
22001                      break;
22002                    }
22003                    case 0x00400010: {
22004                      // 0xfb400010
22005                      switch (instr & 0x0000f000) {
22006                        case 0x0000f000: {
22007                          // 0xfb40f010
22008                          unsigned rd = (instr >> 8) & 0xf;
22009                          unsigned rn = (instr >> 16) & 0xf;
22010                          unsigned rm = instr & 0xf;
22011                          // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22012                          smusdx(CurrentCond(),
22013                                 Register(rd),
22014                                 Register(rn),
22015                                 Register(rm));
22016                          break;
22017                        }
22018                        default: {
22019                          if (((instr & 0xf000) == 0xf000)) {
22020                            UnallocatedT32(instr);
22021                            return;
22022                          }
22023                          unsigned rd = (instr >> 8) & 0xf;
22024                          unsigned rn = (instr >> 16) & 0xf;
22025                          unsigned rm = instr & 0xf;
22026                          unsigned ra = (instr >> 12) & 0xf;
22027                          // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22028                          smlsdx(CurrentCond(),
22029                                 Register(rd),
22030                                 Register(rn),
22031                                 Register(rm),
22032                                 Register(ra));
22033                          break;
22034                        }
22035                      }
22036                      break;
22037                    }
22038                    case 0x00600000: {
22039                      // 0xfb600000
22040                      unsigned rd = (instr >> 8) & 0xf;
22041                      unsigned rn = (instr >> 16) & 0xf;
22042                      unsigned rm = instr & 0xf;
22043                      unsigned ra = (instr >> 12) & 0xf;
22044                      // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22045                      smmls(CurrentCond(),
22046                            Register(rd),
22047                            Register(rn),
22048                            Register(rm),
22049                            Register(ra));
22050                      break;
22051                    }
22052                    case 0x00600010: {
22053                      // 0xfb600010
22054                      unsigned rd = (instr >> 8) & 0xf;
22055                      unsigned rn = (instr >> 16) & 0xf;
22056                      unsigned rm = instr & 0xf;
22057                      unsigned ra = (instr >> 12) & 0xf;
22058                      // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22059                      smmlsr(CurrentCond(),
22060                             Register(rd),
22061                             Register(rn),
22062                             Register(rm),
22063                             Register(ra));
22064                      break;
22065                    }
22066                    default:
22067                      UnallocatedT32(instr);
22068                      break;
22069                  }
22070                  break;
22071                }
22072                case 0x11100000: {
22073                  // 0xfb100000
22074                  switch (instr & 0x006000f0) {
22075                    case 0x00000000: {
22076                      // 0xfb100000
22077                      switch (instr & 0x0000f000) {
22078                        case 0x0000f000: {
22079                          // 0xfb10f000
22080                          unsigned rd = (instr >> 8) & 0xf;
22081                          unsigned rn = (instr >> 16) & 0xf;
22082                          unsigned rm = instr & 0xf;
22083                          // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22084                          smulbb(CurrentCond(),
22085                                 Register(rd),
22086                                 Register(rn),
22087                                 Register(rm));
22088                          break;
22089                        }
22090                        default: {
22091                          if (((instr & 0xf000) == 0xf000)) {
22092                            UnallocatedT32(instr);
22093                            return;
22094                          }
22095                          unsigned rd = (instr >> 8) & 0xf;
22096                          unsigned rn = (instr >> 16) & 0xf;
22097                          unsigned rm = instr & 0xf;
22098                          unsigned ra = (instr >> 12) & 0xf;
22099                          // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22100                          smlabb(CurrentCond(),
22101                                 Register(rd),
22102                                 Register(rn),
22103                                 Register(rm),
22104                                 Register(ra));
22105                          break;
22106                        }
22107                      }
22108                      break;
22109                    }
22110                    case 0x00000010: {
22111                      // 0xfb100010
22112                      switch (instr & 0x0000f000) {
22113                        case 0x0000f000: {
22114                          // 0xfb10f010
22115                          unsigned rd = (instr >> 8) & 0xf;
22116                          unsigned rn = (instr >> 16) & 0xf;
22117                          unsigned rm = instr & 0xf;
22118                          // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22119                          smulbt(CurrentCond(),
22120                                 Register(rd),
22121                                 Register(rn),
22122                                 Register(rm));
22123                          break;
22124                        }
22125                        default: {
22126                          if (((instr & 0xf000) == 0xf000)) {
22127                            UnallocatedT32(instr);
22128                            return;
22129                          }
22130                          unsigned rd = (instr >> 8) & 0xf;
22131                          unsigned rn = (instr >> 16) & 0xf;
22132                          unsigned rm = instr & 0xf;
22133                          unsigned ra = (instr >> 12) & 0xf;
22134                          // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22135                          smlabt(CurrentCond(),
22136                                 Register(rd),
22137                                 Register(rn),
22138                                 Register(rm),
22139                                 Register(ra));
22140                          break;
22141                        }
22142                      }
22143                      break;
22144                    }
22145                    case 0x00000020: {
22146                      // 0xfb100020
22147                      switch (instr & 0x0000f000) {
22148                        case 0x0000f000: {
22149                          // 0xfb10f020
22150                          unsigned rd = (instr >> 8) & 0xf;
22151                          unsigned rn = (instr >> 16) & 0xf;
22152                          unsigned rm = instr & 0xf;
22153                          // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22154                          smultb(CurrentCond(),
22155                                 Register(rd),
22156                                 Register(rn),
22157                                 Register(rm));
22158                          break;
22159                        }
22160                        default: {
22161                          if (((instr & 0xf000) == 0xf000)) {
22162                            UnallocatedT32(instr);
22163                            return;
22164                          }
22165                          unsigned rd = (instr >> 8) & 0xf;
22166                          unsigned rn = (instr >> 16) & 0xf;
22167                          unsigned rm = instr & 0xf;
22168                          unsigned ra = (instr >> 12) & 0xf;
22169                          // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22170                          smlatb(CurrentCond(),
22171                                 Register(rd),
22172                                 Register(rn),
22173                                 Register(rm),
22174                                 Register(ra));
22175                          break;
22176                        }
22177                      }
22178                      break;
22179                    }
22180                    case 0x00000030: {
22181                      // 0xfb100030
22182                      switch (instr & 0x0000f000) {
22183                        case 0x0000f000: {
22184                          // 0xfb10f030
22185                          unsigned rd = (instr >> 8) & 0xf;
22186                          unsigned rn = (instr >> 16) & 0xf;
22187                          unsigned rm = instr & 0xf;
22188                          // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22189                          smultt(CurrentCond(),
22190                                 Register(rd),
22191                                 Register(rn),
22192                                 Register(rm));
22193                          break;
22194                        }
22195                        default: {
22196                          if (((instr & 0xf000) == 0xf000)) {
22197                            UnallocatedT32(instr);
22198                            return;
22199                          }
22200                          unsigned rd = (instr >> 8) & 0xf;
22201                          unsigned rn = (instr >> 16) & 0xf;
22202                          unsigned rm = instr & 0xf;
22203                          unsigned ra = (instr >> 12) & 0xf;
22204                          // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22205                          smlatt(CurrentCond(),
22206                                 Register(rd),
22207                                 Register(rn),
22208                                 Register(rm),
22209                                 Register(ra));
22210                          break;
22211                        }
22212                      }
22213                      break;
22214                    }
22215                    case 0x00200000: {
22216                      // 0xfb300000
22217                      switch (instr & 0x0000f000) {
22218                        case 0x0000f000: {
22219                          // 0xfb30f000
22220                          unsigned rd = (instr >> 8) & 0xf;
22221                          unsigned rn = (instr >> 16) & 0xf;
22222                          unsigned rm = instr & 0xf;
22223                          // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22224                          smulwb(CurrentCond(),
22225                                 Register(rd),
22226                                 Register(rn),
22227                                 Register(rm));
22228                          break;
22229                        }
22230                        default: {
22231                          if (((instr & 0xf000) == 0xf000)) {
22232                            UnallocatedT32(instr);
22233                            return;
22234                          }
22235                          unsigned rd = (instr >> 8) & 0xf;
22236                          unsigned rn = (instr >> 16) & 0xf;
22237                          unsigned rm = instr & 0xf;
22238                          unsigned ra = (instr >> 12) & 0xf;
22239                          // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22240                          smlawb(CurrentCond(),
22241                                 Register(rd),
22242                                 Register(rn),
22243                                 Register(rm),
22244                                 Register(ra));
22245                          break;
22246                        }
22247                      }
22248                      break;
22249                    }
22250                    case 0x00200010: {
22251                      // 0xfb300010
22252                      switch (instr & 0x0000f000) {
22253                        case 0x0000f000: {
22254                          // 0xfb30f010
22255                          unsigned rd = (instr >> 8) & 0xf;
22256                          unsigned rn = (instr >> 16) & 0xf;
22257                          unsigned rm = instr & 0xf;
22258                          // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22259                          smulwt(CurrentCond(),
22260                                 Register(rd),
22261                                 Register(rn),
22262                                 Register(rm));
22263                          break;
22264                        }
22265                        default: {
22266                          if (((instr & 0xf000) == 0xf000)) {
22267                            UnallocatedT32(instr);
22268                            return;
22269                          }
22270                          unsigned rd = (instr >> 8) & 0xf;
22271                          unsigned rn = (instr >> 16) & 0xf;
22272                          unsigned rm = instr & 0xf;
22273                          unsigned ra = (instr >> 12) & 0xf;
22274                          // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22275                          smlawt(CurrentCond(),
22276                                 Register(rd),
22277                                 Register(rn),
22278                                 Register(rm),
22279                                 Register(ra));
22280                          break;
22281                        }
22282                      }
22283                      break;
22284                    }
22285                    case 0x00400000: {
22286                      // 0xfb500000
22287                      switch (instr & 0x0000f000) {
22288                        case 0x0000f000: {
22289                          // 0xfb50f000
22290                          unsigned rd = (instr >> 8) & 0xf;
22291                          unsigned rn = (instr >> 16) & 0xf;
22292                          unsigned rm = instr & 0xf;
22293                          // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22294                          smmul(CurrentCond(),
22295                                Register(rd),
22296                                Register(rn),
22297                                Register(rm));
22298                          break;
22299                        }
22300                        default: {
22301                          if (((instr & 0xf000) == 0xf000)) {
22302                            UnallocatedT32(instr);
22303                            return;
22304                          }
22305                          unsigned rd = (instr >> 8) & 0xf;
22306                          unsigned rn = (instr >> 16) & 0xf;
22307                          unsigned rm = instr & 0xf;
22308                          unsigned ra = (instr >> 12) & 0xf;
22309                          // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22310                          smmla(CurrentCond(),
22311                                Register(rd),
22312                                Register(rn),
22313                                Register(rm),
22314                                Register(ra));
22315                          break;
22316                        }
22317                      }
22318                      break;
22319                    }
22320                    case 0x00400010: {
22321                      // 0xfb500010
22322                      switch (instr & 0x0000f000) {
22323                        case 0x0000f000: {
22324                          // 0xfb50f010
22325                          unsigned rd = (instr >> 8) & 0xf;
22326                          unsigned rn = (instr >> 16) & 0xf;
22327                          unsigned rm = instr & 0xf;
22328                          // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22329                          smmulr(CurrentCond(),
22330                                 Register(rd),
22331                                 Register(rn),
22332                                 Register(rm));
22333                          break;
22334                        }
22335                        default: {
22336                          if (((instr & 0xf000) == 0xf000)) {
22337                            UnallocatedT32(instr);
22338                            return;
22339                          }
22340                          unsigned rd = (instr >> 8) & 0xf;
22341                          unsigned rn = (instr >> 16) & 0xf;
22342                          unsigned rm = instr & 0xf;
22343                          unsigned ra = (instr >> 12) & 0xf;
22344                          // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22345                          smmlar(CurrentCond(),
22346                                 Register(rd),
22347                                 Register(rn),
22348                                 Register(rm),
22349                                 Register(ra));
22350                          break;
22351                        }
22352                      }
22353                      break;
22354                    }
22355                    case 0x00600000: {
22356                      // 0xfb700000
22357                      switch (instr & 0x0000f000) {
22358                        case 0x0000f000: {
22359                          // 0xfb70f000
22360                          unsigned rd = (instr >> 8) & 0xf;
22361                          unsigned rn = (instr >> 16) & 0xf;
22362                          unsigned rm = instr & 0xf;
22363                          // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22364                          usad8(CurrentCond(),
22365                                Register(rd),
22366                                Register(rn),
22367                                Register(rm));
22368                          break;
22369                        }
22370                        default: {
22371                          if (((instr & 0xf000) == 0xf000)) {
22372                            UnallocatedT32(instr);
22373                            return;
22374                          }
22375                          unsigned rd = (instr >> 8) & 0xf;
22376                          unsigned rn = (instr >> 16) & 0xf;
22377                          unsigned rm = instr & 0xf;
22378                          unsigned ra = (instr >> 12) & 0xf;
22379                          // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22380                          usada8(CurrentCond(),
22381                                 Register(rd),
22382                                 Register(rn),
22383                                 Register(rm),
22384                                 Register(ra));
22385                          break;
22386                        }
22387                      }
22388                      break;
22389                    }
22390                    default:
22391                      UnallocatedT32(instr);
22392                      break;
22393                  }
22394                  break;
22395                }
22396                case 0x11800000: {
22397                  // 0xfb800000
22398                  switch (instr & 0x006000f0) {
22399                    case 0x00000000: {
22400                      // 0xfb800000
22401                      unsigned rdlo = (instr >> 12) & 0xf;
22402                      unsigned rdhi = (instr >> 8) & 0xf;
22403                      unsigned rn = (instr >> 16) & 0xf;
22404                      unsigned rm = instr & 0xf;
22405                      // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22406                      smull(CurrentCond(),
22407                            Register(rdlo),
22408                            Register(rdhi),
22409                            Register(rn),
22410                            Register(rm));
22411                      break;
22412                    }
22413                    case 0x00200000: {
22414                      // 0xfba00000
22415                      unsigned rdlo = (instr >> 12) & 0xf;
22416                      unsigned rdhi = (instr >> 8) & 0xf;
22417                      unsigned rn = (instr >> 16) & 0xf;
22418                      unsigned rm = instr & 0xf;
22419                      // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22420                      umull(CurrentCond(),
22421                            Register(rdlo),
22422                            Register(rdhi),
22423                            Register(rn),
22424                            Register(rm));
22425                      break;
22426                    }
22427                    case 0x00400000: {
22428                      // 0xfbc00000
22429                      unsigned rdlo = (instr >> 12) & 0xf;
22430                      unsigned rdhi = (instr >> 8) & 0xf;
22431                      unsigned rn = (instr >> 16) & 0xf;
22432                      unsigned rm = instr & 0xf;
22433                      // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22434                      smlal(CurrentCond(),
22435                            Register(rdlo),
22436                            Register(rdhi),
22437                            Register(rn),
22438                            Register(rm));
22439                      break;
22440                    }
22441                    case 0x00400080: {
22442                      // 0xfbc00080
22443                      unsigned rdlo = (instr >> 12) & 0xf;
22444                      unsigned rdhi = (instr >> 8) & 0xf;
22445                      unsigned rn = (instr >> 16) & 0xf;
22446                      unsigned rm = instr & 0xf;
22447                      // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22448                      smlalbb(CurrentCond(),
22449                              Register(rdlo),
22450                              Register(rdhi),
22451                              Register(rn),
22452                              Register(rm));
22453                      break;
22454                    }
22455                    case 0x00400090: {
22456                      // 0xfbc00090
22457                      unsigned rdlo = (instr >> 12) & 0xf;
22458                      unsigned rdhi = (instr >> 8) & 0xf;
22459                      unsigned rn = (instr >> 16) & 0xf;
22460                      unsigned rm = instr & 0xf;
22461                      // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22462                      smlalbt(CurrentCond(),
22463                              Register(rdlo),
22464                              Register(rdhi),
22465                              Register(rn),
22466                              Register(rm));
22467                      break;
22468                    }
22469                    case 0x004000a0: {
22470                      // 0xfbc000a0
22471                      unsigned rdlo = (instr >> 12) & 0xf;
22472                      unsigned rdhi = (instr >> 8) & 0xf;
22473                      unsigned rn = (instr >> 16) & 0xf;
22474                      unsigned rm = instr & 0xf;
22475                      // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22476                      smlaltb(CurrentCond(),
22477                              Register(rdlo),
22478                              Register(rdhi),
22479                              Register(rn),
22480                              Register(rm));
22481                      break;
22482                    }
22483                    case 0x004000b0: {
22484                      // 0xfbc000b0
22485                      unsigned rdlo = (instr >> 12) & 0xf;
22486                      unsigned rdhi = (instr >> 8) & 0xf;
22487                      unsigned rn = (instr >> 16) & 0xf;
22488                      unsigned rm = instr & 0xf;
22489                      // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22490                      smlaltt(CurrentCond(),
22491                              Register(rdlo),
22492                              Register(rdhi),
22493                              Register(rn),
22494                              Register(rm));
22495                      break;
22496                    }
22497                    case 0x004000c0: {
22498                      // 0xfbc000c0
22499                      unsigned rdlo = (instr >> 12) & 0xf;
22500                      unsigned rdhi = (instr >> 8) & 0xf;
22501                      unsigned rn = (instr >> 16) & 0xf;
22502                      unsigned rm = instr & 0xf;
22503                      // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22504                      smlald(CurrentCond(),
22505                             Register(rdlo),
22506                             Register(rdhi),
22507                             Register(rn),
22508                             Register(rm));
22509                      break;
22510                    }
22511                    case 0x004000d0: {
22512                      // 0xfbc000d0
22513                      unsigned rdlo = (instr >> 12) & 0xf;
22514                      unsigned rdhi = (instr >> 8) & 0xf;
22515                      unsigned rn = (instr >> 16) & 0xf;
22516                      unsigned rm = instr & 0xf;
22517                      // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22518                      smlaldx(CurrentCond(),
22519                              Register(rdlo),
22520                              Register(rdhi),
22521                              Register(rn),
22522                              Register(rm));
22523                      break;
22524                    }
22525                    case 0x00600000: {
22526                      // 0xfbe00000
22527                      unsigned rdlo = (instr >> 12) & 0xf;
22528                      unsigned rdhi = (instr >> 8) & 0xf;
22529                      unsigned rn = (instr >> 16) & 0xf;
22530                      unsigned rm = instr & 0xf;
22531                      // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22532                      umlal(CurrentCond(),
22533                            Register(rdlo),
22534                            Register(rdhi),
22535                            Register(rn),
22536                            Register(rm));
22537                      break;
22538                    }
22539                    case 0x00600060: {
22540                      // 0xfbe00060
22541                      unsigned rdlo = (instr >> 12) & 0xf;
22542                      unsigned rdhi = (instr >> 8) & 0xf;
22543                      unsigned rn = (instr >> 16) & 0xf;
22544                      unsigned rm = instr & 0xf;
22545                      // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22546                      umaal(CurrentCond(),
22547                            Register(rdlo),
22548                            Register(rdhi),
22549                            Register(rn),
22550                            Register(rm));
22551                      break;
22552                    }
22553                    default:
22554                      UnallocatedT32(instr);
22555                      break;
22556                  }
22557                  break;
22558                }
22559                case 0x11900000: {
22560                  // 0xfb900000
22561                  switch (instr & 0x006000f0) {
22562                    case 0x000000f0: {
22563                      // 0xfb9000f0
22564                      unsigned rd = (instr >> 8) & 0xf;
22565                      unsigned rn = (instr >> 16) & 0xf;
22566                      unsigned rm = instr & 0xf;
22567                      // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22568                      sdiv(CurrentCond(),
22569                           Register(rd),
22570                           Register(rn),
22571                           Register(rm));
22572                      if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) {
22573                        UnpredictableT32(instr);
22574                      }
22575                      break;
22576                    }
22577                    case 0x002000f0: {
22578                      // 0xfbb000f0
22579                      unsigned rd = (instr >> 8) & 0xf;
22580                      unsigned rn = (instr >> 16) & 0xf;
22581                      unsigned rm = instr & 0xf;
22582                      // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22583                      udiv(CurrentCond(),
22584                           Register(rd),
22585                           Register(rn),
22586                           Register(rm));
22587                      if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) {
22588                        UnpredictableT32(instr);
22589                      }
22590                      break;
22591                    }
22592                    case 0x004000c0: {
22593                      // 0xfbd000c0
22594                      unsigned rdlo = (instr >> 12) & 0xf;
22595                      unsigned rdhi = (instr >> 8) & 0xf;
22596                      unsigned rn = (instr >> 16) & 0xf;
22597                      unsigned rm = instr & 0xf;
22598                      // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22599                      smlsld(CurrentCond(),
22600                             Register(rdlo),
22601                             Register(rdhi),
22602                             Register(rn),
22603                             Register(rm));
22604                      break;
22605                    }
22606                    case 0x004000d0: {
22607                      // 0xfbd000d0
22608                      unsigned rdlo = (instr >> 12) & 0xf;
22609                      unsigned rdhi = (instr >> 8) & 0xf;
22610                      unsigned rn = (instr >> 16) & 0xf;
22611                      unsigned rm = instr & 0xf;
22612                      // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22613                      smlsldx(CurrentCond(),
22614                              Register(rdlo),
22615                              Register(rdhi),
22616                              Register(rn),
22617                              Register(rm));
22618                      break;
22619                    }
22620                    default:
22621                      UnallocatedT32(instr);
22622                      break;
22623                  }
22624                  break;
22625                }
22626              }
22627              break;
22628            }
22629            case 0x04000000: {
22630              // 0xec000000
22631              switch (instr & 0x11100000) {
22632                case 0x00000000: {
22633                  // 0xec000000
22634                  switch (instr & 0x00000e00) {
22635                    case 0x00000a00: {
22636                      // 0xec000a00
22637                      switch (instr & 0x00800100) {
22638                        case 0x00000000: {
22639                          // 0xec000a00
22640                          if ((instr & 0x006000d0) == 0x00400010) {
22641                            unsigned rm = ExtractSRegister(instr, 5, 0);
22642                            unsigned rt = (instr >> 12) & 0xf;
22643                            unsigned rt2 = (instr >> 16) & 0xf;
22644                            // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1
22645                            vmov(CurrentCond(),
22646                                 SRegister(rm),
22647                                 SRegister(rm + 1),
22648                                 Register(rt),
22649                                 Register(rt2));
22650                          } else {
22651                            UnallocatedT32(instr);
22652                          }
22653                          break;
22654                        }
22655                        case 0x00000100: {
22656                          // 0xec000b00
22657                          if ((instr & 0x006000d0) == 0x00400010) {
22658                            unsigned rm = ExtractDRegister(instr, 5, 0);
22659                            unsigned rt = (instr >> 12) & 0xf;
22660                            unsigned rt2 = (instr >> 16) & 0xf;
22661                            // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1
22662                            vmov(CurrentCond(),
22663                                 DRegister(rm),
22664                                 Register(rt),
22665                                 Register(rt2));
22666                          } else {
22667                            UnallocatedT32(instr);
22668                          }
22669                          break;
22670                        }
22671                        case 0x00800000: {
22672                          // 0xec800a00
22673                          unsigned rn = (instr >> 16) & 0xf;
22674                          WriteBack write_back((instr >> 21) & 0x1);
22675                          unsigned first = ExtractSRegister(instr, 22, 12);
22676                          unsigned len = instr & 0xff;
22677                          // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
22678                          vstm(CurrentCond(),
22679                               kDataTypeValueNone,
22680                               Register(rn),
22681                               write_back,
22682                               SRegisterList(SRegister(first), len));
22683                          if ((len == 0) ||
22684                              ((first + len) > kNumberOfSRegisters)) {
22685                            UnpredictableT32(instr);
22686                          }
22687                          break;
22688                        }
22689                        case 0x00800100: {
22690                          // 0xec800b00
22691                          switch (instr & 0x00000001) {
22692                            case 0x00000000: {
22693                              // 0xec800b00
22694                              unsigned rn = (instr >> 16) & 0xf;
22695                              WriteBack write_back((instr >> 21) & 0x1);
22696                              unsigned first = ExtractDRegister(instr, 22, 12);
22697                              unsigned imm8 = (instr & 0xff);
22698                              unsigned len = imm8 / 2;
22699                              unsigned end = first + len;
22700                              // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 NOLINT(whitespace/line_length)
22701                              vstm(CurrentCond(),
22702                                   kDataTypeValueNone,
22703                                   Register(rn),
22704                                   write_back,
22705                                   DRegisterList(DRegister(first), len));
22706                              if ((len == 0) || (len > 16) ||
22707                                  (end > kMaxNumberOfDRegisters)) {
22708                                UnpredictableT32(instr);
22709                              }
22710                              break;
22711                            }
22712                            case 0x00000001: {
22713                              // 0xec800b01
22714                              unsigned rn = (instr >> 16) & 0xf;
22715                              WriteBack write_back((instr >> 21) & 0x1);
22716                              unsigned first = ExtractDRegister(instr, 22, 12);
22717                              unsigned imm8 = (instr & 0xff);
22718                              unsigned len = imm8 / 2;
22719                              unsigned end = first + len;
22720                              // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
22721                              fstmiax(CurrentCond(),
22722                                      Register(rn),
22723                                      write_back,
22724                                      DRegisterList(DRegister(first), len));
22725                              if ((len == 0) || (len > 16) || (end > 16)) {
22726                                UnpredictableT32(instr);
22727                              }
22728                              break;
22729                            }
22730                          }
22731                          break;
22732                        }
22733                      }
22734                      break;
22735                    }
22736                    default: {
22737                      switch (instr & 0x00200000) {
22738                        case 0x00000000: {
22739                          // 0xec000000
22740                          switch (instr & 0x00800000) {
22741                            case 0x00000000: {
22742                              // 0xec000000
22743                              if ((instr & 0x00400000) == 0x00400000) {
22744                                if (((instr & 0xe00) == 0xa00)) {
22745                                  UnallocatedT32(instr);
22746                                  return;
22747                                }
22748                                UnimplementedT32_32("MCRR", instr);
22749                              } else {
22750                                UnallocatedT32(instr);
22751                              }
22752                              break;
22753                            }
22754                            case 0x00800000: {
22755                              // 0xec800000
22756                              if (((instr & 0xe00) == 0xa00)) {
22757                                UnallocatedT32(instr);
22758                                return;
22759                              }
22760                              UnimplementedT32_32("STC", instr);
22761                              break;
22762                            }
22763                          }
22764                          break;
22765                        }
22766                        case 0x00200000: {
22767                          // 0xec200000
22768                          if (((instr & 0xe00) == 0xa00)) {
22769                            UnallocatedT32(instr);
22770                            return;
22771                          }
22772                          UnimplementedT32_32("STC", instr);
22773                          break;
22774                        }
22775                      }
22776                      break;
22777                    }
22778                  }
22779                  break;
22780                }
22781                case 0x00100000: {
22782                  // 0xec100000
22783                  switch (instr & 0x00000e00) {
22784                    case 0x00000a00: {
22785                      // 0xec100a00
22786                      switch (instr & 0x00800100) {
22787                        case 0x00000000: {
22788                          // 0xec100a00
22789                          if ((instr & 0x006000d0) == 0x00400010) {
22790                            unsigned rt = (instr >> 12) & 0xf;
22791                            unsigned rt2 = (instr >> 16) & 0xf;
22792                            unsigned rm = ExtractSRegister(instr, 5, 0);
22793                            // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1
22794                            vmov(CurrentCond(),
22795                                 Register(rt),
22796                                 Register(rt2),
22797                                 SRegister(rm),
22798                                 SRegister(rm + 1));
22799                          } else {
22800                            UnallocatedT32(instr);
22801                          }
22802                          break;
22803                        }
22804                        case 0x00000100: {
22805                          // 0xec100b00
22806                          if ((instr & 0x006000d0) == 0x00400010) {
22807                            unsigned rt = (instr >> 12) & 0xf;
22808                            unsigned rt2 = (instr >> 16) & 0xf;
22809                            unsigned rm = ExtractDRegister(instr, 5, 0);
22810                            // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1
22811                            vmov(CurrentCond(),
22812                                 Register(rt),
22813                                 Register(rt2),
22814                                 DRegister(rm));
22815                          } else {
22816                            UnallocatedT32(instr);
22817                          }
22818                          break;
22819                        }
22820                        case 0x00800000: {
22821                          // 0xec900a00
22822                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
22823                               Uint32(0x1)) &&
22824                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
22825                               Uint32(0xd))) {
22826                            unsigned first = ExtractSRegister(instr, 22, 12);
22827                            unsigned len = instr & 0xff;
22828                            // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2
22829                            vpop(CurrentCond(),
22830                                 kDataTypeValueNone,
22831                                 SRegisterList(SRegister(first), len));
22832                            if ((len == 0) ||
22833                                ((first + len) > kNumberOfSRegisters)) {
22834                              UnpredictableT32(instr);
22835                            }
22836                            return;
22837                          }
22838                          unsigned rn = (instr >> 16) & 0xf;
22839                          WriteBack write_back((instr >> 21) & 0x1);
22840                          unsigned first = ExtractSRegister(instr, 22, 12);
22841                          unsigned len = instr & 0xff;
22842                          // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
22843                          vldm(CurrentCond(),
22844                               kDataTypeValueNone,
22845                               Register(rn),
22846                               write_back,
22847                               SRegisterList(SRegister(first), len));
22848                          if ((len == 0) ||
22849                              ((first + len) > kNumberOfSRegisters)) {
22850                            UnpredictableT32(instr);
22851                          }
22852                          break;
22853                        }
22854                        case 0x00800100: {
22855                          // 0xec900b00
22856                          switch (instr & 0x00000001) {
22857                            case 0x00000000: {
22858                              // 0xec900b00
22859                              if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
22860                                   Uint32(0x1)) &&
22861                                  ((Uint32((instr >> 16)) & Uint32(0xf)) ==
22862                                   Uint32(0xd))) {
22863                                unsigned first =
22864                                    ExtractDRegister(instr, 22, 12);
22865                                unsigned imm8 = (instr & 0xff);
22866                                unsigned len = imm8 / 2;
22867                                unsigned end = first + len;
22868                                // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1
22869                                vpop(CurrentCond(),
22870                                     kDataTypeValueNone,
22871                                     DRegisterList(DRegister(first), len));
22872                                if ((len == 0) || (len > 16) ||
22873                                    (end > kMaxNumberOfDRegisters)) {
22874                                  UnpredictableT32(instr);
22875                                }
22876                                return;
22877                              }
22878                              unsigned rn = (instr >> 16) & 0xf;
22879                              WriteBack write_back((instr >> 21) & 0x1);
22880                              unsigned first = ExtractDRegister(instr, 22, 12);
22881                              unsigned imm8 = (instr & 0xff);
22882                              unsigned len = imm8 / 2;
22883                              unsigned end = first + len;
22884                              // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 NOLINT(whitespace/line_length)
22885                              vldm(CurrentCond(),
22886                                   kDataTypeValueNone,
22887                                   Register(rn),
22888                                   write_back,
22889                                   DRegisterList(DRegister(first), len));
22890                              if ((len == 0) || (len > 16) ||
22891                                  (end > kMaxNumberOfDRegisters)) {
22892                                UnpredictableT32(instr);
22893                              }
22894                              break;
22895                            }
22896                            case 0x00000001: {
22897                              // 0xec900b01
22898                              unsigned rn = (instr >> 16) & 0xf;
22899                              WriteBack write_back((instr >> 21) & 0x1);
22900                              unsigned first = ExtractDRegister(instr, 22, 12);
22901                              unsigned imm8 = (instr & 0xff);
22902                              unsigned len = imm8 / 2;
22903                              unsigned end = first + len;
22904                              // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
22905                              fldmiax(CurrentCond(),
22906                                      Register(rn),
22907                                      write_back,
22908                                      DRegisterList(DRegister(first), len));
22909                              if ((len == 0) || (len > 16) || (end > 16)) {
22910                                UnpredictableT32(instr);
22911                              }
22912                              break;
22913                            }
22914                          }
22915                          break;
22916                        }
22917                      }
22918                      break;
22919                    }
22920                    default: {
22921                      switch (instr & 0x00200000) {
22922                        case 0x00000000: {
22923                          // 0xec100000
22924                          switch (instr & 0x00800000) {
22925                            case 0x00000000: {
22926                              // 0xec100000
22927                              if ((instr & 0x00400000) == 0x00400000) {
22928                                if (((instr & 0xe00) == 0xa00)) {
22929                                  UnallocatedT32(instr);
22930                                  return;
22931                                }
22932                                UnimplementedT32_32("MRRC", instr);
22933                              } else {
22934                                UnallocatedT32(instr);
22935                              }
22936                              break;
22937                            }
22938                            case 0x00800000: {
22939                              // 0xec900000
22940                              if (((instr & 0xf0000) == 0xf0000) ||
22941                                  ((instr & 0xe00) == 0xa00)) {
22942                                UnallocatedT32(instr);
22943                                return;
22944                              }
22945                              UnimplementedT32_32("LDC", instr);
22946                              break;
22947                            }
22948                          }
22949                          break;
22950                        }
22951                        case 0x00200000: {
22952                          // 0xec300000
22953                          if (((instr & 0xf0000) == 0xf0000) ||
22954                              ((instr & 0xe00) == 0xa00)) {
22955                            UnallocatedT32(instr);
22956                            return;
22957                          }
22958                          UnimplementedT32_32("LDC", instr);
22959                          break;
22960                        }
22961                      }
22962                      break;
22963                    }
22964                  }
22965                  break;
22966                }
22967                case 0x01000000: {
22968                  // 0xed000000
22969                  switch (instr & 0x00200000) {
22970                    case 0x00000000: {
22971                      // 0xed000000
22972                      switch (instr & 0x00000e00) {
22973                        case 0x00000a00: {
22974                          // 0xed000a00
22975                          switch (instr & 0x00000100) {
22976                            case 0x00000000: {
22977                              // 0xed000a00
22978                              unsigned rd = ExtractSRegister(instr, 22, 12);
22979                              unsigned rn = (instr >> 16) & 0xf;
22980                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
22981                                                                     : plus);
22982                              int32_t offset = (instr & 0xff) << 2;
22983                              // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
22984                              vstr(CurrentCond(),
22985                                   Untyped32,
22986                                   SRegister(rd),
22987                                   MemOperand(Register(rn),
22988                                              sign,
22989                                              offset,
22990                                              Offset));
22991                              break;
22992                            }
22993                            case 0x00000100: {
22994                              // 0xed000b00
22995                              unsigned rd = ExtractDRegister(instr, 22, 12);
22996                              unsigned rn = (instr >> 16) & 0xf;
22997                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
22998                                                                     : plus);
22999                              int32_t offset = (instr & 0xff) << 2;
23000                              // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
23001                              vstr(CurrentCond(),
23002                                   Untyped64,
23003                                   DRegister(rd),
23004                                   MemOperand(Register(rn),
23005                                              sign,
23006                                              offset,
23007                                              Offset));
23008                              break;
23009                            }
23010                          }
23011                          break;
23012                        }
23013                        default: {
23014                          if (((instr & 0xe00) == 0xa00)) {
23015                            UnallocatedT32(instr);
23016                            return;
23017                          }
23018                          UnimplementedT32_32("STC", instr);
23019                          break;
23020                        }
23021                      }
23022                      break;
23023                    }
23024                    case 0x00200000: {
23025                      // 0xed200000
23026                      switch (instr & 0x00000e00) {
23027                        case 0x00000a00: {
23028                          // 0xed200a00
23029                          switch (instr & 0x00800100) {
23030                            case 0x00000000: {
23031                              // 0xed200a00
23032                              if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
23033                                   Uint32(0xd))) {
23034                                unsigned first =
23035                                    ExtractSRegister(instr, 22, 12);
23036                                unsigned len = instr & 0xff;
23037                                // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2
23038                                vpush(CurrentCond(),
23039                                      kDataTypeValueNone,
23040                                      SRegisterList(SRegister(first), len));
23041                                if ((len == 0) ||
23042                                    ((first + len) > kNumberOfSRegisters)) {
23043                                  UnpredictableT32(instr);
23044                                }
23045                                return;
23046                              }
23047                              unsigned rn = (instr >> 16) & 0xf;
23048                              unsigned first = ExtractSRegister(instr, 22, 12);
23049                              unsigned len = instr & 0xff;
23050                              // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 NOLINT(whitespace/line_length)
23051                              vstmdb(CurrentCond(),
23052                                     kDataTypeValueNone,
23053                                     Register(rn),
23054                                     WriteBack(WRITE_BACK),
23055                                     SRegisterList(SRegister(first), len));
23056                              if ((len == 0) ||
23057                                  ((first + len) > kNumberOfSRegisters)) {
23058                                UnpredictableT32(instr);
23059                              }
23060                              break;
23061                            }
23062                            case 0x00000100: {
23063                              // 0xed200b00
23064                              switch (instr & 0x00000001) {
23065                                case 0x00000000: {
23066                                  // 0xed200b00
23067                                  if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
23068                                       Uint32(0xd))) {
23069                                    unsigned first =
23070                                        ExtractDRegister(instr, 22, 12);
23071                                    unsigned imm8 = (instr & 0xff);
23072                                    unsigned len = imm8 / 2;
23073                                    unsigned end = first + len;
23074                                    // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1
23075                                    vpush(CurrentCond(),
23076                                          kDataTypeValueNone,
23077                                          DRegisterList(DRegister(first), len));
23078                                    if ((len == 0) || (len > 16) ||
23079                                        (end > kMaxNumberOfDRegisters)) {
23080                                      UnpredictableT32(instr);
23081                                    }
23082                                    return;
23083                                  }
23084                                  unsigned rn = (instr >> 16) & 0xf;
23085                                  unsigned first =
23086                                      ExtractDRegister(instr, 22, 12);
23087                                  unsigned imm8 = (instr & 0xff);
23088                                  unsigned len = imm8 / 2;
23089                                  unsigned end = first + len;
23090                                  // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 NOLINT(whitespace/line_length)
23091                                  vstmdb(CurrentCond(),
23092                                         kDataTypeValueNone,
23093                                         Register(rn),
23094                                         WriteBack(WRITE_BACK),
23095                                         DRegisterList(DRegister(first), len));
23096                                  if ((len == 0) || (len > 16) ||
23097                                      (end > kMaxNumberOfDRegisters)) {
23098                                    UnpredictableT32(instr);
23099                                  }
23100                                  break;
23101                                }
23102                                case 0x00000001: {
23103                                  // 0xed200b01
23104                                  unsigned rn = (instr >> 16) & 0xf;
23105                                  unsigned first =
23106                                      ExtractDRegister(instr, 22, 12);
23107                                  unsigned imm8 = (instr & 0xff);
23108                                  unsigned len = imm8 / 2;
23109                                  unsigned end = first + len;
23110                                  // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
23111                                  fstmdbx(CurrentCond(),
23112                                          Register(rn),
23113                                          WriteBack(WRITE_BACK),
23114                                          DRegisterList(DRegister(first), len));
23115                                  if ((len == 0) || (len > 16) || (end > 16)) {
23116                                    UnpredictableT32(instr);
23117                                  }
23118                                  break;
23119                                }
23120                              }
23121                              break;
23122                            }
23123                            default:
23124                              UnallocatedT32(instr);
23125                              break;
23126                          }
23127                          break;
23128                        }
23129                        default: {
23130                          if (((instr & 0xe00) == 0xa00)) {
23131                            UnallocatedT32(instr);
23132                            return;
23133                          }
23134                          UnimplementedT32_32("STC", instr);
23135                          break;
23136                        }
23137                      }
23138                      break;
23139                    }
23140                  }
23141                  break;
23142                }
23143                case 0x01100000: {
23144                  // 0xed100000
23145                  switch (instr & 0x00200000) {
23146                    case 0x00000000: {
23147                      // 0xed100000
23148                      switch (instr & 0x000f0000) {
23149                        case 0x000f0000: {
23150                          // 0xed1f0000
23151                          switch (instr & 0x00000e00) {
23152                            case 0x00000a00: {
23153                              // 0xed1f0a00
23154                              switch (instr & 0x00000100) {
23155                                case 0x00000000: {
23156                                  // 0xed1f0a00
23157                                  unsigned rd = ExtractSRegister(instr, 22, 12);
23158                                  uint32_t U = (instr >> 23) & 0x1;
23159                                  int32_t imm = instr & 0xff;
23160                                  imm <<= 2;
23161                                  if (U == 0) imm = -imm;
23162                                  bool minus_zero = (imm == 0) && (U == 0);
23163                                  Location location(imm, kT32PcDelta);
23164                                  // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2
23165                                  if (minus_zero) {
23166                                    vldr(CurrentCond(),
23167                                         Untyped32,
23168                                         SRegister(rd),
23169                                         MemOperand(pc, minus, 0));
23170                                  } else {
23171                                    vldr(CurrentCond(),
23172                                         Untyped32,
23173                                         SRegister(rd),
23174                                         &location);
23175                                  }
23176                                  break;
23177                                }
23178                                case 0x00000100: {
23179                                  // 0xed1f0b00
23180                                  unsigned rd = ExtractDRegister(instr, 22, 12);
23181                                  uint32_t U = (instr >> 23) & 0x1;
23182                                  int32_t imm = instr & 0xff;
23183                                  imm <<= 2;
23184                                  if (U == 0) imm = -imm;
23185                                  bool minus_zero = (imm == 0) && (U == 0);
23186                                  Location location(imm, kT32PcDelta);
23187                                  // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1
23188                                  if (minus_zero) {
23189                                    vldr(CurrentCond(),
23190                                         Untyped64,
23191                                         DRegister(rd),
23192                                         MemOperand(pc, minus, 0));
23193                                  } else {
23194                                    vldr(CurrentCond(),
23195                                         Untyped64,
23196                                         DRegister(rd),
23197                                         &location);
23198                                  }
23199                                  break;
23200                                }
23201                              }
23202                              break;
23203                            }
23204                            default: {
23205                              if (((instr & 0xe00) == 0xa00)) {
23206                                UnallocatedT32(instr);
23207                                return;
23208                              }
23209                              UnimplementedT32_32("LDC", instr);
23210                              break;
23211                            }
23212                          }
23213                          break;
23214                        }
23215                        default: {
23216                          switch (instr & 0x00000e00) {
23217                            case 0x00000a00: {
23218                              // 0xed100a00
23219                              switch (instr & 0x00000100) {
23220                                case 0x00000000: {
23221                                  // 0xed100a00
23222                                  if (((instr & 0xf0000) == 0xf0000)) {
23223                                    UnallocatedT32(instr);
23224                                    return;
23225                                  }
23226                                  unsigned rd = ExtractSRegister(instr, 22, 12);
23227                                  unsigned rn = (instr >> 16) & 0xf;
23228                                  Sign sign((((instr >> 23) & 0x1) == 0)
23229                                                ? minus
23230                                                : plus);
23231                                  int32_t offset = (instr & 0xff) << 2;
23232                                  // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
23233                                  vldr(CurrentCond(),
23234                                       Untyped32,
23235                                       SRegister(rd),
23236                                       MemOperand(Register(rn),
23237                                                  sign,
23238                                                  offset,
23239                                                  Offset));
23240                                  break;
23241                                }
23242                                case 0x00000100: {
23243                                  // 0xed100b00
23244                                  if (((instr & 0xf0000) == 0xf0000)) {
23245                                    UnallocatedT32(instr);
23246                                    return;
23247                                  }
23248                                  unsigned rd = ExtractDRegister(instr, 22, 12);
23249                                  unsigned rn = (instr >> 16) & 0xf;
23250                                  Sign sign((((instr >> 23) & 0x1) == 0)
23251                                                ? minus
23252                                                : plus);
23253                                  int32_t offset = (instr & 0xff) << 2;
23254                                  // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
23255                                  vldr(CurrentCond(),
23256                                       Untyped64,
23257                                       DRegister(rd),
23258                                       MemOperand(Register(rn),
23259                                                  sign,
23260                                                  offset,
23261                                                  Offset));
23262                                  break;
23263                                }
23264                              }
23265                              break;
23266                            }
23267                            default: {
23268                              if (((instr & 0xf0000) == 0xf0000) ||
23269                                  ((instr & 0xe00) == 0xa00)) {
23270                                UnallocatedT32(instr);
23271                                return;
23272                              }
23273                              UnimplementedT32_32("LDC", instr);
23274                              break;
23275                            }
23276                          }
23277                          break;
23278                        }
23279                      }
23280                      break;
23281                    }
23282                    case 0x00200000: {
23283                      // 0xed300000
23284                      switch (instr & 0x00000e00) {
23285                        case 0x00000a00: {
23286                          // 0xed300a00
23287                          switch (instr & 0x00800100) {
23288                            case 0x00000000: {
23289                              // 0xed300a00
23290                              unsigned rn = (instr >> 16) & 0xf;
23291                              unsigned first = ExtractSRegister(instr, 22, 12);
23292                              unsigned len = instr & 0xff;
23293                              // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 NOLINT(whitespace/line_length)
23294                              vldmdb(CurrentCond(),
23295                                     kDataTypeValueNone,
23296                                     Register(rn),
23297                                     WriteBack(WRITE_BACK),
23298                                     SRegisterList(SRegister(first), len));
23299                              if ((len == 0) ||
23300                                  ((first + len) > kNumberOfSRegisters)) {
23301                                UnpredictableT32(instr);
23302                              }
23303                              break;
23304                            }
23305                            case 0x00000100: {
23306                              // 0xed300b00
23307                              switch (instr & 0x00000001) {
23308                                case 0x00000000: {
23309                                  // 0xed300b00
23310                                  unsigned rn = (instr >> 16) & 0xf;
23311                                  unsigned first =
23312                                      ExtractDRegister(instr, 22, 12);
23313                                  unsigned imm8 = (instr & 0xff);
23314                                  unsigned len = imm8 / 2;
23315                                  unsigned end = first + len;
23316                                  // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 NOLINT(whitespace/line_length)
23317                                  vldmdb(CurrentCond(),
23318                                         kDataTypeValueNone,
23319                                         Register(rn),
23320                                         WriteBack(WRITE_BACK),
23321                                         DRegisterList(DRegister(first), len));
23322                                  if ((len == 0) || (len > 16) ||
23323                                      (end > kMaxNumberOfDRegisters)) {
23324                                    UnpredictableT32(instr);
23325                                  }
23326                                  break;
23327                                }
23328                                case 0x00000001: {
23329                                  // 0xed300b01
23330                                  unsigned rn = (instr >> 16) & 0xf;
23331                                  unsigned first =
23332                                      ExtractDRegister(instr, 22, 12);
23333                                  unsigned imm8 = (instr & 0xff);
23334                                  unsigned len = imm8 / 2;
23335                                  unsigned end = first + len;
23336                                  // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
23337                                  fldmdbx(CurrentCond(),
23338                                          Register(rn),
23339                                          WriteBack(WRITE_BACK),
23340                                          DRegisterList(DRegister(first), len));
23341                                  if ((len == 0) || (len > 16) || (end > 16)) {
23342                                    UnpredictableT32(instr);
23343                                  }
23344                                  break;
23345                                }
23346                              }
23347                              break;
23348                            }
23349                            default:
23350                              UnallocatedT32(instr);
23351                              break;
23352                          }
23353                          break;
23354                        }
23355                        default: {
23356                          if (((instr & 0xf0000) == 0xf0000) ||
23357                              ((instr & 0xe00) == 0xa00)) {
23358                            UnallocatedT32(instr);
23359                            return;
23360                          }
23361                          UnimplementedT32_32("LDC", instr);
23362                          break;
23363                        }
23364                      }
23365                      break;
23366                    }
23367                  }
23368                  break;
23369                }
23370                case 0x10000000: {
23371                  // 0xfc000000
23372                  switch (instr & 0x00200000) {
23373                    case 0x00000000: {
23374                      // 0xfc000000
23375                      switch (instr & 0x00800000) {
23376                        case 0x00000000: {
23377                          // 0xfc000000
23378                          if ((instr & 0x00400000) == 0x00400000) {
23379                            if (((instr & 0xe00) == 0xa00)) {
23380                              UnallocatedT32(instr);
23381                              return;
23382                            }
23383                            UnimplementedT32_32("MCRR2", instr);
23384                          } else {
23385                            UnallocatedT32(instr);
23386                          }
23387                          break;
23388                        }
23389                        case 0x00800000: {
23390                          // 0xfc800000
23391                          if (((instr & 0xe00) == 0xa00)) {
23392                            UnallocatedT32(instr);
23393                            return;
23394                          }
23395                          UnimplementedT32_32("STC2", instr);
23396                          break;
23397                        }
23398                      }
23399                      break;
23400                    }
23401                    case 0x00200000: {
23402                      // 0xfc200000
23403                      if (((instr & 0xe00) == 0xa00)) {
23404                        UnallocatedT32(instr);
23405                        return;
23406                      }
23407                      UnimplementedT32_32("STC2", instr);
23408                      break;
23409                    }
23410                  }
23411                  break;
23412                }
23413                case 0x10100000: {
23414                  // 0xfc100000
23415                  switch (instr & 0x00200000) {
23416                    case 0x00000000: {
23417                      // 0xfc100000
23418                      switch (instr & 0x00800000) {
23419                        case 0x00000000: {
23420                          // 0xfc100000
23421                          if ((instr & 0x00400000) == 0x00400000) {
23422                            if (((instr & 0xe00) == 0xa00)) {
23423                              UnallocatedT32(instr);
23424                              return;
23425                            }
23426                            UnimplementedT32_32("MRRC2", instr);
23427                          } else {
23428                            UnallocatedT32(instr);
23429                          }
23430                          break;
23431                        }
23432                        case 0x00800000: {
23433                          // 0xfc900000
23434                          if (((instr & 0xf0000) == 0xf0000) ||
23435                              ((instr & 0xe00) == 0xa00)) {
23436                            UnallocatedT32(instr);
23437                            return;
23438                          }
23439                          UnimplementedT32_32("LDC2", instr);
23440                          break;
23441                        }
23442                      }
23443                      break;
23444                    }
23445                    case 0x00200000: {
23446                      // 0xfc300000
23447                      if (((instr & 0xf0000) == 0xf0000) ||
23448                          ((instr & 0xe00) == 0xa00)) {
23449                        UnallocatedT32(instr);
23450                        return;
23451                      }
23452                      UnimplementedT32_32("LDC2", instr);
23453                      break;
23454                    }
23455                  }
23456                  break;
23457                }
23458                case 0x11000000: {
23459                  // 0xfd000000
23460                  switch (instr & 0x00200000) {
23461                    case 0x00000000: {
23462                      // 0xfd000000
23463                      if (((instr & 0xe00) == 0xa00)) {
23464                        UnallocatedT32(instr);
23465                        return;
23466                      }
23467                      UnimplementedT32_32("STC2", instr);
23468                      break;
23469                    }
23470                    case 0x00200000: {
23471                      // 0xfd200000
23472                      if (((instr & 0xe00) == 0xa00)) {
23473                        UnallocatedT32(instr);
23474                        return;
23475                      }
23476                      UnimplementedT32_32("STC2", instr);
23477                      break;
23478                    }
23479                  }
23480                  break;
23481                }
23482                case 0x11100000: {
23483                  // 0xfd100000
23484                  switch (instr & 0x00200000) {
23485                    case 0x00000000: {
23486                      // 0xfd100000
23487                      switch (instr & 0x00000e00) {
23488                        case 0x00000a00: {
23489                          // 0xfd100a00
23490                          UnallocatedT32(instr);
23491                          break;
23492                        }
23493                        default: {
23494                          switch (instr & 0x000f0000) {
23495                            case 0x000f0000: {
23496                              // 0xfd1f0000
23497                              if (((instr & 0xe00) == 0xa00)) {
23498                                UnallocatedT32(instr);
23499                                return;
23500                              }
23501                              UnimplementedT32_32("LDC2", instr);
23502                              break;
23503                            }
23504                            default: {
23505                              if (((instr & 0xf0000) == 0xf0000) ||
23506                                  ((instr & 0xe00) == 0xa00)) {
23507                                UnallocatedT32(instr);
23508                                return;
23509                              }
23510                              UnimplementedT32_32("LDC2", instr);
23511                              break;
23512                            }
23513                          }
23514                          break;
23515                        }
23516                      }
23517                      break;
23518                    }
23519                    case 0x00200000: {
23520                      // 0xfd300000
23521                      if (((instr & 0xf0000) == 0xf0000) ||
23522                          ((instr & 0xe00) == 0xa00)) {
23523                        UnallocatedT32(instr);
23524                        return;
23525                      }
23526                      UnimplementedT32_32("LDC2", instr);
23527                      break;
23528                    }
23529                  }
23530                  break;
23531                }
23532              }
23533              break;
23534            }
23535            case 0x06000000: {
23536              // 0xee000000
23537              switch (instr & 0x01000010) {
23538                case 0x00000000: {
23539                  // 0xee000000
23540                  switch (instr & 0x10000000) {
23541                    case 0x00000000: {
23542                      // 0xee000000
23543                      switch (instr & 0x00000e00) {
23544                        case 0x00000a00: {
23545                          // 0xee000a00
23546                          switch (instr & 0x00b00140) {
23547                            case 0x00000000: {
23548                              // 0xee000a00
23549                              unsigned rd = ExtractSRegister(instr, 22, 12);
23550                              unsigned rn = ExtractSRegister(instr, 7, 16);
23551                              unsigned rm = ExtractSRegister(instr, 5, 0);
23552                              // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23553                              vmla(CurrentCond(),
23554                                   F32,
23555                                   SRegister(rd),
23556                                   SRegister(rn),
23557                                   SRegister(rm));
23558                              break;
23559                            }
23560                            case 0x00000040: {
23561                              // 0xee000a40
23562                              unsigned rd = ExtractSRegister(instr, 22, 12);
23563                              unsigned rn = ExtractSRegister(instr, 7, 16);
23564                              unsigned rm = ExtractSRegister(instr, 5, 0);
23565                              // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23566                              vmls(CurrentCond(),
23567                                   F32,
23568                                   SRegister(rd),
23569                                   SRegister(rn),
23570                                   SRegister(rm));
23571                              break;
23572                            }
23573                            case 0x00000100: {
23574                              // 0xee000b00
23575                              unsigned rd = ExtractDRegister(instr, 22, 12);
23576                              unsigned rn = ExtractDRegister(instr, 7, 16);
23577                              unsigned rm = ExtractDRegister(instr, 5, 0);
23578                              // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23579                              vmla(CurrentCond(),
23580                                   F64,
23581                                   DRegister(rd),
23582                                   DRegister(rn),
23583                                   DRegister(rm));
23584                              break;
23585                            }
23586                            case 0x00000140: {
23587                              // 0xee000b40
23588                              unsigned rd = ExtractDRegister(instr, 22, 12);
23589                              unsigned rn = ExtractDRegister(instr, 7, 16);
23590                              unsigned rm = ExtractDRegister(instr, 5, 0);
23591                              // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23592                              vmls(CurrentCond(),
23593                                   F64,
23594                                   DRegister(rd),
23595                                   DRegister(rn),
23596                                   DRegister(rm));
23597                              break;
23598                            }
23599                            case 0x00100000: {
23600                              // 0xee100a00
23601                              unsigned rd = ExtractSRegister(instr, 22, 12);
23602                              unsigned rn = ExtractSRegister(instr, 7, 16);
23603                              unsigned rm = ExtractSRegister(instr, 5, 0);
23604                              // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23605                              vnmls(CurrentCond(),
23606                                    F32,
23607                                    SRegister(rd),
23608                                    SRegister(rn),
23609                                    SRegister(rm));
23610                              break;
23611                            }
23612                            case 0x00100040: {
23613                              // 0xee100a40
23614                              unsigned rd = ExtractSRegister(instr, 22, 12);
23615                              unsigned rn = ExtractSRegister(instr, 7, 16);
23616                              unsigned rm = ExtractSRegister(instr, 5, 0);
23617                              // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23618                              vnmla(CurrentCond(),
23619                                    F32,
23620                                    SRegister(rd),
23621                                    SRegister(rn),
23622                                    SRegister(rm));
23623                              break;
23624                            }
23625                            case 0x00100100: {
23626                              // 0xee100b00
23627                              unsigned rd = ExtractDRegister(instr, 22, 12);
23628                              unsigned rn = ExtractDRegister(instr, 7, 16);
23629                              unsigned rm = ExtractDRegister(instr, 5, 0);
23630                              // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23631                              vnmls(CurrentCond(),
23632                                    F64,
23633                                    DRegister(rd),
23634                                    DRegister(rn),
23635                                    DRegister(rm));
23636                              break;
23637                            }
23638                            case 0x00100140: {
23639                              // 0xee100b40
23640                              unsigned rd = ExtractDRegister(instr, 22, 12);
23641                              unsigned rn = ExtractDRegister(instr, 7, 16);
23642                              unsigned rm = ExtractDRegister(instr, 5, 0);
23643                              // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23644                              vnmla(CurrentCond(),
23645                                    F64,
23646                                    DRegister(rd),
23647                                    DRegister(rn),
23648                                    DRegister(rm));
23649                              break;
23650                            }
23651                            case 0x00200000: {
23652                              // 0xee200a00
23653                              unsigned rd = ExtractSRegister(instr, 22, 12);
23654                              unsigned rn = ExtractSRegister(instr, 7, 16);
23655                              unsigned rm = ExtractSRegister(instr, 5, 0);
23656                              // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23657                              vmul(CurrentCond(),
23658                                   F32,
23659                                   SRegister(rd),
23660                                   SRegister(rn),
23661                                   SRegister(rm));
23662                              break;
23663                            }
23664                            case 0x00200040: {
23665                              // 0xee200a40
23666                              unsigned rd = ExtractSRegister(instr, 22, 12);
23667                              unsigned rn = ExtractSRegister(instr, 7, 16);
23668                              unsigned rm = ExtractSRegister(instr, 5, 0);
23669                              // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
23670                              vnmul(CurrentCond(),
23671                                    F32,
23672                                    SRegister(rd),
23673                                    SRegister(rn),
23674                                    SRegister(rm));
23675                              break;
23676                            }
23677                            case 0x00200100: {
23678                              // 0xee200b00
23679                              unsigned rd = ExtractDRegister(instr, 22, 12);
23680                              unsigned rn = ExtractDRegister(instr, 7, 16);
23681                              unsigned rm = ExtractDRegister(instr, 5, 0);
23682                              // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23683                              vmul(CurrentCond(),
23684                                   F64,
23685                                   DRegister(rd),
23686                                   DRegister(rn),
23687                                   DRegister(rm));
23688                              break;
23689                            }
23690                            case 0x00200140: {
23691                              // 0xee200b40
23692                              unsigned rd = ExtractDRegister(instr, 22, 12);
23693                              unsigned rn = ExtractDRegister(instr, 7, 16);
23694                              unsigned rm = ExtractDRegister(instr, 5, 0);
23695                              // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
23696                              vnmul(CurrentCond(),
23697                                    F64,
23698                                    DRegister(rd),
23699                                    DRegister(rn),
23700                                    DRegister(rm));
23701                              break;
23702                            }
23703                            case 0x00300000: {
23704                              // 0xee300a00
23705                              unsigned rd = ExtractSRegister(instr, 22, 12);
23706                              unsigned rn = ExtractSRegister(instr, 7, 16);
23707                              unsigned rm = ExtractSRegister(instr, 5, 0);
23708                              // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23709                              vadd(CurrentCond(),
23710                                   F32,
23711                                   SRegister(rd),
23712                                   SRegister(rn),
23713                                   SRegister(rm));
23714                              break;
23715                            }
23716                            case 0x00300040: {
23717                              // 0xee300a40
23718                              unsigned rd = ExtractSRegister(instr, 22, 12);
23719                              unsigned rn = ExtractSRegister(instr, 7, 16);
23720                              unsigned rm = ExtractSRegister(instr, 5, 0);
23721                              // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23722                              vsub(CurrentCond(),
23723                                   F32,
23724                                   SRegister(rd),
23725                                   SRegister(rn),
23726                                   SRegister(rm));
23727                              break;
23728                            }
23729                            case 0x00300100: {
23730                              // 0xee300b00
23731                              unsigned rd = ExtractDRegister(instr, 22, 12);
23732                              unsigned rn = ExtractDRegister(instr, 7, 16);
23733                              unsigned rm = ExtractDRegister(instr, 5, 0);
23734                              // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23735                              vadd(CurrentCond(),
23736                                   F64,
23737                                   DRegister(rd),
23738                                   DRegister(rn),
23739                                   DRegister(rm));
23740                              break;
23741                            }
23742                            case 0x00300140: {
23743                              // 0xee300b40
23744                              unsigned rd = ExtractDRegister(instr, 22, 12);
23745                              unsigned rn = ExtractDRegister(instr, 7, 16);
23746                              unsigned rm = ExtractDRegister(instr, 5, 0);
23747                              // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23748                              vsub(CurrentCond(),
23749                                   F64,
23750                                   DRegister(rd),
23751                                   DRegister(rn),
23752                                   DRegister(rm));
23753                              break;
23754                            }
23755                            case 0x00800000: {
23756                              // 0xee800a00
23757                              unsigned rd = ExtractSRegister(instr, 22, 12);
23758                              unsigned rn = ExtractSRegister(instr, 7, 16);
23759                              unsigned rm = ExtractSRegister(instr, 5, 0);
23760                              // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
23761                              vdiv(CurrentCond(),
23762                                   F32,
23763                                   SRegister(rd),
23764                                   SRegister(rn),
23765                                   SRegister(rm));
23766                              break;
23767                            }
23768                            case 0x00800100: {
23769                              // 0xee800b00
23770                              unsigned rd = ExtractDRegister(instr, 22, 12);
23771                              unsigned rn = ExtractDRegister(instr, 7, 16);
23772                              unsigned rm = ExtractDRegister(instr, 5, 0);
23773                              // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
23774                              vdiv(CurrentCond(),
23775                                   F64,
23776                                   DRegister(rd),
23777                                   DRegister(rn),
23778                                   DRegister(rm));
23779                              break;
23780                            }
23781                            case 0x00900000: {
23782                              // 0xee900a00
23783                              unsigned rd = ExtractSRegister(instr, 22, 12);
23784                              unsigned rn = ExtractSRegister(instr, 7, 16);
23785                              unsigned rm = ExtractSRegister(instr, 5, 0);
23786                              // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23787                              vfnms(CurrentCond(),
23788                                    F32,
23789                                    SRegister(rd),
23790                                    SRegister(rn),
23791                                    SRegister(rm));
23792                              break;
23793                            }
23794                            case 0x00900040: {
23795                              // 0xee900a40
23796                              unsigned rd = ExtractSRegister(instr, 22, 12);
23797                              unsigned rn = ExtractSRegister(instr, 7, 16);
23798                              unsigned rm = ExtractSRegister(instr, 5, 0);
23799                              // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23800                              vfnma(CurrentCond(),
23801                                    F32,
23802                                    SRegister(rd),
23803                                    SRegister(rn),
23804                                    SRegister(rm));
23805                              break;
23806                            }
23807                            case 0x00900100: {
23808                              // 0xee900b00
23809                              unsigned rd = ExtractDRegister(instr, 22, 12);
23810                              unsigned rn = ExtractDRegister(instr, 7, 16);
23811                              unsigned rm = ExtractDRegister(instr, 5, 0);
23812                              // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23813                              vfnms(CurrentCond(),
23814                                    F64,
23815                                    DRegister(rd),
23816                                    DRegister(rn),
23817                                    DRegister(rm));
23818                              break;
23819                            }
23820                            case 0x00900140: {
23821                              // 0xee900b40
23822                              unsigned rd = ExtractDRegister(instr, 22, 12);
23823                              unsigned rn = ExtractDRegister(instr, 7, 16);
23824                              unsigned rm = ExtractDRegister(instr, 5, 0);
23825                              // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23826                              vfnma(CurrentCond(),
23827                                    F64,
23828                                    DRegister(rd),
23829                                    DRegister(rn),
23830                                    DRegister(rm));
23831                              break;
23832                            }
23833                            case 0x00a00000: {
23834                              // 0xeea00a00
23835                              unsigned rd = ExtractSRegister(instr, 22, 12);
23836                              unsigned rn = ExtractSRegister(instr, 7, 16);
23837                              unsigned rm = ExtractSRegister(instr, 5, 0);
23838                              // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23839                              vfma(CurrentCond(),
23840                                   F32,
23841                                   SRegister(rd),
23842                                   SRegister(rn),
23843                                   SRegister(rm));
23844                              break;
23845                            }
23846                            case 0x00a00040: {
23847                              // 0xeea00a40
23848                              unsigned rd = ExtractSRegister(instr, 22, 12);
23849                              unsigned rn = ExtractSRegister(instr, 7, 16);
23850                              unsigned rm = ExtractSRegister(instr, 5, 0);
23851                              // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23852                              vfms(CurrentCond(),
23853                                   F32,
23854                                   SRegister(rd),
23855                                   SRegister(rn),
23856                                   SRegister(rm));
23857                              break;
23858                            }
23859                            case 0x00a00100: {
23860                              // 0xeea00b00
23861                              unsigned rd = ExtractDRegister(instr, 22, 12);
23862                              unsigned rn = ExtractDRegister(instr, 7, 16);
23863                              unsigned rm = ExtractDRegister(instr, 5, 0);
23864                              // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23865                              vfma(CurrentCond(),
23866                                   F64,
23867                                   DRegister(rd),
23868                                   DRegister(rn),
23869                                   DRegister(rm));
23870                              break;
23871                            }
23872                            case 0x00a00140: {
23873                              // 0xeea00b40
23874                              unsigned rd = ExtractDRegister(instr, 22, 12);
23875                              unsigned rn = ExtractDRegister(instr, 7, 16);
23876                              unsigned rm = ExtractDRegister(instr, 5, 0);
23877                              // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23878                              vfms(CurrentCond(),
23879                                   F64,
23880                                   DRegister(rd),
23881                                   DRegister(rn),
23882                                   DRegister(rm));
23883                              break;
23884                            }
23885                            case 0x00b00000: {
23886                              // 0xeeb00a00
23887                              unsigned rd = ExtractSRegister(instr, 22, 12);
23888                              uint32_t encoded_imm =
23889                                  (instr & 0xf) | ((instr >> 12) & 0xf0);
23890                              NeonImmediate imm =
23891                                  ImmediateVFP::Decode<float>(encoded_imm);
23892                              // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2
23893                              vmov(CurrentCond(), F32, SRegister(rd), imm);
23894                              if (((instr & 0xffb00ff0) != 0xeeb00a00)) {
23895                                UnpredictableT32(instr);
23896                              }
23897                              break;
23898                            }
23899                            case 0x00b00040: {
23900                              // 0xeeb00a40
23901                              switch (instr & 0x000e0000) {
23902                                case 0x00000000: {
23903                                  // 0xeeb00a40
23904                                  switch (instr & 0x00010080) {
23905                                    case 0x00000000: {
23906                                      // 0xeeb00a40
23907                                      unsigned rd =
23908                                          ExtractSRegister(instr, 22, 12);
23909                                      unsigned rm =
23910                                          ExtractSRegister(instr, 5, 0);
23911                                      // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23912                                      vmov(CurrentCond(),
23913                                           F32,
23914                                           SRegister(rd),
23915                                           SRegister(rm));
23916                                      break;
23917                                    }
23918                                    case 0x00000080: {
23919                                      // 0xeeb00ac0
23920                                      unsigned rd =
23921                                          ExtractSRegister(instr, 22, 12);
23922                                      unsigned rm =
23923                                          ExtractSRegister(instr, 5, 0);
23924                                      // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23925                                      vabs(CurrentCond(),
23926                                           F32,
23927                                           SRegister(rd),
23928                                           SRegister(rm));
23929                                      break;
23930                                    }
23931                                    case 0x00010000: {
23932                                      // 0xeeb10a40
23933                                      unsigned rd =
23934                                          ExtractSRegister(instr, 22, 12);
23935                                      unsigned rm =
23936                                          ExtractSRegister(instr, 5, 0);
23937                                      // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23938                                      vneg(CurrentCond(),
23939                                           F32,
23940                                           SRegister(rd),
23941                                           SRegister(rm));
23942                                      break;
23943                                    }
23944                                    case 0x00010080: {
23945                                      // 0xeeb10ac0
23946                                      unsigned rd =
23947                                          ExtractSRegister(instr, 22, 12);
23948                                      unsigned rm =
23949                                          ExtractSRegister(instr, 5, 0);
23950                                      // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23951                                      vsqrt(CurrentCond(),
23952                                            F32,
23953                                            SRegister(rd),
23954                                            SRegister(rm));
23955                                      break;
23956                                    }
23957                                  }
23958                                  break;
23959                                }
23960                                case 0x00020000: {
23961                                  // 0xeeb20a40
23962                                  switch (instr & 0x00010080) {
23963                                    case 0x00000000: {
23964                                      // 0xeeb20a40
23965                                      unsigned rd =
23966                                          ExtractSRegister(instr, 22, 12);
23967                                      unsigned rm =
23968                                          ExtractSRegister(instr, 5, 0);
23969                                      // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
23970                                      vcvtb(CurrentCond(),
23971                                            F32,
23972                                            F16,
23973                                            SRegister(rd),
23974                                            SRegister(rm));
23975                                      break;
23976                                    }
23977                                    case 0x00000080: {
23978                                      // 0xeeb20ac0
23979                                      unsigned rd =
23980                                          ExtractSRegister(instr, 22, 12);
23981                                      unsigned rm =
23982                                          ExtractSRegister(instr, 5, 0);
23983                                      // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
23984                                      vcvtt(CurrentCond(),
23985                                            F32,
23986                                            F16,
23987                                            SRegister(rd),
23988                                            SRegister(rm));
23989                                      break;
23990                                    }
23991                                    case 0x00010000: {
23992                                      // 0xeeb30a40
23993                                      unsigned rd =
23994                                          ExtractSRegister(instr, 22, 12);
23995                                      unsigned rm =
23996                                          ExtractSRegister(instr, 5, 0);
23997                                      // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
23998                                      vcvtb(CurrentCond(),
23999                                            F16,
24000                                            F32,
24001                                            SRegister(rd),
24002                                            SRegister(rm));
24003                                      break;
24004                                    }
24005                                    case 0x00010080: {
24006                                      // 0xeeb30ac0
24007                                      unsigned rd =
24008                                          ExtractSRegister(instr, 22, 12);
24009                                      unsigned rm =
24010                                          ExtractSRegister(instr, 5, 0);
24011                                      // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
24012                                      vcvtt(CurrentCond(),
24013                                            F16,
24014                                            F32,
24015                                            SRegister(rd),
24016                                            SRegister(rm));
24017                                      break;
24018                                    }
24019                                  }
24020                                  break;
24021                                }
24022                                case 0x00040000: {
24023                                  // 0xeeb40a40
24024                                  switch (instr & 0x00010080) {
24025                                    case 0x00000000: {
24026                                      // 0xeeb40a40
24027                                      unsigned rd =
24028                                          ExtractSRegister(instr, 22, 12);
24029                                      unsigned rm =
24030                                          ExtractSRegister(instr, 5, 0);
24031                                      // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
24032                                      vcmp(CurrentCond(),
24033                                           F32,
24034                                           SRegister(rd),
24035                                           SRegister(rm));
24036                                      break;
24037                                    }
24038                                    case 0x00000080: {
24039                                      // 0xeeb40ac0
24040                                      unsigned rd =
24041                                          ExtractSRegister(instr, 22, 12);
24042                                      unsigned rm =
24043                                          ExtractSRegister(instr, 5, 0);
24044                                      // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
24045                                      vcmpe(CurrentCond(),
24046                                            F32,
24047                                            SRegister(rd),
24048                                            SRegister(rm));
24049                                      break;
24050                                    }
24051                                    case 0x00010000: {
24052                                      // 0xeeb50a40
24053                                      unsigned rd =
24054                                          ExtractSRegister(instr, 22, 12);
24055                                      // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
24056                                      vcmp(CurrentCond(),
24057                                           F32,
24058                                           SRegister(rd),
24059                                           0.0);
24060                                      if (((instr & 0xffbf0fff) !=
24061                                           0xeeb50a40)) {
24062                                        UnpredictableT32(instr);
24063                                      }
24064                                      break;
24065                                    }
24066                                    case 0x00010080: {
24067                                      // 0xeeb50ac0
24068                                      unsigned rd =
24069                                          ExtractSRegister(instr, 22, 12);
24070                                      // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
24071                                      vcmpe(CurrentCond(),
24072                                            F32,
24073                                            SRegister(rd),
24074                                            0.0);
24075                                      if (((instr & 0xffbf0fff) !=
24076                                           0xeeb50ac0)) {
24077                                        UnpredictableT32(instr);
24078                                      }
24079                                      break;
24080                                    }
24081                                  }
24082                                  break;
24083                                }
24084                                case 0x00060000: {
24085                                  // 0xeeb60a40
24086                                  switch (instr & 0x00010080) {
24087                                    case 0x00000000: {
24088                                      // 0xeeb60a40
24089                                      unsigned rd =
24090                                          ExtractSRegister(instr, 22, 12);
24091                                      unsigned rm =
24092                                          ExtractSRegister(instr, 5, 0);
24093                                      // VRINTR{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
24094                                      vrintr(CurrentCond(),
24095                                             F32,
24096                                             F32,
24097                                             SRegister(rd),
24098                                             SRegister(rm));
24099                                      break;
24100                                    }
24101                                    case 0x00000080: {
24102                                      // 0xeeb60ac0
24103                                      unsigned rd =
24104                                          ExtractSRegister(instr, 22, 12);
24105                                      unsigned rm =
24106                                          ExtractSRegister(instr, 5, 0);
24107                                      // VRINTZ{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
24108                                      vrintz(CurrentCond(),
24109                                             F32,
24110                                             F32,
24111                                             SRegister(rd),
24112                                             SRegister(rm));
24113                                      break;
24114                                    }
24115                                    case 0x00010000: {
24116                                      // 0xeeb70a40
24117                                      unsigned rd =
24118                                          ExtractSRegister(instr, 22, 12);
24119                                      unsigned rm =
24120                                          ExtractSRegister(instr, 5, 0);
24121                                      // VRINTX{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
24122                                      vrintx(CurrentCond(),
24123                                             F32,
24124                                             F32,
24125                                             SRegister(rd),
24126                                             SRegister(rm));
24127                                      break;
24128                                    }
24129                                    case 0x00010080: {
24130                                      // 0xeeb70ac0
24131                                      unsigned rd =
24132                                          ExtractDRegister(instr, 22, 12);
24133                                      unsigned rm =
24134                                          ExtractSRegister(instr, 5, 0);
24135                                      // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1
24136                                      vcvt(CurrentCond(),
24137                                           F64,
24138                                           F32,
24139                                           DRegister(rd),
24140                                           SRegister(rm));
24141                                      break;
24142                                    }
24143                                  }
24144                                  break;
24145                                }
24146                                case 0x00080000: {
24147                                  // 0xeeb80a40
24148                                  if ((instr & 0x00010000) == 0x00000000) {
24149                                    DataType dt =
24150                                        Dt_op_2_Decode((instr >> 7) & 0x1);
24151                                    if (dt.Is(kDataTypeValueInvalid)) {
24152                                      UnallocatedT32(instr);
24153                                      return;
24154                                    }
24155                                    unsigned rd =
24156                                        ExtractSRegister(instr, 22, 12);
24157                                    unsigned rm = ExtractSRegister(instr, 5, 0);
24158                                    // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1
24159                                    vcvt(CurrentCond(),
24160                                         F32,
24161                                         dt,
24162                                         SRegister(rd),
24163                                         SRegister(rm));
24164                                  } else {
24165                                    UnallocatedT32(instr);
24166                                  }
24167                                  break;
24168                                }
24169                                case 0x000a0000: {
24170                                  // 0xeeba0a40
24171                                  DataType dt =
24172                                      Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24173                                                       ((instr >> 15) & 0x2));
24174                                  if (dt.Is(kDataTypeValueInvalid)) {
24175                                    UnallocatedT32(instr);
24176                                    return;
24177                                  }
24178                                  unsigned rd = ExtractSRegister(instr, 22, 12);
24179                                  unsigned offset = 32;
24180                                  if (dt.Is(S16) || dt.Is(U16)) {
24181                                    offset = 16;
24182                                  }
24183                                  uint32_t fbits =
24184                                      offset - (((instr >> 5) & 0x1) |
24185                                                ((instr << 1) & 0x1e));
24186                                  // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
24187                                  vcvt(CurrentCond(),
24188                                       F32,
24189                                       dt,
24190                                       SRegister(rd),
24191                                       SRegister(rd),
24192                                       fbits);
24193                                  break;
24194                                }
24195                                case 0x000c0000: {
24196                                  // 0xeebc0a40
24197                                  switch (instr & 0x00010080) {
24198                                    case 0x00000000: {
24199                                      // 0xeebc0a40
24200                                      unsigned rd =
24201                                          ExtractSRegister(instr, 22, 12);
24202                                      unsigned rm =
24203                                          ExtractSRegister(instr, 5, 0);
24204                                      // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
24205                                      vcvtr(CurrentCond(),
24206                                            U32,
24207                                            F32,
24208                                            SRegister(rd),
24209                                            SRegister(rm));
24210                                      break;
24211                                    }
24212                                    case 0x00000080: {
24213                                      // 0xeebc0ac0
24214                                      unsigned rd =
24215                                          ExtractSRegister(instr, 22, 12);
24216                                      unsigned rm =
24217                                          ExtractSRegister(instr, 5, 0);
24218                                      // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
24219                                      vcvt(CurrentCond(),
24220                                           U32,
24221                                           F32,
24222                                           SRegister(rd),
24223                                           SRegister(rm));
24224                                      break;
24225                                    }
24226                                    case 0x00010000: {
24227                                      // 0xeebd0a40
24228                                      unsigned rd =
24229                                          ExtractSRegister(instr, 22, 12);
24230                                      unsigned rm =
24231                                          ExtractSRegister(instr, 5, 0);
24232                                      // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
24233                                      vcvtr(CurrentCond(),
24234                                            S32,
24235                                            F32,
24236                                            SRegister(rd),
24237                                            SRegister(rm));
24238                                      break;
24239                                    }
24240                                    case 0x00010080: {
24241                                      // 0xeebd0ac0
24242                                      unsigned rd =
24243                                          ExtractSRegister(instr, 22, 12);
24244                                      unsigned rm =
24245                                          ExtractSRegister(instr, 5, 0);
24246                                      // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
24247                                      vcvt(CurrentCond(),
24248                                           S32,
24249                                           F32,
24250                                           SRegister(rd),
24251                                           SRegister(rm));
24252                                      break;
24253                                    }
24254                                  }
24255                                  break;
24256                                }
24257                                case 0x000e0000: {
24258                                  // 0xeebe0a40
24259                                  DataType dt =
24260                                      Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24261                                                       ((instr >> 15) & 0x2));
24262                                  if (dt.Is(kDataTypeValueInvalid)) {
24263                                    UnallocatedT32(instr);
24264                                    return;
24265                                  }
24266                                  unsigned rd = ExtractSRegister(instr, 22, 12);
24267                                  unsigned offset = 32;
24268                                  if (dt.Is(S16) || dt.Is(U16)) {
24269                                    offset = 16;
24270                                  }
24271                                  uint32_t fbits =
24272                                      offset - (((instr >> 5) & 0x1) |
24273                                                ((instr << 1) & 0x1e));
24274                                  // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
24275                                  vcvt(CurrentCond(),
24276                                       dt,
24277                                       F32,
24278                                       SRegister(rd),
24279                                       SRegister(rd),
24280                                       fbits);
24281                                  break;
24282                                }
24283                              }
24284                              break;
24285                            }
24286                            case 0x00b00100: {
24287                              // 0xeeb00b00
24288                              unsigned rd = ExtractDRegister(instr, 22, 12);
24289                              uint32_t encoded_imm =
24290                                  (instr & 0xf) | ((instr >> 12) & 0xf0);
24291                              NeonImmediate imm =
24292                                  ImmediateVFP::Decode<double>(encoded_imm);
24293                              // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2
24294                              vmov(CurrentCond(), F64, DRegister(rd), imm);
24295                              if (((instr & 0xffb00ff0) != 0xeeb00b00)) {
24296                                UnpredictableT32(instr);
24297                              }
24298                              break;
24299                            }
24300                            case 0x00b00140: {
24301                              // 0xeeb00b40
24302                              switch (instr & 0x000e0000) {
24303                                case 0x00000000: {
24304                                  // 0xeeb00b40
24305                                  switch (instr & 0x00010080) {
24306                                    case 0x00000000: {
24307                                      // 0xeeb00b40
24308                                      unsigned rd =
24309                                          ExtractDRegister(instr, 22, 12);
24310                                      unsigned rm =
24311                                          ExtractDRegister(instr, 5, 0);
24312                                      // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24313                                      vmov(CurrentCond(),
24314                                           F64,
24315                                           DRegister(rd),
24316                                           DRegister(rm));
24317                                      break;
24318                                    }
24319                                    case 0x00000080: {
24320                                      // 0xeeb00bc0
24321                                      unsigned rd =
24322                                          ExtractDRegister(instr, 22, 12);
24323                                      unsigned rm =
24324                                          ExtractDRegister(instr, 5, 0);
24325                                      // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24326                                      vabs(CurrentCond(),
24327                                           F64,
24328                                           DRegister(rd),
24329                                           DRegister(rm));
24330                                      break;
24331                                    }
24332                                    case 0x00010000: {
24333                                      // 0xeeb10b40
24334                                      unsigned rd =
24335                                          ExtractDRegister(instr, 22, 12);
24336                                      unsigned rm =
24337                                          ExtractDRegister(instr, 5, 0);
24338                                      // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24339                                      vneg(CurrentCond(),
24340                                           F64,
24341                                           DRegister(rd),
24342                                           DRegister(rm));
24343                                      break;
24344                                    }
24345                                    case 0x00010080: {
24346                                      // 0xeeb10bc0
24347                                      unsigned rd =
24348                                          ExtractDRegister(instr, 22, 12);
24349                                      unsigned rm =
24350                                          ExtractDRegister(instr, 5, 0);
24351                                      // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24352                                      vsqrt(CurrentCond(),
24353                                            F64,
24354                                            DRegister(rd),
24355                                            DRegister(rm));
24356                                      break;
24357                                    }
24358                                  }
24359                                  break;
24360                                }
24361                                case 0x00020000: {
24362                                  // 0xeeb20b40
24363                                  switch (instr & 0x00010080) {
24364                                    case 0x00000000: {
24365                                      // 0xeeb20b40
24366                                      unsigned rd =
24367                                          ExtractDRegister(instr, 22, 12);
24368                                      unsigned rm =
24369                                          ExtractSRegister(instr, 5, 0);
24370                                      // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
24371                                      vcvtb(CurrentCond(),
24372                                            F64,
24373                                            F16,
24374                                            DRegister(rd),
24375                                            SRegister(rm));
24376                                      break;
24377                                    }
24378                                    case 0x00000080: {
24379                                      // 0xeeb20bc0
24380                                      unsigned rd =
24381                                          ExtractDRegister(instr, 22, 12);
24382                                      unsigned rm =
24383                                          ExtractSRegister(instr, 5, 0);
24384                                      // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
24385                                      vcvtt(CurrentCond(),
24386                                            F64,
24387                                            F16,
24388                                            DRegister(rd),
24389                                            SRegister(rm));
24390                                      break;
24391                                    }
24392                                    case 0x00010000: {
24393                                      // 0xeeb30b40
24394                                      unsigned rd =
24395                                          ExtractSRegister(instr, 22, 12);
24396                                      unsigned rm =
24397                                          ExtractDRegister(instr, 5, 0);
24398                                      // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
24399                                      vcvtb(CurrentCond(),
24400                                            F16,
24401                                            F64,
24402                                            SRegister(rd),
24403                                            DRegister(rm));
24404                                      break;
24405                                    }
24406                                    case 0x00010080: {
24407                                      // 0xeeb30bc0
24408                                      unsigned rd =
24409                                          ExtractSRegister(instr, 22, 12);
24410                                      unsigned rm =
24411                                          ExtractDRegister(instr, 5, 0);
24412                                      // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
24413                                      vcvtt(CurrentCond(),
24414                                            F16,
24415                                            F64,
24416                                            SRegister(rd),
24417                                            DRegister(rm));
24418                                      break;
24419                                    }
24420                                  }
24421                                  break;
24422                                }
24423                                case 0x00040000: {
24424                                  // 0xeeb40b40
24425                                  switch (instr & 0x00010080) {
24426                                    case 0x00000000: {
24427                                      // 0xeeb40b40
24428                                      unsigned rd =
24429                                          ExtractDRegister(instr, 22, 12);
24430                                      unsigned rm =
24431                                          ExtractDRegister(instr, 5, 0);
24432                                      // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24433                                      vcmp(CurrentCond(),
24434                                           F64,
24435                                           DRegister(rd),
24436                                           DRegister(rm));
24437                                      break;
24438                                    }
24439                                    case 0x00000080: {
24440                                      // 0xeeb40bc0
24441                                      unsigned rd =
24442                                          ExtractDRegister(instr, 22, 12);
24443                                      unsigned rm =
24444                                          ExtractDRegister(instr, 5, 0);
24445                                      // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24446                                      vcmpe(CurrentCond(),
24447                                            F64,
24448                                            DRegister(rd),
24449                                            DRegister(rm));
24450                                      break;
24451                                    }
24452                                    case 0x00010000: {
24453                                      // 0xeeb50b40
24454                                      unsigned rd =
24455                                          ExtractDRegister(instr, 22, 12);
24456                                      // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
24457                                      vcmp(CurrentCond(),
24458                                           F64,
24459                                           DRegister(rd),
24460                                           0.0);
24461                                      if (((instr & 0xffbf0fff) !=
24462                                           0xeeb50b40)) {
24463                                        UnpredictableT32(instr);
24464                                      }
24465                                      break;
24466                                    }
24467                                    case 0x00010080: {
24468                                      // 0xeeb50bc0
24469                                      unsigned rd =
24470                                          ExtractDRegister(instr, 22, 12);
24471                                      // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
24472                                      vcmpe(CurrentCond(),
24473                                            F64,
24474                                            DRegister(rd),
24475                                            0.0);
24476                                      if (((instr & 0xffbf0fff) !=
24477                                           0xeeb50bc0)) {
24478                                        UnpredictableT32(instr);
24479                                      }
24480                                      break;
24481                                    }
24482                                  }
24483                                  break;
24484                                }
24485                                case 0x00060000: {
24486                                  // 0xeeb60b40
24487                                  switch (instr & 0x00010080) {
24488                                    case 0x00000000: {
24489                                      // 0xeeb60b40
24490                                      unsigned rd =
24491                                          ExtractDRegister(instr, 22, 12);
24492                                      unsigned rm =
24493                                          ExtractDRegister(instr, 5, 0);
24494                                      // VRINTR{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
24495                                      vrintr(CurrentCond(),
24496                                             F64,
24497                                             F64,
24498                                             DRegister(rd),
24499                                             DRegister(rm));
24500                                      break;
24501                                    }
24502                                    case 0x00000080: {
24503                                      // 0xeeb60bc0
24504                                      unsigned rd =
24505                                          ExtractDRegister(instr, 22, 12);
24506                                      unsigned rm =
24507                                          ExtractDRegister(instr, 5, 0);
24508                                      // VRINTZ{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
24509                                      vrintz(CurrentCond(),
24510                                             F64,
24511                                             F64,
24512                                             DRegister(rd),
24513                                             DRegister(rm));
24514                                      break;
24515                                    }
24516                                    case 0x00010000: {
24517                                      // 0xeeb70b40
24518                                      unsigned rd =
24519                                          ExtractDRegister(instr, 22, 12);
24520                                      unsigned rm =
24521                                          ExtractDRegister(instr, 5, 0);
24522                                      // VRINTX{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
24523                                      vrintx(CurrentCond(),
24524                                             F64,
24525                                             F64,
24526                                             DRegister(rd),
24527                                             DRegister(rm));
24528                                      break;
24529                                    }
24530                                    case 0x00010080: {
24531                                      // 0xeeb70bc0
24532                                      unsigned rd =
24533                                          ExtractSRegister(instr, 22, 12);
24534                                      unsigned rm =
24535                                          ExtractDRegister(instr, 5, 0);
24536                                      // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1
24537                                      vcvt(CurrentCond(),
24538                                           F32,
24539                                           F64,
24540                                           SRegister(rd),
24541                                           DRegister(rm));
24542                                      break;
24543                                    }
24544                                  }
24545                                  break;
24546                                }
24547                                case 0x00080000: {
24548                                  // 0xeeb80b40
24549                                  if ((instr & 0x00010000) == 0x00000000) {
24550                                    DataType dt =
24551                                        Dt_op_2_Decode((instr >> 7) & 0x1);
24552                                    if (dt.Is(kDataTypeValueInvalid)) {
24553                                      UnallocatedT32(instr);
24554                                      return;
24555                                    }
24556                                    unsigned rd =
24557                                        ExtractDRegister(instr, 22, 12);
24558                                    unsigned rm = ExtractSRegister(instr, 5, 0);
24559                                    // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1
24560                                    vcvt(CurrentCond(),
24561                                         F64,
24562                                         dt,
24563                                         DRegister(rd),
24564                                         SRegister(rm));
24565                                  } else {
24566                                    UnallocatedT32(instr);
24567                                  }
24568                                  break;
24569                                }
24570                                case 0x000a0000: {
24571                                  // 0xeeba0b40
24572                                  DataType dt =
24573                                      Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24574                                                       ((instr >> 15) & 0x2));
24575                                  if (dt.Is(kDataTypeValueInvalid)) {
24576                                    UnallocatedT32(instr);
24577                                    return;
24578                                  }
24579                                  unsigned rd = ExtractDRegister(instr, 22, 12);
24580                                  unsigned offset = 32;
24581                                  if (dt.Is(S16) || dt.Is(U16)) {
24582                                    offset = 16;
24583                                  }
24584                                  uint32_t fbits =
24585                                      offset - (((instr >> 5) & 0x1) |
24586                                                ((instr << 1) & 0x1e));
24587                                  // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
24588                                  vcvt(CurrentCond(),
24589                                       F64,
24590                                       dt,
24591                                       DRegister(rd),
24592                                       DRegister(rd),
24593                                       fbits);
24594                                  break;
24595                                }
24596                                case 0x000c0000: {
24597                                  // 0xeebc0b40
24598                                  switch (instr & 0x00010080) {
24599                                    case 0x00000000: {
24600                                      // 0xeebc0b40
24601                                      unsigned rd =
24602                                          ExtractSRegister(instr, 22, 12);
24603                                      unsigned rm =
24604                                          ExtractDRegister(instr, 5, 0);
24605                                      // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
24606                                      vcvtr(CurrentCond(),
24607                                            U32,
24608                                            F64,
24609                                            SRegister(rd),
24610                                            DRegister(rm));
24611                                      break;
24612                                    }
24613                                    case 0x00000080: {
24614                                      // 0xeebc0bc0
24615                                      unsigned rd =
24616                                          ExtractSRegister(instr, 22, 12);
24617                                      unsigned rm =
24618                                          ExtractDRegister(instr, 5, 0);
24619                                      // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
24620                                      vcvt(CurrentCond(),
24621                                           U32,
24622                                           F64,
24623                                           SRegister(rd),
24624                                           DRegister(rm));
24625                                      break;
24626                                    }
24627                                    case 0x00010000: {
24628                                      // 0xeebd0b40
24629                                      unsigned rd =
24630                                          ExtractSRegister(instr, 22, 12);
24631                                      unsigned rm =
24632                                          ExtractDRegister(instr, 5, 0);
24633                                      // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
24634                                      vcvtr(CurrentCond(),
24635                                            S32,
24636                                            F64,
24637                                            SRegister(rd),
24638                                            DRegister(rm));
24639                                      break;
24640                                    }
24641                                    case 0x00010080: {
24642                                      // 0xeebd0bc0
24643                                      unsigned rd =
24644                                          ExtractSRegister(instr, 22, 12);
24645                                      unsigned rm =
24646                                          ExtractDRegister(instr, 5, 0);
24647                                      // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
24648                                      vcvt(CurrentCond(),
24649                                           S32,
24650                                           F64,
24651                                           SRegister(rd),
24652                                           DRegister(rm));
24653                                      break;
24654                                    }
24655                                  }
24656                                  break;
24657                                }
24658                                case 0x000e0000: {
24659                                  // 0xeebe0b40
24660                                  DataType dt =
24661                                      Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24662                                                       ((instr >> 15) & 0x2));
24663                                  if (dt.Is(kDataTypeValueInvalid)) {
24664                                    UnallocatedT32(instr);
24665                                    return;
24666                                  }
24667                                  unsigned rd = ExtractDRegister(instr, 22, 12);
24668                                  unsigned offset = 32;
24669                                  if (dt.Is(S16) || dt.Is(U16)) {
24670                                    offset = 16;
24671                                  }
24672                                  uint32_t fbits =
24673                                      offset - (((instr >> 5) & 0x1) |
24674                                                ((instr << 1) & 0x1e));
24675                                  // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
24676                                  vcvt(CurrentCond(),
24677                                       dt,
24678                                       F64,
24679                                       DRegister(rd),
24680                                       DRegister(rd),
24681                                       fbits);
24682                                  break;
24683                                }
24684                              }
24685                              break;
24686                            }
24687                            default:
24688                              UnallocatedT32(instr);
24689                              break;
24690                          }
24691                          break;
24692                        }
24693                        default: {
24694                          if (((instr & 0xe00) == 0xa00)) {
24695                            UnallocatedT32(instr);
24696                            return;
24697                          }
24698                          UnimplementedT32_32("CDP", instr);
24699                          break;
24700                        }
24701                      }
24702                      break;
24703                    }
24704                    case 0x10000000: {
24705                      // 0xfe000000
24706                      switch (instr & 0x00000e00) {
24707                        case 0x00000a00: {
24708                          // 0xfe000a00
24709                          switch (instr & 0x00b00140) {
24710                            case 0x00000000: {
24711                              // 0xfe000a00
24712                              unsigned rd = ExtractSRegister(instr, 22, 12);
24713                              unsigned rn = ExtractSRegister(instr, 7, 16);
24714                              unsigned rm = ExtractSRegister(instr, 5, 0);
24715                              // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1
24716                              vseleq(F32,
24717                                     SRegister(rd),
24718                                     SRegister(rn),
24719                                     SRegister(rm));
24720                              break;
24721                            }
24722                            case 0x00000100: {
24723                              // 0xfe000b00
24724                              unsigned rd = ExtractDRegister(instr, 22, 12);
24725                              unsigned rn = ExtractDRegister(instr, 7, 16);
24726                              unsigned rm = ExtractDRegister(instr, 5, 0);
24727                              // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1
24728                              vseleq(F64,
24729                                     DRegister(rd),
24730                                     DRegister(rn),
24731                                     DRegister(rm));
24732                              break;
24733                            }
24734                            case 0x00100000: {
24735                              // 0xfe100a00
24736                              unsigned rd = ExtractSRegister(instr, 22, 12);
24737                              unsigned rn = ExtractSRegister(instr, 7, 16);
24738                              unsigned rm = ExtractSRegister(instr, 5, 0);
24739                              // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1
24740                              vselvs(F32,
24741                                     SRegister(rd),
24742                                     SRegister(rn),
24743                                     SRegister(rm));
24744                              break;
24745                            }
24746                            case 0x00100100: {
24747                              // 0xfe100b00
24748                              unsigned rd = ExtractDRegister(instr, 22, 12);
24749                              unsigned rn = ExtractDRegister(instr, 7, 16);
24750                              unsigned rm = ExtractDRegister(instr, 5, 0);
24751                              // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1
24752                              vselvs(F64,
24753                                     DRegister(rd),
24754                                     DRegister(rn),
24755                                     DRegister(rm));
24756                              break;
24757                            }
24758                            case 0x00200000: {
24759                              // 0xfe200a00
24760                              unsigned rd = ExtractSRegister(instr, 22, 12);
24761                              unsigned rn = ExtractSRegister(instr, 7, 16);
24762                              unsigned rm = ExtractSRegister(instr, 5, 0);
24763                              // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1
24764                              vselge(F32,
24765                                     SRegister(rd),
24766                                     SRegister(rn),
24767                                     SRegister(rm));
24768                              break;
24769                            }
24770                            case 0x00200100: {
24771                              // 0xfe200b00
24772                              unsigned rd = ExtractDRegister(instr, 22, 12);
24773                              unsigned rn = ExtractDRegister(instr, 7, 16);
24774                              unsigned rm = ExtractDRegister(instr, 5, 0);
24775                              // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1
24776                              vselge(F64,
24777                                     DRegister(rd),
24778                                     DRegister(rn),
24779                                     DRegister(rm));
24780                              break;
24781                            }
24782                            case 0x00300000: {
24783                              // 0xfe300a00
24784                              unsigned rd = ExtractSRegister(instr, 22, 12);
24785                              unsigned rn = ExtractSRegister(instr, 7, 16);
24786                              unsigned rm = ExtractSRegister(instr, 5, 0);
24787                              // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1
24788                              vselgt(F32,
24789                                     SRegister(rd),
24790                                     SRegister(rn),
24791                                     SRegister(rm));
24792                              break;
24793                            }
24794                            case 0x00300100: {
24795                              // 0xfe300b00
24796                              unsigned rd = ExtractDRegister(instr, 22, 12);
24797                              unsigned rn = ExtractDRegister(instr, 7, 16);
24798                              unsigned rm = ExtractDRegister(instr, 5, 0);
24799                              // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1
24800                              vselgt(F64,
24801                                     DRegister(rd),
24802                                     DRegister(rn),
24803                                     DRegister(rm));
24804                              break;
24805                            }
24806                            case 0x00800000: {
24807                              // 0xfe800a00
24808                              unsigned rd = ExtractSRegister(instr, 22, 12);
24809                              unsigned rn = ExtractSRegister(instr, 7, 16);
24810                              unsigned rm = ExtractSRegister(instr, 5, 0);
24811                              // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
24812                              vmaxnm(F32,
24813                                     SRegister(rd),
24814                                     SRegister(rn),
24815                                     SRegister(rm));
24816                              break;
24817                            }
24818                            case 0x00800040: {
24819                              // 0xfe800a40
24820                              unsigned rd = ExtractSRegister(instr, 22, 12);
24821                              unsigned rn = ExtractSRegister(instr, 7, 16);
24822                              unsigned rm = ExtractSRegister(instr, 5, 0);
24823                              // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
24824                              vminnm(F32,
24825                                     SRegister(rd),
24826                                     SRegister(rn),
24827                                     SRegister(rm));
24828                              break;
24829                            }
24830                            case 0x00800100: {
24831                              // 0xfe800b00
24832                              unsigned rd = ExtractDRegister(instr, 22, 12);
24833                              unsigned rn = ExtractDRegister(instr, 7, 16);
24834                              unsigned rm = ExtractDRegister(instr, 5, 0);
24835                              // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
24836                              vmaxnm(F64,
24837                                     DRegister(rd),
24838                                     DRegister(rn),
24839                                     DRegister(rm));
24840                              break;
24841                            }
24842                            case 0x00800140: {
24843                              // 0xfe800b40
24844                              unsigned rd = ExtractDRegister(instr, 22, 12);
24845                              unsigned rn = ExtractDRegister(instr, 7, 16);
24846                              unsigned rm = ExtractDRegister(instr, 5, 0);
24847                              // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
24848                              vminnm(F64,
24849                                     DRegister(rd),
24850                                     DRegister(rn),
24851                                     DRegister(rm));
24852                              break;
24853                            }
24854                            case 0x00b00040: {
24855                              // 0xfeb00a40
24856                              switch (instr & 0x000f0000) {
24857                                case 0x00080000: {
24858                                  // 0xfeb80a40
24859                                  if ((instr & 0x00000080) == 0x00000000) {
24860                                    unsigned rd =
24861                                        ExtractSRegister(instr, 22, 12);
24862                                    unsigned rm = ExtractSRegister(instr, 5, 0);
24863                                    // VRINTA{<q>}.F32.F32 <Sd>, <Sm> ; T1
24864                                    vrinta(F32,
24865                                           F32,
24866                                           SRegister(rd),
24867                                           SRegister(rm));
24868                                  } else {
24869                                    UnallocatedT32(instr);
24870                                  }
24871                                  break;
24872                                }
24873                                case 0x00090000: {
24874                                  // 0xfeb90a40
24875                                  if ((instr & 0x00000080) == 0x00000000) {
24876                                    unsigned rd =
24877                                        ExtractSRegister(instr, 22, 12);
24878                                    unsigned rm = ExtractSRegister(instr, 5, 0);
24879                                    // VRINTN{<q>}.F32.F32 <Sd>, <Sm> ; T1
24880                                    vrintn(F32,
24881                                           F32,
24882                                           SRegister(rd),
24883                                           SRegister(rm));
24884                                  } else {
24885                                    UnallocatedT32(instr);
24886                                  }
24887                                  break;
24888                                }
24889                                case 0x000a0000: {
24890                                  // 0xfeba0a40
24891                                  if ((instr & 0x00000080) == 0x00000000) {
24892                                    unsigned rd =
24893                                        ExtractSRegister(instr, 22, 12);
24894                                    unsigned rm = ExtractSRegister(instr, 5, 0);
24895                                    // VRINTP{<q>}.F32.F32 <Sd>, <Sm> ; T1
24896                                    vrintp(F32,
24897                                           F32,
24898                                           SRegister(rd),
24899                                           SRegister(rm));
24900                                  } else {
24901                                    UnallocatedT32(instr);
24902                                  }
24903                                  break;
24904                                }
24905                                case 0x000b0000: {
24906                                  // 0xfebb0a40
24907                                  if ((instr & 0x00000080) == 0x00000000) {
24908                                    unsigned rd =
24909                                        ExtractSRegister(instr, 22, 12);
24910                                    unsigned rm = ExtractSRegister(instr, 5, 0);
24911                                    // VRINTM{<q>}.F32.F32 <Sd>, <Sm> ; T1
24912                                    vrintm(F32,
24913                                           F32,
24914                                           SRegister(rd),
24915                                           SRegister(rm));
24916                                  } else {
24917                                    UnallocatedT32(instr);
24918                                  }
24919                                  break;
24920                                }
24921                                case 0x000c0000: {
24922                                  // 0xfebc0a40
24923                                  DataType dt =
24924                                      Dt_op_2_Decode((instr >> 7) & 0x1);
24925                                  if (dt.Is(kDataTypeValueInvalid)) {
24926                                    UnallocatedT32(instr);
24927                                    return;
24928                                  }
24929                                  unsigned rd = ExtractSRegister(instr, 22, 12);
24930                                  unsigned rm = ExtractSRegister(instr, 5, 0);
24931                                  // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24932                                  vcvta(dt, F32, SRegister(rd), SRegister(rm));
24933                                  break;
24934                                }
24935                                case 0x000d0000: {
24936                                  // 0xfebd0a40
24937                                  DataType dt =
24938                                      Dt_op_2_Decode((instr >> 7) & 0x1);
24939                                  if (dt.Is(kDataTypeValueInvalid)) {
24940                                    UnallocatedT32(instr);
24941                                    return;
24942                                  }
24943                                  unsigned rd = ExtractSRegister(instr, 22, 12);
24944                                  unsigned rm = ExtractSRegister(instr, 5, 0);
24945                                  // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24946                                  vcvtn(dt, F32, SRegister(rd), SRegister(rm));
24947                                  break;
24948                                }
24949                                case 0x000e0000: {
24950                                  // 0xfebe0a40
24951                                  DataType dt =
24952                                      Dt_op_2_Decode((instr >> 7) & 0x1);
24953                                  if (dt.Is(kDataTypeValueInvalid)) {
24954                                    UnallocatedT32(instr);
24955                                    return;
24956                                  }
24957                                  unsigned rd = ExtractSRegister(instr, 22, 12);
24958                                  unsigned rm = ExtractSRegister(instr, 5, 0);
24959                                  // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24960                                  vcvtp(dt, F32, SRegister(rd), SRegister(rm));
24961                                  break;
24962                                }
24963                                case 0x000f0000: {
24964                                  // 0xfebf0a40
24965                                  DataType dt =
24966                                      Dt_op_2_Decode((instr >> 7) & 0x1);
24967                                  if (dt.Is(kDataTypeValueInvalid)) {
24968                                    UnallocatedT32(instr);
24969                                    return;
24970                                  }
24971                                  unsigned rd = ExtractSRegister(instr, 22, 12);
24972                                  unsigned rm = ExtractSRegister(instr, 5, 0);
24973                                  // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24974                                  vcvtm(dt, F32, SRegister(rd), SRegister(rm));
24975                                  break;
24976                                }
24977                                default:
24978                                  UnallocatedT32(instr);
24979                                  break;
24980                              }
24981                              break;
24982                            }
24983                            case 0x00b00140: {
24984                              // 0xfeb00b40
24985                              switch (instr & 0x000f0000) {
24986                                case 0x00080000: {
24987                                  // 0xfeb80b40
24988                                  if ((instr & 0x00000080) == 0x00000000) {
24989                                    unsigned rd =
24990                                        ExtractDRegister(instr, 22, 12);
24991                                    unsigned rm = ExtractDRegister(instr, 5, 0);
24992                                    // VRINTA{<q>}.F64.F64 <Dd>, <Dm> ; T1
24993                                    vrinta(F64,
24994                                           F64,
24995                                           DRegister(rd),
24996                                           DRegister(rm));
24997                                  } else {
24998                                    UnallocatedT32(instr);
24999                                  }
25000                                  break;
25001                                }
25002                                case 0x00090000: {
25003                                  // 0xfeb90b40
25004                                  if ((instr & 0x00000080) == 0x00000000) {
25005                                    unsigned rd =
25006                                        ExtractDRegister(instr, 22, 12);
25007                                    unsigned rm = ExtractDRegister(instr, 5, 0);
25008                                    // VRINTN{<q>}.F64.F64 <Dd>, <Dm> ; T1
25009                                    vrintn(F64,
25010                                           F64,
25011                                           DRegister(rd),
25012                                           DRegister(rm));
25013                                  } else {
25014                                    UnallocatedT32(instr);
25015                                  }
25016                                  break;
25017                                }
25018                                case 0x000a0000: {
25019                                  // 0xfeba0b40
25020                                  if ((instr & 0x00000080) == 0x00000000) {
25021                                    unsigned rd =
25022                                        ExtractDRegister(instr, 22, 12);
25023                                    unsigned rm = ExtractDRegister(instr, 5, 0);
25024                                    // VRINTP{<q>}.F64.F64 <Dd>, <Dm> ; T1
25025                                    vrintp(F64,
25026                                           F64,
25027                                           DRegister(rd),
25028                                           DRegister(rm));
25029                                  } else {
25030                                    UnallocatedT32(instr);
25031                                  }
25032                                  break;
25033                                }
25034                                case 0x000b0000: {
25035                                  // 0xfebb0b40
25036                                  if ((instr & 0x00000080) == 0x00000000) {
25037                                    unsigned rd =
25038                                        ExtractDRegister(instr, 22, 12);
25039                                    unsigned rm = ExtractDRegister(instr, 5, 0);
25040                                    // VRINTM{<q>}.F64.F64 <Dd>, <Dm> ; T1
25041                                    vrintm(F64,
25042                                           F64,
25043                                           DRegister(rd),
25044                                           DRegister(rm));
25045                                  } else {
25046                                    UnallocatedT32(instr);
25047                                  }
25048                                  break;
25049                                }
25050                                case 0x000c0000: {
25051                                  // 0xfebc0b40
25052                                  DataType dt =
25053                                      Dt_op_2_Decode((instr >> 7) & 0x1);
25054                                  if (dt.Is(kDataTypeValueInvalid)) {
25055                                    UnallocatedT32(instr);
25056                                    return;
25057                                  }
25058                                  unsigned rd = ExtractSRegister(instr, 22, 12);
25059                                  unsigned rm = ExtractDRegister(instr, 5, 0);
25060                                  // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
25061                                  vcvta(dt, F64, SRegister(rd), DRegister(rm));
25062                                  break;
25063                                }
25064                                case 0x000d0000: {
25065                                  // 0xfebd0b40
25066                                  DataType dt =
25067                                      Dt_op_2_Decode((instr >> 7) & 0x1);
25068                                  if (dt.Is(kDataTypeValueInvalid)) {
25069                                    UnallocatedT32(instr);
25070                                    return;
25071                                  }
25072                                  unsigned rd = ExtractSRegister(instr, 22, 12);
25073                                  unsigned rm = ExtractDRegister(instr, 5, 0);
25074                                  // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
25075                                  vcvtn(dt, F64, SRegister(rd), DRegister(rm));
25076                                  break;
25077                                }
25078                                case 0x000e0000: {
25079                                  // 0xfebe0b40
25080                                  DataType dt =
25081                                      Dt_op_2_Decode((instr >> 7) & 0x1);
25082                                  if (dt.Is(kDataTypeValueInvalid)) {
25083                                    UnallocatedT32(instr);
25084                                    return;
25085                                  }
25086                                  unsigned rd = ExtractSRegister(instr, 22, 12);
25087                                  unsigned rm = ExtractDRegister(instr, 5, 0);
25088                                  // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
25089                                  vcvtp(dt, F64, SRegister(rd), DRegister(rm));
25090                                  break;
25091                                }
25092                                case 0x000f0000: {
25093                                  // 0xfebf0b40
25094                                  DataType dt =
25095                                      Dt_op_2_Decode((instr >> 7) & 0x1);
25096                                  if (dt.Is(kDataTypeValueInvalid)) {
25097                                    UnallocatedT32(instr);
25098                                    return;
25099                                  }
25100                                  unsigned rd = ExtractSRegister(instr, 22, 12);
25101                                  unsigned rm = ExtractDRegister(instr, 5, 0);
25102                                  // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
25103                                  vcvtm(dt, F64, SRegister(rd), DRegister(rm));
25104                                  break;
25105                                }
25106                                default:
25107                                  UnallocatedT32(instr);
25108                                  break;
25109                              }
25110                              break;
25111                            }
25112                            default:
25113                              UnallocatedT32(instr);
25114                              break;
25115                          }
25116                          break;
25117                        }
25118                        default: {
25119                          if (((instr & 0xe00) == 0xa00)) {
25120                            UnallocatedT32(instr);
25121                            return;
25122                          }
25123                          UnimplementedT32_32("CDP2", instr);
25124                          break;
25125                        }
25126                      }
25127                      break;
25128                    }
25129                  }
25130                  break;
25131                }
25132                case 0x00000010: {
25133                  // 0xee000010
25134                  switch (instr & 0x10100000) {
25135                    case 0x00000000: {
25136                      // 0xee000010
25137                      switch (instr & 0x00000e00) {
25138                        case 0x00000a00: {
25139                          // 0xee000a10
25140                          switch (instr & 0x00800100) {
25141                            case 0x00000000: {
25142                              // 0xee000a10
25143                              if ((instr & 0x00600000) == 0x00000000) {
25144                                unsigned rn = ExtractSRegister(instr, 7, 16);
25145                                unsigned rt = (instr >> 12) & 0xf;
25146                                // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1
25147                                vmov(CurrentCond(),
25148                                     SRegister(rn),
25149                                     Register(rt));
25150                                if (((instr & 0xfff00f7f) != 0xee000a10)) {
25151                                  UnpredictableT32(instr);
25152                                }
25153                              } else {
25154                                UnallocatedT32(instr);
25155                              }
25156                              break;
25157                            }
25158                            case 0x00000100: {
25159                              // 0xee000b10
25160                              unsigned lane;
25161                              DataType dt =
25162                                  Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
25163                                                            ((instr >> 19) &
25164                                                             0xc),
25165                                                        &lane);
25166                              if (dt.Is(kDataTypeValueInvalid)) {
25167                                UnallocatedT32(instr);
25168                                return;
25169                              }
25170                              unsigned rd = ExtractDRegister(instr, 7, 16);
25171                              unsigned rt = (instr >> 12) & 0xf;
25172                              // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1
25173                              vmov(CurrentCond(),
25174                                   dt,
25175                                   DRegisterLane(rd, lane),
25176                                   Register(rt));
25177                              if (((instr & 0xff900f1f) != 0xee000b10)) {
25178                                UnpredictableT32(instr);
25179                              }
25180                              break;
25181                            }
25182                            case 0x00800000: {
25183                              // 0xee800a10
25184                              if ((instr & 0x00600000) == 0x00600000) {
25185                                unsigned spec_reg = (instr >> 16) & 0xf;
25186                                unsigned rt = (instr >> 12) & 0xf;
25187                                switch (spec_reg) {
25188                                  case 0x0:
25189                                  case 0x1:
25190                                  case 0x8: {
25191                                    // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1
25192                                    vmsr(CurrentCond(),
25193                                         SpecialFPRegister(spec_reg),
25194                                         Register(rt));
25195                                    if (((instr & 0xfff00fff) != 0xeee00a10)) {
25196                                      UnpredictableT32(instr);
25197                                    }
25198                                    break;
25199                                  }
25200                                  default:
25201                                    UnallocatedT32(instr);
25202                                    break;
25203                                }
25204                              } else {
25205                                UnallocatedT32(instr);
25206                              }
25207                              break;
25208                            }
25209                            case 0x00800100: {
25210                              // 0xee800b10
25211                              switch (instr & 0x00200040) {
25212                                case 0x00000000: {
25213                                  // 0xee800b10
25214                                  DataType dt =
25215                                      Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
25216                                                      ((instr >> 21) & 0x2));
25217                                  if (dt.Is(kDataTypeValueInvalid)) {
25218                                    UnallocatedT32(instr);
25219                                    return;
25220                                  }
25221                                  unsigned rd = ExtractDRegister(instr, 7, 16);
25222                                  unsigned rt = (instr >> 12) & 0xf;
25223                                  // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1
25224                                  vdup(CurrentCond(),
25225                                       dt,
25226                                       DRegister(rd),
25227                                       Register(rt));
25228                                  if (((instr & 0xffb00f5f) != 0xee800b10)) {
25229                                    UnpredictableT32(instr);
25230                                  }
25231                                  break;
25232                                }
25233                                case 0x00200000: {
25234                                  // 0xeea00b10
25235                                  DataType dt =
25236                                      Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
25237                                                      ((instr >> 21) & 0x2));
25238                                  if (dt.Is(kDataTypeValueInvalid)) {
25239                                    UnallocatedT32(instr);
25240                                    return;
25241                                  }
25242                                  if (((instr >> 16) & 1) != 0) {
25243                                    UnallocatedT32(instr);
25244                                    return;
25245                                  }
25246                                  unsigned rd = ExtractQRegister(instr, 7, 16);
25247                                  unsigned rt = (instr >> 12) & 0xf;
25248                                  // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1
25249                                  vdup(CurrentCond(),
25250                                       dt,
25251                                       QRegister(rd),
25252                                       Register(rt));
25253                                  if (((instr & 0xffb00f5f) != 0xeea00b10)) {
25254                                    UnpredictableT32(instr);
25255                                  }
25256                                  break;
25257                                }
25258                                default:
25259                                  UnallocatedT32(instr);
25260                                  break;
25261                              }
25262                              break;
25263                            }
25264                          }
25265                          break;
25266                        }
25267                        default: {
25268                          if (((instr & 0xe00) == 0xa00)) {
25269                            UnallocatedT32(instr);
25270                            return;
25271                          }
25272                          UnimplementedT32_32("MCR", instr);
25273                          break;
25274                        }
25275                      }
25276                      break;
25277                    }
25278                    case 0x00100000: {
25279                      // 0xee100010
25280                      switch (instr & 0x00000e00) {
25281                        case 0x00000a00: {
25282                          // 0xee100a10
25283                          switch (instr & 0x00000100) {
25284                            case 0x00000000: {
25285                              // 0xee100a10
25286                              switch (instr & 0x00e00000) {
25287                                case 0x00000000: {
25288                                  // 0xee100a10
25289                                  unsigned rt = (instr >> 12) & 0xf;
25290                                  unsigned rn = ExtractSRegister(instr, 7, 16);
25291                                  // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1
25292                                  vmov(CurrentCond(),
25293                                       Register(rt),
25294                                       SRegister(rn));
25295                                  if (((instr & 0xfff00f7f) != 0xee100a10)) {
25296                                    UnpredictableT32(instr);
25297                                  }
25298                                  break;
25299                                }
25300                                case 0x00e00000: {
25301                                  // 0xeef00a10
25302                                  unsigned rt = (instr >> 12) & 0xf;
25303                                  unsigned spec_reg = (instr >> 16) & 0xf;
25304                                  switch (spec_reg) {
25305                                    case 0x0:
25306                                    case 0x1:
25307                                    case 0x5:
25308                                    case 0x6:
25309                                    case 0x7:
25310                                    case 0x8: {
25311                                      // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1
25312                                      vmrs(CurrentCond(),
25313                                           RegisterOrAPSR_nzcv(rt),
25314                                           SpecialFPRegister(spec_reg));
25315                                      if (((instr & 0xfff00fff) !=
25316                                           0xeef00a10)) {
25317                                        UnpredictableT32(instr);
25318                                      }
25319                                      break;
25320                                    }
25321                                    default:
25322                                      UnallocatedT32(instr);
25323                                      break;
25324                                  }
25325                                  break;
25326                                }
25327                                default:
25328                                  UnallocatedT32(instr);
25329                                  break;
25330                              }
25331                              break;
25332                            }
25333                            case 0x00000100: {
25334                              // 0xee100b10
25335                              unsigned lane;
25336                              DataType dt =
25337                                  Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
25338                                                              ((instr >> 19) &
25339                                                               0xc) |
25340                                                              ((instr >> 19) &
25341                                                               0x10),
25342                                                          &lane);
25343                              if (dt.Is(kDataTypeValueInvalid)) {
25344                                UnallocatedT32(instr);
25345                                return;
25346                              }
25347                              unsigned rt = (instr >> 12) & 0xf;
25348                              unsigned rn = ExtractDRegister(instr, 7, 16);
25349                              // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1
25350                              vmov(CurrentCond(),
25351                                   dt,
25352                                   Register(rt),
25353                                   DRegisterLane(rn, lane));
25354                              if (((instr & 0xff100f1f) != 0xee100b10)) {
25355                                UnpredictableT32(instr);
25356                              }
25357                              break;
25358                            }
25359                          }
25360                          break;
25361                        }
25362                        default: {
25363                          if (((instr & 0xe00) == 0xa00)) {
25364                            UnallocatedT32(instr);
25365                            return;
25366                          }
25367                          UnimplementedT32_32("MRC", instr);
25368                          break;
25369                        }
25370                      }
25371                      break;
25372                    }
25373                    case 0x10000000: {
25374                      // 0xfe000010
25375                      if (((instr & 0xe00) == 0xa00)) {
25376                        UnallocatedT32(instr);
25377                        return;
25378                      }
25379                      UnimplementedT32_32("MCR2", instr);
25380                      break;
25381                    }
25382                    case 0x10100000: {
25383                      // 0xfe100010
25384                      if (((instr & 0xe00) == 0xa00)) {
25385                        UnallocatedT32(instr);
25386                        return;
25387                      }
25388                      UnimplementedT32_32("MRC2", instr);
25389                      break;
25390                    }
25391                  }
25392                  break;
25393                }
25394                case 0x01000000: {
25395                  // 0xef000000
25396                  switch (instr & 0x00800000) {
25397                    case 0x00000000: {
25398                      // 0xef000000
25399                      switch (instr & 0x00000f40) {
25400                        case 0x00000000: {
25401                          // 0xef000000
25402                          DataType dt = Dt_U_size_1_Decode(
25403                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25404                          if (dt.Is(kDataTypeValueInvalid)) {
25405                            UnallocatedT32(instr);
25406                            return;
25407                          }
25408                          unsigned rd = ExtractDRegister(instr, 22, 12);
25409                          unsigned rn = ExtractDRegister(instr, 7, 16);
25410                          unsigned rm = ExtractDRegister(instr, 5, 0);
25411                          // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25412                          vhadd(CurrentCond(),
25413                                dt,
25414                                DRegister(rd),
25415                                DRegister(rn),
25416                                DRegister(rm));
25417                          break;
25418                        }
25419                        case 0x00000040: {
25420                          // 0xef000040
25421                          DataType dt = Dt_U_size_1_Decode(
25422                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25423                          if (dt.Is(kDataTypeValueInvalid)) {
25424                            UnallocatedT32(instr);
25425                            return;
25426                          }
25427                          if (((instr >> 12) & 1) != 0) {
25428                            UnallocatedT32(instr);
25429                            return;
25430                          }
25431                          unsigned rd = ExtractQRegister(instr, 22, 12);
25432                          if (((instr >> 16) & 1) != 0) {
25433                            UnallocatedT32(instr);
25434                            return;
25435                          }
25436                          unsigned rn = ExtractQRegister(instr, 7, 16);
25437                          if ((instr & 1) != 0) {
25438                            UnallocatedT32(instr);
25439                            return;
25440                          }
25441                          unsigned rm = ExtractQRegister(instr, 5, 0);
25442                          // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25443                          vhadd(CurrentCond(),
25444                                dt,
25445                                QRegister(rd),
25446                                QRegister(rn),
25447                                QRegister(rm));
25448                          break;
25449                        }
25450                        case 0x00000100: {
25451                          // 0xef000100
25452                          DataType dt = Dt_U_size_1_Decode(
25453                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25454                          if (dt.Is(kDataTypeValueInvalid)) {
25455                            UnallocatedT32(instr);
25456                            return;
25457                          }
25458                          unsigned rd = ExtractDRegister(instr, 22, 12);
25459                          unsigned rn = ExtractDRegister(instr, 7, 16);
25460                          unsigned rm = ExtractDRegister(instr, 5, 0);
25461                          // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25462                          vrhadd(CurrentCond(),
25463                                 dt,
25464                                 DRegister(rd),
25465                                 DRegister(rn),
25466                                 DRegister(rm));
25467                          break;
25468                        }
25469                        case 0x00000140: {
25470                          // 0xef000140
25471                          DataType dt = Dt_U_size_1_Decode(
25472                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25473                          if (dt.Is(kDataTypeValueInvalid)) {
25474                            UnallocatedT32(instr);
25475                            return;
25476                          }
25477                          if (((instr >> 12) & 1) != 0) {
25478                            UnallocatedT32(instr);
25479                            return;
25480                          }
25481                          unsigned rd = ExtractQRegister(instr, 22, 12);
25482                          if (((instr >> 16) & 1) != 0) {
25483                            UnallocatedT32(instr);
25484                            return;
25485                          }
25486                          unsigned rn = ExtractQRegister(instr, 7, 16);
25487                          if ((instr & 1) != 0) {
25488                            UnallocatedT32(instr);
25489                            return;
25490                          }
25491                          unsigned rm = ExtractQRegister(instr, 5, 0);
25492                          // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25493                          vrhadd(CurrentCond(),
25494                                 dt,
25495                                 QRegister(rd),
25496                                 QRegister(rn),
25497                                 QRegister(rm));
25498                          break;
25499                        }
25500                        case 0x00000200: {
25501                          // 0xef000200
25502                          DataType dt = Dt_U_size_1_Decode(
25503                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25504                          if (dt.Is(kDataTypeValueInvalid)) {
25505                            UnallocatedT32(instr);
25506                            return;
25507                          }
25508                          unsigned rd = ExtractDRegister(instr, 22, 12);
25509                          unsigned rn = ExtractDRegister(instr, 7, 16);
25510                          unsigned rm = ExtractDRegister(instr, 5, 0);
25511                          // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25512                          vhsub(CurrentCond(),
25513                                dt,
25514                                DRegister(rd),
25515                                DRegister(rn),
25516                                DRegister(rm));
25517                          break;
25518                        }
25519                        case 0x00000240: {
25520                          // 0xef000240
25521                          DataType dt = Dt_U_size_1_Decode(
25522                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25523                          if (dt.Is(kDataTypeValueInvalid)) {
25524                            UnallocatedT32(instr);
25525                            return;
25526                          }
25527                          if (((instr >> 12) & 1) != 0) {
25528                            UnallocatedT32(instr);
25529                            return;
25530                          }
25531                          unsigned rd = ExtractQRegister(instr, 22, 12);
25532                          if (((instr >> 16) & 1) != 0) {
25533                            UnallocatedT32(instr);
25534                            return;
25535                          }
25536                          unsigned rn = ExtractQRegister(instr, 7, 16);
25537                          if ((instr & 1) != 0) {
25538                            UnallocatedT32(instr);
25539                            return;
25540                          }
25541                          unsigned rm = ExtractQRegister(instr, 5, 0);
25542                          // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25543                          vhsub(CurrentCond(),
25544                                dt,
25545                                QRegister(rd),
25546                                QRegister(rn),
25547                                QRegister(rm));
25548                          break;
25549                        }
25550                        case 0x00000300: {
25551                          // 0xef000300
25552                          DataType dt = Dt_U_size_1_Decode(
25553                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25554                          if (dt.Is(kDataTypeValueInvalid)) {
25555                            UnallocatedT32(instr);
25556                            return;
25557                          }
25558                          unsigned rd = ExtractDRegister(instr, 22, 12);
25559                          unsigned rn = ExtractDRegister(instr, 7, 16);
25560                          unsigned rm = ExtractDRegister(instr, 5, 0);
25561                          // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25562                          vcgt(CurrentCond(),
25563                               dt,
25564                               DRegister(rd),
25565                               DRegister(rn),
25566                               DRegister(rm));
25567                          break;
25568                        }
25569                        case 0x00000340: {
25570                          // 0xef000340
25571                          DataType dt = Dt_U_size_1_Decode(
25572                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25573                          if (dt.Is(kDataTypeValueInvalid)) {
25574                            UnallocatedT32(instr);
25575                            return;
25576                          }
25577                          if (((instr >> 12) & 1) != 0) {
25578                            UnallocatedT32(instr);
25579                            return;
25580                          }
25581                          unsigned rd = ExtractQRegister(instr, 22, 12);
25582                          if (((instr >> 16) & 1) != 0) {
25583                            UnallocatedT32(instr);
25584                            return;
25585                          }
25586                          unsigned rn = ExtractQRegister(instr, 7, 16);
25587                          if ((instr & 1) != 0) {
25588                            UnallocatedT32(instr);
25589                            return;
25590                          }
25591                          unsigned rm = ExtractQRegister(instr, 5, 0);
25592                          // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25593                          vcgt(CurrentCond(),
25594                               dt,
25595                               QRegister(rd),
25596                               QRegister(rn),
25597                               QRegister(rm));
25598                          break;
25599                        }
25600                        case 0x00000400: {
25601                          // 0xef000400
25602                          DataType dt = Dt_U_size_3_Decode(
25603                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25604                          if (dt.Is(kDataTypeValueInvalid)) {
25605                            UnallocatedT32(instr);
25606                            return;
25607                          }
25608                          unsigned rd = ExtractDRegister(instr, 22, 12);
25609                          unsigned rm = ExtractDRegister(instr, 5, 0);
25610                          unsigned rn = ExtractDRegister(instr, 7, 16);
25611                          // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
25612                          vshl(CurrentCond(),
25613                               dt,
25614                               DRegister(rd),
25615                               DRegister(rm),
25616                               DRegister(rn));
25617                          break;
25618                        }
25619                        case 0x00000440: {
25620                          // 0xef000440
25621                          DataType dt = Dt_U_size_3_Decode(
25622                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25623                          if (dt.Is(kDataTypeValueInvalid)) {
25624                            UnallocatedT32(instr);
25625                            return;
25626                          }
25627                          if (((instr >> 12) & 1) != 0) {
25628                            UnallocatedT32(instr);
25629                            return;
25630                          }
25631                          unsigned rd = ExtractQRegister(instr, 22, 12);
25632                          if ((instr & 1) != 0) {
25633                            UnallocatedT32(instr);
25634                            return;
25635                          }
25636                          unsigned rm = ExtractQRegister(instr, 5, 0);
25637                          if (((instr >> 16) & 1) != 0) {
25638                            UnallocatedT32(instr);
25639                            return;
25640                          }
25641                          unsigned rn = ExtractQRegister(instr, 7, 16);
25642                          // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
25643                          vshl(CurrentCond(),
25644                               dt,
25645                               QRegister(rd),
25646                               QRegister(rm),
25647                               QRegister(rn));
25648                          break;
25649                        }
25650                        case 0x00000500: {
25651                          // 0xef000500
25652                          DataType dt = Dt_U_size_3_Decode(
25653                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25654                          if (dt.Is(kDataTypeValueInvalid)) {
25655                            UnallocatedT32(instr);
25656                            return;
25657                          }
25658                          unsigned rd = ExtractDRegister(instr, 22, 12);
25659                          unsigned rm = ExtractDRegister(instr, 5, 0);
25660                          unsigned rn = ExtractDRegister(instr, 7, 16);
25661                          // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
25662                          vrshl(CurrentCond(),
25663                                dt,
25664                                DRegister(rd),
25665                                DRegister(rm),
25666                                DRegister(rn));
25667                          break;
25668                        }
25669                        case 0x00000540: {
25670                          // 0xef000540
25671                          DataType dt = Dt_U_size_3_Decode(
25672                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25673                          if (dt.Is(kDataTypeValueInvalid)) {
25674                            UnallocatedT32(instr);
25675                            return;
25676                          }
25677                          if (((instr >> 12) & 1) != 0) {
25678                            UnallocatedT32(instr);
25679                            return;
25680                          }
25681                          unsigned rd = ExtractQRegister(instr, 22, 12);
25682                          if ((instr & 1) != 0) {
25683                            UnallocatedT32(instr);
25684                            return;
25685                          }
25686                          unsigned rm = ExtractQRegister(instr, 5, 0);
25687                          if (((instr >> 16) & 1) != 0) {
25688                            UnallocatedT32(instr);
25689                            return;
25690                          }
25691                          unsigned rn = ExtractQRegister(instr, 7, 16);
25692                          // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
25693                          vrshl(CurrentCond(),
25694                                dt,
25695                                QRegister(rd),
25696                                QRegister(rm),
25697                                QRegister(rn));
25698                          break;
25699                        }
25700                        case 0x00000600: {
25701                          // 0xef000600
25702                          DataType dt = Dt_U_size_1_Decode(
25703                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25704                          if (dt.Is(kDataTypeValueInvalid)) {
25705                            UnallocatedT32(instr);
25706                            return;
25707                          }
25708                          unsigned rd = ExtractDRegister(instr, 22, 12);
25709                          unsigned rn = ExtractDRegister(instr, 7, 16);
25710                          unsigned rm = ExtractDRegister(instr, 5, 0);
25711                          // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25712                          vmax(CurrentCond(),
25713                               dt,
25714                               DRegister(rd),
25715                               DRegister(rn),
25716                               DRegister(rm));
25717                          break;
25718                        }
25719                        case 0x00000640: {
25720                          // 0xef000640
25721                          DataType dt = Dt_U_size_1_Decode(
25722                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25723                          if (dt.Is(kDataTypeValueInvalid)) {
25724                            UnallocatedT32(instr);
25725                            return;
25726                          }
25727                          if (((instr >> 12) & 1) != 0) {
25728                            UnallocatedT32(instr);
25729                            return;
25730                          }
25731                          unsigned rd = ExtractQRegister(instr, 22, 12);
25732                          if (((instr >> 16) & 1) != 0) {
25733                            UnallocatedT32(instr);
25734                            return;
25735                          }
25736                          unsigned rn = ExtractQRegister(instr, 7, 16);
25737                          if ((instr & 1) != 0) {
25738                            UnallocatedT32(instr);
25739                            return;
25740                          }
25741                          unsigned rm = ExtractQRegister(instr, 5, 0);
25742                          // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25743                          vmax(CurrentCond(),
25744                               dt,
25745                               QRegister(rd),
25746                               QRegister(rn),
25747                               QRegister(rm));
25748                          break;
25749                        }
25750                        case 0x00000700: {
25751                          // 0xef000700
25752                          DataType dt = Dt_U_size_1_Decode(
25753                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25754                          if (dt.Is(kDataTypeValueInvalid)) {
25755                            UnallocatedT32(instr);
25756                            return;
25757                          }
25758                          unsigned rd = ExtractDRegister(instr, 22, 12);
25759                          unsigned rn = ExtractDRegister(instr, 7, 16);
25760                          unsigned rm = ExtractDRegister(instr, 5, 0);
25761                          // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25762                          vabd(CurrentCond(),
25763                               dt,
25764                               DRegister(rd),
25765                               DRegister(rn),
25766                               DRegister(rm));
25767                          break;
25768                        }
25769                        case 0x00000740: {
25770                          // 0xef000740
25771                          DataType dt = Dt_U_size_1_Decode(
25772                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25773                          if (dt.Is(kDataTypeValueInvalid)) {
25774                            UnallocatedT32(instr);
25775                            return;
25776                          }
25777                          if (((instr >> 12) & 1) != 0) {
25778                            UnallocatedT32(instr);
25779                            return;
25780                          }
25781                          unsigned rd = ExtractQRegister(instr, 22, 12);
25782                          if (((instr >> 16) & 1) != 0) {
25783                            UnallocatedT32(instr);
25784                            return;
25785                          }
25786                          unsigned rn = ExtractQRegister(instr, 7, 16);
25787                          if ((instr & 1) != 0) {
25788                            UnallocatedT32(instr);
25789                            return;
25790                          }
25791                          unsigned rm = ExtractQRegister(instr, 5, 0);
25792                          // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25793                          vabd(CurrentCond(),
25794                               dt,
25795                               QRegister(rd),
25796                               QRegister(rn),
25797                               QRegister(rm));
25798                          break;
25799                        }
25800                        case 0x00000800: {
25801                          // 0xef000800
25802                          switch (instr & 0x10000000) {
25803                            case 0x00000000: {
25804                              // 0xef000800
25805                              DataType dt =
25806                                  Dt_size_2_Decode((instr >> 20) & 0x3);
25807                              if (dt.Is(kDataTypeValueInvalid)) {
25808                                UnallocatedT32(instr);
25809                                return;
25810                              }
25811                              unsigned rd = ExtractDRegister(instr, 22, 12);
25812                              unsigned rn = ExtractDRegister(instr, 7, 16);
25813                              unsigned rm = ExtractDRegister(instr, 5, 0);
25814                              // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25815                              vadd(CurrentCond(),
25816                                   dt,
25817                                   DRegister(rd),
25818                                   DRegister(rn),
25819                                   DRegister(rm));
25820                              break;
25821                            }
25822                            case 0x10000000: {
25823                              // 0xff000800
25824                              DataType dt =
25825                                  Dt_size_2_Decode((instr >> 20) & 0x3);
25826                              if (dt.Is(kDataTypeValueInvalid)) {
25827                                UnallocatedT32(instr);
25828                                return;
25829                              }
25830                              unsigned rd = ExtractDRegister(instr, 22, 12);
25831                              unsigned rn = ExtractDRegister(instr, 7, 16);
25832                              unsigned rm = ExtractDRegister(instr, 5, 0);
25833                              // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25834                              vsub(CurrentCond(),
25835                                   dt,
25836                                   DRegister(rd),
25837                                   DRegister(rn),
25838                                   DRegister(rm));
25839                              break;
25840                            }
25841                          }
25842                          break;
25843                        }
25844                        case 0x00000840: {
25845                          // 0xef000840
25846                          switch (instr & 0x10000000) {
25847                            case 0x00000000: {
25848                              // 0xef000840
25849                              DataType dt =
25850                                  Dt_size_2_Decode((instr >> 20) & 0x3);
25851                              if (dt.Is(kDataTypeValueInvalid)) {
25852                                UnallocatedT32(instr);
25853                                return;
25854                              }
25855                              if (((instr >> 12) & 1) != 0) {
25856                                UnallocatedT32(instr);
25857                                return;
25858                              }
25859                              unsigned rd = ExtractQRegister(instr, 22, 12);
25860                              if (((instr >> 16) & 1) != 0) {
25861                                UnallocatedT32(instr);
25862                                return;
25863                              }
25864                              unsigned rn = ExtractQRegister(instr, 7, 16);
25865                              if ((instr & 1) != 0) {
25866                                UnallocatedT32(instr);
25867                                return;
25868                              }
25869                              unsigned rm = ExtractQRegister(instr, 5, 0);
25870                              // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25871                              vadd(CurrentCond(),
25872                                   dt,
25873                                   QRegister(rd),
25874                                   QRegister(rn),
25875                                   QRegister(rm));
25876                              break;
25877                            }
25878                            case 0x10000000: {
25879                              // 0xff000840
25880                              DataType dt =
25881                                  Dt_size_2_Decode((instr >> 20) & 0x3);
25882                              if (dt.Is(kDataTypeValueInvalid)) {
25883                                UnallocatedT32(instr);
25884                                return;
25885                              }
25886                              if (((instr >> 12) & 1) != 0) {
25887                                UnallocatedT32(instr);
25888                                return;
25889                              }
25890                              unsigned rd = ExtractQRegister(instr, 22, 12);
25891                              if (((instr >> 16) & 1) != 0) {
25892                                UnallocatedT32(instr);
25893                                return;
25894                              }
25895                              unsigned rn = ExtractQRegister(instr, 7, 16);
25896                              if ((instr & 1) != 0) {
25897                                UnallocatedT32(instr);
25898                                return;
25899                              }
25900                              unsigned rm = ExtractQRegister(instr, 5, 0);
25901                              // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25902                              vsub(CurrentCond(),
25903                                   dt,
25904                                   QRegister(rd),
25905                                   QRegister(rn),
25906                                   QRegister(rm));
25907                              break;
25908                            }
25909                          }
25910                          break;
25911                        }
25912                        case 0x00000900: {
25913                          // 0xef000900
25914                          switch (instr & 0x10000000) {
25915                            case 0x00000000: {
25916                              // 0xef000900
25917                              DataType dt =
25918                                  Dt_size_10_Decode((instr >> 20) & 0x3);
25919                              if (dt.Is(kDataTypeValueInvalid)) {
25920                                UnallocatedT32(instr);
25921                                return;
25922                              }
25923                              unsigned rd = ExtractDRegister(instr, 22, 12);
25924                              unsigned rn = ExtractDRegister(instr, 7, 16);
25925                              unsigned rm = ExtractDRegister(instr, 5, 0);
25926                              // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
25927                              vmla(CurrentCond(),
25928                                   dt,
25929                                   DRegister(rd),
25930                                   DRegister(rn),
25931                                   DRegister(rm));
25932                              break;
25933                            }
25934                            case 0x10000000: {
25935                              // 0xff000900
25936                              DataType dt =
25937                                  Dt_size_10_Decode((instr >> 20) & 0x3);
25938                              if (dt.Is(kDataTypeValueInvalid)) {
25939                                UnallocatedT32(instr);
25940                                return;
25941                              }
25942                              unsigned rd = ExtractDRegister(instr, 22, 12);
25943                              unsigned rn = ExtractDRegister(instr, 7, 16);
25944                              unsigned rm = ExtractDRegister(instr, 5, 0);
25945                              // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
25946                              vmls(CurrentCond(),
25947                                   dt,
25948                                   DRegister(rd),
25949                                   DRegister(rn),
25950                                   DRegister(rm));
25951                              break;
25952                            }
25953                          }
25954                          break;
25955                        }
25956                        case 0x00000940: {
25957                          // 0xef000940
25958                          switch (instr & 0x10000000) {
25959                            case 0x00000000: {
25960                              // 0xef000940
25961                              DataType dt =
25962                                  Dt_size_10_Decode((instr >> 20) & 0x3);
25963                              if (dt.Is(kDataTypeValueInvalid)) {
25964                                UnallocatedT32(instr);
25965                                return;
25966                              }
25967                              if (((instr >> 12) & 1) != 0) {
25968                                UnallocatedT32(instr);
25969                                return;
25970                              }
25971                              unsigned rd = ExtractQRegister(instr, 22, 12);
25972                              if (((instr >> 16) & 1) != 0) {
25973                                UnallocatedT32(instr);
25974                                return;
25975                              }
25976                              unsigned rn = ExtractQRegister(instr, 7, 16);
25977                              if ((instr & 1) != 0) {
25978                                UnallocatedT32(instr);
25979                                return;
25980                              }
25981                              unsigned rm = ExtractQRegister(instr, 5, 0);
25982                              // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
25983                              vmla(CurrentCond(),
25984                                   dt,
25985                                   QRegister(rd),
25986                                   QRegister(rn),
25987                                   QRegister(rm));
25988                              break;
25989                            }
25990                            case 0x10000000: {
25991                              // 0xff000940
25992                              DataType dt =
25993                                  Dt_size_10_Decode((instr >> 20) & 0x3);
25994                              if (dt.Is(kDataTypeValueInvalid)) {
25995                                UnallocatedT32(instr);
25996                                return;
25997                              }
25998                              if (((instr >> 12) & 1) != 0) {
25999                                UnallocatedT32(instr);
26000                                return;
26001                              }
26002                              unsigned rd = ExtractQRegister(instr, 22, 12);
26003                              if (((instr >> 16) & 1) != 0) {
26004                                UnallocatedT32(instr);
26005                                return;
26006                              }
26007                              unsigned rn = ExtractQRegister(instr, 7, 16);
26008                              if ((instr & 1) != 0) {
26009                                UnallocatedT32(instr);
26010                                return;
26011                              }
26012                              unsigned rm = ExtractQRegister(instr, 5, 0);
26013                              // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
26014                              vmls(CurrentCond(),
26015                                   dt,
26016                                   QRegister(rd),
26017                                   QRegister(rn),
26018                                   QRegister(rm));
26019                              break;
26020                            }
26021                          }
26022                          break;
26023                        }
26024                        case 0x00000a00: {
26025                          // 0xef000a00
26026                          DataType dt = Dt_U_size_1_Decode(
26027                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
26028                          if (dt.Is(kDataTypeValueInvalid)) {
26029                            UnallocatedT32(instr);
26030                            return;
26031                          }
26032                          unsigned rd = ExtractDRegister(instr, 22, 12);
26033                          unsigned rn = ExtractDRegister(instr, 7, 16);
26034                          unsigned rm = ExtractDRegister(instr, 5, 0);
26035                          // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
26036                          vpmax(CurrentCond(),
26037                                dt,
26038                                DRegister(rd),
26039                                DRegister(rn),
26040                                DRegister(rm));
26041                          break;
26042                        }
26043                        case 0x00000b00: {
26044                          // 0xef000b00
26045                          switch (instr & 0x10000000) {
26046                            case 0x00000000: {
26047                              // 0xef000b00
26048                              DataType dt =
26049                                  Dt_size_13_Decode((instr >> 20) & 0x3);
26050                              if (dt.Is(kDataTypeValueInvalid)) {
26051                                UnallocatedT32(instr);
26052                                return;
26053                              }
26054                              unsigned rd = ExtractDRegister(instr, 22, 12);
26055                              unsigned rn = ExtractDRegister(instr, 7, 16);
26056                              unsigned rm = ExtractDRegister(instr, 5, 0);
26057                              // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
26058                              vqdmulh(CurrentCond(),
26059                                      dt,
26060                                      DRegister(rd),
26061                                      DRegister(rn),
26062                                      DRegister(rm));
26063                              break;
26064                            }
26065                            case 0x10000000: {
26066                              // 0xff000b00
26067                              DataType dt =
26068                                  Dt_size_13_Decode((instr >> 20) & 0x3);
26069                              if (dt.Is(kDataTypeValueInvalid)) {
26070                                UnallocatedT32(instr);
26071                                return;
26072                              }
26073                              unsigned rd = ExtractDRegister(instr, 22, 12);
26074                              unsigned rn = ExtractDRegister(instr, 7, 16);
26075                              unsigned rm = ExtractDRegister(instr, 5, 0);
26076                              // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
26077                              vqrdmulh(CurrentCond(),
26078                                       dt,
26079                                       DRegister(rd),
26080                                       DRegister(rn),
26081                                       DRegister(rm));
26082                              break;
26083                            }
26084                          }
26085                          break;
26086                        }
26087                        case 0x00000b40: {
26088                          // 0xef000b40
26089                          switch (instr & 0x10000000) {
26090                            case 0x00000000: {
26091                              // 0xef000b40
26092                              DataType dt =
26093                                  Dt_size_13_Decode((instr >> 20) & 0x3);
26094                              if (dt.Is(kDataTypeValueInvalid)) {
26095                                UnallocatedT32(instr);
26096                                return;
26097                              }
26098                              if (((instr >> 12) & 1) != 0) {
26099                                UnallocatedT32(instr);
26100                                return;
26101                              }
26102                              unsigned rd = ExtractQRegister(instr, 22, 12);
26103                              if (((instr >> 16) & 1) != 0) {
26104                                UnallocatedT32(instr);
26105                                return;
26106                              }
26107                              unsigned rn = ExtractQRegister(instr, 7, 16);
26108                              if ((instr & 1) != 0) {
26109                                UnallocatedT32(instr);
26110                                return;
26111                              }
26112                              unsigned rm = ExtractQRegister(instr, 5, 0);
26113                              // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
26114                              vqdmulh(CurrentCond(),
26115                                      dt,
26116                                      QRegister(rd),
26117                                      QRegister(rn),
26118                                      QRegister(rm));
26119                              break;
26120                            }
26121                            case 0x10000000: {
26122                              // 0xff000b40
26123                              DataType dt =
26124                                  Dt_size_13_Decode((instr >> 20) & 0x3);
26125                              if (dt.Is(kDataTypeValueInvalid)) {
26126                                UnallocatedT32(instr);
26127                                return;
26128                              }
26129                              if (((instr >> 12) & 1) != 0) {
26130                                UnallocatedT32(instr);
26131                                return;
26132                              }
26133                              unsigned rd = ExtractQRegister(instr, 22, 12);
26134                              if (((instr >> 16) & 1) != 0) {
26135                                UnallocatedT32(instr);
26136                                return;
26137                              }
26138                              unsigned rn = ExtractQRegister(instr, 7, 16);
26139                              if ((instr & 1) != 0) {
26140                                UnallocatedT32(instr);
26141                                return;
26142                              }
26143                              unsigned rm = ExtractQRegister(instr, 5, 0);
26144                              // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
26145                              vqrdmulh(CurrentCond(),
26146                                       dt,
26147                                       QRegister(rd),
26148                                       QRegister(rn),
26149                                       QRegister(rm));
26150                              break;
26151                            }
26152                          }
26153                          break;
26154                        }
26155                        case 0x00000c40: {
26156                          // 0xef000c40
26157                          switch (instr & 0x10300000) {
26158                            case 0x00000000: {
26159                              // 0xef000c40
26160                              UnimplementedT32_32("SHA1C", instr);
26161                              break;
26162                            }
26163                            case 0x00100000: {
26164                              // 0xef100c40
26165                              UnimplementedT32_32("SHA1P", instr);
26166                              break;
26167                            }
26168                            case 0x00200000: {
26169                              // 0xef200c40
26170                              UnimplementedT32_32("SHA1M", instr);
26171                              break;
26172                            }
26173                            case 0x00300000: {
26174                              // 0xef300c40
26175                              UnimplementedT32_32("SHA1SU0", instr);
26176                              break;
26177                            }
26178                            case 0x10000000: {
26179                              // 0xff000c40
26180                              UnimplementedT32_32("SHA256H", instr);
26181                              break;
26182                            }
26183                            case 0x10100000: {
26184                              // 0xff100c40
26185                              UnimplementedT32_32("SHA256H2", instr);
26186                              break;
26187                            }
26188                            case 0x10200000: {
26189                              // 0xff200c40
26190                              UnimplementedT32_32("SHA256SU1", instr);
26191                              break;
26192                            }
26193                            default:
26194                              UnallocatedT32(instr);
26195                              break;
26196                          }
26197                          break;
26198                        }
26199                        case 0x00000d00: {
26200                          // 0xef000d00
26201                          switch (instr & 0x10300000) {
26202                            case 0x00000000: {
26203                              // 0xef000d00
26204                              unsigned rd = ExtractDRegister(instr, 22, 12);
26205                              unsigned rn = ExtractDRegister(instr, 7, 16);
26206                              unsigned rm = ExtractDRegister(instr, 5, 0);
26207                              // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26208                              vadd(CurrentCond(),
26209                                   F32,
26210                                   DRegister(rd),
26211                                   DRegister(rn),
26212                                   DRegister(rm));
26213                              break;
26214                            }
26215                            case 0x00200000: {
26216                              // 0xef200d00
26217                              unsigned rd = ExtractDRegister(instr, 22, 12);
26218                              unsigned rn = ExtractDRegister(instr, 7, 16);
26219                              unsigned rm = ExtractDRegister(instr, 5, 0);
26220                              // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26221                              vsub(CurrentCond(),
26222                                   F32,
26223                                   DRegister(rd),
26224                                   DRegister(rn),
26225                                   DRegister(rm));
26226                              break;
26227                            }
26228                            case 0x10000000: {
26229                              // 0xff000d00
26230                              unsigned rd = ExtractDRegister(instr, 22, 12);
26231                              unsigned rn = ExtractDRegister(instr, 7, 16);
26232                              unsigned rm = ExtractDRegister(instr, 5, 0);
26233                              // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26234                              vpadd(CurrentCond(),
26235                                    F32,
26236                                    DRegister(rd),
26237                                    DRegister(rn),
26238                                    DRegister(rm));
26239                              break;
26240                            }
26241                            case 0x10200000: {
26242                              // 0xff200d00
26243                              unsigned rd = ExtractDRegister(instr, 22, 12);
26244                              unsigned rn = ExtractDRegister(instr, 7, 16);
26245                              unsigned rm = ExtractDRegister(instr, 5, 0);
26246                              // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26247                              vabd(CurrentCond(),
26248                                   F32,
26249                                   DRegister(rd),
26250                                   DRegister(rn),
26251                                   DRegister(rm));
26252                              break;
26253                            }
26254                            default:
26255                              UnallocatedT32(instr);
26256                              break;
26257                          }
26258                          break;
26259                        }
26260                        case 0x00000d40: {
26261                          // 0xef000d40
26262                          switch (instr & 0x10300000) {
26263                            case 0x00000000: {
26264                              // 0xef000d40
26265                              if (((instr >> 12) & 1) != 0) {
26266                                UnallocatedT32(instr);
26267                                return;
26268                              }
26269                              unsigned rd = ExtractQRegister(instr, 22, 12);
26270                              if (((instr >> 16) & 1) != 0) {
26271                                UnallocatedT32(instr);
26272                                return;
26273                              }
26274                              unsigned rn = ExtractQRegister(instr, 7, 16);
26275                              if ((instr & 1) != 0) {
26276                                UnallocatedT32(instr);
26277                                return;
26278                              }
26279                              unsigned rm = ExtractQRegister(instr, 5, 0);
26280                              // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26281                              vadd(CurrentCond(),
26282                                   F32,
26283                                   QRegister(rd),
26284                                   QRegister(rn),
26285                                   QRegister(rm));
26286                              break;
26287                            }
26288                            case 0x00200000: {
26289                              // 0xef200d40
26290                              if (((instr >> 12) & 1) != 0) {
26291                                UnallocatedT32(instr);
26292                                return;
26293                              }
26294                              unsigned rd = ExtractQRegister(instr, 22, 12);
26295                              if (((instr >> 16) & 1) != 0) {
26296                                UnallocatedT32(instr);
26297                                return;
26298                              }
26299                              unsigned rn = ExtractQRegister(instr, 7, 16);
26300                              if ((instr & 1) != 0) {
26301                                UnallocatedT32(instr);
26302                                return;
26303                              }
26304                              unsigned rm = ExtractQRegister(instr, 5, 0);
26305                              // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26306                              vsub(CurrentCond(),
26307                                   F32,
26308                                   QRegister(rd),
26309                                   QRegister(rn),
26310                                   QRegister(rm));
26311                              break;
26312                            }
26313                            case 0x10200000: {
26314                              // 0xff200d40
26315                              if (((instr >> 12) & 1) != 0) {
26316                                UnallocatedT32(instr);
26317                                return;
26318                              }
26319                              unsigned rd = ExtractQRegister(instr, 22, 12);
26320                              if (((instr >> 16) & 1) != 0) {
26321                                UnallocatedT32(instr);
26322                                return;
26323                              }
26324                              unsigned rn = ExtractQRegister(instr, 7, 16);
26325                              if ((instr & 1) != 0) {
26326                                UnallocatedT32(instr);
26327                                return;
26328                              }
26329                              unsigned rm = ExtractQRegister(instr, 5, 0);
26330                              // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26331                              vabd(CurrentCond(),
26332                                   F32,
26333                                   QRegister(rd),
26334                                   QRegister(rn),
26335                                   QRegister(rm));
26336                              break;
26337                            }
26338                            default:
26339                              UnallocatedT32(instr);
26340                              break;
26341                          }
26342                          break;
26343                        }
26344                        case 0x00000e00: {
26345                          // 0xef000e00
26346                          switch (instr & 0x10200000) {
26347                            case 0x00000000: {
26348                              // 0xef000e00
26349                              DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
26350                              if (dt.Is(kDataTypeValueInvalid)) {
26351                                UnallocatedT32(instr);
26352                                return;
26353                              }
26354                              unsigned rd = ExtractDRegister(instr, 22, 12);
26355                              unsigned rn = ExtractDRegister(instr, 7, 16);
26356                              unsigned rm = ExtractDRegister(instr, 5, 0);
26357                              // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2
26358                              vceq(CurrentCond(),
26359                                   dt,
26360                                   DRegister(rd),
26361                                   DRegister(rn),
26362                                   DRegister(rm));
26363                              break;
26364                            }
26365                            case 0x10000000: {
26366                              // 0xff000e00
26367                              if ((instr & 0x00100000) == 0x00000000) {
26368                                unsigned rd = ExtractDRegister(instr, 22, 12);
26369                                unsigned rn = ExtractDRegister(instr, 7, 16);
26370                                unsigned rm = ExtractDRegister(instr, 5, 0);
26371                                // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
26372                                vcge(CurrentCond(),
26373                                     F32,
26374                                     DRegister(rd),
26375                                     DRegister(rn),
26376                                     DRegister(rm));
26377                              } else {
26378                                UnallocatedT32(instr);
26379                              }
26380                              break;
26381                            }
26382                            case 0x10200000: {
26383                              // 0xff200e00
26384                              if ((instr & 0x00100000) == 0x00000000) {
26385                                unsigned rd = ExtractDRegister(instr, 22, 12);
26386                                unsigned rn = ExtractDRegister(instr, 7, 16);
26387                                unsigned rm = ExtractDRegister(instr, 5, 0);
26388                                // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
26389                                vcgt(CurrentCond(),
26390                                     F32,
26391                                     DRegister(rd),
26392                                     DRegister(rn),
26393                                     DRegister(rm));
26394                              } else {
26395                                UnallocatedT32(instr);
26396                              }
26397                              break;
26398                            }
26399                            default:
26400                              UnallocatedT32(instr);
26401                              break;
26402                          }
26403                          break;
26404                        }
26405                        case 0x00000e40: {
26406                          // 0xef000e40
26407                          switch (instr & 0x10200000) {
26408                            case 0x00000000: {
26409                              // 0xef000e40
26410                              DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
26411                              if (dt.Is(kDataTypeValueInvalid)) {
26412                                UnallocatedT32(instr);
26413                                return;
26414                              }
26415                              if (((instr >> 12) & 1) != 0) {
26416                                UnallocatedT32(instr);
26417                                return;
26418                              }
26419                              unsigned rd = ExtractQRegister(instr, 22, 12);
26420                              if (((instr >> 16) & 1) != 0) {
26421                                UnallocatedT32(instr);
26422                                return;
26423                              }
26424                              unsigned rn = ExtractQRegister(instr, 7, 16);
26425                              if ((instr & 1) != 0) {
26426                                UnallocatedT32(instr);
26427                                return;
26428                              }
26429                              unsigned rm = ExtractQRegister(instr, 5, 0);
26430                              // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2
26431                              vceq(CurrentCond(),
26432                                   dt,
26433                                   QRegister(rd),
26434                                   QRegister(rn),
26435                                   QRegister(rm));
26436                              break;
26437                            }
26438                            case 0x10000000: {
26439                              // 0xff000e40
26440                              if ((instr & 0x00100000) == 0x00000000) {
26441                                if (((instr >> 12) & 1) != 0) {
26442                                  UnallocatedT32(instr);
26443                                  return;
26444                                }
26445                                unsigned rd = ExtractQRegister(instr, 22, 12);
26446                                if (((instr >> 16) & 1) != 0) {
26447                                  UnallocatedT32(instr);
26448                                  return;
26449                                }
26450                                unsigned rn = ExtractQRegister(instr, 7, 16);
26451                                if ((instr & 1) != 0) {
26452                                  UnallocatedT32(instr);
26453                                  return;
26454                                }
26455                                unsigned rm = ExtractQRegister(instr, 5, 0);
26456                                // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
26457                                vcge(CurrentCond(),
26458                                     F32,
26459                                     QRegister(rd),
26460                                     QRegister(rn),
26461                                     QRegister(rm));
26462                              } else {
26463                                UnallocatedT32(instr);
26464                              }
26465                              break;
26466                            }
26467                            case 0x10200000: {
26468                              // 0xff200e40
26469                              if ((instr & 0x00100000) == 0x00000000) {
26470                                if (((instr >> 12) & 1) != 0) {
26471                                  UnallocatedT32(instr);
26472                                  return;
26473                                }
26474                                unsigned rd = ExtractQRegister(instr, 22, 12);
26475                                if (((instr >> 16) & 1) != 0) {
26476                                  UnallocatedT32(instr);
26477                                  return;
26478                                }
26479                                unsigned rn = ExtractQRegister(instr, 7, 16);
26480                                if ((instr & 1) != 0) {
26481                                  UnallocatedT32(instr);
26482                                  return;
26483                                }
26484                                unsigned rm = ExtractQRegister(instr, 5, 0);
26485                                // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
26486                                vcgt(CurrentCond(),
26487                                     F32,
26488                                     QRegister(rd),
26489                                     QRegister(rn),
26490                                     QRegister(rm));
26491                              } else {
26492                                UnallocatedT32(instr);
26493                              }
26494                              break;
26495                            }
26496                            default:
26497                              UnallocatedT32(instr);
26498                              break;
26499                          }
26500                          break;
26501                        }
26502                        case 0x00000f00: {
26503                          // 0xef000f00
26504                          switch (instr & 0x10300000) {
26505                            case 0x00000000: {
26506                              // 0xef000f00
26507                              unsigned rd = ExtractDRegister(instr, 22, 12);
26508                              unsigned rn = ExtractDRegister(instr, 7, 16);
26509                              unsigned rm = ExtractDRegister(instr, 5, 0);
26510                              // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26511                              vmax(CurrentCond(),
26512                                   F32,
26513                                   DRegister(rd),
26514                                   DRegister(rn),
26515                                   DRegister(rm));
26516                              break;
26517                            }
26518                            case 0x00200000: {
26519                              // 0xef200f00
26520                              unsigned rd = ExtractDRegister(instr, 22, 12);
26521                              unsigned rn = ExtractDRegister(instr, 7, 16);
26522                              unsigned rm = ExtractDRegister(instr, 5, 0);
26523                              // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26524                              vmin(CurrentCond(),
26525                                   F32,
26526                                   DRegister(rd),
26527                                   DRegister(rn),
26528                                   DRegister(rm));
26529                              break;
26530                            }
26531                            case 0x10000000: {
26532                              // 0xff000f00
26533                              unsigned rd = ExtractDRegister(instr, 22, 12);
26534                              unsigned rn = ExtractDRegister(instr, 7, 16);
26535                              unsigned rm = ExtractDRegister(instr, 5, 0);
26536                              // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26537                              vpmax(CurrentCond(),
26538                                    F32,
26539                                    DRegister(rd),
26540                                    DRegister(rn),
26541                                    DRegister(rm));
26542                              break;
26543                            }
26544                            case 0x10200000: {
26545                              // 0xff200f00
26546                              unsigned rd = ExtractDRegister(instr, 22, 12);
26547                              unsigned rn = ExtractDRegister(instr, 7, 16);
26548                              unsigned rm = ExtractDRegister(instr, 5, 0);
26549                              // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26550                              vpmin(CurrentCond(),
26551                                    F32,
26552                                    DRegister(rd),
26553                                    DRegister(rn),
26554                                    DRegister(rm));
26555                              break;
26556                            }
26557                            default:
26558                              UnallocatedT32(instr);
26559                              break;
26560                          }
26561                          break;
26562                        }
26563                        case 0x00000f40: {
26564                          // 0xef000f40
26565                          switch (instr & 0x10300000) {
26566                            case 0x00000000: {
26567                              // 0xef000f40
26568                              if (((instr >> 12) & 1) != 0) {
26569                                UnallocatedT32(instr);
26570                                return;
26571                              }
26572                              unsigned rd = ExtractQRegister(instr, 22, 12);
26573                              if (((instr >> 16) & 1) != 0) {
26574                                UnallocatedT32(instr);
26575                                return;
26576                              }
26577                              unsigned rn = ExtractQRegister(instr, 7, 16);
26578                              if ((instr & 1) != 0) {
26579                                UnallocatedT32(instr);
26580                                return;
26581                              }
26582                              unsigned rm = ExtractQRegister(instr, 5, 0);
26583                              // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26584                              vmax(CurrentCond(),
26585                                   F32,
26586                                   QRegister(rd),
26587                                   QRegister(rn),
26588                                   QRegister(rm));
26589                              break;
26590                            }
26591                            case 0x00200000: {
26592                              // 0xef200f40
26593                              if (((instr >> 12) & 1) != 0) {
26594                                UnallocatedT32(instr);
26595                                return;
26596                              }
26597                              unsigned rd = ExtractQRegister(instr, 22, 12);
26598                              if (((instr >> 16) & 1) != 0) {
26599                                UnallocatedT32(instr);
26600                                return;
26601                              }
26602                              unsigned rn = ExtractQRegister(instr, 7, 16);
26603                              if ((instr & 1) != 0) {
26604                                UnallocatedT32(instr);
26605                                return;
26606                              }
26607                              unsigned rm = ExtractQRegister(instr, 5, 0);
26608                              // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26609                              vmin(CurrentCond(),
26610                                   F32,
26611                                   QRegister(rd),
26612                                   QRegister(rn),
26613                                   QRegister(rm));
26614                              break;
26615                            }
26616                            default:
26617                              UnallocatedT32(instr);
26618                              break;
26619                          }
26620                          break;
26621                        }
26622                        default:
26623                          UnallocatedT32(instr);
26624                          break;
26625                      }
26626                      break;
26627                    }
26628                    case 0x00800000: {
26629                      // 0xef800000
26630                      switch (instr & 0x00300000) {
26631                        case 0x00300000: {
26632                          // 0xefb00000
26633                          switch (instr & 0x10000000) {
26634                            case 0x00000000: {
26635                              // 0xefb00000
26636                              switch (instr & 0x00000040) {
26637                                case 0x00000000: {
26638                                  // 0xefb00000
26639                                  if (((instr & 0x800) == 0x800)) {
26640                                    UnallocatedT32(instr);
26641                                    return;
26642                                  }
26643                                  unsigned rd = ExtractDRegister(instr, 22, 12);
26644                                  unsigned rn = ExtractDRegister(instr, 7, 16);
26645                                  unsigned rm = ExtractDRegister(instr, 5, 0);
26646                                  uint32_t imm = (instr >> 8) & 0xf;
26647                                  // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
26648                                  vext(CurrentCond(),
26649                                       Untyped8,
26650                                       DRegister(rd),
26651                                       DRegister(rn),
26652                                       DRegister(rm),
26653                                       imm);
26654                                  break;
26655                                }
26656                                case 0x00000040: {
26657                                  // 0xefb00040
26658                                  if (((instr >> 12) & 1) != 0) {
26659                                    UnallocatedT32(instr);
26660                                    return;
26661                                  }
26662                                  unsigned rd = ExtractQRegister(instr, 22, 12);
26663                                  if (((instr >> 16) & 1) != 0) {
26664                                    UnallocatedT32(instr);
26665                                    return;
26666                                  }
26667                                  unsigned rn = ExtractQRegister(instr, 7, 16);
26668                                  if ((instr & 1) != 0) {
26669                                    UnallocatedT32(instr);
26670                                    return;
26671                                  }
26672                                  unsigned rm = ExtractQRegister(instr, 5, 0);
26673                                  uint32_t imm = (instr >> 8) & 0xf;
26674                                  // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
26675                                  vext(CurrentCond(),
26676                                       Untyped8,
26677                                       QRegister(rd),
26678                                       QRegister(rn),
26679                                       QRegister(rm),
26680                                       imm);
26681                                  break;
26682                                }
26683                              }
26684                              break;
26685                            }
26686                            case 0x10000000: {
26687                              // 0xffb00000
26688                              switch (instr & 0x00000800) {
26689                                case 0x00000000: {
26690                                  // 0xffb00000
26691                                  switch (instr & 0x00030200) {
26692                                    case 0x00000000: {
26693                                      // 0xffb00000
26694                                      switch (instr & 0x000005c0) {
26695                                        case 0x00000000: {
26696                                          // 0xffb00000
26697                                          DataType dt = Dt_size_7_Decode(
26698                                              (instr >> 18) & 0x3);
26699                                          if (dt.Is(kDataTypeValueInvalid)) {
26700                                            UnallocatedT32(instr);
26701                                            return;
26702                                          }
26703                                          unsigned rd =
26704                                              ExtractDRegister(instr, 22, 12);
26705                                          unsigned rm =
26706                                              ExtractDRegister(instr, 5, 0);
26707                                          // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26708                                          vrev64(CurrentCond(),
26709                                                 dt,
26710                                                 DRegister(rd),
26711                                                 DRegister(rm));
26712                                          break;
26713                                        }
26714                                        case 0x00000040: {
26715                                          // 0xffb00040
26716                                          DataType dt = Dt_size_7_Decode(
26717                                              (instr >> 18) & 0x3);
26718                                          if (dt.Is(kDataTypeValueInvalid)) {
26719                                            UnallocatedT32(instr);
26720                                            return;
26721                                          }
26722                                          if (((instr >> 12) & 1) != 0) {
26723                                            UnallocatedT32(instr);
26724                                            return;
26725                                          }
26726                                          unsigned rd =
26727                                              ExtractQRegister(instr, 22, 12);
26728                                          if ((instr & 1) != 0) {
26729                                            UnallocatedT32(instr);
26730                                            return;
26731                                          }
26732                                          unsigned rm =
26733                                              ExtractQRegister(instr, 5, 0);
26734                                          // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26735                                          vrev64(CurrentCond(),
26736                                                 dt,
26737                                                 QRegister(rd),
26738                                                 QRegister(rm));
26739                                          break;
26740                                        }
26741                                        case 0x00000080: {
26742                                          // 0xffb00080
26743                                          DataType dt = Dt_size_15_Decode(
26744                                              (instr >> 18) & 0x3);
26745                                          if (dt.Is(kDataTypeValueInvalid)) {
26746                                            UnallocatedT32(instr);
26747                                            return;
26748                                          }
26749                                          unsigned rd =
26750                                              ExtractDRegister(instr, 22, 12);
26751                                          unsigned rm =
26752                                              ExtractDRegister(instr, 5, 0);
26753                                          // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26754                                          vrev32(CurrentCond(),
26755                                                 dt,
26756                                                 DRegister(rd),
26757                                                 DRegister(rm));
26758                                          break;
26759                                        }
26760                                        case 0x000000c0: {
26761                                          // 0xffb000c0
26762                                          DataType dt = Dt_size_15_Decode(
26763                                              (instr >> 18) & 0x3);
26764                                          if (dt.Is(kDataTypeValueInvalid)) {
26765                                            UnallocatedT32(instr);
26766                                            return;
26767                                          }
26768                                          if (((instr >> 12) & 1) != 0) {
26769                                            UnallocatedT32(instr);
26770                                            return;
26771                                          }
26772                                          unsigned rd =
26773                                              ExtractQRegister(instr, 22, 12);
26774                                          if ((instr & 1) != 0) {
26775                                            UnallocatedT32(instr);
26776                                            return;
26777                                          }
26778                                          unsigned rm =
26779                                              ExtractQRegister(instr, 5, 0);
26780                                          // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26781                                          vrev32(CurrentCond(),
26782                                                 dt,
26783                                                 QRegister(rd),
26784                                                 QRegister(rm));
26785                                          break;
26786                                        }
26787                                        case 0x00000100: {
26788                                          // 0xffb00100
26789                                          DataType dt = Dt_size_1_Decode(
26790                                              (instr >> 18) & 0x3);
26791                                          if (dt.Is(kDataTypeValueInvalid)) {
26792                                            UnallocatedT32(instr);
26793                                            return;
26794                                          }
26795                                          unsigned rd =
26796                                              ExtractDRegister(instr, 22, 12);
26797                                          unsigned rm =
26798                                              ExtractDRegister(instr, 5, 0);
26799                                          // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26800                                          vrev16(CurrentCond(),
26801                                                 dt,
26802                                                 DRegister(rd),
26803                                                 DRegister(rm));
26804                                          break;
26805                                        }
26806                                        case 0x00000140: {
26807                                          // 0xffb00140
26808                                          DataType dt = Dt_size_1_Decode(
26809                                              (instr >> 18) & 0x3);
26810                                          if (dt.Is(kDataTypeValueInvalid)) {
26811                                            UnallocatedT32(instr);
26812                                            return;
26813                                          }
26814                                          if (((instr >> 12) & 1) != 0) {
26815                                            UnallocatedT32(instr);
26816                                            return;
26817                                          }
26818                                          unsigned rd =
26819                                              ExtractQRegister(instr, 22, 12);
26820                                          if ((instr & 1) != 0) {
26821                                            UnallocatedT32(instr);
26822                                            return;
26823                                          }
26824                                          unsigned rm =
26825                                              ExtractQRegister(instr, 5, 0);
26826                                          // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26827                                          vrev16(CurrentCond(),
26828                                                 dt,
26829                                                 QRegister(rd),
26830                                                 QRegister(rm));
26831                                          break;
26832                                        }
26833                                        case 0x00000400: {
26834                                          // 0xffb00400
26835                                          DataType dt = Dt_size_5_Decode(
26836                                              (instr >> 18) & 0x3);
26837                                          if (dt.Is(kDataTypeValueInvalid)) {
26838                                            UnallocatedT32(instr);
26839                                            return;
26840                                          }
26841                                          unsigned rd =
26842                                              ExtractDRegister(instr, 22, 12);
26843                                          unsigned rm =
26844                                              ExtractDRegister(instr, 5, 0);
26845                                          // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
26846                                          vcls(CurrentCond(),
26847                                               dt,
26848                                               DRegister(rd),
26849                                               DRegister(rm));
26850                                          break;
26851                                        }
26852                                        case 0x00000440: {
26853                                          // 0xffb00440
26854                                          DataType dt = Dt_size_5_Decode(
26855                                              (instr >> 18) & 0x3);
26856                                          if (dt.Is(kDataTypeValueInvalid)) {
26857                                            UnallocatedT32(instr);
26858                                            return;
26859                                          }
26860                                          if (((instr >> 12) & 1) != 0) {
26861                                            UnallocatedT32(instr);
26862                                            return;
26863                                          }
26864                                          unsigned rd =
26865                                              ExtractQRegister(instr, 22, 12);
26866                                          if ((instr & 1) != 0) {
26867                                            UnallocatedT32(instr);
26868                                            return;
26869                                          }
26870                                          unsigned rm =
26871                                              ExtractQRegister(instr, 5, 0);
26872                                          // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
26873                                          vcls(CurrentCond(),
26874                                               dt,
26875                                               QRegister(rd),
26876                                               QRegister(rm));
26877                                          break;
26878                                        }
26879                                        case 0x00000480: {
26880                                          // 0xffb00480
26881                                          DataType dt = Dt_size_4_Decode(
26882                                              (instr >> 18) & 0x3);
26883                                          if (dt.Is(kDataTypeValueInvalid)) {
26884                                            UnallocatedT32(instr);
26885                                            return;
26886                                          }
26887                                          unsigned rd =
26888                                              ExtractDRegister(instr, 22, 12);
26889                                          unsigned rm =
26890                                              ExtractDRegister(instr, 5, 0);
26891                                          // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
26892                                          vclz(CurrentCond(),
26893                                               dt,
26894                                               DRegister(rd),
26895                                               DRegister(rm));
26896                                          break;
26897                                        }
26898                                        case 0x000004c0: {
26899                                          // 0xffb004c0
26900                                          DataType dt = Dt_size_4_Decode(
26901                                              (instr >> 18) & 0x3);
26902                                          if (dt.Is(kDataTypeValueInvalid)) {
26903                                            UnallocatedT32(instr);
26904                                            return;
26905                                          }
26906                                          if (((instr >> 12) & 1) != 0) {
26907                                            UnallocatedT32(instr);
26908                                            return;
26909                                          }
26910                                          unsigned rd =
26911                                              ExtractQRegister(instr, 22, 12);
26912                                          if ((instr & 1) != 0) {
26913                                            UnallocatedT32(instr);
26914                                            return;
26915                                          }
26916                                          unsigned rm =
26917                                              ExtractQRegister(instr, 5, 0);
26918                                          // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
26919                                          vclz(CurrentCond(),
26920                                               dt,
26921                                               QRegister(rd),
26922                                               QRegister(rm));
26923                                          break;
26924                                        }
26925                                        case 0x00000500: {
26926                                          // 0xffb00500
26927                                          if ((instr & 0x000c0000) ==
26928                                              0x00000000) {
26929                                            unsigned rd =
26930                                                ExtractDRegister(instr, 22, 12);
26931                                            unsigned rm =
26932                                                ExtractDRegister(instr, 5, 0);
26933                                            // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1
26934                                            vcnt(CurrentCond(),
26935                                                 Untyped8,
26936                                                 DRegister(rd),
26937                                                 DRegister(rm));
26938                                          } else {
26939                                            UnallocatedT32(instr);
26940                                          }
26941                                          break;
26942                                        }
26943                                        case 0x00000540: {
26944                                          // 0xffb00540
26945                                          if ((instr & 0x000c0000) ==
26946                                              0x00000000) {
26947                                            if (((instr >> 12) & 1) != 0) {
26948                                              UnallocatedT32(instr);
26949                                              return;
26950                                            }
26951                                            unsigned rd =
26952                                                ExtractQRegister(instr, 22, 12);
26953                                            if ((instr & 1) != 0) {
26954                                              UnallocatedT32(instr);
26955                                              return;
26956                                            }
26957                                            unsigned rm =
26958                                                ExtractQRegister(instr, 5, 0);
26959                                            // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1
26960                                            vcnt(CurrentCond(),
26961                                                 Untyped8,
26962                                                 QRegister(rd),
26963                                                 QRegister(rm));
26964                                          } else {
26965                                            UnallocatedT32(instr);
26966                                          }
26967                                          break;
26968                                        }
26969                                        case 0x00000580: {
26970                                          // 0xffb00580
26971                                          if ((instr & 0x000c0000) ==
26972                                              0x00000000) {
26973                                            unsigned rd =
26974                                                ExtractDRegister(instr, 22, 12);
26975                                            unsigned rm =
26976                                                ExtractDRegister(instr, 5, 0);
26977                                            // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26978                                            vmvn(CurrentCond(),
26979                                                 kDataTypeValueNone,
26980                                                 DRegister(rd),
26981                                                 DRegister(rm));
26982                                          } else {
26983                                            UnallocatedT32(instr);
26984                                          }
26985                                          break;
26986                                        }
26987                                        case 0x000005c0: {
26988                                          // 0xffb005c0
26989                                          if ((instr & 0x000c0000) ==
26990                                              0x00000000) {
26991                                            if (((instr >> 12) & 1) != 0) {
26992                                              UnallocatedT32(instr);
26993                                              return;
26994                                            }
26995                                            unsigned rd =
26996                                                ExtractQRegister(instr, 22, 12);
26997                                            if ((instr & 1) != 0) {
26998                                              UnallocatedT32(instr);
26999                                              return;
27000                                            }
27001                                            unsigned rm =
27002                                                ExtractQRegister(instr, 5, 0);
27003                                            // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27004                                            vmvn(CurrentCond(),
27005                                                 kDataTypeValueNone,
27006                                                 QRegister(rd),
27007                                                 QRegister(rm));
27008                                          } else {
27009                                            UnallocatedT32(instr);
27010                                          }
27011                                          break;
27012                                        }
27013                                        default:
27014                                          UnallocatedT32(instr);
27015                                          break;
27016                                      }
27017                                      break;
27018                                    }
27019                                    case 0x00000200: {
27020                                      // 0xffb00200
27021                                      switch (instr & 0x00000540) {
27022                                        case 0x00000000: {
27023                                          // 0xffb00200
27024                                          DataType dt = Dt_op_size_2_Decode(
27025                                              ((instr >> 18) & 0x3) |
27026                                              ((instr >> 5) & 0x4));
27027                                          if (dt.Is(kDataTypeValueInvalid)) {
27028                                            UnallocatedT32(instr);
27029                                            return;
27030                                          }
27031                                          unsigned rd =
27032                                              ExtractDRegister(instr, 22, 12);
27033                                          unsigned rm =
27034                                              ExtractDRegister(instr, 5, 0);
27035                                          // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27036                                          vpaddl(CurrentCond(),
27037                                                 dt,
27038                                                 DRegister(rd),
27039                                                 DRegister(rm));
27040                                          break;
27041                                        }
27042                                        case 0x00000040: {
27043                                          // 0xffb00240
27044                                          DataType dt = Dt_op_size_2_Decode(
27045                                              ((instr >> 18) & 0x3) |
27046                                              ((instr >> 5) & 0x4));
27047                                          if (dt.Is(kDataTypeValueInvalid)) {
27048                                            UnallocatedT32(instr);
27049                                            return;
27050                                          }
27051                                          if (((instr >> 12) & 1) != 0) {
27052                                            UnallocatedT32(instr);
27053                                            return;
27054                                          }
27055                                          unsigned rd =
27056                                              ExtractQRegister(instr, 22, 12);
27057                                          if ((instr & 1) != 0) {
27058                                            UnallocatedT32(instr);
27059                                            return;
27060                                          }
27061                                          unsigned rm =
27062                                              ExtractQRegister(instr, 5, 0);
27063                                          // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27064                                          vpaddl(CurrentCond(),
27065                                                 dt,
27066                                                 QRegister(rd),
27067                                                 QRegister(rm));
27068                                          break;
27069                                        }
27070                                        case 0x00000100: {
27071                                          // 0xffb00300
27072                                          switch (instr & 0x00000080) {
27073                                            case 0x00000000: {
27074                                              // 0xffb00300
27075                                              UnimplementedT32_32("AESE",
27076                                                                  instr);
27077                                              break;
27078                                            }
27079                                            case 0x00000080: {
27080                                              // 0xffb00380
27081                                              UnimplementedT32_32("AESMC",
27082                                                                  instr);
27083                                              break;
27084                                            }
27085                                          }
27086                                          break;
27087                                        }
27088                                        case 0x00000140: {
27089                                          // 0xffb00340
27090                                          switch (instr & 0x00000080) {
27091                                            case 0x00000000: {
27092                                              // 0xffb00340
27093                                              UnimplementedT32_32("AESD",
27094                                                                  instr);
27095                                              break;
27096                                            }
27097                                            case 0x00000080: {
27098                                              // 0xffb003c0
27099                                              UnimplementedT32_32("AESIMC",
27100                                                                  instr);
27101                                              break;
27102                                            }
27103                                          }
27104                                          break;
27105                                        }
27106                                        case 0x00000400: {
27107                                          // 0xffb00600
27108                                          DataType dt = Dt_op_size_2_Decode(
27109                                              ((instr >> 18) & 0x3) |
27110                                              ((instr >> 5) & 0x4));
27111                                          if (dt.Is(kDataTypeValueInvalid)) {
27112                                            UnallocatedT32(instr);
27113                                            return;
27114                                          }
27115                                          unsigned rd =
27116                                              ExtractDRegister(instr, 22, 12);
27117                                          unsigned rm =
27118                                              ExtractDRegister(instr, 5, 0);
27119                                          // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27120                                          vpadal(CurrentCond(),
27121                                                 dt,
27122                                                 DRegister(rd),
27123                                                 DRegister(rm));
27124                                          break;
27125                                        }
27126                                        case 0x00000440: {
27127                                          // 0xffb00640
27128                                          DataType dt = Dt_op_size_2_Decode(
27129                                              ((instr >> 18) & 0x3) |
27130                                              ((instr >> 5) & 0x4));
27131                                          if (dt.Is(kDataTypeValueInvalid)) {
27132                                            UnallocatedT32(instr);
27133                                            return;
27134                                          }
27135                                          if (((instr >> 12) & 1) != 0) {
27136                                            UnallocatedT32(instr);
27137                                            return;
27138                                          }
27139                                          unsigned rd =
27140                                              ExtractQRegister(instr, 22, 12);
27141                                          if ((instr & 1) != 0) {
27142                                            UnallocatedT32(instr);
27143                                            return;
27144                                          }
27145                                          unsigned rm =
27146                                              ExtractQRegister(instr, 5, 0);
27147                                          // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27148                                          vpadal(CurrentCond(),
27149                                                 dt,
27150                                                 QRegister(rd),
27151                                                 QRegister(rm));
27152                                          break;
27153                                        }
27154                                        case 0x00000500: {
27155                                          // 0xffb00700
27156                                          switch (instr & 0x00000080) {
27157                                            case 0x00000000: {
27158                                              // 0xffb00700
27159                                              DataType dt = Dt_size_5_Decode(
27160                                                  (instr >> 18) & 0x3);
27161                                              if (dt.Is(
27162                                                      kDataTypeValueInvalid)) {
27163                                                UnallocatedT32(instr);
27164                                                return;
27165                                              }
27166                                              unsigned rd =
27167                                                  ExtractDRegister(instr,
27168                                                                   22,
27169                                                                   12);
27170                                              unsigned rm =
27171                                                  ExtractDRegister(instr, 5, 0);
27172                                              // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27173                                              vqabs(CurrentCond(),
27174                                                    dt,
27175                                                    DRegister(rd),
27176                                                    DRegister(rm));
27177                                              break;
27178                                            }
27179                                            case 0x00000080: {
27180                                              // 0xffb00780
27181                                              DataType dt = Dt_size_5_Decode(
27182                                                  (instr >> 18) & 0x3);
27183                                              if (dt.Is(
27184                                                      kDataTypeValueInvalid)) {
27185                                                UnallocatedT32(instr);
27186                                                return;
27187                                              }
27188                                              unsigned rd =
27189                                                  ExtractDRegister(instr,
27190                                                                   22,
27191                                                                   12);
27192                                              unsigned rm =
27193                                                  ExtractDRegister(instr, 5, 0);
27194                                              // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27195                                              vqneg(CurrentCond(),
27196                                                    dt,
27197                                                    DRegister(rd),
27198                                                    DRegister(rm));
27199                                              break;
27200                                            }
27201                                          }
27202                                          break;
27203                                        }
27204                                        case 0x00000540: {
27205                                          // 0xffb00740
27206                                          switch (instr & 0x00000080) {
27207                                            case 0x00000000: {
27208                                              // 0xffb00740
27209                                              DataType dt = Dt_size_5_Decode(
27210                                                  (instr >> 18) & 0x3);
27211                                              if (dt.Is(
27212                                                      kDataTypeValueInvalid)) {
27213                                                UnallocatedT32(instr);
27214                                                return;
27215                                              }
27216                                              if (((instr >> 12) & 1) != 0) {
27217                                                UnallocatedT32(instr);
27218                                                return;
27219                                              }
27220                                              unsigned rd =
27221                                                  ExtractQRegister(instr,
27222                                                                   22,
27223                                                                   12);
27224                                              if ((instr & 1) != 0) {
27225                                                UnallocatedT32(instr);
27226                                                return;
27227                                              }
27228                                              unsigned rm =
27229                                                  ExtractQRegister(instr, 5, 0);
27230                                              // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27231                                              vqabs(CurrentCond(),
27232                                                    dt,
27233                                                    QRegister(rd),
27234                                                    QRegister(rm));
27235                                              break;
27236                                            }
27237                                            case 0x00000080: {
27238                                              // 0xffb007c0
27239                                              DataType dt = Dt_size_5_Decode(
27240                                                  (instr >> 18) & 0x3);
27241                                              if (dt.Is(
27242                                                      kDataTypeValueInvalid)) {
27243                                                UnallocatedT32(instr);
27244                                                return;
27245                                              }
27246                                              if (((instr >> 12) & 1) != 0) {
27247                                                UnallocatedT32(instr);
27248                                                return;
27249                                              }
27250                                              unsigned rd =
27251                                                  ExtractQRegister(instr,
27252                                                                   22,
27253                                                                   12);
27254                                              if ((instr & 1) != 0) {
27255                                                UnallocatedT32(instr);
27256                                                return;
27257                                              }
27258                                              unsigned rm =
27259                                                  ExtractQRegister(instr, 5, 0);
27260                                              // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27261                                              vqneg(CurrentCond(),
27262                                                    dt,
27263                                                    QRegister(rd),
27264                                                    QRegister(rm));
27265                                              break;
27266                                            }
27267                                          }
27268                                          break;
27269                                        }
27270                                      }
27271                                      break;
27272                                    }
27273                                    case 0x00010000: {
27274                                      // 0xffb10000
27275                                      switch (instr & 0x000001c0) {
27276                                        case 0x00000000: {
27277                                          // 0xffb10000
27278                                          DataType dt = Dt_F_size_1_Decode(
27279                                              ((instr >> 18) & 0x3) |
27280                                              ((instr >> 8) & 0x4));
27281                                          if (dt.Is(kDataTypeValueInvalid)) {
27282                                            UnallocatedT32(instr);
27283                                            return;
27284                                          }
27285                                          unsigned rd =
27286                                              ExtractDRegister(instr, 22, 12);
27287                                          unsigned rm =
27288                                              ExtractDRegister(instr, 5, 0);
27289                                          // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27290                                          vcgt(CurrentCond(),
27291                                               dt,
27292                                               DRegister(rd),
27293                                               DRegister(rm),
27294                                               UINT32_C(0));
27295                                          break;
27296                                        }
27297                                        case 0x00000040: {
27298                                          // 0xffb10040
27299                                          DataType dt = Dt_F_size_1_Decode(
27300                                              ((instr >> 18) & 0x3) |
27301                                              ((instr >> 8) & 0x4));
27302                                          if (dt.Is(kDataTypeValueInvalid)) {
27303                                            UnallocatedT32(instr);
27304                                            return;
27305                                          }
27306                                          if (((instr >> 12) & 1) != 0) {
27307                                            UnallocatedT32(instr);
27308                                            return;
27309                                          }
27310                                          unsigned rd =
27311                                              ExtractQRegister(instr, 22, 12);
27312                                          if ((instr & 1) != 0) {
27313                                            UnallocatedT32(instr);
27314                                            return;
27315                                          }
27316                                          unsigned rm =
27317                                              ExtractQRegister(instr, 5, 0);
27318                                          // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27319                                          vcgt(CurrentCond(),
27320                                               dt,
27321                                               QRegister(rd),
27322                                               QRegister(rm),
27323                                               UINT32_C(0));
27324                                          break;
27325                                        }
27326                                        case 0x00000080: {
27327                                          // 0xffb10080
27328                                          DataType dt = Dt_F_size_1_Decode(
27329                                              ((instr >> 18) & 0x3) |
27330                                              ((instr >> 8) & 0x4));
27331                                          if (dt.Is(kDataTypeValueInvalid)) {
27332                                            UnallocatedT32(instr);
27333                                            return;
27334                                          }
27335                                          unsigned rd =
27336                                              ExtractDRegister(instr, 22, 12);
27337                                          unsigned rm =
27338                                              ExtractDRegister(instr, 5, 0);
27339                                          // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27340                                          vcge(CurrentCond(),
27341                                               dt,
27342                                               DRegister(rd),
27343                                               DRegister(rm),
27344                                               UINT32_C(0));
27345                                          break;
27346                                        }
27347                                        case 0x000000c0: {
27348                                          // 0xffb100c0
27349                                          DataType dt = Dt_F_size_1_Decode(
27350                                              ((instr >> 18) & 0x3) |
27351                                              ((instr >> 8) & 0x4));
27352                                          if (dt.Is(kDataTypeValueInvalid)) {
27353                                            UnallocatedT32(instr);
27354                                            return;
27355                                          }
27356                                          if (((instr >> 12) & 1) != 0) {
27357                                            UnallocatedT32(instr);
27358                                            return;
27359                                          }
27360                                          unsigned rd =
27361                                              ExtractQRegister(instr, 22, 12);
27362                                          if ((instr & 1) != 0) {
27363                                            UnallocatedT32(instr);
27364                                            return;
27365                                          }
27366                                          unsigned rm =
27367                                              ExtractQRegister(instr, 5, 0);
27368                                          // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27369                                          vcge(CurrentCond(),
27370                                               dt,
27371                                               QRegister(rd),
27372                                               QRegister(rm),
27373                                               UINT32_C(0));
27374                                          break;
27375                                        }
27376                                        case 0x00000100: {
27377                                          // 0xffb10100
27378                                          DataType dt = Dt_F_size_2_Decode(
27379                                              ((instr >> 18) & 0x3) |
27380                                              ((instr >> 8) & 0x4));
27381                                          if (dt.Is(kDataTypeValueInvalid)) {
27382                                            UnallocatedT32(instr);
27383                                            return;
27384                                          }
27385                                          unsigned rd =
27386                                              ExtractDRegister(instr, 22, 12);
27387                                          unsigned rm =
27388                                              ExtractDRegister(instr, 5, 0);
27389                                          // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27390                                          vceq(CurrentCond(),
27391                                               dt,
27392                                               DRegister(rd),
27393                                               DRegister(rm),
27394                                               UINT32_C(0));
27395                                          break;
27396                                        }
27397                                        case 0x00000140: {
27398                                          // 0xffb10140
27399                                          DataType dt = Dt_F_size_2_Decode(
27400                                              ((instr >> 18) & 0x3) |
27401                                              ((instr >> 8) & 0x4));
27402                                          if (dt.Is(kDataTypeValueInvalid)) {
27403                                            UnallocatedT32(instr);
27404                                            return;
27405                                          }
27406                                          if (((instr >> 12) & 1) != 0) {
27407                                            UnallocatedT32(instr);
27408                                            return;
27409                                          }
27410                                          unsigned rd =
27411                                              ExtractQRegister(instr, 22, 12);
27412                                          if ((instr & 1) != 0) {
27413                                            UnallocatedT32(instr);
27414                                            return;
27415                                          }
27416                                          unsigned rm =
27417                                              ExtractQRegister(instr, 5, 0);
27418                                          // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27419                                          vceq(CurrentCond(),
27420                                               dt,
27421                                               QRegister(rd),
27422                                               QRegister(rm),
27423                                               UINT32_C(0));
27424                                          break;
27425                                        }
27426                                        case 0x00000180: {
27427                                          // 0xffb10180
27428                                          DataType dt = Dt_F_size_1_Decode(
27429                                              ((instr >> 18) & 0x3) |
27430                                              ((instr >> 8) & 0x4));
27431                                          if (dt.Is(kDataTypeValueInvalid)) {
27432                                            UnallocatedT32(instr);
27433                                            return;
27434                                          }
27435                                          unsigned rd =
27436                                              ExtractDRegister(instr, 22, 12);
27437                                          unsigned rm =
27438                                              ExtractDRegister(instr, 5, 0);
27439                                          // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27440                                          vcle(CurrentCond(),
27441                                               dt,
27442                                               DRegister(rd),
27443                                               DRegister(rm),
27444                                               UINT32_C(0));
27445                                          break;
27446                                        }
27447                                        case 0x000001c0: {
27448                                          // 0xffb101c0
27449                                          DataType dt = Dt_F_size_1_Decode(
27450                                              ((instr >> 18) & 0x3) |
27451                                              ((instr >> 8) & 0x4));
27452                                          if (dt.Is(kDataTypeValueInvalid)) {
27453                                            UnallocatedT32(instr);
27454                                            return;
27455                                          }
27456                                          if (((instr >> 12) & 1) != 0) {
27457                                            UnallocatedT32(instr);
27458                                            return;
27459                                          }
27460                                          unsigned rd =
27461                                              ExtractQRegister(instr, 22, 12);
27462                                          if ((instr & 1) != 0) {
27463                                            UnallocatedT32(instr);
27464                                            return;
27465                                          }
27466                                          unsigned rm =
27467                                              ExtractQRegister(instr, 5, 0);
27468                                          // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27469                                          vcle(CurrentCond(),
27470                                               dt,
27471                                               QRegister(rd),
27472                                               QRegister(rm),
27473                                               UINT32_C(0));
27474                                          break;
27475                                        }
27476                                      }
27477                                      break;
27478                                    }
27479                                    case 0x00010200: {
27480                                      // 0xffb10200
27481                                      switch (instr & 0x000001c0) {
27482                                        case 0x00000000: {
27483                                          // 0xffb10200
27484                                          DataType dt = Dt_F_size_1_Decode(
27485                                              ((instr >> 18) & 0x3) |
27486                                              ((instr >> 8) & 0x4));
27487                                          if (dt.Is(kDataTypeValueInvalid)) {
27488                                            UnallocatedT32(instr);
27489                                            return;
27490                                          }
27491                                          unsigned rd =
27492                                              ExtractDRegister(instr, 22, 12);
27493                                          unsigned rm =
27494                                              ExtractDRegister(instr, 5, 0);
27495                                          // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27496                                          vclt(CurrentCond(),
27497                                               dt,
27498                                               DRegister(rd),
27499                                               DRegister(rm),
27500                                               UINT32_C(0));
27501                                          break;
27502                                        }
27503                                        case 0x00000040: {
27504                                          // 0xffb10240
27505                                          DataType dt = Dt_F_size_1_Decode(
27506                                              ((instr >> 18) & 0x3) |
27507                                              ((instr >> 8) & 0x4));
27508                                          if (dt.Is(kDataTypeValueInvalid)) {
27509                                            UnallocatedT32(instr);
27510                                            return;
27511                                          }
27512                                          if (((instr >> 12) & 1) != 0) {
27513                                            UnallocatedT32(instr);
27514                                            return;
27515                                          }
27516                                          unsigned rd =
27517                                              ExtractQRegister(instr, 22, 12);
27518                                          if ((instr & 1) != 0) {
27519                                            UnallocatedT32(instr);
27520                                            return;
27521                                          }
27522                                          unsigned rm =
27523                                              ExtractQRegister(instr, 5, 0);
27524                                          // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27525                                          vclt(CurrentCond(),
27526                                               dt,
27527                                               QRegister(rd),
27528                                               QRegister(rm),
27529                                               UINT32_C(0));
27530                                          break;
27531                                        }
27532                                        case 0x000000c0: {
27533                                          // 0xffb102c0
27534                                          if ((instr & 0x000c0400) ==
27535                                              0x00080000) {
27536                                            UnimplementedT32_32("SHA1H", instr);
27537                                          } else {
27538                                            UnallocatedT32(instr);
27539                                          }
27540                                          break;
27541                                        }
27542                                        case 0x00000100: {
27543                                          // 0xffb10300
27544                                          DataType dt = Dt_F_size_1_Decode(
27545                                              ((instr >> 18) & 0x3) |
27546                                              ((instr >> 8) & 0x4));
27547                                          if (dt.Is(kDataTypeValueInvalid)) {
27548                                            UnallocatedT32(instr);
27549                                            return;
27550                                          }
27551                                          unsigned rd =
27552                                              ExtractDRegister(instr, 22, 12);
27553                                          unsigned rm =
27554                                              ExtractDRegister(instr, 5, 0);
27555                                          // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27556                                          vabs(CurrentCond(),
27557                                               dt,
27558                                               DRegister(rd),
27559                                               DRegister(rm));
27560                                          break;
27561                                        }
27562                                        case 0x00000140: {
27563                                          // 0xffb10340
27564                                          DataType dt = Dt_F_size_1_Decode(
27565                                              ((instr >> 18) & 0x3) |
27566                                              ((instr >> 8) & 0x4));
27567                                          if (dt.Is(kDataTypeValueInvalid)) {
27568                                            UnallocatedT32(instr);
27569                                            return;
27570                                          }
27571                                          if (((instr >> 12) & 1) != 0) {
27572                                            UnallocatedT32(instr);
27573                                            return;
27574                                          }
27575                                          unsigned rd =
27576                                              ExtractQRegister(instr, 22, 12);
27577                                          if ((instr & 1) != 0) {
27578                                            UnallocatedT32(instr);
27579                                            return;
27580                                          }
27581                                          unsigned rm =
27582                                              ExtractQRegister(instr, 5, 0);
27583                                          // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27584                                          vabs(CurrentCond(),
27585                                               dt,
27586                                               QRegister(rd),
27587                                               QRegister(rm));
27588                                          break;
27589                                        }
27590                                        case 0x00000180: {
27591                                          // 0xffb10380
27592                                          DataType dt = Dt_F_size_1_Decode(
27593                                              ((instr >> 18) & 0x3) |
27594                                              ((instr >> 8) & 0x4));
27595                                          if (dt.Is(kDataTypeValueInvalid)) {
27596                                            UnallocatedT32(instr);
27597                                            return;
27598                                          }
27599                                          unsigned rd =
27600                                              ExtractDRegister(instr, 22, 12);
27601                                          unsigned rm =
27602                                              ExtractDRegister(instr, 5, 0);
27603                                          // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27604                                          vneg(CurrentCond(),
27605                                               dt,
27606                                               DRegister(rd),
27607                                               DRegister(rm));
27608                                          break;
27609                                        }
27610                                        case 0x000001c0: {
27611                                          // 0xffb103c0
27612                                          DataType dt = Dt_F_size_1_Decode(
27613                                              ((instr >> 18) & 0x3) |
27614                                              ((instr >> 8) & 0x4));
27615                                          if (dt.Is(kDataTypeValueInvalid)) {
27616                                            UnallocatedT32(instr);
27617                                            return;
27618                                          }
27619                                          if (((instr >> 12) & 1) != 0) {
27620                                            UnallocatedT32(instr);
27621                                            return;
27622                                          }
27623                                          unsigned rd =
27624                                              ExtractQRegister(instr, 22, 12);
27625                                          if ((instr & 1) != 0) {
27626                                            UnallocatedT32(instr);
27627                                            return;
27628                                          }
27629                                          unsigned rm =
27630                                              ExtractQRegister(instr, 5, 0);
27631                                          // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27632                                          vneg(CurrentCond(),
27633                                               dt,
27634                                               QRegister(rd),
27635                                               QRegister(rm));
27636                                          break;
27637                                        }
27638                                        default:
27639                                          UnallocatedT32(instr);
27640                                          break;
27641                                      }
27642                                      break;
27643                                    }
27644                                    case 0x00020000: {
27645                                      // 0xffb20000
27646                                      switch (instr & 0x000005c0) {
27647                                        case 0x00000000: {
27648                                          // 0xffb20000
27649                                          if ((instr & 0x000c0000) ==
27650                                              0x00000000) {
27651                                            unsigned rd =
27652                                                ExtractDRegister(instr, 22, 12);
27653                                            unsigned rm =
27654                                                ExtractDRegister(instr, 5, 0);
27655                                            // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27656                                            vswp(CurrentCond(),
27657                                                 kDataTypeValueNone,
27658                                                 DRegister(rd),
27659                                                 DRegister(rm));
27660                                          } else {
27661                                            UnallocatedT32(instr);
27662                                          }
27663                                          break;
27664                                        }
27665                                        case 0x00000040: {
27666                                          // 0xffb20040
27667                                          if ((instr & 0x000c0000) ==
27668                                              0x00000000) {
27669                                            if (((instr >> 12) & 1) != 0) {
27670                                              UnallocatedT32(instr);
27671                                              return;
27672                                            }
27673                                            unsigned rd =
27674                                                ExtractQRegister(instr, 22, 12);
27675                                            if ((instr & 1) != 0) {
27676                                              UnallocatedT32(instr);
27677                                              return;
27678                                            }
27679                                            unsigned rm =
27680                                                ExtractQRegister(instr, 5, 0);
27681                                            // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27682                                            vswp(CurrentCond(),
27683                                                 kDataTypeValueNone,
27684                                                 QRegister(rd),
27685                                                 QRegister(rm));
27686                                          } else {
27687                                            UnallocatedT32(instr);
27688                                          }
27689                                          break;
27690                                        }
27691                                        case 0x00000080: {
27692                                          // 0xffb20080
27693                                          DataType dt = Dt_size_7_Decode(
27694                                              (instr >> 18) & 0x3);
27695                                          if (dt.Is(kDataTypeValueInvalid)) {
27696                                            UnallocatedT32(instr);
27697                                            return;
27698                                          }
27699                                          unsigned rd =
27700                                              ExtractDRegister(instr, 22, 12);
27701                                          unsigned rm =
27702                                              ExtractDRegister(instr, 5, 0);
27703                                          // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27704                                          vtrn(CurrentCond(),
27705                                               dt,
27706                                               DRegister(rd),
27707                                               DRegister(rm));
27708                                          break;
27709                                        }
27710                                        case 0x000000c0: {
27711                                          // 0xffb200c0
27712                                          DataType dt = Dt_size_7_Decode(
27713                                              (instr >> 18) & 0x3);
27714                                          if (dt.Is(kDataTypeValueInvalid)) {
27715                                            UnallocatedT32(instr);
27716                                            return;
27717                                          }
27718                                          if (((instr >> 12) & 1) != 0) {
27719                                            UnallocatedT32(instr);
27720                                            return;
27721                                          }
27722                                          unsigned rd =
27723                                              ExtractQRegister(instr, 22, 12);
27724                                          if ((instr & 1) != 0) {
27725                                            UnallocatedT32(instr);
27726                                            return;
27727                                          }
27728                                          unsigned rm =
27729                                              ExtractQRegister(instr, 5, 0);
27730                                          // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27731                                          vtrn(CurrentCond(),
27732                                               dt,
27733                                               QRegister(rd),
27734                                               QRegister(rm));
27735                                          break;
27736                                        }
27737                                        case 0x00000100: {
27738                                          // 0xffb20100
27739                                          DataType dt = Dt_size_15_Decode(
27740                                              (instr >> 18) & 0x3);
27741                                          if (dt.Is(kDataTypeValueInvalid)) {
27742                                            UnallocatedT32(instr);
27743                                            return;
27744                                          }
27745                                          unsigned rd =
27746                                              ExtractDRegister(instr, 22, 12);
27747                                          unsigned rm =
27748                                              ExtractDRegister(instr, 5, 0);
27749                                          // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27750                                          vuzp(CurrentCond(),
27751                                               dt,
27752                                               DRegister(rd),
27753                                               DRegister(rm));
27754                                          break;
27755                                        }
27756                                        case 0x00000140: {
27757                                          // 0xffb20140
27758                                          DataType dt = Dt_size_7_Decode(
27759                                              (instr >> 18) & 0x3);
27760                                          if (dt.Is(kDataTypeValueInvalid)) {
27761                                            UnallocatedT32(instr);
27762                                            return;
27763                                          }
27764                                          if (((instr >> 12) & 1) != 0) {
27765                                            UnallocatedT32(instr);
27766                                            return;
27767                                          }
27768                                          unsigned rd =
27769                                              ExtractQRegister(instr, 22, 12);
27770                                          if ((instr & 1) != 0) {
27771                                            UnallocatedT32(instr);
27772                                            return;
27773                                          }
27774                                          unsigned rm =
27775                                              ExtractQRegister(instr, 5, 0);
27776                                          // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27777                                          vuzp(CurrentCond(),
27778                                               dt,
27779                                               QRegister(rd),
27780                                               QRegister(rm));
27781                                          break;
27782                                        }
27783                                        case 0x00000180: {
27784                                          // 0xffb20180
27785                                          DataType dt = Dt_size_15_Decode(
27786                                              (instr >> 18) & 0x3);
27787                                          if (dt.Is(kDataTypeValueInvalid)) {
27788                                            UnallocatedT32(instr);
27789                                            return;
27790                                          }
27791                                          unsigned rd =
27792                                              ExtractDRegister(instr, 22, 12);
27793                                          unsigned rm =
27794                                              ExtractDRegister(instr, 5, 0);
27795                                          // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27796                                          vzip(CurrentCond(),
27797                                               dt,
27798                                               DRegister(rd),
27799                                               DRegister(rm));
27800                                          break;
27801                                        }
27802                                        case 0x000001c0: {
27803                                          // 0xffb201c0
27804                                          DataType dt = Dt_size_7_Decode(
27805                                              (instr >> 18) & 0x3);
27806                                          if (dt.Is(kDataTypeValueInvalid)) {
27807                                            UnallocatedT32(instr);
27808                                            return;
27809                                          }
27810                                          if (((instr >> 12) & 1) != 0) {
27811                                            UnallocatedT32(instr);
27812                                            return;
27813                                          }
27814                                          unsigned rd =
27815                                              ExtractQRegister(instr, 22, 12);
27816                                          if ((instr & 1) != 0) {
27817                                            UnallocatedT32(instr);
27818                                            return;
27819                                          }
27820                                          unsigned rm =
27821                                              ExtractQRegister(instr, 5, 0);
27822                                          // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27823                                          vzip(CurrentCond(),
27824                                               dt,
27825                                               QRegister(rd),
27826                                               QRegister(rm));
27827                                          break;
27828                                        }
27829                                        case 0x00000400: {
27830                                          // 0xffb20400
27831                                          if ((instr & 0x000c0000) ==
27832                                              0x00080000) {
27833                                            unsigned rd =
27834                                                ExtractDRegister(instr, 22, 12);
27835                                            unsigned rm =
27836                                                ExtractDRegister(instr, 5, 0);
27837                                            // VRINTN{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27838                                            vrintn(F32,
27839                                                   F32,
27840                                                   DRegister(rd),
27841                                                   DRegister(rm));
27842                                          } else {
27843                                            UnallocatedT32(instr);
27844                                          }
27845                                          break;
27846                                        }
27847                                        case 0x00000440: {
27848                                          // 0xffb20440
27849                                          if ((instr & 0x000c0000) ==
27850                                              0x00080000) {
27851                                            if (((instr >> 12) & 1) != 0) {
27852                                              UnallocatedT32(instr);
27853                                              return;
27854                                            }
27855                                            unsigned rd =
27856                                                ExtractQRegister(instr, 22, 12);
27857                                            if ((instr & 1) != 0) {
27858                                              UnallocatedT32(instr);
27859                                              return;
27860                                            }
27861                                            unsigned rm =
27862                                                ExtractQRegister(instr, 5, 0);
27863                                            // VRINTN{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27864                                            vrintn(F32,
27865                                                   F32,
27866                                                   QRegister(rd),
27867                                                   QRegister(rm));
27868                                          } else {
27869                                            UnallocatedT32(instr);
27870                                          }
27871                                          break;
27872                                        }
27873                                        case 0x00000480: {
27874                                          // 0xffb20480
27875                                          if ((instr & 0x000c0000) ==
27876                                              0x00080000) {
27877                                            unsigned rd =
27878                                                ExtractDRegister(instr, 22, 12);
27879                                            unsigned rm =
27880                                                ExtractDRegister(instr, 5, 0);
27881                                            // VRINTX{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27882                                            vrintx(Condition::None(),
27883                                                   F32,
27884                                                   F32,
27885                                                   DRegister(rd),
27886                                                   DRegister(rm));
27887                                          } else {
27888                                            UnallocatedT32(instr);
27889                                          }
27890                                          break;
27891                                        }
27892                                        case 0x000004c0: {
27893                                          // 0xffb204c0
27894                                          if ((instr & 0x000c0000) ==
27895                                              0x00080000) {
27896                                            if (((instr >> 12) & 1) != 0) {
27897                                              UnallocatedT32(instr);
27898                                              return;
27899                                            }
27900                                            unsigned rd =
27901                                                ExtractQRegister(instr, 22, 12);
27902                                            if ((instr & 1) != 0) {
27903                                              UnallocatedT32(instr);
27904                                              return;
27905                                            }
27906                                            unsigned rm =
27907                                                ExtractQRegister(instr, 5, 0);
27908                                            // VRINTX{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27909                                            vrintx(F32,
27910                                                   F32,
27911                                                   QRegister(rd),
27912                                                   QRegister(rm));
27913                                          } else {
27914                                            UnallocatedT32(instr);
27915                                          }
27916                                          break;
27917                                        }
27918                                        case 0x00000500: {
27919                                          // 0xffb20500
27920                                          if ((instr & 0x000c0000) ==
27921                                              0x00080000) {
27922                                            unsigned rd =
27923                                                ExtractDRegister(instr, 22, 12);
27924                                            unsigned rm =
27925                                                ExtractDRegister(instr, 5, 0);
27926                                            // VRINTA{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27927                                            vrinta(F32,
27928                                                   F32,
27929                                                   DRegister(rd),
27930                                                   DRegister(rm));
27931                                          } else {
27932                                            UnallocatedT32(instr);
27933                                          }
27934                                          break;
27935                                        }
27936                                        case 0x00000540: {
27937                                          // 0xffb20540
27938                                          if ((instr & 0x000c0000) ==
27939                                              0x00080000) {
27940                                            if (((instr >> 12) & 1) != 0) {
27941                                              UnallocatedT32(instr);
27942                                              return;
27943                                            }
27944                                            unsigned rd =
27945                                                ExtractQRegister(instr, 22, 12);
27946                                            if ((instr & 1) != 0) {
27947                                              UnallocatedT32(instr);
27948                                              return;
27949                                            }
27950                                            unsigned rm =
27951                                                ExtractQRegister(instr, 5, 0);
27952                                            // VRINTA{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27953                                            vrinta(F32,
27954                                                   F32,
27955                                                   QRegister(rd),
27956                                                   QRegister(rm));
27957                                          } else {
27958                                            UnallocatedT32(instr);
27959                                          }
27960                                          break;
27961                                        }
27962                                        case 0x00000580: {
27963                                          // 0xffb20580
27964                                          if ((instr & 0x000c0000) ==
27965                                              0x00080000) {
27966                                            unsigned rd =
27967                                                ExtractDRegister(instr, 22, 12);
27968                                            unsigned rm =
27969                                                ExtractDRegister(instr, 5, 0);
27970                                            // VRINTZ{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27971                                            vrintz(Condition::None(),
27972                                                   F32,
27973                                                   F32,
27974                                                   DRegister(rd),
27975                                                   DRegister(rm));
27976                                          } else {
27977                                            UnallocatedT32(instr);
27978                                          }
27979                                          break;
27980                                        }
27981                                        case 0x000005c0: {
27982                                          // 0xffb205c0
27983                                          if ((instr & 0x000c0000) ==
27984                                              0x00080000) {
27985                                            if (((instr >> 12) & 1) != 0) {
27986                                              UnallocatedT32(instr);
27987                                              return;
27988                                            }
27989                                            unsigned rd =
27990                                                ExtractQRegister(instr, 22, 12);
27991                                            if ((instr & 1) != 0) {
27992                                              UnallocatedT32(instr);
27993                                              return;
27994                                            }
27995                                            unsigned rm =
27996                                                ExtractQRegister(instr, 5, 0);
27997                                            // VRINTZ{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27998                                            vrintz(F32,
27999                                                   F32,
28000                                                   QRegister(rd),
28001                                                   QRegister(rm));
28002                                          } else {
28003                                            UnallocatedT32(instr);
28004                                          }
28005                                          break;
28006                                        }
28007                                      }
28008                                      break;
28009                                    }
28010                                    case 0x00020200: {
28011                                      // 0xffb20200
28012                                      switch (instr & 0x00000580) {
28013                                        case 0x00000000: {
28014                                          // 0xffb20200
28015                                          switch (instr & 0x00000040) {
28016                                            case 0x00000000: {
28017                                              // 0xffb20200
28018                                              DataType dt = Dt_size_3_Decode(
28019                                                  (instr >> 18) & 0x3);
28020                                              if (dt.Is(
28021                                                      kDataTypeValueInvalid)) {
28022                                                UnallocatedT32(instr);
28023                                                return;
28024                                              }
28025                                              unsigned rd =
28026                                                  ExtractDRegister(instr,
28027                                                                   22,
28028                                                                   12);
28029                                              if ((instr & 1) != 0) {
28030                                                UnallocatedT32(instr);
28031                                                return;
28032                                              }
28033                                              unsigned rm =
28034                                                  ExtractQRegister(instr, 5, 0);
28035                                              // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28036                                              vmovn(CurrentCond(),
28037                                                    dt,
28038                                                    DRegister(rd),
28039                                                    QRegister(rm));
28040                                              break;
28041                                            }
28042                                            case 0x00000040: {
28043                                              // 0xffb20240
28044                                              DataType dt = Dt_size_14_Decode(
28045                                                  (instr >> 18) & 0x3);
28046                                              if (dt.Is(
28047                                                      kDataTypeValueInvalid)) {
28048                                                UnallocatedT32(instr);
28049                                                return;
28050                                              }
28051                                              unsigned rd =
28052                                                  ExtractDRegister(instr,
28053                                                                   22,
28054                                                                   12);
28055                                              if ((instr & 1) != 0) {
28056                                                UnallocatedT32(instr);
28057                                                return;
28058                                              }
28059                                              unsigned rm =
28060                                                  ExtractQRegister(instr, 5, 0);
28061                                              // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28062                                              vqmovun(CurrentCond(),
28063                                                      dt,
28064                                                      DRegister(rd),
28065                                                      QRegister(rm));
28066                                              break;
28067                                            }
28068                                          }
28069                                          break;
28070                                        }
28071                                        case 0x00000080: {
28072                                          // 0xffb20280
28073                                          DataType dt = Dt_op_size_3_Decode(
28074                                              ((instr >> 18) & 0x3) |
28075                                              ((instr >> 4) & 0x4));
28076                                          if (dt.Is(kDataTypeValueInvalid)) {
28077                                            UnallocatedT32(instr);
28078                                            return;
28079                                          }
28080                                          unsigned rd =
28081                                              ExtractDRegister(instr, 22, 12);
28082                                          if ((instr & 1) != 0) {
28083                                            UnallocatedT32(instr);
28084                                            return;
28085                                          }
28086                                          unsigned rm =
28087                                              ExtractQRegister(instr, 5, 0);
28088                                          // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28089                                          vqmovn(CurrentCond(),
28090                                                 dt,
28091                                                 DRegister(rd),
28092                                                 QRegister(rm));
28093                                          break;
28094                                        }
28095                                        case 0x00000100: {
28096                                          // 0xffb20300
28097                                          if ((instr & 0x00000040) ==
28098                                              0x00000000) {
28099                                            DataType dt = Dt_size_16_Decode(
28100                                                (instr >> 18) & 0x3);
28101                                            if (dt.Is(kDataTypeValueInvalid)) {
28102                                              UnallocatedT32(instr);
28103                                              return;
28104                                            }
28105                                            if (((instr >> 12) & 1) != 0) {
28106                                              UnallocatedT32(instr);
28107                                              return;
28108                                            }
28109                                            unsigned rd =
28110                                                ExtractQRegister(instr, 22, 12);
28111                                            unsigned rm =
28112                                                ExtractDRegister(instr, 5, 0);
28113                                            uint32_t imm = dt.GetSize();
28114                                            // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length)
28115                                            vshll(CurrentCond(),
28116                                                  dt,
28117                                                  QRegister(rd),
28118                                                  DRegister(rm),
28119                                                  imm);
28120                                          } else {
28121                                            UnallocatedT32(instr);
28122                                          }
28123                                          break;
28124                                        }
28125                                        case 0x00000180: {
28126                                          // 0xffb20380
28127                                          switch (instr & 0x000c0040) {
28128                                            case 0x00080000: {
28129                                              // 0xffba0380
28130                                              UnimplementedT32_32("SHA1SU1",
28131                                                                  instr);
28132                                              break;
28133                                            }
28134                                            case 0x00080040: {
28135                                              // 0xffba03c0
28136                                              UnimplementedT32_32("SHA256SU0",
28137                                                                  instr);
28138                                              break;
28139                                            }
28140                                            default:
28141                                              UnallocatedT32(instr);
28142                                              break;
28143                                          }
28144                                          break;
28145                                        }
28146                                        case 0x00000400: {
28147                                          // 0xffb20600
28148                                          if ((instr & 0x000c0040) ==
28149                                              0x00040000) {
28150                                            unsigned rd =
28151                                                ExtractDRegister(instr, 22, 12);
28152                                            if ((instr & 1) != 0) {
28153                                              UnallocatedT32(instr);
28154                                              return;
28155                                            }
28156                                            unsigned rm =
28157                                                ExtractQRegister(instr, 5, 0);
28158                                            // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28159                                            vcvt(CurrentCond(),
28160                                                 F16,
28161                                                 F32,
28162                                                 DRegister(rd),
28163                                                 QRegister(rm));
28164                                          } else {
28165                                            UnallocatedT32(instr);
28166                                          }
28167                                          break;
28168                                        }
28169                                        case 0x00000480: {
28170                                          // 0xffb20680
28171                                          switch (instr & 0x000c0040) {
28172                                            case 0x00080000: {
28173                                              // 0xffba0680
28174                                              unsigned rd =
28175                                                  ExtractDRegister(instr,
28176                                                                   22,
28177                                                                   12);
28178                                              unsigned rm =
28179                                                  ExtractDRegister(instr, 5, 0);
28180                                              // VRINTM{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28181                                              vrintm(F32,
28182                                                     F32,
28183                                                     DRegister(rd),
28184                                                     DRegister(rm));
28185                                              break;
28186                                            }
28187                                            case 0x00080040: {
28188                                              // 0xffba06c0
28189                                              if (((instr >> 12) & 1) != 0) {
28190                                                UnallocatedT32(instr);
28191                                                return;
28192                                              }
28193                                              unsigned rd =
28194                                                  ExtractQRegister(instr,
28195                                                                   22,
28196                                                                   12);
28197                                              if ((instr & 1) != 0) {
28198                                                UnallocatedT32(instr);
28199                                                return;
28200                                              }
28201                                              unsigned rm =
28202                                                  ExtractQRegister(instr, 5, 0);
28203                                              // VRINTM{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28204                                              vrintm(F32,
28205                                                     F32,
28206                                                     QRegister(rd),
28207                                                     QRegister(rm));
28208                                              break;
28209                                            }
28210                                            default:
28211                                              UnallocatedT32(instr);
28212                                              break;
28213                                          }
28214                                          break;
28215                                        }
28216                                        case 0x00000500: {
28217                                          // 0xffb20700
28218                                          if ((instr & 0x000c0040) ==
28219                                              0x00040000) {
28220                                            if (((instr >> 12) & 1) != 0) {
28221                                              UnallocatedT32(instr);
28222                                              return;
28223                                            }
28224                                            unsigned rd =
28225                                                ExtractQRegister(instr, 22, 12);
28226                                            unsigned rm =
28227                                                ExtractDRegister(instr, 5, 0);
28228                                            // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28229                                            vcvt(CurrentCond(),
28230                                                 F32,
28231                                                 F16,
28232                                                 QRegister(rd),
28233                                                 DRegister(rm));
28234                                          } else {
28235                                            UnallocatedT32(instr);
28236                                          }
28237                                          break;
28238                                        }
28239                                        case 0x00000580: {
28240                                          // 0xffb20780
28241                                          switch (instr & 0x000c0040) {
28242                                            case 0x00080000: {
28243                                              // 0xffba0780
28244                                              unsigned rd =
28245                                                  ExtractDRegister(instr,
28246                                                                   22,
28247                                                                   12);
28248                                              unsigned rm =
28249                                                  ExtractDRegister(instr, 5, 0);
28250                                              // VRINTP{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28251                                              vrintp(F32,
28252                                                     F32,
28253                                                     DRegister(rd),
28254                                                     DRegister(rm));
28255                                              break;
28256                                            }
28257                                            case 0x00080040: {
28258                                              // 0xffba07c0
28259                                              if (((instr >> 12) & 1) != 0) {
28260                                                UnallocatedT32(instr);
28261                                                return;
28262                                              }
28263                                              unsigned rd =
28264                                                  ExtractQRegister(instr,
28265                                                                   22,
28266                                                                   12);
28267                                              if ((instr & 1) != 0) {
28268                                                UnallocatedT32(instr);
28269                                                return;
28270                                              }
28271                                              unsigned rm =
28272                                                  ExtractQRegister(instr, 5, 0);
28273                                              // VRINTP{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28274                                              vrintp(F32,
28275                                                     F32,
28276                                                     QRegister(rd),
28277                                                     QRegister(rm));
28278                                              break;
28279                                            }
28280                                            default:
28281                                              UnallocatedT32(instr);
28282                                              break;
28283                                          }
28284                                          break;
28285                                        }
28286                                      }
28287                                      break;
28288                                    }
28289                                    case 0x00030000: {
28290                                      // 0xffb30000
28291                                      switch (instr & 0x00000440) {
28292                                        case 0x00000000: {
28293                                          // 0xffb30000
28294                                          switch (instr & 0x000c0100) {
28295                                            case 0x00080000: {
28296                                              // 0xffbb0000
28297                                              DataType dt = Dt_op_3_Decode(
28298                                                  (instr >> 7) & 0x1);
28299                                              if (dt.Is(
28300                                                      kDataTypeValueInvalid)) {
28301                                                UnallocatedT32(instr);
28302                                                return;
28303                                              }
28304                                              unsigned rd =
28305                                                  ExtractDRegister(instr,
28306                                                                   22,
28307                                                                   12);
28308                                              unsigned rm =
28309                                                  ExtractDRegister(instr, 5, 0);
28310                                              // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28311                                              vcvta(dt,
28312                                                    F32,
28313                                                    DRegister(rd),
28314                                                    DRegister(rm));
28315                                              break;
28316                                            }
28317                                            case 0x00080100: {
28318                                              // 0xffbb0100
28319                                              DataType dt = Dt_op_3_Decode(
28320                                                  (instr >> 7) & 0x1);
28321                                              if (dt.Is(
28322                                                      kDataTypeValueInvalid)) {
28323                                                UnallocatedT32(instr);
28324                                                return;
28325                                              }
28326                                              unsigned rd =
28327                                                  ExtractDRegister(instr,
28328                                                                   22,
28329                                                                   12);
28330                                              unsigned rm =
28331                                                  ExtractDRegister(instr, 5, 0);
28332                                              // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28333                                              vcvtn(dt,
28334                                                    F32,
28335                                                    DRegister(rd),
28336                                                    DRegister(rm));
28337                                              break;
28338                                            }
28339                                            default:
28340                                              UnallocatedT32(instr);
28341                                              break;
28342                                          }
28343                                          break;
28344                                        }
28345                                        case 0x00000040: {
28346                                          // 0xffb30040
28347                                          switch (instr & 0x000c0100) {
28348                                            case 0x00080000: {
28349                                              // 0xffbb0040
28350                                              DataType dt = Dt_op_3_Decode(
28351                                                  (instr >> 7) & 0x1);
28352                                              if (dt.Is(
28353                                                      kDataTypeValueInvalid)) {
28354                                                UnallocatedT32(instr);
28355                                                return;
28356                                              }
28357                                              if (((instr >> 12) & 1) != 0) {
28358                                                UnallocatedT32(instr);
28359                                                return;
28360                                              }
28361                                              unsigned rd =
28362                                                  ExtractQRegister(instr,
28363                                                                   22,
28364                                                                   12);
28365                                              if ((instr & 1) != 0) {
28366                                                UnallocatedT32(instr);
28367                                                return;
28368                                              }
28369                                              unsigned rm =
28370                                                  ExtractQRegister(instr, 5, 0);
28371                                              // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28372                                              vcvta(dt,
28373                                                    F32,
28374                                                    QRegister(rd),
28375                                                    QRegister(rm));
28376                                              break;
28377                                            }
28378                                            case 0x00080100: {
28379                                              // 0xffbb0140
28380                                              DataType dt = Dt_op_3_Decode(
28381                                                  (instr >> 7) & 0x1);
28382                                              if (dt.Is(
28383                                                      kDataTypeValueInvalid)) {
28384                                                UnallocatedT32(instr);
28385                                                return;
28386                                              }
28387                                              if (((instr >> 12) & 1) != 0) {
28388                                                UnallocatedT32(instr);
28389                                                return;
28390                                              }
28391                                              unsigned rd =
28392                                                  ExtractQRegister(instr,
28393                                                                   22,
28394                                                                   12);
28395                                              if ((instr & 1) != 0) {
28396                                                UnallocatedT32(instr);
28397                                                return;
28398                                              }
28399                                              unsigned rm =
28400                                                  ExtractQRegister(instr, 5, 0);
28401                                              // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28402                                              vcvtn(dt,
28403                                                    F32,
28404                                                    QRegister(rd),
28405                                                    QRegister(rm));
28406                                              break;
28407                                            }
28408                                            default:
28409                                              UnallocatedT32(instr);
28410                                              break;
28411                                          }
28412                                          break;
28413                                        }
28414                                        case 0x00000400: {
28415                                          // 0xffb30400
28416                                          switch (instr & 0x00000080) {
28417                                            case 0x00000000: {
28418                                              // 0xffb30400
28419                                              DataType dt = Dt_F_size_4_Decode(
28420                                                  ((instr >> 18) & 0x3) |
28421                                                  ((instr >> 6) & 0x4));
28422                                              if (dt.Is(
28423                                                      kDataTypeValueInvalid)) {
28424                                                UnallocatedT32(instr);
28425                                                return;
28426                                              }
28427                                              unsigned rd =
28428                                                  ExtractDRegister(instr,
28429                                                                   22,
28430                                                                   12);
28431                                              unsigned rm =
28432                                                  ExtractDRegister(instr, 5, 0);
28433                                              // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28434                                              vrecpe(CurrentCond(),
28435                                                     dt,
28436                                                     DRegister(rd),
28437                                                     DRegister(rm));
28438                                              break;
28439                                            }
28440                                            case 0x00000080: {
28441                                              // 0xffb30480
28442                                              DataType dt = Dt_F_size_4_Decode(
28443                                                  ((instr >> 18) & 0x3) |
28444                                                  ((instr >> 6) & 0x4));
28445                                              if (dt.Is(
28446                                                      kDataTypeValueInvalid)) {
28447                                                UnallocatedT32(instr);
28448                                                return;
28449                                              }
28450                                              unsigned rd =
28451                                                  ExtractDRegister(instr,
28452                                                                   22,
28453                                                                   12);
28454                                              unsigned rm =
28455                                                  ExtractDRegister(instr, 5, 0);
28456                                              // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28457                                              vrsqrte(CurrentCond(),
28458                                                      dt,
28459                                                      DRegister(rd),
28460                                                      DRegister(rm));
28461                                              break;
28462                                            }
28463                                          }
28464                                          break;
28465                                        }
28466                                        case 0x00000440: {
28467                                          // 0xffb30440
28468                                          switch (instr & 0x00000080) {
28469                                            case 0x00000000: {
28470                                              // 0xffb30440
28471                                              DataType dt = Dt_F_size_4_Decode(
28472                                                  ((instr >> 18) & 0x3) |
28473                                                  ((instr >> 6) & 0x4));
28474                                              if (dt.Is(
28475                                                      kDataTypeValueInvalid)) {
28476                                                UnallocatedT32(instr);
28477                                                return;
28478                                              }
28479                                              if (((instr >> 12) & 1) != 0) {
28480                                                UnallocatedT32(instr);
28481                                                return;
28482                                              }
28483                                              unsigned rd =
28484                                                  ExtractQRegister(instr,
28485                                                                   22,
28486                                                                   12);
28487                                              if ((instr & 1) != 0) {
28488                                                UnallocatedT32(instr);
28489                                                return;
28490                                              }
28491                                              unsigned rm =
28492                                                  ExtractQRegister(instr, 5, 0);
28493                                              // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28494                                              vrecpe(CurrentCond(),
28495                                                     dt,
28496                                                     QRegister(rd),
28497                                                     QRegister(rm));
28498                                              break;
28499                                            }
28500                                            case 0x00000080: {
28501                                              // 0xffb304c0
28502                                              DataType dt = Dt_F_size_4_Decode(
28503                                                  ((instr >> 18) & 0x3) |
28504                                                  ((instr >> 6) & 0x4));
28505                                              if (dt.Is(
28506                                                      kDataTypeValueInvalid)) {
28507                                                UnallocatedT32(instr);
28508                                                return;
28509                                              }
28510                                              if (((instr >> 12) & 1) != 0) {
28511                                                UnallocatedT32(instr);
28512                                                return;
28513                                              }
28514                                              unsigned rd =
28515                                                  ExtractQRegister(instr,
28516                                                                   22,
28517                                                                   12);
28518                                              if ((instr & 1) != 0) {
28519                                                UnallocatedT32(instr);
28520                                                return;
28521                                              }
28522                                              unsigned rm =
28523                                                  ExtractQRegister(instr, 5, 0);
28524                                              // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28525                                              vrsqrte(CurrentCond(),
28526                                                      dt,
28527                                                      QRegister(rd),
28528                                                      QRegister(rm));
28529                                              break;
28530                                            }
28531                                          }
28532                                          break;
28533                                        }
28534                                      }
28535                                      break;
28536                                    }
28537                                    case 0x00030200: {
28538                                      // 0xffb30200
28539                                      switch (instr & 0x000c0440) {
28540                                        case 0x00080000: {
28541                                          // 0xffbb0200
28542                                          switch (instr & 0x00000100) {
28543                                            case 0x00000000: {
28544                                              // 0xffbb0200
28545                                              DataType dt = Dt_op_3_Decode(
28546                                                  (instr >> 7) & 0x1);
28547                                              if (dt.Is(
28548                                                      kDataTypeValueInvalid)) {
28549                                                UnallocatedT32(instr);
28550                                                return;
28551                                              }
28552                                              unsigned rd =
28553                                                  ExtractDRegister(instr,
28554                                                                   22,
28555                                                                   12);
28556                                              unsigned rm =
28557                                                  ExtractDRegister(instr, 5, 0);
28558                                              // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28559                                              vcvtp(dt,
28560                                                    F32,
28561                                                    DRegister(rd),
28562                                                    DRegister(rm));
28563                                              break;
28564                                            }
28565                                            case 0x00000100: {
28566                                              // 0xffbb0300
28567                                              DataType dt = Dt_op_3_Decode(
28568                                                  (instr >> 7) & 0x1);
28569                                              if (dt.Is(
28570                                                      kDataTypeValueInvalid)) {
28571                                                UnallocatedT32(instr);
28572                                                return;
28573                                              }
28574                                              unsigned rd =
28575                                                  ExtractDRegister(instr,
28576                                                                   22,
28577                                                                   12);
28578                                              unsigned rm =
28579                                                  ExtractDRegister(instr, 5, 0);
28580                                              // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28581                                              vcvtm(dt,
28582                                                    F32,
28583                                                    DRegister(rd),
28584                                                    DRegister(rm));
28585                                              break;
28586                                            }
28587                                          }
28588                                          break;
28589                                        }
28590                                        case 0x00080040: {
28591                                          // 0xffbb0240
28592                                          switch (instr & 0x00000100) {
28593                                            case 0x00000000: {
28594                                              // 0xffbb0240
28595                                              DataType dt = Dt_op_3_Decode(
28596                                                  (instr >> 7) & 0x1);
28597                                              if (dt.Is(
28598                                                      kDataTypeValueInvalid)) {
28599                                                UnallocatedT32(instr);
28600                                                return;
28601                                              }
28602                                              if (((instr >> 12) & 1) != 0) {
28603                                                UnallocatedT32(instr);
28604                                                return;
28605                                              }
28606                                              unsigned rd =
28607                                                  ExtractQRegister(instr,
28608                                                                   22,
28609                                                                   12);
28610                                              if ((instr & 1) != 0) {
28611                                                UnallocatedT32(instr);
28612                                                return;
28613                                              }
28614                                              unsigned rm =
28615                                                  ExtractQRegister(instr, 5, 0);
28616                                              // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28617                                              vcvtp(dt,
28618                                                    F32,
28619                                                    QRegister(rd),
28620                                                    QRegister(rm));
28621                                              break;
28622                                            }
28623                                            case 0x00000100: {
28624                                              // 0xffbb0340
28625                                              DataType dt = Dt_op_3_Decode(
28626                                                  (instr >> 7) & 0x1);
28627                                              if (dt.Is(
28628                                                      kDataTypeValueInvalid)) {
28629                                                UnallocatedT32(instr);
28630                                                return;
28631                                              }
28632                                              if (((instr >> 12) & 1) != 0) {
28633                                                UnallocatedT32(instr);
28634                                                return;
28635                                              }
28636                                              unsigned rd =
28637                                                  ExtractQRegister(instr,
28638                                                                   22,
28639                                                                   12);
28640                                              if ((instr & 1) != 0) {
28641                                                UnallocatedT32(instr);
28642                                                return;
28643                                              }
28644                                              unsigned rm =
28645                                                  ExtractQRegister(instr, 5, 0);
28646                                              // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28647                                              vcvtm(dt,
28648                                                    F32,
28649                                                    QRegister(rd),
28650                                                    QRegister(rm));
28651                                              break;
28652                                            }
28653                                          }
28654                                          break;
28655                                        }
28656                                        case 0x00080400: {
28657                                          // 0xffbb0600
28658                                          DataType dt1 = Dt_op_1_Decode1(
28659                                              (instr >> 7) & 0x3);
28660                                          if (dt1.Is(kDataTypeValueInvalid)) {
28661                                            UnallocatedT32(instr);
28662                                            return;
28663                                          }
28664                                          DataType dt2 = Dt_op_1_Decode2(
28665                                              (instr >> 7) & 0x3);
28666                                          if (dt2.Is(kDataTypeValueInvalid)) {
28667                                            UnallocatedT32(instr);
28668                                            return;
28669                                          }
28670                                          unsigned rd =
28671                                              ExtractDRegister(instr, 22, 12);
28672                                          unsigned rm =
28673                                              ExtractDRegister(instr, 5, 0);
28674                                          // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28675                                          vcvt(CurrentCond(),
28676                                               dt1,
28677                                               dt2,
28678                                               DRegister(rd),
28679                                               DRegister(rm));
28680                                          break;
28681                                        }
28682                                        case 0x00080440: {
28683                                          // 0xffbb0640
28684                                          DataType dt1 = Dt_op_1_Decode1(
28685                                              (instr >> 7) & 0x3);
28686                                          if (dt1.Is(kDataTypeValueInvalid)) {
28687                                            UnallocatedT32(instr);
28688                                            return;
28689                                          }
28690                                          DataType dt2 = Dt_op_1_Decode2(
28691                                              (instr >> 7) & 0x3);
28692                                          if (dt2.Is(kDataTypeValueInvalid)) {
28693                                            UnallocatedT32(instr);
28694                                            return;
28695                                          }
28696                                          if (((instr >> 12) & 1) != 0) {
28697                                            UnallocatedT32(instr);
28698                                            return;
28699                                          }
28700                                          unsigned rd =
28701                                              ExtractQRegister(instr, 22, 12);
28702                                          if ((instr & 1) != 0) {
28703                                            UnallocatedT32(instr);
28704                                            return;
28705                                          }
28706                                          unsigned rm =
28707                                              ExtractQRegister(instr, 5, 0);
28708                                          // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28709                                          vcvt(CurrentCond(),
28710                                               dt1,
28711                                               dt2,
28712                                               QRegister(rd),
28713                                               QRegister(rm));
28714                                          break;
28715                                        }
28716                                        default:
28717                                          UnallocatedT32(instr);
28718                                          break;
28719                                      }
28720                                      break;
28721                                    }
28722                                  }
28723                                  break;
28724                                }
28725                                case 0x00000800: {
28726                                  // 0xffb00800
28727                                  switch (instr & 0x00000440) {
28728                                    case 0x00000000: {
28729                                      // 0xffb00800
28730                                      unsigned rd =
28731                                          ExtractDRegister(instr, 22, 12);
28732                                      unsigned first =
28733                                          ExtractDRegister(instr, 7, 16);
28734                                      unsigned length;
28735                                      SpacingType spacing = kSingle;
28736                                      switch ((instr >> 8) & 0x3) {
28737                                        default:
28738                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
28739                                        case 0x0:
28740                                          length = 1;
28741                                          break;
28742                                        case 0x1:
28743                                          length = 2;
28744                                          break;
28745                                        case 0x2:
28746                                          length = 3;
28747                                          break;
28748                                        case 0x3:
28749                                          length = 4;
28750                                          break;
28751                                      }
28752                                      unsigned last = first + length - 1;
28753                                      TransferType transfer = kMultipleLanes;
28754                                      unsigned rm =
28755                                          ExtractDRegister(instr, 5, 0);
28756                                      // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
28757                                      vtbl(CurrentCond(),
28758                                           Untyped8,
28759                                           DRegister(rd),
28760                                           NeonRegisterList(DRegister(first),
28761                                                            DRegister(last),
28762                                                            spacing,
28763                                                            transfer),
28764                                           DRegister(rm));
28765                                      break;
28766                                    }
28767                                    case 0x00000040: {
28768                                      // 0xffb00840
28769                                      unsigned rd =
28770                                          ExtractDRegister(instr, 22, 12);
28771                                      unsigned first =
28772                                          ExtractDRegister(instr, 7, 16);
28773                                      unsigned length;
28774                                      SpacingType spacing = kSingle;
28775                                      switch ((instr >> 8) & 0x3) {
28776                                        default:
28777                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
28778                                        case 0x0:
28779                                          length = 1;
28780                                          break;
28781                                        case 0x1:
28782                                          length = 2;
28783                                          break;
28784                                        case 0x2:
28785                                          length = 3;
28786                                          break;
28787                                        case 0x3:
28788                                          length = 4;
28789                                          break;
28790                                      }
28791                                      unsigned last = first + length - 1;
28792                                      TransferType transfer = kMultipleLanes;
28793                                      unsigned rm =
28794                                          ExtractDRegister(instr, 5, 0);
28795                                      // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
28796                                      vtbx(CurrentCond(),
28797                                           Untyped8,
28798                                           DRegister(rd),
28799                                           NeonRegisterList(DRegister(first),
28800                                                            DRegister(last),
28801                                                            spacing,
28802                                                            transfer),
28803                                           DRegister(rm));
28804                                      break;
28805                                    }
28806                                    case 0x00000400: {
28807                                      // 0xffb00c00
28808                                      if ((instr & 0x00000380) == 0x00000000) {
28809                                        unsigned lane;
28810                                        DataType dt =
28811                                            Dt_imm4_1_Decode((instr >> 16) &
28812                                                                 0xf,
28813                                                             &lane);
28814                                        if (dt.Is(kDataTypeValueInvalid)) {
28815                                          UnallocatedT32(instr);
28816                                          return;
28817                                        }
28818                                        unsigned rd =
28819                                            ExtractDRegister(instr, 22, 12);
28820                                        unsigned rm =
28821                                            ExtractDRegister(instr, 5, 0);
28822                                        // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28823                                        vdup(CurrentCond(),
28824                                             dt,
28825                                             DRegister(rd),
28826                                             DRegisterLane(rm, lane));
28827                                      } else {
28828                                        UnallocatedT32(instr);
28829                                      }
28830                                      break;
28831                                    }
28832                                    case 0x00000440: {
28833                                      // 0xffb00c40
28834                                      if ((instr & 0x00000380) == 0x00000000) {
28835                                        unsigned lane;
28836                                        DataType dt =
28837                                            Dt_imm4_1_Decode((instr >> 16) &
28838                                                                 0xf,
28839                                                             &lane);
28840                                        if (dt.Is(kDataTypeValueInvalid)) {
28841                                          UnallocatedT32(instr);
28842                                          return;
28843                                        }
28844                                        if (((instr >> 12) & 1) != 0) {
28845                                          UnallocatedT32(instr);
28846                                          return;
28847                                        }
28848                                        unsigned rd =
28849                                            ExtractQRegister(instr, 22, 12);
28850                                        unsigned rm =
28851                                            ExtractDRegister(instr, 5, 0);
28852                                        // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28853                                        vdup(CurrentCond(),
28854                                             dt,
28855                                             QRegister(rd),
28856                                             DRegisterLane(rm, lane));
28857                                      } else {
28858                                        UnallocatedT32(instr);
28859                                      }
28860                                      break;
28861                                    }
28862                                  }
28863                                  break;
28864                                }
28865                              }
28866                              break;
28867                            }
28868                          }
28869                          break;
28870                        }
28871                        default: {
28872                          switch (instr & 0x00000c40) {
28873                            case 0x00000000: {
28874                              // 0xef800000
28875                              switch (instr & 0x00000300) {
28876                                case 0x00000000: {
28877                                  // 0xef800000
28878                                  if (((instr & 0x300000) == 0x300000)) {
28879                                    UnallocatedT32(instr);
28880                                    return;
28881                                  }
28882                                  DataType dt =
28883                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28884                                                         ((instr >> 26) & 0x4));
28885                                  if (dt.Is(kDataTypeValueInvalid)) {
28886                                    UnallocatedT32(instr);
28887                                    return;
28888                                  }
28889                                  if (((instr >> 12) & 1) != 0) {
28890                                    UnallocatedT32(instr);
28891                                    return;
28892                                  }
28893                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28894                                  unsigned rn = ExtractDRegister(instr, 7, 16);
28895                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28896                                  // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28897                                  vaddl(CurrentCond(),
28898                                        dt,
28899                                        QRegister(rd),
28900                                        DRegister(rn),
28901                                        DRegister(rm));
28902                                  break;
28903                                }
28904                                case 0x00000100: {
28905                                  // 0xef800100
28906                                  if (((instr & 0x300000) == 0x300000)) {
28907                                    UnallocatedT32(instr);
28908                                    return;
28909                                  }
28910                                  DataType dt =
28911                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28912                                                         ((instr >> 26) & 0x4));
28913                                  if (dt.Is(kDataTypeValueInvalid)) {
28914                                    UnallocatedT32(instr);
28915                                    return;
28916                                  }
28917                                  if (((instr >> 12) & 1) != 0) {
28918                                    UnallocatedT32(instr);
28919                                    return;
28920                                  }
28921                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28922                                  if (((instr >> 16) & 1) != 0) {
28923                                    UnallocatedT32(instr);
28924                                    return;
28925                                  }
28926                                  unsigned rn = ExtractQRegister(instr, 7, 16);
28927                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28928                                  // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
28929                                  vaddw(CurrentCond(),
28930                                        dt,
28931                                        QRegister(rd),
28932                                        QRegister(rn),
28933                                        DRegister(rm));
28934                                  break;
28935                                }
28936                                case 0x00000200: {
28937                                  // 0xef800200
28938                                  if (((instr & 0x300000) == 0x300000)) {
28939                                    UnallocatedT32(instr);
28940                                    return;
28941                                  }
28942                                  DataType dt =
28943                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28944                                                         ((instr >> 26) & 0x4));
28945                                  if (dt.Is(kDataTypeValueInvalid)) {
28946                                    UnallocatedT32(instr);
28947                                    return;
28948                                  }
28949                                  if (((instr >> 12) & 1) != 0) {
28950                                    UnallocatedT32(instr);
28951                                    return;
28952                                  }
28953                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28954                                  unsigned rn = ExtractDRegister(instr, 7, 16);
28955                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28956                                  // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28957                                  vsubl(CurrentCond(),
28958                                        dt,
28959                                        QRegister(rd),
28960                                        DRegister(rn),
28961                                        DRegister(rm));
28962                                  break;
28963                                }
28964                                case 0x00000300: {
28965                                  // 0xef800300
28966                                  if (((instr & 0x300000) == 0x300000)) {
28967                                    UnallocatedT32(instr);
28968                                    return;
28969                                  }
28970                                  DataType dt =
28971                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28972                                                         ((instr >> 26) & 0x4));
28973                                  if (dt.Is(kDataTypeValueInvalid)) {
28974                                    UnallocatedT32(instr);
28975                                    return;
28976                                  }
28977                                  if (((instr >> 12) & 1) != 0) {
28978                                    UnallocatedT32(instr);
28979                                    return;
28980                                  }
28981                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28982                                  if (((instr >> 16) & 1) != 0) {
28983                                    UnallocatedT32(instr);
28984                                    return;
28985                                  }
28986                                  unsigned rn = ExtractQRegister(instr, 7, 16);
28987                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28988                                  // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
28989                                  vsubw(CurrentCond(),
28990                                        dt,
28991                                        QRegister(rd),
28992                                        QRegister(rn),
28993                                        DRegister(rm));
28994                                  break;
28995                                }
28996                              }
28997                              break;
28998                            }
28999                            case 0x00000040: {
29000                              // 0xef800040
29001                              switch (instr & 0x00000200) {
29002                                case 0x00000000: {
29003                                  // 0xef800040
29004                                  switch (instr & 0x10000000) {
29005                                    case 0x00000000: {
29006                                      // 0xef800040
29007                                      if (((instr & 0x300000) == 0x300000)) {
29008                                        UnallocatedT32(instr);
29009                                        return;
29010                                      }
29011                                      DataType dt =
29012                                          Dt_size_9_Decode((instr >> 20) & 0x3,
29013                                                           (instr >> 8) & 0x1);
29014                                      if (dt.Is(kDataTypeValueInvalid)) {
29015                                        UnallocatedT32(instr);
29016                                        return;
29017                                      }
29018                                      unsigned rd =
29019                                          ExtractDRegister(instr, 22, 12);
29020                                      unsigned rn =
29021                                          ExtractDRegister(instr, 7, 16);
29022                                      int lane;
29023                                      unsigned rm =
29024                                          ExtractDRegisterAndLane(instr,
29025                                                                  dt,
29026                                                                  5,
29027                                                                  0,
29028                                                                  &lane);
29029                                      // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29030                                      vmla(CurrentCond(),
29031                                           dt,
29032                                           DRegister(rd),
29033                                           DRegister(rn),
29034                                           DRegisterLane(rm, lane));
29035                                      break;
29036                                    }
29037                                    case 0x10000000: {
29038                                      // 0xff800040
29039                                      if (((instr & 0x300000) == 0x300000)) {
29040                                        UnallocatedT32(instr);
29041                                        return;
29042                                      }
29043                                      DataType dt =
29044                                          Dt_size_9_Decode((instr >> 20) & 0x3,
29045                                                           (instr >> 8) & 0x1);
29046                                      if (dt.Is(kDataTypeValueInvalid)) {
29047                                        UnallocatedT32(instr);
29048                                        return;
29049                                      }
29050                                      if (((instr >> 12) & 1) != 0) {
29051                                        UnallocatedT32(instr);
29052                                        return;
29053                                      }
29054                                      unsigned rd =
29055                                          ExtractQRegister(instr, 22, 12);
29056                                      if (((instr >> 16) & 1) != 0) {
29057                                        UnallocatedT32(instr);
29058                                        return;
29059                                      }
29060                                      unsigned rn =
29061                                          ExtractQRegister(instr, 7, 16);
29062                                      int lane;
29063                                      unsigned rm =
29064                                          ExtractDRegisterAndLane(instr,
29065                                                                  dt,
29066                                                                  5,
29067                                                                  0,
29068                                                                  &lane);
29069                                      // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29070                                      vmla(CurrentCond(),
29071                                           dt,
29072                                           QRegister(rd),
29073                                           QRegister(rn),
29074                                           DRegisterLane(rm, lane));
29075                                      break;
29076                                    }
29077                                  }
29078                                  break;
29079                                }
29080                                case 0x00000200: {
29081                                  // 0xef800240
29082                                  switch (instr & 0x00000100) {
29083                                    case 0x00000000: {
29084                                      // 0xef800240
29085                                      if (((instr & 0x300000) == 0x300000)) {
29086                                        UnallocatedT32(instr);
29087                                        return;
29088                                      }
29089                                      DataType dt =
29090                                          Dt_size_11_Decode((instr >> 20) & 0x3,
29091                                                            (instr >> 28) &
29092                                                                0x1);
29093                                      if (dt.Is(kDataTypeValueInvalid)) {
29094                                        UnallocatedT32(instr);
29095                                        return;
29096                                      }
29097                                      if (((instr >> 12) & 1) != 0) {
29098                                        UnallocatedT32(instr);
29099                                        return;
29100                                      }
29101                                      unsigned rd =
29102                                          ExtractQRegister(instr, 22, 12);
29103                                      unsigned rn =
29104                                          ExtractDRegister(instr, 7, 16);
29105                                      int lane;
29106                                      unsigned rm =
29107                                          ExtractDRegisterAndLane(instr,
29108                                                                  dt,
29109                                                                  5,
29110                                                                  0,
29111                                                                  &lane);
29112                                      // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29113                                      vmlal(CurrentCond(),
29114                                            dt,
29115                                            QRegister(rd),
29116                                            DRegister(rn),
29117                                            DRegisterLane(rm, lane));
29118                                      break;
29119                                    }
29120                                    case 0x00000100: {
29121                                      // 0xef800340
29122                                      if ((instr & 0x10000000) == 0x00000000) {
29123                                        if (((instr & 0x300000) == 0x300000)) {
29124                                          UnallocatedT32(instr);
29125                                          return;
29126                                        }
29127                                        DataType dt = Dt_size_13_Decode(
29128                                            (instr >> 20) & 0x3);
29129                                        if (dt.Is(kDataTypeValueInvalid)) {
29130                                          UnallocatedT32(instr);
29131                                          return;
29132                                        }
29133                                        if (((instr >> 12) & 1) != 0) {
29134                                          UnallocatedT32(instr);
29135                                          return;
29136                                        }
29137                                        unsigned rd =
29138                                            ExtractQRegister(instr, 22, 12);
29139                                        unsigned rn =
29140                                            ExtractDRegister(instr, 7, 16);
29141                                        uint32_t mvm = (instr & 0xf) |
29142                                                       ((instr >> 1) & 0x10);
29143                                        uint32_t shift = 4;
29144                                        if (dt.Is(S16)) {
29145                                          shift = 3;
29146                                        }
29147                                        uint32_t vm = mvm & ((1 << shift) - 1);
29148                                        uint32_t index = mvm >> shift;
29149                                        // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
29150                                        vqdmlal(CurrentCond(),
29151                                                dt,
29152                                                QRegister(rd),
29153                                                DRegister(rn),
29154                                                DRegister(vm),
29155                                                index);
29156                                      } else {
29157                                        UnallocatedT32(instr);
29158                                      }
29159                                      break;
29160                                    }
29161                                  }
29162                                  break;
29163                                }
29164                              }
29165                              break;
29166                            }
29167                            case 0x00000400: {
29168                              // 0xef800400
29169                              switch (instr & 0x00000300) {
29170                                case 0x00000000: {
29171                                  // 0xef800400
29172                                  switch (instr & 0x10000000) {
29173                                    case 0x00000000: {
29174                                      // 0xef800400
29175                                      if (((instr & 0x300000) == 0x300000)) {
29176                                        UnallocatedT32(instr);
29177                                        return;
29178                                      }
29179                                      DataType dt =
29180                                          Dt_size_3_Decode((instr >> 20) & 0x3);
29181                                      if (dt.Is(kDataTypeValueInvalid)) {
29182                                        UnallocatedT32(instr);
29183                                        return;
29184                                      }
29185                                      unsigned rd =
29186                                          ExtractDRegister(instr, 22, 12);
29187                                      if (((instr >> 16) & 1) != 0) {
29188                                        UnallocatedT32(instr);
29189                                        return;
29190                                      }
29191                                      unsigned rn =
29192                                          ExtractQRegister(instr, 7, 16);
29193                                      if ((instr & 1) != 0) {
29194                                        UnallocatedT32(instr);
29195                                        return;
29196                                      }
29197                                      unsigned rm =
29198                                          ExtractQRegister(instr, 5, 0);
29199                                      // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
29200                                      vaddhn(CurrentCond(),
29201                                             dt,
29202                                             DRegister(rd),
29203                                             QRegister(rn),
29204                                             QRegister(rm));
29205                                      break;
29206                                    }
29207                                    case 0x10000000: {
29208                                      // 0xff800400
29209                                      if (((instr & 0x300000) == 0x300000)) {
29210                                        UnallocatedT32(instr);
29211                                        return;
29212                                      }
29213                                      DataType dt =
29214                                          Dt_size_3_Decode((instr >> 20) & 0x3);
29215                                      if (dt.Is(kDataTypeValueInvalid)) {
29216                                        UnallocatedT32(instr);
29217                                        return;
29218                                      }
29219                                      unsigned rd =
29220                                          ExtractDRegister(instr, 22, 12);
29221                                      if (((instr >> 16) & 1) != 0) {
29222                                        UnallocatedT32(instr);
29223                                        return;
29224                                      }
29225                                      unsigned rn =
29226                                          ExtractQRegister(instr, 7, 16);
29227                                      if ((instr & 1) != 0) {
29228                                        UnallocatedT32(instr);
29229                                        return;
29230                                      }
29231                                      unsigned rm =
29232                                          ExtractQRegister(instr, 5, 0);
29233                                      // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
29234                                      vraddhn(CurrentCond(),
29235                                              dt,
29236                                              DRegister(rd),
29237                                              QRegister(rn),
29238                                              QRegister(rm));
29239                                      break;
29240                                    }
29241                                  }
29242                                  break;
29243                                }
29244                                case 0x00000100: {
29245                                  // 0xef800500
29246                                  if (((instr & 0x300000) == 0x300000)) {
29247                                    UnallocatedT32(instr);
29248                                    return;
29249                                  }
29250                                  DataType dt =
29251                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
29252                                                         ((instr >> 26) & 0x4));
29253                                  if (dt.Is(kDataTypeValueInvalid)) {
29254                                    UnallocatedT32(instr);
29255                                    return;
29256                                  }
29257                                  if (((instr >> 12) & 1) != 0) {
29258                                    UnallocatedT32(instr);
29259                                    return;
29260                                  }
29261                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29262                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29263                                  unsigned rm = ExtractDRegister(instr, 5, 0);
29264                                  // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
29265                                  vabal(CurrentCond(),
29266                                        dt,
29267                                        QRegister(rd),
29268                                        DRegister(rn),
29269                                        DRegister(rm));
29270                                  break;
29271                                }
29272                                case 0x00000200: {
29273                                  // 0xef800600
29274                                  switch (instr & 0x10000000) {
29275                                    case 0x00000000: {
29276                                      // 0xef800600
29277                                      if (((instr & 0x300000) == 0x300000)) {
29278                                        UnallocatedT32(instr);
29279                                        return;
29280                                      }
29281                                      DataType dt =
29282                                          Dt_size_3_Decode((instr >> 20) & 0x3);
29283                                      if (dt.Is(kDataTypeValueInvalid)) {
29284                                        UnallocatedT32(instr);
29285                                        return;
29286                                      }
29287                                      unsigned rd =
29288                                          ExtractDRegister(instr, 22, 12);
29289                                      if (((instr >> 16) & 1) != 0) {
29290                                        UnallocatedT32(instr);
29291                                        return;
29292                                      }
29293                                      unsigned rn =
29294                                          ExtractQRegister(instr, 7, 16);
29295                                      if ((instr & 1) != 0) {
29296                                        UnallocatedT32(instr);
29297                                        return;
29298                                      }
29299                                      unsigned rm =
29300                                          ExtractQRegister(instr, 5, 0);
29301                                      // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
29302                                      vsubhn(CurrentCond(),
29303                                             dt,
29304                                             DRegister(rd),
29305                                             QRegister(rn),
29306                                             QRegister(rm));
29307                                      break;
29308                                    }
29309                                    case 0x10000000: {
29310                                      // 0xff800600
29311                                      if (((instr & 0x300000) == 0x300000)) {
29312                                        UnallocatedT32(instr);
29313                                        return;
29314                                      }
29315                                      DataType dt =
29316                                          Dt_size_3_Decode((instr >> 20) & 0x3);
29317                                      if (dt.Is(kDataTypeValueInvalid)) {
29318                                        UnallocatedT32(instr);
29319                                        return;
29320                                      }
29321                                      unsigned rd =
29322                                          ExtractDRegister(instr, 22, 12);
29323                                      if (((instr >> 16) & 1) != 0) {
29324                                        UnallocatedT32(instr);
29325                                        return;
29326                                      }
29327                                      unsigned rn =
29328                                          ExtractQRegister(instr, 7, 16);
29329                                      if ((instr & 1) != 0) {
29330                                        UnallocatedT32(instr);
29331                                        return;
29332                                      }
29333                                      unsigned rm =
29334                                          ExtractQRegister(instr, 5, 0);
29335                                      // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
29336                                      vrsubhn(CurrentCond(),
29337                                              dt,
29338                                              DRegister(rd),
29339                                              QRegister(rn),
29340                                              QRegister(rm));
29341                                      break;
29342                                    }
29343                                  }
29344                                  break;
29345                                }
29346                                case 0x00000300: {
29347                                  // 0xef800700
29348                                  if (((instr & 0x300000) == 0x300000)) {
29349                                    UnallocatedT32(instr);
29350                                    return;
29351                                  }
29352                                  DataType dt =
29353                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
29354                                                         ((instr >> 26) & 0x4));
29355                                  if (dt.Is(kDataTypeValueInvalid)) {
29356                                    UnallocatedT32(instr);
29357                                    return;
29358                                  }
29359                                  if (((instr >> 12) & 1) != 0) {
29360                                    UnallocatedT32(instr);
29361                                    return;
29362                                  }
29363                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29364                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29365                                  unsigned rm = ExtractDRegister(instr, 5, 0);
29366                                  // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
29367                                  vabdl(CurrentCond(),
29368                                        dt,
29369                                        QRegister(rd),
29370                                        DRegister(rn),
29371                                        DRegister(rm));
29372                                  break;
29373                                }
29374                              }
29375                              break;
29376                            }
29377                            case 0x00000440: {
29378                              // 0xef800440
29379                              switch (instr & 0x00000200) {
29380                                case 0x00000000: {
29381                                  // 0xef800440
29382                                  switch (instr & 0x10000000) {
29383                                    case 0x00000000: {
29384                                      // 0xef800440
29385                                      if (((instr & 0x300000) == 0x300000)) {
29386                                        UnallocatedT32(instr);
29387                                        return;
29388                                      }
29389                                      DataType dt =
29390                                          Dt_size_9_Decode((instr >> 20) & 0x3,
29391                                                           (instr >> 8) & 0x1);
29392                                      if (dt.Is(kDataTypeValueInvalid)) {
29393                                        UnallocatedT32(instr);
29394                                        return;
29395                                      }
29396                                      unsigned rd =
29397                                          ExtractDRegister(instr, 22, 12);
29398                                      unsigned rn =
29399                                          ExtractDRegister(instr, 7, 16);
29400                                      int lane;
29401                                      unsigned rm =
29402                                          ExtractDRegisterAndLane(instr,
29403                                                                  dt,
29404                                                                  5,
29405                                                                  0,
29406                                                                  &lane);
29407                                      // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29408                                      vmls(CurrentCond(),
29409                                           dt,
29410                                           DRegister(rd),
29411                                           DRegister(rn),
29412                                           DRegisterLane(rm, lane));
29413                                      break;
29414                                    }
29415                                    case 0x10000000: {
29416                                      // 0xff800440
29417                                      if (((instr & 0x300000) == 0x300000)) {
29418                                        UnallocatedT32(instr);
29419                                        return;
29420                                      }
29421                                      DataType dt =
29422                                          Dt_size_9_Decode((instr >> 20) & 0x3,
29423                                                           (instr >> 8) & 0x1);
29424                                      if (dt.Is(kDataTypeValueInvalid)) {
29425                                        UnallocatedT32(instr);
29426                                        return;
29427                                      }
29428                                      if (((instr >> 12) & 1) != 0) {
29429                                        UnallocatedT32(instr);
29430                                        return;
29431                                      }
29432                                      unsigned rd =
29433                                          ExtractQRegister(instr, 22, 12);
29434                                      if (((instr >> 16) & 1) != 0) {
29435                                        UnallocatedT32(instr);
29436                                        return;
29437                                      }
29438                                      unsigned rn =
29439                                          ExtractQRegister(instr, 7, 16);
29440                                      int lane;
29441                                      unsigned rm =
29442                                          ExtractDRegisterAndLane(instr,
29443                                                                  dt,
29444                                                                  5,
29445                                                                  0,
29446                                                                  &lane);
29447                                      // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29448                                      vmls(CurrentCond(),
29449                                           dt,
29450                                           QRegister(rd),
29451                                           QRegister(rn),
29452                                           DRegisterLane(rm, lane));
29453                                      break;
29454                                    }
29455                                  }
29456                                  break;
29457                                }
29458                                case 0x00000200: {
29459                                  // 0xef800640
29460                                  switch (instr & 0x00000100) {
29461                                    case 0x00000000: {
29462                                      // 0xef800640
29463                                      if (((instr & 0x300000) == 0x300000)) {
29464                                        UnallocatedT32(instr);
29465                                        return;
29466                                      }
29467                                      DataType dt =
29468                                          Dt_size_11_Decode((instr >> 20) & 0x3,
29469                                                            (instr >> 28) &
29470                                                                0x1);
29471                                      if (dt.Is(kDataTypeValueInvalid)) {
29472                                        UnallocatedT32(instr);
29473                                        return;
29474                                      }
29475                                      if (((instr >> 12) & 1) != 0) {
29476                                        UnallocatedT32(instr);
29477                                        return;
29478                                      }
29479                                      unsigned rd =
29480                                          ExtractQRegister(instr, 22, 12);
29481                                      unsigned rn =
29482                                          ExtractDRegister(instr, 7, 16);
29483                                      int lane;
29484                                      unsigned rm =
29485                                          ExtractDRegisterAndLane(instr,
29486                                                                  dt,
29487                                                                  5,
29488                                                                  0,
29489                                                                  &lane);
29490                                      // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29491                                      vmlsl(CurrentCond(),
29492                                            dt,
29493                                            QRegister(rd),
29494                                            DRegister(rn),
29495                                            DRegisterLane(rm, lane));
29496                                      break;
29497                                    }
29498                                    case 0x00000100: {
29499                                      // 0xef800740
29500                                      if ((instr & 0x10000000) == 0x00000000) {
29501                                        if (((instr & 0x300000) == 0x300000)) {
29502                                          UnallocatedT32(instr);
29503                                          return;
29504                                        }
29505                                        DataType dt = Dt_size_13_Decode(
29506                                            (instr >> 20) & 0x3);
29507                                        if (dt.Is(kDataTypeValueInvalid)) {
29508                                          UnallocatedT32(instr);
29509                                          return;
29510                                        }
29511                                        if (((instr >> 12) & 1) != 0) {
29512                                          UnallocatedT32(instr);
29513                                          return;
29514                                        }
29515                                        unsigned rd =
29516                                            ExtractQRegister(instr, 22, 12);
29517                                        unsigned rn =
29518                                            ExtractDRegister(instr, 7, 16);
29519                                        uint32_t mvm = (instr & 0xf) |
29520                                                       ((instr >> 1) & 0x10);
29521                                        uint32_t shift = 4;
29522                                        if (dt.Is(S16)) {
29523                                          shift = 3;
29524                                        }
29525                                        uint32_t vm = mvm & ((1 << shift) - 1);
29526                                        uint32_t index = mvm >> shift;
29527                                        // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
29528                                        vqdmlsl(CurrentCond(),
29529                                                dt,
29530                                                QRegister(rd),
29531                                                DRegister(rn),
29532                                                DRegister(vm),
29533                                                index);
29534                                      } else {
29535                                        UnallocatedT32(instr);
29536                                      }
29537                                      break;
29538                                    }
29539                                  }
29540                                  break;
29541                                }
29542                              }
29543                              break;
29544                            }
29545                            case 0x00000800: {
29546                              // 0xef800800
29547                              switch (instr & 0x00000300) {
29548                                case 0x00000000: {
29549                                  // 0xef800800
29550                                  if (((instr & 0x300000) == 0x300000)) {
29551                                    UnallocatedT32(instr);
29552                                    return;
29553                                  }
29554                                  DataType dt =
29555                                      Dt_size_12_Decode((instr >> 20) & 0x3,
29556                                                        (instr >> 28) & 0x1);
29557                                  if (dt.Is(kDataTypeValueInvalid)) {
29558                                    UnallocatedT32(instr);
29559                                    return;
29560                                  }
29561                                  if (((instr >> 12) & 1) != 0) {
29562                                    UnallocatedT32(instr);
29563                                    return;
29564                                  }
29565                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29566                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29567                                  unsigned rm = ExtractDRegister(instr, 5, 0);
29568                                  // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29569                                  vmlal(CurrentCond(),
29570                                        dt,
29571                                        QRegister(rd),
29572                                        DRegister(rn),
29573                                        DRegister(rm));
29574                                  break;
29575                                }
29576                                case 0x00000100: {
29577                                  // 0xef800900
29578                                  if ((instr & 0x10000000) == 0x00000000) {
29579                                    if (((instr & 0x300000) == 0x300000)) {
29580                                      UnallocatedT32(instr);
29581                                      return;
29582                                    }
29583                                    DataType dt =
29584                                        Dt_size_13_Decode((instr >> 20) & 0x3);
29585                                    if (dt.Is(kDataTypeValueInvalid)) {
29586                                      UnallocatedT32(instr);
29587                                      return;
29588                                    }
29589                                    if (((instr >> 12) & 1) != 0) {
29590                                      UnallocatedT32(instr);
29591                                      return;
29592                                    }
29593                                    unsigned rd =
29594                                        ExtractQRegister(instr, 22, 12);
29595                                    unsigned rn =
29596                                        ExtractDRegister(instr, 7, 16);
29597                                    unsigned rm = ExtractDRegister(instr, 5, 0);
29598                                    // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29599                                    vqdmlal(CurrentCond(),
29600                                            dt,
29601                                            QRegister(rd),
29602                                            DRegister(rn),
29603                                            DRegister(rm));
29604                                  } else {
29605                                    UnallocatedT32(instr);
29606                                  }
29607                                  break;
29608                                }
29609                                case 0x00000200: {
29610                                  // 0xef800a00
29611                                  if (((instr & 0x300000) == 0x300000)) {
29612                                    UnallocatedT32(instr);
29613                                    return;
29614                                  }
29615                                  DataType dt =
29616                                      Dt_size_12_Decode((instr >> 20) & 0x3,
29617                                                        (instr >> 28) & 0x1);
29618                                  if (dt.Is(kDataTypeValueInvalid)) {
29619                                    UnallocatedT32(instr);
29620                                    return;
29621                                  }
29622                                  if (((instr >> 12) & 1) != 0) {
29623                                    UnallocatedT32(instr);
29624                                    return;
29625                                  }
29626                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29627                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29628                                  unsigned rm = ExtractDRegister(instr, 5, 0);
29629                                  // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29630                                  vmlsl(CurrentCond(),
29631                                        dt,
29632                                        QRegister(rd),
29633                                        DRegister(rn),
29634                                        DRegister(rm));
29635                                  break;
29636                                }
29637                                case 0x00000300: {
29638                                  // 0xef800b00
29639                                  if ((instr & 0x10000000) == 0x00000000) {
29640                                    if (((instr & 0x300000) == 0x300000)) {
29641                                      UnallocatedT32(instr);
29642                                      return;
29643                                    }
29644                                    DataType dt =
29645                                        Dt_size_13_Decode((instr >> 20) & 0x3);
29646                                    if (dt.Is(kDataTypeValueInvalid)) {
29647                                      UnallocatedT32(instr);
29648                                      return;
29649                                    }
29650                                    if (((instr >> 12) & 1) != 0) {
29651                                      UnallocatedT32(instr);
29652                                      return;
29653                                    }
29654                                    unsigned rd =
29655                                        ExtractQRegister(instr, 22, 12);
29656                                    unsigned rn =
29657                                        ExtractDRegister(instr, 7, 16);
29658                                    unsigned rm = ExtractDRegister(instr, 5, 0);
29659                                    // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29660                                    vqdmlsl(CurrentCond(),
29661                                            dt,
29662                                            QRegister(rd),
29663                                            DRegister(rn),
29664                                            DRegister(rm));
29665                                  } else {
29666                                    UnallocatedT32(instr);
29667                                  }
29668                                  break;
29669                                }
29670                              }
29671                              break;
29672                            }
29673                            case 0x00000840: {
29674                              // 0xef800840
29675                              switch (instr & 0x00000200) {
29676                                case 0x00000000: {
29677                                  // 0xef800840
29678                                  switch (instr & 0x10000000) {
29679                                    case 0x00000000: {
29680                                      // 0xef800840
29681                                      if (((instr & 0x300000) == 0x300000)) {
29682                                        UnallocatedT32(instr);
29683                                        return;
29684                                      }
29685                                      DataType dt = Dt_F_size_3_Decode(
29686                                          ((instr >> 20) & 0x3) |
29687                                          ((instr >> 6) & 0x4));
29688                                      if (dt.Is(kDataTypeValueInvalid)) {
29689                                        UnallocatedT32(instr);
29690                                        return;
29691                                      }
29692                                      unsigned rd =
29693                                          ExtractDRegister(instr, 22, 12);
29694                                      unsigned rn =
29695                                          ExtractDRegister(instr, 7, 16);
29696                                      uint32_t mvm =
29697                                          (instr & 0xf) | ((instr >> 1) & 0x10);
29698                                      uint32_t shift = 4;
29699                                      if (dt.Is(I16)) {
29700                                        shift = 3;
29701                                      }
29702                                      uint32_t vm = mvm & ((1 << shift) - 1);
29703                                      uint32_t index = mvm >> shift;
29704                                      // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29705                                      vmul(CurrentCond(),
29706                                           dt,
29707                                           DRegister(rd),
29708                                           DRegister(rn),
29709                                           DRegister(vm),
29710                                           index);
29711                                      break;
29712                                    }
29713                                    case 0x10000000: {
29714                                      // 0xff800840
29715                                      if (((instr & 0x300000) == 0x300000)) {
29716                                        UnallocatedT32(instr);
29717                                        return;
29718                                      }
29719                                      DataType dt = Dt_F_size_3_Decode(
29720                                          ((instr >> 20) & 0x3) |
29721                                          ((instr >> 6) & 0x4));
29722                                      if (dt.Is(kDataTypeValueInvalid)) {
29723                                        UnallocatedT32(instr);
29724                                        return;
29725                                      }
29726                                      if (((instr >> 12) & 1) != 0) {
29727                                        UnallocatedT32(instr);
29728                                        return;
29729                                      }
29730                                      unsigned rd =
29731                                          ExtractQRegister(instr, 22, 12);
29732                                      if (((instr >> 16) & 1) != 0) {
29733                                        UnallocatedT32(instr);
29734                                        return;
29735                                      }
29736                                      unsigned rn =
29737                                          ExtractQRegister(instr, 7, 16);
29738                                      uint32_t mvm =
29739                                          (instr & 0xf) | ((instr >> 1) & 0x10);
29740                                      uint32_t shift = 4;
29741                                      if (dt.Is(I16)) {
29742                                        shift = 3;
29743                                      }
29744                                      uint32_t vm = mvm & ((1 << shift) - 1);
29745                                      uint32_t index = mvm >> shift;
29746                                      // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29747                                      vmul(CurrentCond(),
29748                                           dt,
29749                                           QRegister(rd),
29750                                           QRegister(rn),
29751                                           DRegister(vm),
29752                                           index);
29753                                      break;
29754                                    }
29755                                  }
29756                                  break;
29757                                }
29758                                case 0x00000200: {
29759                                  // 0xef800a40
29760                                  switch (instr & 0x00000100) {
29761                                    case 0x00000000: {
29762                                      // 0xef800a40
29763                                      if (((instr & 0x300000) == 0x300000)) {
29764                                        UnallocatedT32(instr);
29765                                        return;
29766                                      }
29767                                      DataType dt = Dt_U_size_2_Decode(
29768                                          ((instr >> 20) & 0x3) |
29769                                          ((instr >> 26) & 0x4));
29770                                      if (dt.Is(kDataTypeValueInvalid)) {
29771                                        UnallocatedT32(instr);
29772                                        return;
29773                                      }
29774                                      if (((instr >> 12) & 1) != 0) {
29775                                        UnallocatedT32(instr);
29776                                        return;
29777                                      }
29778                                      unsigned rd =
29779                                          ExtractQRegister(instr, 22, 12);
29780                                      unsigned rn =
29781                                          ExtractDRegister(instr, 7, 16);
29782                                      uint32_t mvm =
29783                                          (instr & 0xf) | ((instr >> 1) & 0x10);
29784                                      uint32_t shift = 4;
29785                                      if (dt.Is(S16) || dt.Is(U16)) {
29786                                        shift = 3;
29787                                      }
29788                                      uint32_t vm = mvm & ((1 << shift) - 1);
29789                                      uint32_t index = mvm >> shift;
29790                                      // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29791                                      vmull(CurrentCond(),
29792                                            dt,
29793                                            QRegister(rd),
29794                                            DRegister(rn),
29795                                            DRegister(vm),
29796                                            index);
29797                                      break;
29798                                    }
29799                                    case 0x00000100: {
29800                                      // 0xef800b40
29801                                      if ((instr & 0x10000000) == 0x00000000) {
29802                                        if (((instr & 0x300000) == 0x300000)) {
29803                                          UnallocatedT32(instr);
29804                                          return;
29805                                        }
29806                                        DataType dt = Dt_size_13_Decode(
29807                                            (instr >> 20) & 0x3);
29808                                        if (dt.Is(kDataTypeValueInvalid)) {
29809                                          UnallocatedT32(instr);
29810                                          return;
29811                                        }
29812                                        if (((instr >> 12) & 1) != 0) {
29813                                          UnallocatedT32(instr);
29814                                          return;
29815                                        }
29816                                        unsigned rd =
29817                                            ExtractQRegister(instr, 22, 12);
29818                                        unsigned rn =
29819                                            ExtractDRegister(instr, 7, 16);
29820                                        int lane;
29821                                        unsigned rm =
29822                                            ExtractDRegisterAndLane(instr,
29823                                                                    dt,
29824                                                                    5,
29825                                                                    0,
29826                                                                    &lane);
29827                                        // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29828                                        vqdmull(CurrentCond(),
29829                                                dt,
29830                                                QRegister(rd),
29831                                                DRegister(rn),
29832                                                DRegisterLane(rm, lane));
29833                                      } else {
29834                                        UnallocatedT32(instr);
29835                                      }
29836                                      break;
29837                                    }
29838                                  }
29839                                  break;
29840                                }
29841                              }
29842                              break;
29843                            }
29844                            case 0x00000c00: {
29845                              // 0xef800c00
29846                              switch (instr & 0x00000100) {
29847                                case 0x00000000: {
29848                                  // 0xef800c00
29849                                  if (((instr & 0x300000) == 0x300000)) {
29850                                    UnallocatedT32(instr);
29851                                    return;
29852                                  }
29853                                  DataType dt = Dt_op_U_size_1_Decode(
29854                                      ((instr >> 20) & 0x3) |
29855                                      ((instr >> 26) & 0x4) |
29856                                      ((instr >> 6) & 0x8));
29857                                  if (dt.Is(kDataTypeValueInvalid)) {
29858                                    UnallocatedT32(instr);
29859                                    return;
29860                                  }
29861                                  if (((instr >> 12) & 1) != 0) {
29862                                    UnallocatedT32(instr);
29863                                    return;
29864                                  }
29865                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29866                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29867                                  unsigned rm = ExtractDRegister(instr, 5, 0);
29868                                  // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
29869                                  vmull(CurrentCond(),
29870                                        dt,
29871                                        QRegister(rd),
29872                                        DRegister(rn),
29873                                        DRegister(rm));
29874                                  break;
29875                                }
29876                                case 0x00000100: {
29877                                  // 0xef800d00
29878                                  if ((instr & 0x10000200) == 0x00000000) {
29879                                    if (((instr & 0x300000) == 0x300000)) {
29880                                      UnallocatedT32(instr);
29881                                      return;
29882                                    }
29883                                    DataType dt =
29884                                        Dt_size_13_Decode((instr >> 20) & 0x3);
29885                                    if (dt.Is(kDataTypeValueInvalid)) {
29886                                      UnallocatedT32(instr);
29887                                      return;
29888                                    }
29889                                    if (((instr >> 12) & 1) != 0) {
29890                                      UnallocatedT32(instr);
29891                                      return;
29892                                    }
29893                                    unsigned rd =
29894                                        ExtractQRegister(instr, 22, 12);
29895                                    unsigned rn =
29896                                        ExtractDRegister(instr, 7, 16);
29897                                    unsigned rm = ExtractDRegister(instr, 5, 0);
29898                                    // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29899                                    vqdmull(CurrentCond(),
29900                                            dt,
29901                                            QRegister(rd),
29902                                            DRegister(rn),
29903                                            DRegister(rm));
29904                                  } else {
29905                                    UnallocatedT32(instr);
29906                                  }
29907                                  break;
29908                                }
29909                              }
29910                              break;
29911                            }
29912                            case 0x00000c40: {
29913                              // 0xef800c40
29914                              switch (instr & 0x10000300) {
29915                                case 0x00000000: {
29916                                  // 0xef800c40
29917                                  if (((instr & 0x300000) == 0x300000)) {
29918                                    UnallocatedT32(instr);
29919                                    return;
29920                                  }
29921                                  DataType dt =
29922                                      Dt_size_13_Decode((instr >> 20) & 0x3);
29923                                  if (dt.Is(kDataTypeValueInvalid)) {
29924                                    UnallocatedT32(instr);
29925                                    return;
29926                                  }
29927                                  unsigned rd = ExtractDRegister(instr, 22, 12);
29928                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29929                                  int lane;
29930                                  unsigned rm = ExtractDRegisterAndLane(instr,
29931                                                                        dt,
29932                                                                        5,
29933                                                                        0,
29934                                                                        &lane);
29935                                  // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29936                                  vqdmulh(CurrentCond(),
29937                                          dt,
29938                                          DRegister(rd),
29939                                          DRegister(rn),
29940                                          DRegisterLane(rm, lane));
29941                                  break;
29942                                }
29943                                case 0x00000100: {
29944                                  // 0xef800d40
29945                                  if (((instr & 0x300000) == 0x300000)) {
29946                                    UnallocatedT32(instr);
29947                                    return;
29948                                  }
29949                                  DataType dt =
29950                                      Dt_size_13_Decode((instr >> 20) & 0x3);
29951                                  if (dt.Is(kDataTypeValueInvalid)) {
29952                                    UnallocatedT32(instr);
29953                                    return;
29954                                  }
29955                                  unsigned rd = ExtractDRegister(instr, 22, 12);
29956                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29957                                  int lane;
29958                                  unsigned rm = ExtractDRegisterAndLane(instr,
29959                                                                        dt,
29960                                                                        5,
29961                                                                        0,
29962                                                                        &lane);
29963                                  // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29964                                  vqrdmulh(CurrentCond(),
29965                                           dt,
29966                                           DRegister(rd),
29967                                           DRegister(rn),
29968                                           DRegisterLane(rm, lane));
29969                                  break;
29970                                }
29971                                case 0x10000000: {
29972                                  // 0xff800c40
29973                                  if (((instr & 0x300000) == 0x300000)) {
29974                                    UnallocatedT32(instr);
29975                                    return;
29976                                  }
29977                                  DataType dt =
29978                                      Dt_size_13_Decode((instr >> 20) & 0x3);
29979                                  if (dt.Is(kDataTypeValueInvalid)) {
29980                                    UnallocatedT32(instr);
29981                                    return;
29982                                  }
29983                                  if (((instr >> 12) & 1) != 0) {
29984                                    UnallocatedT32(instr);
29985                                    return;
29986                                  }
29987                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29988                                  if (((instr >> 16) & 1) != 0) {
29989                                    UnallocatedT32(instr);
29990                                    return;
29991                                  }
29992                                  unsigned rn = ExtractQRegister(instr, 7, 16);
29993                                  int lane;
29994                                  unsigned rm = ExtractDRegisterAndLane(instr,
29995                                                                        dt,
29996                                                                        5,
29997                                                                        0,
29998                                                                        &lane);
29999                                  // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
30000                                  vqdmulh(CurrentCond(),
30001                                          dt,
30002                                          QRegister(rd),
30003                                          QRegister(rn),
30004                                          DRegisterLane(rm, lane));
30005                                  break;
30006                                }
30007                                case 0x10000100: {
30008                                  // 0xff800d40
30009                                  if (((instr & 0x300000) == 0x300000)) {
30010                                    UnallocatedT32(instr);
30011                                    return;
30012                                  }
30013                                  DataType dt =
30014                                      Dt_size_13_Decode((instr >> 20) & 0x3);
30015                                  if (dt.Is(kDataTypeValueInvalid)) {
30016                                    UnallocatedT32(instr);
30017                                    return;
30018                                  }
30019                                  if (((instr >> 12) & 1) != 0) {
30020                                    UnallocatedT32(instr);
30021                                    return;
30022                                  }
30023                                  unsigned rd = ExtractQRegister(instr, 22, 12);
30024                                  if (((instr >> 16) & 1) != 0) {
30025                                    UnallocatedT32(instr);
30026                                    return;
30027                                  }
30028                                  unsigned rn = ExtractQRegister(instr, 7, 16);
30029                                  int lane;
30030                                  unsigned rm = ExtractDRegisterAndLane(instr,
30031                                                                        dt,
30032                                                                        5,
30033                                                                        0,
30034                                                                        &lane);
30035                                  // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
30036                                  vqrdmulh(CurrentCond(),
30037                                           dt,
30038                                           QRegister(rd),
30039                                           QRegister(rn),
30040                                           DRegisterLane(rm, lane));
30041                                  break;
30042                                }
30043                                default:
30044                                  UnallocatedT32(instr);
30045                                  break;
30046                              }
30047                              break;
30048                            }
30049                          }
30050                          break;
30051                        }
30052                      }
30053                      break;
30054                    }
30055                  }
30056                  break;
30057                }
30058                case 0x01000010: {
30059                  // 0xef000010
30060                  switch (instr & 0x00800040) {
30061                    case 0x00000000: {
30062                      // 0xef000010
30063                      switch (instr & 0x00000f00) {
30064                        case 0x00000000: {
30065                          // 0xef000010
30066                          DataType dt = Dt_U_size_3_Decode(
30067                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30068                          if (dt.Is(kDataTypeValueInvalid)) {
30069                            UnallocatedT32(instr);
30070                            return;
30071                          }
30072                          unsigned rd = ExtractDRegister(instr, 22, 12);
30073                          unsigned rn = ExtractDRegister(instr, 7, 16);
30074                          unsigned rm = ExtractDRegister(instr, 5, 0);
30075                          // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30076                          vqadd(CurrentCond(),
30077                                dt,
30078                                DRegister(rd),
30079                                DRegister(rn),
30080                                DRegister(rm));
30081                          break;
30082                        }
30083                        case 0x00000100: {
30084                          // 0xef000110
30085                          switch (instr & 0x10300000) {
30086                            case 0x00000000: {
30087                              // 0xef000110
30088                              unsigned rd = ExtractDRegister(instr, 22, 12);
30089                              unsigned rn = ExtractDRegister(instr, 7, 16);
30090                              unsigned rm = ExtractDRegister(instr, 5, 0);
30091                              // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30092                              vand(CurrentCond(),
30093                                   kDataTypeValueNone,
30094                                   DRegister(rd),
30095                                   DRegister(rn),
30096                                   DRegister(rm));
30097                              break;
30098                            }
30099                            case 0x00100000: {
30100                              // 0xef100110
30101                              unsigned rd = ExtractDRegister(instr, 22, 12);
30102                              unsigned rn = ExtractDRegister(instr, 7, 16);
30103                              unsigned rm = ExtractDRegister(instr, 5, 0);
30104                              // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30105                              vbic(CurrentCond(),
30106                                   kDataTypeValueNone,
30107                                   DRegister(rd),
30108                                   DRegister(rn),
30109                                   DRegister(rm));
30110                              break;
30111                            }
30112                            case 0x00200000: {
30113                              // 0xef200110
30114                              if (((instr & 0x00000040) == 0x00000000) &&
30115                                  ((((Uint32((instr >> 7)) & Uint32(0x1))
30116                                     << 4) |
30117                                    (Uint32((instr >> 16)) & Uint32(0xf))) ==
30118                                   (((Uint32((instr >> 5)) & Uint32(0x1))
30119                                     << 4) |
30120                                    (Uint32(instr) & Uint32(0xf))))) {
30121                                unsigned rd = ExtractDRegister(instr, 22, 12);
30122                                unsigned rm = ExtractDRegister(instr, 7, 16);
30123                                // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1
30124                                vmov(CurrentCond(),
30125                                     kDataTypeValueNone,
30126                                     DRegister(rd),
30127                                     DRegister(rm));
30128                                return;
30129                              }
30130                              unsigned rd = ExtractDRegister(instr, 22, 12);
30131                              unsigned rn = ExtractDRegister(instr, 7, 16);
30132                              unsigned rm = ExtractDRegister(instr, 5, 0);
30133                              // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30134                              vorr(CurrentCond(),
30135                                   kDataTypeValueNone,
30136                                   DRegister(rd),
30137                                   DRegister(rn),
30138                                   DRegister(rm));
30139                              break;
30140                            }
30141                            case 0x00300000: {
30142                              // 0xef300110
30143                              unsigned rd = ExtractDRegister(instr, 22, 12);
30144                              unsigned rn = ExtractDRegister(instr, 7, 16);
30145                              unsigned rm = ExtractDRegister(instr, 5, 0);
30146                              // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30147                              vorn(CurrentCond(),
30148                                   kDataTypeValueNone,
30149                                   DRegister(rd),
30150                                   DRegister(rn),
30151                                   DRegister(rm));
30152                              break;
30153                            }
30154                            case 0x10000000: {
30155                              // 0xff000110
30156                              unsigned rd = ExtractDRegister(instr, 22, 12);
30157                              unsigned rn = ExtractDRegister(instr, 7, 16);
30158                              unsigned rm = ExtractDRegister(instr, 5, 0);
30159                              // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30160                              veor(CurrentCond(),
30161                                   kDataTypeValueNone,
30162                                   DRegister(rd),
30163                                   DRegister(rn),
30164                                   DRegister(rm));
30165                              break;
30166                            }
30167                            case 0x10100000: {
30168                              // 0xff100110
30169                              unsigned rd = ExtractDRegister(instr, 22, 12);
30170                              unsigned rn = ExtractDRegister(instr, 7, 16);
30171                              unsigned rm = ExtractDRegister(instr, 5, 0);
30172                              // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30173                              vbsl(CurrentCond(),
30174                                   kDataTypeValueNone,
30175                                   DRegister(rd),
30176                                   DRegister(rn),
30177                                   DRegister(rm));
30178                              break;
30179                            }
30180                            case 0x10200000: {
30181                              // 0xff200110
30182                              unsigned rd = ExtractDRegister(instr, 22, 12);
30183                              unsigned rn = ExtractDRegister(instr, 7, 16);
30184                              unsigned rm = ExtractDRegister(instr, 5, 0);
30185                              // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30186                              vbit(CurrentCond(),
30187                                   kDataTypeValueNone,
30188                                   DRegister(rd),
30189                                   DRegister(rn),
30190                                   DRegister(rm));
30191                              break;
30192                            }
30193                            case 0x10300000: {
30194                              // 0xff300110
30195                              unsigned rd = ExtractDRegister(instr, 22, 12);
30196                              unsigned rn = ExtractDRegister(instr, 7, 16);
30197                              unsigned rm = ExtractDRegister(instr, 5, 0);
30198                              // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30199                              vbif(CurrentCond(),
30200                                   kDataTypeValueNone,
30201                                   DRegister(rd),
30202                                   DRegister(rn),
30203                                   DRegister(rm));
30204                              break;
30205                            }
30206                          }
30207                          break;
30208                        }
30209                        case 0x00000200: {
30210                          // 0xef000210
30211                          DataType dt = Dt_U_size_3_Decode(
30212                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30213                          if (dt.Is(kDataTypeValueInvalid)) {
30214                            UnallocatedT32(instr);
30215                            return;
30216                          }
30217                          unsigned rd = ExtractDRegister(instr, 22, 12);
30218                          unsigned rn = ExtractDRegister(instr, 7, 16);
30219                          unsigned rm = ExtractDRegister(instr, 5, 0);
30220                          // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30221                          vqsub(CurrentCond(),
30222                                dt,
30223                                DRegister(rd),
30224                                DRegister(rn),
30225                                DRegister(rm));
30226                          break;
30227                        }
30228                        case 0x00000300: {
30229                          // 0xef000310
30230                          DataType dt = Dt_U_size_1_Decode(
30231                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30232                          if (dt.Is(kDataTypeValueInvalid)) {
30233                            UnallocatedT32(instr);
30234                            return;
30235                          }
30236                          unsigned rd = ExtractDRegister(instr, 22, 12);
30237                          unsigned rn = ExtractDRegister(instr, 7, 16);
30238                          unsigned rm = ExtractDRegister(instr, 5, 0);
30239                          // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30240                          vcge(CurrentCond(),
30241                               dt,
30242                               DRegister(rd),
30243                               DRegister(rn),
30244                               DRegister(rm));
30245                          break;
30246                        }
30247                        case 0x00000400: {
30248                          // 0xef000410
30249                          DataType dt = Dt_U_size_3_Decode(
30250                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30251                          if (dt.Is(kDataTypeValueInvalid)) {
30252                            UnallocatedT32(instr);
30253                            return;
30254                          }
30255                          unsigned rd = ExtractDRegister(instr, 22, 12);
30256                          unsigned rm = ExtractDRegister(instr, 5, 0);
30257                          unsigned rn = ExtractDRegister(instr, 7, 16);
30258                          // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
30259                          vqshl(CurrentCond(),
30260                                dt,
30261                                DRegister(rd),
30262                                DRegister(rm),
30263                                DRegister(rn));
30264                          break;
30265                        }
30266                        case 0x00000500: {
30267                          // 0xef000510
30268                          DataType dt = Dt_U_size_3_Decode(
30269                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30270                          if (dt.Is(kDataTypeValueInvalid)) {
30271                            UnallocatedT32(instr);
30272                            return;
30273                          }
30274                          unsigned rd = ExtractDRegister(instr, 22, 12);
30275                          unsigned rm = ExtractDRegister(instr, 5, 0);
30276                          unsigned rn = ExtractDRegister(instr, 7, 16);
30277                          // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
30278                          vqrshl(CurrentCond(),
30279                                 dt,
30280                                 DRegister(rd),
30281                                 DRegister(rm),
30282                                 DRegister(rn));
30283                          break;
30284                        }
30285                        case 0x00000600: {
30286                          // 0xef000610
30287                          DataType dt = Dt_U_size_1_Decode(
30288                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30289                          if (dt.Is(kDataTypeValueInvalid)) {
30290                            UnallocatedT32(instr);
30291                            return;
30292                          }
30293                          unsigned rd = ExtractDRegister(instr, 22, 12);
30294                          unsigned rn = ExtractDRegister(instr, 7, 16);
30295                          unsigned rm = ExtractDRegister(instr, 5, 0);
30296                          // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30297                          vmin(CurrentCond(),
30298                               dt,
30299                               DRegister(rd),
30300                               DRegister(rn),
30301                               DRegister(rm));
30302                          break;
30303                        }
30304                        case 0x00000700: {
30305                          // 0xef000710
30306                          DataType dt = Dt_U_size_1_Decode(
30307                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30308                          if (dt.Is(kDataTypeValueInvalid)) {
30309                            UnallocatedT32(instr);
30310                            return;
30311                          }
30312                          unsigned rd = ExtractDRegister(instr, 22, 12);
30313                          unsigned rn = ExtractDRegister(instr, 7, 16);
30314                          unsigned rm = ExtractDRegister(instr, 5, 0);
30315                          // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1
30316                          vaba(CurrentCond(),
30317                               dt,
30318                               DRegister(rd),
30319                               DRegister(rn),
30320                               DRegister(rm));
30321                          break;
30322                        }
30323                        case 0x00000800: {
30324                          // 0xef000810
30325                          switch (instr & 0x10000000) {
30326                            case 0x00000000: {
30327                              // 0xef000810
30328                              DataType dt =
30329                                  Dt_size_7_Decode((instr >> 20) & 0x3);
30330                              if (dt.Is(kDataTypeValueInvalid)) {
30331                                UnallocatedT32(instr);
30332                                return;
30333                              }
30334                              unsigned rd = ExtractDRegister(instr, 22, 12);
30335                              unsigned rn = ExtractDRegister(instr, 7, 16);
30336                              unsigned rm = ExtractDRegister(instr, 5, 0);
30337                              // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30338                              vtst(CurrentCond(),
30339                                   dt,
30340                                   DRegister(rd),
30341                                   DRegister(rn),
30342                                   DRegister(rm));
30343                              break;
30344                            }
30345                            case 0x10000000: {
30346                              // 0xff000810
30347                              DataType dt =
30348                                  Dt_size_4_Decode((instr >> 20) & 0x3);
30349                              if (dt.Is(kDataTypeValueInvalid)) {
30350                                UnallocatedT32(instr);
30351                                return;
30352                              }
30353                              unsigned rd = ExtractDRegister(instr, 22, 12);
30354                              unsigned rn = ExtractDRegister(instr, 7, 16);
30355                              unsigned rm = ExtractDRegister(instr, 5, 0);
30356                              // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30357                              vceq(CurrentCond(),
30358                                   dt,
30359                                   DRegister(rd),
30360                                   DRegister(rn),
30361                                   DRegister(rm));
30362                              break;
30363                            }
30364                          }
30365                          break;
30366                        }
30367                        case 0x00000900: {
30368                          // 0xef000910
30369                          DataType dt = Dt_op_size_1_Decode(
30370                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30371                          if (dt.Is(kDataTypeValueInvalid)) {
30372                            UnallocatedT32(instr);
30373                            return;
30374                          }
30375                          unsigned rd = ExtractDRegister(instr, 22, 12);
30376                          unsigned rn = ExtractDRegister(instr, 7, 16);
30377                          unsigned rm = ExtractDRegister(instr, 5, 0);
30378                          // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30379                          vmul(CurrentCond(),
30380                               dt,
30381                               DRegister(rd),
30382                               DRegister(rn),
30383                               DRegister(rm));
30384                          break;
30385                        }
30386                        case 0x00000a00: {
30387                          // 0xef000a10
30388                          DataType dt = Dt_U_size_1_Decode(
30389                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30390                          if (dt.Is(kDataTypeValueInvalid)) {
30391                            UnallocatedT32(instr);
30392                            return;
30393                          }
30394                          unsigned rd = ExtractDRegister(instr, 22, 12);
30395                          unsigned rn = ExtractDRegister(instr, 7, 16);
30396                          unsigned rm = ExtractDRegister(instr, 5, 0);
30397                          // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30398                          vpmin(CurrentCond(),
30399                                dt,
30400                                DRegister(rd),
30401                                DRegister(rn),
30402                                DRegister(rm));
30403                          break;
30404                        }
30405                        case 0x00000b00: {
30406                          // 0xef000b10
30407                          if ((instr & 0x10000000) == 0x00000000) {
30408                            DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
30409                            if (dt.Is(kDataTypeValueInvalid)) {
30410                              UnallocatedT32(instr);
30411                              return;
30412                            }
30413                            unsigned rd = ExtractDRegister(instr, 22, 12);
30414                            unsigned rn = ExtractDRegister(instr, 7, 16);
30415                            unsigned rm = ExtractDRegister(instr, 5, 0);
30416                            // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30417                            vpadd(CurrentCond(),
30418                                  dt,
30419                                  DRegister(rd),
30420                                  DRegister(rn),
30421                                  DRegister(rm));
30422                          } else {
30423                            UnallocatedT32(instr);
30424                          }
30425                          break;
30426                        }
30427                        case 0x00000c00: {
30428                          // 0xef000c10
30429                          switch (instr & 0x10300000) {
30430                            case 0x00000000: {
30431                              // 0xef000c10
30432                              unsigned rd = ExtractDRegister(instr, 22, 12);
30433                              unsigned rn = ExtractDRegister(instr, 7, 16);
30434                              unsigned rm = ExtractDRegister(instr, 5, 0);
30435                              // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30436                              vfma(CurrentCond(),
30437                                   F32,
30438                                   DRegister(rd),
30439                                   DRegister(rn),
30440                                   DRegister(rm));
30441                              break;
30442                            }
30443                            case 0x00200000: {
30444                              // 0xef200c10
30445                              unsigned rd = ExtractDRegister(instr, 22, 12);
30446                              unsigned rn = ExtractDRegister(instr, 7, 16);
30447                              unsigned rm = ExtractDRegister(instr, 5, 0);
30448                              // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30449                              vfms(CurrentCond(),
30450                                   F32,
30451                                   DRegister(rd),
30452                                   DRegister(rn),
30453                                   DRegister(rm));
30454                              break;
30455                            }
30456                            default:
30457                              UnallocatedT32(instr);
30458                              break;
30459                          }
30460                          break;
30461                        }
30462                        case 0x00000d00: {
30463                          // 0xef000d10
30464                          switch (instr & 0x10300000) {
30465                            case 0x00000000: {
30466                              // 0xef000d10
30467                              unsigned rd = ExtractDRegister(instr, 22, 12);
30468                              unsigned rn = ExtractDRegister(instr, 7, 16);
30469                              unsigned rm = ExtractDRegister(instr, 5, 0);
30470                              // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30471                              vmla(CurrentCond(),
30472                                   F32,
30473                                   DRegister(rd),
30474                                   DRegister(rn),
30475                                   DRegister(rm));
30476                              break;
30477                            }
30478                            case 0x00200000: {
30479                              // 0xef200d10
30480                              unsigned rd = ExtractDRegister(instr, 22, 12);
30481                              unsigned rn = ExtractDRegister(instr, 7, 16);
30482                              unsigned rm = ExtractDRegister(instr, 5, 0);
30483                              // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30484                              vmls(CurrentCond(),
30485                                   F32,
30486                                   DRegister(rd),
30487                                   DRegister(rn),
30488                                   DRegister(rm));
30489                              break;
30490                            }
30491                            case 0x10000000: {
30492                              // 0xff000d10
30493                              unsigned rd = ExtractDRegister(instr, 22, 12);
30494                              unsigned rn = ExtractDRegister(instr, 7, 16);
30495                              unsigned rm = ExtractDRegister(instr, 5, 0);
30496                              // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30497                              vmul(CurrentCond(),
30498                                   F32,
30499                                   DRegister(rd),
30500                                   DRegister(rn),
30501                                   DRegister(rm));
30502                              break;
30503                            }
30504                            default:
30505                              UnallocatedT32(instr);
30506                              break;
30507                          }
30508                          break;
30509                        }
30510                        case 0x00000e00: {
30511                          // 0xef000e10
30512                          switch (instr & 0x10300000) {
30513                            case 0x10000000: {
30514                              // 0xff000e10
30515                              unsigned rd = ExtractDRegister(instr, 22, 12);
30516                              unsigned rn = ExtractDRegister(instr, 7, 16);
30517                              unsigned rm = ExtractDRegister(instr, 5, 0);
30518                              // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30519                              vacge(CurrentCond(),
30520                                    F32,
30521                                    DRegister(rd),
30522                                    DRegister(rn),
30523                                    DRegister(rm));
30524                              break;
30525                            }
30526                            case 0x10200000: {
30527                              // 0xff200e10
30528                              unsigned rd = ExtractDRegister(instr, 22, 12);
30529                              unsigned rn = ExtractDRegister(instr, 7, 16);
30530                              unsigned rm = ExtractDRegister(instr, 5, 0);
30531                              // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30532                              vacgt(CurrentCond(),
30533                                    F32,
30534                                    DRegister(rd),
30535                                    DRegister(rn),
30536                                    DRegister(rm));
30537                              break;
30538                            }
30539                            default:
30540                              UnallocatedT32(instr);
30541                              break;
30542                          }
30543                          break;
30544                        }
30545                        case 0x00000f00: {
30546                          // 0xef000f10
30547                          switch (instr & 0x10300000) {
30548                            case 0x00000000: {
30549                              // 0xef000f10
30550                              unsigned rd = ExtractDRegister(instr, 22, 12);
30551                              unsigned rn = ExtractDRegister(instr, 7, 16);
30552                              unsigned rm = ExtractDRegister(instr, 5, 0);
30553                              // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30554                              vrecps(CurrentCond(),
30555                                     F32,
30556                                     DRegister(rd),
30557                                     DRegister(rn),
30558                                     DRegister(rm));
30559                              break;
30560                            }
30561                            case 0x00200000: {
30562                              // 0xef200f10
30563                              unsigned rd = ExtractDRegister(instr, 22, 12);
30564                              unsigned rn = ExtractDRegister(instr, 7, 16);
30565                              unsigned rm = ExtractDRegister(instr, 5, 0);
30566                              // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30567                              vrsqrts(CurrentCond(),
30568                                      F32,
30569                                      DRegister(rd),
30570                                      DRegister(rn),
30571                                      DRegister(rm));
30572                              break;
30573                            }
30574                            case 0x10000000: {
30575                              // 0xff000f10
30576                              unsigned rd = ExtractDRegister(instr, 22, 12);
30577                              unsigned rn = ExtractDRegister(instr, 7, 16);
30578                              unsigned rm = ExtractDRegister(instr, 5, 0);
30579                              // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30580                              vmaxnm(F32,
30581                                     DRegister(rd),
30582                                     DRegister(rn),
30583                                     DRegister(rm));
30584                              break;
30585                            }
30586                            case 0x10200000: {
30587                              // 0xff200f10
30588                              unsigned rd = ExtractDRegister(instr, 22, 12);
30589                              unsigned rn = ExtractDRegister(instr, 7, 16);
30590                              unsigned rm = ExtractDRegister(instr, 5, 0);
30591                              // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30592                              vminnm(F32,
30593                                     DRegister(rd),
30594                                     DRegister(rn),
30595                                     DRegister(rm));
30596                              break;
30597                            }
30598                            default:
30599                              UnallocatedT32(instr);
30600                              break;
30601                          }
30602                          break;
30603                        }
30604                      }
30605                      break;
30606                    }
30607                    case 0x00000040: {
30608                      // 0xef000050
30609                      switch (instr & 0x00000f00) {
30610                        case 0x00000000: {
30611                          // 0xef000050
30612                          DataType dt = Dt_U_size_3_Decode(
30613                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30614                          if (dt.Is(kDataTypeValueInvalid)) {
30615                            UnallocatedT32(instr);
30616                            return;
30617                          }
30618                          if (((instr >> 12) & 1) != 0) {
30619                            UnallocatedT32(instr);
30620                            return;
30621                          }
30622                          unsigned rd = ExtractQRegister(instr, 22, 12);
30623                          if (((instr >> 16) & 1) != 0) {
30624                            UnallocatedT32(instr);
30625                            return;
30626                          }
30627                          unsigned rn = ExtractQRegister(instr, 7, 16);
30628                          if ((instr & 1) != 0) {
30629                            UnallocatedT32(instr);
30630                            return;
30631                          }
30632                          unsigned rm = ExtractQRegister(instr, 5, 0);
30633                          // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30634                          vqadd(CurrentCond(),
30635                                dt,
30636                                QRegister(rd),
30637                                QRegister(rn),
30638                                QRegister(rm));
30639                          break;
30640                        }
30641                        case 0x00000100: {
30642                          // 0xef000150
30643                          switch (instr & 0x10300000) {
30644                            case 0x00000000: {
30645                              // 0xef000150
30646                              if (((instr >> 12) & 1) != 0) {
30647                                UnallocatedT32(instr);
30648                                return;
30649                              }
30650                              unsigned rd = ExtractQRegister(instr, 22, 12);
30651                              if (((instr >> 16) & 1) != 0) {
30652                                UnallocatedT32(instr);
30653                                return;
30654                              }
30655                              unsigned rn = ExtractQRegister(instr, 7, 16);
30656                              if ((instr & 1) != 0) {
30657                                UnallocatedT32(instr);
30658                                return;
30659                              }
30660                              unsigned rm = ExtractQRegister(instr, 5, 0);
30661                              // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30662                              vand(CurrentCond(),
30663                                   kDataTypeValueNone,
30664                                   QRegister(rd),
30665                                   QRegister(rn),
30666                                   QRegister(rm));
30667                              break;
30668                            }
30669                            case 0x00100000: {
30670                              // 0xef100150
30671                              if (((instr >> 12) & 1) != 0) {
30672                                UnallocatedT32(instr);
30673                                return;
30674                              }
30675                              unsigned rd = ExtractQRegister(instr, 22, 12);
30676                              if (((instr >> 16) & 1) != 0) {
30677                                UnallocatedT32(instr);
30678                                return;
30679                              }
30680                              unsigned rn = ExtractQRegister(instr, 7, 16);
30681                              if ((instr & 1) != 0) {
30682                                UnallocatedT32(instr);
30683                                return;
30684                              }
30685                              unsigned rm = ExtractQRegister(instr, 5, 0);
30686                              // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30687                              vbic(CurrentCond(),
30688                                   kDataTypeValueNone,
30689                                   QRegister(rd),
30690                                   QRegister(rn),
30691                                   QRegister(rm));
30692                              break;
30693                            }
30694                            case 0x00200000: {
30695                              // 0xef200150
30696                              if (((instr & 0x00000040) == 0x00000040) &&
30697                                  ((((Uint32((instr >> 7)) & Uint32(0x1))
30698                                     << 4) |
30699                                    (Uint32((instr >> 16)) & Uint32(0xf))) ==
30700                                   (((Uint32((instr >> 5)) & Uint32(0x1))
30701                                     << 4) |
30702                                    (Uint32(instr) & Uint32(0xf))))) {
30703                                if (((instr >> 12) & 1) != 0) {
30704                                  UnallocatedT32(instr);
30705                                  return;
30706                                }
30707                                unsigned rd = ExtractQRegister(instr, 22, 12);
30708                                if (((instr >> 16) & 1) != 0) {
30709                                  UnallocatedT32(instr);
30710                                  return;
30711                                }
30712                                unsigned rm = ExtractQRegister(instr, 7, 16);
30713                                // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1
30714                                vmov(CurrentCond(),
30715                                     kDataTypeValueNone,
30716                                     QRegister(rd),
30717                                     QRegister(rm));
30718                                return;
30719                              }
30720                              if (((instr >> 12) & 1) != 0) {
30721                                UnallocatedT32(instr);
30722                                return;
30723                              }
30724                              unsigned rd = ExtractQRegister(instr, 22, 12);
30725                              if (((instr >> 16) & 1) != 0) {
30726                                UnallocatedT32(instr);
30727                                return;
30728                              }
30729                              unsigned rn = ExtractQRegister(instr, 7, 16);
30730                              if ((instr & 1) != 0) {
30731                                UnallocatedT32(instr);
30732                                return;
30733                              }
30734                              unsigned rm = ExtractQRegister(instr, 5, 0);
30735                              // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30736                              vorr(CurrentCond(),
30737                                   kDataTypeValueNone,
30738                                   QRegister(rd),
30739                                   QRegister(rn),
30740                                   QRegister(rm));
30741                              break;
30742                            }
30743                            case 0x00300000: {
30744                              // 0xef300150
30745                              if (((instr >> 12) & 1) != 0) {
30746                                UnallocatedT32(instr);
30747                                return;
30748                              }
30749                              unsigned rd = ExtractQRegister(instr, 22, 12);
30750                              if (((instr >> 16) & 1) != 0) {
30751                                UnallocatedT32(instr);
30752                                return;
30753                              }
30754                              unsigned rn = ExtractQRegister(instr, 7, 16);
30755                              if ((instr & 1) != 0) {
30756                                UnallocatedT32(instr);
30757                                return;
30758                              }
30759                              unsigned rm = ExtractQRegister(instr, 5, 0);
30760                              // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30761                              vorn(CurrentCond(),
30762                                   kDataTypeValueNone,
30763                                   QRegister(rd),
30764                                   QRegister(rn),
30765                                   QRegister(rm));
30766                              break;
30767                            }
30768                            case 0x10000000: {
30769                              // 0xff000150
30770                              if (((instr >> 12) & 1) != 0) {
30771                                UnallocatedT32(instr);
30772                                return;
30773                              }
30774                              unsigned rd = ExtractQRegister(instr, 22, 12);
30775                              if (((instr >> 16) & 1) != 0) {
30776                                UnallocatedT32(instr);
30777                                return;
30778                              }
30779                              unsigned rn = ExtractQRegister(instr, 7, 16);
30780                              if ((instr & 1) != 0) {
30781                                UnallocatedT32(instr);
30782                                return;
30783                              }
30784                              unsigned rm = ExtractQRegister(instr, 5, 0);
30785                              // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30786                              veor(CurrentCond(),
30787                                   kDataTypeValueNone,
30788                                   QRegister(rd),
30789                                   QRegister(rn),
30790                                   QRegister(rm));
30791                              break;
30792                            }
30793                            case 0x10100000: {
30794                              // 0xff100150
30795                              if (((instr >> 12) & 1) != 0) {
30796                                UnallocatedT32(instr);
30797                                return;
30798                              }
30799                              unsigned rd = ExtractQRegister(instr, 22, 12);
30800                              if (((instr >> 16) & 1) != 0) {
30801                                UnallocatedT32(instr);
30802                                return;
30803                              }
30804                              unsigned rn = ExtractQRegister(instr, 7, 16);
30805                              if ((instr & 1) != 0) {
30806                                UnallocatedT32(instr);
30807                                return;
30808                              }
30809                              unsigned rm = ExtractQRegister(instr, 5, 0);
30810                              // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30811                              vbsl(CurrentCond(),
30812                                   kDataTypeValueNone,
30813                                   QRegister(rd),
30814                                   QRegister(rn),
30815                                   QRegister(rm));
30816                              break;
30817                            }
30818                            case 0x10200000: {
30819                              // 0xff200150
30820                              if (((instr >> 12) & 1) != 0) {
30821                                UnallocatedT32(instr);
30822                                return;
30823                              }
30824                              unsigned rd = ExtractQRegister(instr, 22, 12);
30825                              if (((instr >> 16) & 1) != 0) {
30826                                UnallocatedT32(instr);
30827                                return;
30828                              }
30829                              unsigned rn = ExtractQRegister(instr, 7, 16);
30830                              if ((instr & 1) != 0) {
30831                                UnallocatedT32(instr);
30832                                return;
30833                              }
30834                              unsigned rm = ExtractQRegister(instr, 5, 0);
30835                              // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30836                              vbit(CurrentCond(),
30837                                   kDataTypeValueNone,
30838                                   QRegister(rd),
30839                                   QRegister(rn),
30840                                   QRegister(rm));
30841                              break;
30842                            }
30843                            case 0x10300000: {
30844                              // 0xff300150
30845                              if (((instr >> 12) & 1) != 0) {
30846                                UnallocatedT32(instr);
30847                                return;
30848                              }
30849                              unsigned rd = ExtractQRegister(instr, 22, 12);
30850                              if (((instr >> 16) & 1) != 0) {
30851                                UnallocatedT32(instr);
30852                                return;
30853                              }
30854                              unsigned rn = ExtractQRegister(instr, 7, 16);
30855                              if ((instr & 1) != 0) {
30856                                UnallocatedT32(instr);
30857                                return;
30858                              }
30859                              unsigned rm = ExtractQRegister(instr, 5, 0);
30860                              // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30861                              vbif(CurrentCond(),
30862                                   kDataTypeValueNone,
30863                                   QRegister(rd),
30864                                   QRegister(rn),
30865                                   QRegister(rm));
30866                              break;
30867                            }
30868                          }
30869                          break;
30870                        }
30871                        case 0x00000200: {
30872                          // 0xef000250
30873                          DataType dt = Dt_U_size_3_Decode(
30874                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30875                          if (dt.Is(kDataTypeValueInvalid)) {
30876                            UnallocatedT32(instr);
30877                            return;
30878                          }
30879                          if (((instr >> 12) & 1) != 0) {
30880                            UnallocatedT32(instr);
30881                            return;
30882                          }
30883                          unsigned rd = ExtractQRegister(instr, 22, 12);
30884                          if (((instr >> 16) & 1) != 0) {
30885                            UnallocatedT32(instr);
30886                            return;
30887                          }
30888                          unsigned rn = ExtractQRegister(instr, 7, 16);
30889                          if ((instr & 1) != 0) {
30890                            UnallocatedT32(instr);
30891                            return;
30892                          }
30893                          unsigned rm = ExtractQRegister(instr, 5, 0);
30894                          // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30895                          vqsub(CurrentCond(),
30896                                dt,
30897                                QRegister(rd),
30898                                QRegister(rn),
30899                                QRegister(rm));
30900                          break;
30901                        }
30902                        case 0x00000300: {
30903                          // 0xef000350
30904                          DataType dt = Dt_U_size_1_Decode(
30905                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30906                          if (dt.Is(kDataTypeValueInvalid)) {
30907                            UnallocatedT32(instr);
30908                            return;
30909                          }
30910                          if (((instr >> 12) & 1) != 0) {
30911                            UnallocatedT32(instr);
30912                            return;
30913                          }
30914                          unsigned rd = ExtractQRegister(instr, 22, 12);
30915                          if (((instr >> 16) & 1) != 0) {
30916                            UnallocatedT32(instr);
30917                            return;
30918                          }
30919                          unsigned rn = ExtractQRegister(instr, 7, 16);
30920                          if ((instr & 1) != 0) {
30921                            UnallocatedT32(instr);
30922                            return;
30923                          }
30924                          unsigned rm = ExtractQRegister(instr, 5, 0);
30925                          // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30926                          vcge(CurrentCond(),
30927                               dt,
30928                               QRegister(rd),
30929                               QRegister(rn),
30930                               QRegister(rm));
30931                          break;
30932                        }
30933                        case 0x00000400: {
30934                          // 0xef000450
30935                          DataType dt = Dt_U_size_3_Decode(
30936                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30937                          if (dt.Is(kDataTypeValueInvalid)) {
30938                            UnallocatedT32(instr);
30939                            return;
30940                          }
30941                          if (((instr >> 12) & 1) != 0) {
30942                            UnallocatedT32(instr);
30943                            return;
30944                          }
30945                          unsigned rd = ExtractQRegister(instr, 22, 12);
30946                          if ((instr & 1) != 0) {
30947                            UnallocatedT32(instr);
30948                            return;
30949                          }
30950                          unsigned rm = ExtractQRegister(instr, 5, 0);
30951                          if (((instr >> 16) & 1) != 0) {
30952                            UnallocatedT32(instr);
30953                            return;
30954                          }
30955                          unsigned rn = ExtractQRegister(instr, 7, 16);
30956                          // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
30957                          vqshl(CurrentCond(),
30958                                dt,
30959                                QRegister(rd),
30960                                QRegister(rm),
30961                                QRegister(rn));
30962                          break;
30963                        }
30964                        case 0x00000500: {
30965                          // 0xef000550
30966                          DataType dt = Dt_U_size_3_Decode(
30967                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30968                          if (dt.Is(kDataTypeValueInvalid)) {
30969                            UnallocatedT32(instr);
30970                            return;
30971                          }
30972                          if (((instr >> 12) & 1) != 0) {
30973                            UnallocatedT32(instr);
30974                            return;
30975                          }
30976                          unsigned rd = ExtractQRegister(instr, 22, 12);
30977                          if ((instr & 1) != 0) {
30978                            UnallocatedT32(instr);
30979                            return;
30980                          }
30981                          unsigned rm = ExtractQRegister(instr, 5, 0);
30982                          if (((instr >> 16) & 1) != 0) {
30983                            UnallocatedT32(instr);
30984                            return;
30985                          }
30986                          unsigned rn = ExtractQRegister(instr, 7, 16);
30987                          // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
30988                          vqrshl(CurrentCond(),
30989                                 dt,
30990                                 QRegister(rd),
30991                                 QRegister(rm),
30992                                 QRegister(rn));
30993                          break;
30994                        }
30995                        case 0x00000600: {
30996                          // 0xef000650
30997                          DataType dt = Dt_U_size_1_Decode(
30998                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30999                          if (dt.Is(kDataTypeValueInvalid)) {
31000                            UnallocatedT32(instr);
31001                            return;
31002                          }
31003                          if (((instr >> 12) & 1) != 0) {
31004                            UnallocatedT32(instr);
31005                            return;
31006                          }
31007                          unsigned rd = ExtractQRegister(instr, 22, 12);
31008                          if (((instr >> 16) & 1) != 0) {
31009                            UnallocatedT32(instr);
31010                            return;
31011                          }
31012                          unsigned rn = ExtractQRegister(instr, 7, 16);
31013                          if ((instr & 1) != 0) {
31014                            UnallocatedT32(instr);
31015                            return;
31016                          }
31017                          unsigned rm = ExtractQRegister(instr, 5, 0);
31018                          // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
31019                          vmin(CurrentCond(),
31020                               dt,
31021                               QRegister(rd),
31022                               QRegister(rn),
31023                               QRegister(rm));
31024                          break;
31025                        }
31026                        case 0x00000700: {
31027                          // 0xef000750
31028                          DataType dt = Dt_U_size_1_Decode(
31029                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
31030                          if (dt.Is(kDataTypeValueInvalid)) {
31031                            UnallocatedT32(instr);
31032                            return;
31033                          }
31034                          if (((instr >> 12) & 1) != 0) {
31035                            UnallocatedT32(instr);
31036                            return;
31037                          }
31038                          unsigned rd = ExtractQRegister(instr, 22, 12);
31039                          if (((instr >> 16) & 1) != 0) {
31040                            UnallocatedT32(instr);
31041                            return;
31042                          }
31043                          unsigned rn = ExtractQRegister(instr, 7, 16);
31044                          if ((instr & 1) != 0) {
31045                            UnallocatedT32(instr);
31046                            return;
31047                          }
31048                          unsigned rm = ExtractQRegister(instr, 5, 0);
31049                          // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1
31050                          vaba(CurrentCond(),
31051                               dt,
31052                               QRegister(rd),
31053                               QRegister(rn),
31054                               QRegister(rm));
31055                          break;
31056                        }
31057                        case 0x00000800: {
31058                          // 0xef000850
31059                          switch (instr & 0x10000000) {
31060                            case 0x00000000: {
31061                              // 0xef000850
31062                              DataType dt =
31063                                  Dt_size_7_Decode((instr >> 20) & 0x3);
31064                              if (dt.Is(kDataTypeValueInvalid)) {
31065                                UnallocatedT32(instr);
31066                                return;
31067                              }
31068                              if (((instr >> 12) & 1) != 0) {
31069                                UnallocatedT32(instr);
31070                                return;
31071                              }
31072                              unsigned rd = ExtractQRegister(instr, 22, 12);
31073                              if (((instr >> 16) & 1) != 0) {
31074                                UnallocatedT32(instr);
31075                                return;
31076                              }
31077                              unsigned rn = ExtractQRegister(instr, 7, 16);
31078                              if ((instr & 1) != 0) {
31079                                UnallocatedT32(instr);
31080                                return;
31081                              }
31082                              unsigned rm = ExtractQRegister(instr, 5, 0);
31083                              // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
31084                              vtst(CurrentCond(),
31085                                   dt,
31086                                   QRegister(rd),
31087                                   QRegister(rn),
31088                                   QRegister(rm));
31089                              break;
31090                            }
31091                            case 0x10000000: {
31092                              // 0xff000850
31093                              DataType dt =
31094                                  Dt_size_4_Decode((instr >> 20) & 0x3);
31095                              if (dt.Is(kDataTypeValueInvalid)) {
31096                                UnallocatedT32(instr);
31097                                return;
31098                              }
31099                              if (((instr >> 12) & 1) != 0) {
31100                                UnallocatedT32(instr);
31101                                return;
31102                              }
31103                              unsigned rd = ExtractQRegister(instr, 22, 12);
31104                              if (((instr >> 16) & 1) != 0) {
31105                                UnallocatedT32(instr);
31106                                return;
31107                              }
31108                              unsigned rn = ExtractQRegister(instr, 7, 16);
31109                              if ((instr & 1) != 0) {
31110                                UnallocatedT32(instr);
31111                                return;
31112                              }
31113                              unsigned rm = ExtractQRegister(instr, 5, 0);
31114                              // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
31115                              vceq(CurrentCond(),
31116                                   dt,
31117                                   QRegister(rd),
31118                                   QRegister(rn),
31119                                   QRegister(rm));
31120                              break;
31121                            }
31122                          }
31123                          break;
31124                        }
31125                        case 0x00000900: {
31126                          // 0xef000950
31127                          DataType dt = Dt_op_size_1_Decode(
31128                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
31129                          if (dt.Is(kDataTypeValueInvalid)) {
31130                            UnallocatedT32(instr);
31131                            return;
31132                          }
31133                          if (((instr >> 12) & 1) != 0) {
31134                            UnallocatedT32(instr);
31135                            return;
31136                          }
31137                          unsigned rd = ExtractQRegister(instr, 22, 12);
31138                          if (((instr >> 16) & 1) != 0) {
31139                            UnallocatedT32(instr);
31140                            return;
31141                          }
31142                          unsigned rn = ExtractQRegister(instr, 7, 16);
31143                          if ((instr & 1) != 0) {
31144                            UnallocatedT32(instr);
31145                            return;
31146                          }
31147                          unsigned rm = ExtractQRegister(instr, 5, 0);
31148                          // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
31149                          vmul(CurrentCond(),
31150                               dt,
31151                               QRegister(rd),
31152                               QRegister(rn),
31153                               QRegister(rm));
31154                          break;
31155                        }
31156                        case 0x00000c00: {
31157                          // 0xef000c50
31158                          switch (instr & 0x10300000) {
31159                            case 0x00000000: {
31160                              // 0xef000c50
31161                              if (((instr >> 12) & 1) != 0) {
31162                                UnallocatedT32(instr);
31163                                return;
31164                              }
31165                              unsigned rd = ExtractQRegister(instr, 22, 12);
31166                              if (((instr >> 16) & 1) != 0) {
31167                                UnallocatedT32(instr);
31168                                return;
31169                              }
31170                              unsigned rn = ExtractQRegister(instr, 7, 16);
31171                              if ((instr & 1) != 0) {
31172                                UnallocatedT32(instr);
31173                                return;
31174                              }
31175                              unsigned rm = ExtractQRegister(instr, 5, 0);
31176                              // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31177                              vfma(CurrentCond(),
31178                                   F32,
31179                                   QRegister(rd),
31180                                   QRegister(rn),
31181                                   QRegister(rm));
31182                              break;
31183                            }
31184                            case 0x00200000: {
31185                              // 0xef200c50
31186                              if (((instr >> 12) & 1) != 0) {
31187                                UnallocatedT32(instr);
31188                                return;
31189                              }
31190                              unsigned rd = ExtractQRegister(instr, 22, 12);
31191                              if (((instr >> 16) & 1) != 0) {
31192                                UnallocatedT32(instr);
31193                                return;
31194                              }
31195                              unsigned rn = ExtractQRegister(instr, 7, 16);
31196                              if ((instr & 1) != 0) {
31197                                UnallocatedT32(instr);
31198                                return;
31199                              }
31200                              unsigned rm = ExtractQRegister(instr, 5, 0);
31201                              // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31202                              vfms(CurrentCond(),
31203                                   F32,
31204                                   QRegister(rd),
31205                                   QRegister(rn),
31206                                   QRegister(rm));
31207                              break;
31208                            }
31209                            default:
31210                              UnallocatedT32(instr);
31211                              break;
31212                          }
31213                          break;
31214                        }
31215                        case 0x00000d00: {
31216                          // 0xef000d50
31217                          switch (instr & 0x10300000) {
31218                            case 0x00000000: {
31219                              // 0xef000d50
31220                              if (((instr >> 12) & 1) != 0) {
31221                                UnallocatedT32(instr);
31222                                return;
31223                              }
31224                              unsigned rd = ExtractQRegister(instr, 22, 12);
31225                              if (((instr >> 16) & 1) != 0) {
31226                                UnallocatedT32(instr);
31227                                return;
31228                              }
31229                              unsigned rn = ExtractQRegister(instr, 7, 16);
31230                              if ((instr & 1) != 0) {
31231                                UnallocatedT32(instr);
31232                                return;
31233                              }
31234                              unsigned rm = ExtractQRegister(instr, 5, 0);
31235                              // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31236                              vmla(CurrentCond(),
31237                                   F32,
31238                                   QRegister(rd),
31239                                   QRegister(rn),
31240                                   QRegister(rm));
31241                              break;
31242                            }
31243                            case 0x00200000: {
31244                              // 0xef200d50
31245                              if (((instr >> 12) & 1) != 0) {
31246                                UnallocatedT32(instr);
31247                                return;
31248                              }
31249                              unsigned rd = ExtractQRegister(instr, 22, 12);
31250                              if (((instr >> 16) & 1) != 0) {
31251                                UnallocatedT32(instr);
31252                                return;
31253                              }
31254                              unsigned rn = ExtractQRegister(instr, 7, 16);
31255                              if ((instr & 1) != 0) {
31256                                UnallocatedT32(instr);
31257                                return;
31258                              }
31259                              unsigned rm = ExtractQRegister(instr, 5, 0);
31260                              // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31261                              vmls(CurrentCond(),
31262                                   F32,
31263                                   QRegister(rd),
31264                                   QRegister(rn),
31265                                   QRegister(rm));
31266                              break;
31267                            }
31268                            case 0x10000000: {
31269                              // 0xff000d50
31270                              if (((instr >> 12) & 1) != 0) {
31271                                UnallocatedT32(instr);
31272                                return;
31273                              }
31274                              unsigned rd = ExtractQRegister(instr, 22, 12);
31275                              if (((instr >> 16) & 1) != 0) {
31276                                UnallocatedT32(instr);
31277                                return;
31278                              }
31279                              unsigned rn = ExtractQRegister(instr, 7, 16);
31280                              if ((instr & 1) != 0) {
31281                                UnallocatedT32(instr);
31282                                return;
31283                              }
31284                              unsigned rm = ExtractQRegister(instr, 5, 0);
31285                              // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31286                              vmul(CurrentCond(),
31287                                   F32,
31288                                   QRegister(rd),
31289                                   QRegister(rn),
31290                                   QRegister(rm));
31291                              break;
31292                            }
31293                            default:
31294                              UnallocatedT32(instr);
31295                              break;
31296                          }
31297                          break;
31298                        }
31299                        case 0x00000e00: {
31300                          // 0xef000e50
31301                          switch (instr & 0x10300000) {
31302                            case 0x10000000: {
31303                              // 0xff000e50
31304                              if (((instr >> 12) & 1) != 0) {
31305                                UnallocatedT32(instr);
31306                                return;
31307                              }
31308                              unsigned rd = ExtractQRegister(instr, 22, 12);
31309                              if (((instr >> 16) & 1) != 0) {
31310                                UnallocatedT32(instr);
31311                                return;
31312                              }
31313                              unsigned rn = ExtractQRegister(instr, 7, 16);
31314                              if ((instr & 1) != 0) {
31315                                UnallocatedT32(instr);
31316                                return;
31317                              }
31318                              unsigned rm = ExtractQRegister(instr, 5, 0);
31319                              // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31320                              vacge(CurrentCond(),
31321                                    F32,
31322                                    QRegister(rd),
31323                                    QRegister(rn),
31324                                    QRegister(rm));
31325                              break;
31326                            }
31327                            case 0x10200000: {
31328                              // 0xff200e50
31329                              if (((instr >> 12) & 1) != 0) {
31330                                UnallocatedT32(instr);
31331                                return;
31332                              }
31333                              unsigned rd = ExtractQRegister(instr, 22, 12);
31334                              if (((instr >> 16) & 1) != 0) {
31335                                UnallocatedT32(instr);
31336                                return;
31337                              }
31338                              unsigned rn = ExtractQRegister(instr, 7, 16);
31339                              if ((instr & 1) != 0) {
31340                                UnallocatedT32(instr);
31341                                return;
31342                              }
31343                              unsigned rm = ExtractQRegister(instr, 5, 0);
31344                              // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31345                              vacgt(CurrentCond(),
31346                                    F32,
31347                                    QRegister(rd),
31348                                    QRegister(rn),
31349                                    QRegister(rm));
31350                              break;
31351                            }
31352                            default:
31353                              UnallocatedT32(instr);
31354                              break;
31355                          }
31356                          break;
31357                        }
31358                        case 0x00000f00: {
31359                          // 0xef000f50
31360                          switch (instr & 0x10300000) {
31361                            case 0x00000000: {
31362                              // 0xef000f50
31363                              if (((instr >> 12) & 1) != 0) {
31364                                UnallocatedT32(instr);
31365                                return;
31366                              }
31367                              unsigned rd = ExtractQRegister(instr, 22, 12);
31368                              if (((instr >> 16) & 1) != 0) {
31369                                UnallocatedT32(instr);
31370                                return;
31371                              }
31372                              unsigned rn = ExtractQRegister(instr, 7, 16);
31373                              if ((instr & 1) != 0) {
31374                                UnallocatedT32(instr);
31375                                return;
31376                              }
31377                              unsigned rm = ExtractQRegister(instr, 5, 0);
31378                              // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31379                              vrecps(CurrentCond(),
31380                                     F32,
31381                                     QRegister(rd),
31382                                     QRegister(rn),
31383                                     QRegister(rm));
31384                              break;
31385                            }
31386                            case 0x00200000: {
31387                              // 0xef200f50
31388                              if (((instr >> 12) & 1) != 0) {
31389                                UnallocatedT32(instr);
31390                                return;
31391                              }
31392                              unsigned rd = ExtractQRegister(instr, 22, 12);
31393                              if (((instr >> 16) & 1) != 0) {
31394                                UnallocatedT32(instr);
31395                                return;
31396                              }
31397                              unsigned rn = ExtractQRegister(instr, 7, 16);
31398                              if ((instr & 1) != 0) {
31399                                UnallocatedT32(instr);
31400                                return;
31401                              }
31402                              unsigned rm = ExtractQRegister(instr, 5, 0);
31403                              // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31404                              vrsqrts(CurrentCond(),
31405                                      F32,
31406                                      QRegister(rd),
31407                                      QRegister(rn),
31408                                      QRegister(rm));
31409                              break;
31410                            }
31411                            case 0x10000000: {
31412                              // 0xff000f50
31413                              if (((instr >> 12) & 1) != 0) {
31414                                UnallocatedT32(instr);
31415                                return;
31416                              }
31417                              unsigned rd = ExtractQRegister(instr, 22, 12);
31418                              if (((instr >> 16) & 1) != 0) {
31419                                UnallocatedT32(instr);
31420                                return;
31421                              }
31422                              unsigned rn = ExtractQRegister(instr, 7, 16);
31423                              if ((instr & 1) != 0) {
31424                                UnallocatedT32(instr);
31425                                return;
31426                              }
31427                              unsigned rm = ExtractQRegister(instr, 5, 0);
31428                              // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31429                              vmaxnm(F32,
31430                                     QRegister(rd),
31431                                     QRegister(rn),
31432                                     QRegister(rm));
31433                              break;
31434                            }
31435                            case 0x10200000: {
31436                              // 0xff200f50
31437                              if (((instr >> 12) & 1) != 0) {
31438                                UnallocatedT32(instr);
31439                                return;
31440                              }
31441                              unsigned rd = ExtractQRegister(instr, 22, 12);
31442                              if (((instr >> 16) & 1) != 0) {
31443                                UnallocatedT32(instr);
31444                                return;
31445                              }
31446                              unsigned rn = ExtractQRegister(instr, 7, 16);
31447                              if ((instr & 1) != 0) {
31448                                UnallocatedT32(instr);
31449                                return;
31450                              }
31451                              unsigned rm = ExtractQRegister(instr, 5, 0);
31452                              // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31453                              vminnm(F32,
31454                                     QRegister(rd),
31455                                     QRegister(rn),
31456                                     QRegister(rm));
31457                              break;
31458                            }
31459                            default:
31460                              UnallocatedT32(instr);
31461                              break;
31462                          }
31463                          break;
31464                        }
31465                        default:
31466                          UnallocatedT32(instr);
31467                          break;
31468                      }
31469                      break;
31470                    }
31471                    case 0x00800000: {
31472                      // 0xef800010
31473                      switch (instr & 0x00000c00) {
31474                        case 0x00000000: {
31475                          // 0xef800010
31476                          switch (instr & 0x00380080) {
31477                            case 0x00000000: {
31478                              // 0xef800010
31479                              switch (instr & 0x00000100) {
31480                                case 0x00000000: {
31481                                  // 0xef800010
31482                                  switch (instr & 0x00000200) {
31483                                    default: {
31484                                      switch (instr & 0x00000020) {
31485                                        case 0x00000020: {
31486                                          // 0xef800030
31487                                          if (((instr & 0xd00) == 0x100) ||
31488                                              ((instr & 0xd00) == 0x500) ||
31489                                              ((instr & 0xd00) == 0x900) ||
31490                                              ((instr & 0xe00) == 0xe00)) {
31491                                            UnallocatedT32(instr);
31492                                            return;
31493                                          }
31494                                          unsigned cmode = (instr >> 8) & 0xf;
31495                                          DataType dt =
31496                                              ImmediateVmvn::DecodeDt(cmode);
31497                                          if (dt.Is(kDataTypeValueInvalid)) {
31498                                            UnallocatedT32(instr);
31499                                            return;
31500                                          }
31501                                          unsigned rd =
31502                                              ExtractDRegister(instr, 22, 12);
31503                                          DOperand imm =
31504                                              ImmediateVmvn::DecodeImmediate(
31505                                                  cmode,
31506                                                  (instr & 0xf) |
31507                                                      ((instr >> 12) & 0x70) |
31508                                                      ((instr >> 21) & 0x80));
31509                                          // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31510                                          vmvn(CurrentCond(),
31511                                               dt,
31512                                               DRegister(rd),
31513                                               imm);
31514                                          break;
31515                                        }
31516                                        default: {
31517                                          if (((instr & 0x920) == 0x100) ||
31518                                              ((instr & 0x520) == 0x100) ||
31519                                              ((instr & 0x820) == 0x20) ||
31520                                              ((instr & 0x420) == 0x20) ||
31521                                              ((instr & 0x220) == 0x20) ||
31522                                              ((instr & 0x120) == 0x120)) {
31523                                            UnallocatedT32(instr);
31524                                            return;
31525                                          }
31526                                          unsigned cmode =
31527                                              ((instr >> 8) & 0xf) |
31528                                              ((instr >> 1) & 0x10);
31529                                          DataType dt =
31530                                              ImmediateVmov::DecodeDt(cmode);
31531                                          if (dt.Is(kDataTypeValueInvalid)) {
31532                                            UnallocatedT32(instr);
31533                                            return;
31534                                          }
31535                                          unsigned rd =
31536                                              ExtractDRegister(instr, 22, 12);
31537                                          DOperand imm =
31538                                              ImmediateVmov::DecodeImmediate(
31539                                                  cmode,
31540                                                  (instr & 0xf) |
31541                                                      ((instr >> 12) & 0x70) |
31542                                                      ((instr >> 21) & 0x80));
31543                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31544                                          vmov(CurrentCond(),
31545                                               dt,
31546                                               DRegister(rd),
31547                                               imm);
31548                                          break;
31549                                        }
31550                                      }
31551                                      break;
31552                                    }
31553                                  }
31554                                  break;
31555                                }
31556                                case 0x00000100: {
31557                                  // 0xef800110
31558                                  switch (instr & 0x00000020) {
31559                                    case 0x00000000: {
31560                                      // 0xef800110
31561                                      if (((instr & 0x100) == 0x0) ||
31562                                          ((instr & 0xc00) == 0xc00)) {
31563                                        UnallocatedT32(instr);
31564                                        return;
31565                                      }
31566                                      unsigned cmode = (instr >> 8) & 0xf;
31567                                      DataType dt =
31568                                          ImmediateVorr::DecodeDt(cmode);
31569                                      if (dt.Is(kDataTypeValueInvalid)) {
31570                                        UnallocatedT32(instr);
31571                                        return;
31572                                      }
31573                                      unsigned rd =
31574                                          ExtractDRegister(instr, 22, 12);
31575                                      DOperand imm =
31576                                          ImmediateVorr::DecodeImmediate(
31577                                              cmode,
31578                                              (instr & 0xf) |
31579                                                  ((instr >> 12) & 0x70) |
31580                                                  ((instr >> 21) & 0x80));
31581                                      // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31582                                      vorr(CurrentCond(),
31583                                           dt,
31584                                           DRegister(rd),
31585                                           DRegister(rd),
31586                                           imm);
31587                                      break;
31588                                    }
31589                                    case 0x00000020: {
31590                                      // 0xef800130
31591                                      if (((instr & 0x100) == 0x0) ||
31592                                          ((instr & 0xc00) == 0xc00)) {
31593                                        UnallocatedT32(instr);
31594                                        return;
31595                                      }
31596                                      unsigned cmode = (instr >> 8) & 0xf;
31597                                      DataType dt =
31598                                          ImmediateVbic::DecodeDt(cmode);
31599                                      if (dt.Is(kDataTypeValueInvalid)) {
31600                                        UnallocatedT32(instr);
31601                                        return;
31602                                      }
31603                                      unsigned rd =
31604                                          ExtractDRegister(instr, 22, 12);
31605                                      DOperand imm =
31606                                          ImmediateVbic::DecodeImmediate(
31607                                              cmode,
31608                                              (instr & 0xf) |
31609                                                  ((instr >> 12) & 0x70) |
31610                                                  ((instr >> 21) & 0x80));
31611                                      // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31612                                      vbic(CurrentCond(),
31613                                           dt,
31614                                           DRegister(rd),
31615                                           DRegister(rd),
31616                                           imm);
31617                                      break;
31618                                    }
31619                                  }
31620                                  break;
31621                                }
31622                              }
31623                              break;
31624                            }
31625                            default: {
31626                              switch (instr & 0x00000300) {
31627                                case 0x00000000: {
31628                                  // 0xef800010
31629                                  if (((instr & 0x380080) == 0x0)) {
31630                                    UnallocatedT32(instr);
31631                                    return;
31632                                  }
31633                                  DataType dt =
31634                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31635                                                             ((instr >> 4) &
31636                                                              0x8),
31637                                                         (instr >> 28) & 0x1);
31638                                  if (dt.Is(kDataTypeValueInvalid)) {
31639                                    UnallocatedT32(instr);
31640                                    return;
31641                                  }
31642                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31643                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31644                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31645                                  uint32_t imm =
31646                                      (dt.IsSize(64) ? 64
31647                                                     : (dt.GetSize() * 2)) -
31648                                      imm6;
31649                                  // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31650                                  vshr(CurrentCond(),
31651                                       dt,
31652                                       DRegister(rd),
31653                                       DRegister(rm),
31654                                       imm);
31655                                  break;
31656                                }
31657                                case 0x00000100: {
31658                                  // 0xef800110
31659                                  if (((instr & 0x380080) == 0x0)) {
31660                                    UnallocatedT32(instr);
31661                                    return;
31662                                  }
31663                                  DataType dt =
31664                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31665                                                             ((instr >> 4) &
31666                                                              0x8),
31667                                                         (instr >> 28) & 0x1);
31668                                  if (dt.Is(kDataTypeValueInvalid)) {
31669                                    UnallocatedT32(instr);
31670                                    return;
31671                                  }
31672                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31673                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31674                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31675                                  uint32_t imm =
31676                                      (dt.IsSize(64) ? 64
31677                                                     : (dt.GetSize() * 2)) -
31678                                      imm6;
31679                                  // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31680                                  vsra(CurrentCond(),
31681                                       dt,
31682                                       DRegister(rd),
31683                                       DRegister(rm),
31684                                       imm);
31685                                  break;
31686                                }
31687                                case 0x00000200: {
31688                                  // 0xef800210
31689                                  if (((instr & 0x380080) == 0x0)) {
31690                                    UnallocatedT32(instr);
31691                                    return;
31692                                  }
31693                                  DataType dt =
31694                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31695                                                             ((instr >> 4) &
31696                                                              0x8),
31697                                                         (instr >> 28) & 0x1);
31698                                  if (dt.Is(kDataTypeValueInvalid)) {
31699                                    UnallocatedT32(instr);
31700                                    return;
31701                                  }
31702                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31703                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31704                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31705                                  uint32_t imm =
31706                                      (dt.IsSize(64) ? 64
31707                                                     : (dt.GetSize() * 2)) -
31708                                      imm6;
31709                                  // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31710                                  vrshr(CurrentCond(),
31711                                        dt,
31712                                        DRegister(rd),
31713                                        DRegister(rm),
31714                                        imm);
31715                                  break;
31716                                }
31717                                case 0x00000300: {
31718                                  // 0xef800310
31719                                  if (((instr & 0x380080) == 0x0)) {
31720                                    UnallocatedT32(instr);
31721                                    return;
31722                                  }
31723                                  DataType dt =
31724                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31725                                                             ((instr >> 4) &
31726                                                              0x8),
31727                                                         (instr >> 28) & 0x1);
31728                                  if (dt.Is(kDataTypeValueInvalid)) {
31729                                    UnallocatedT32(instr);
31730                                    return;
31731                                  }
31732                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31733                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31734                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31735                                  uint32_t imm =
31736                                      (dt.IsSize(64) ? 64
31737                                                     : (dt.GetSize() * 2)) -
31738                                      imm6;
31739                                  // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31740                                  vrsra(CurrentCond(),
31741                                        dt,
31742                                        DRegister(rd),
31743                                        DRegister(rm),
31744                                        imm);
31745                                  break;
31746                                }
31747                              }
31748                              break;
31749                            }
31750                          }
31751                          break;
31752                        }
31753                        case 0x00000400: {
31754                          // 0xef800410
31755                          switch (instr & 0x00380080) {
31756                            case 0x00000000: {
31757                              // 0xef800410
31758                              switch (instr & 0x00000100) {
31759                                case 0x00000000: {
31760                                  // 0xef800410
31761                                  switch (instr & 0x00000200) {
31762                                    default: {
31763                                      switch (instr & 0x00000020) {
31764                                        case 0x00000020: {
31765                                          // 0xef800430
31766                                          if (((instr & 0xd00) == 0x100) ||
31767                                              ((instr & 0xd00) == 0x500) ||
31768                                              ((instr & 0xd00) == 0x900) ||
31769                                              ((instr & 0xe00) == 0xe00)) {
31770                                            UnallocatedT32(instr);
31771                                            return;
31772                                          }
31773                                          unsigned cmode = (instr >> 8) & 0xf;
31774                                          DataType dt =
31775                                              ImmediateVmvn::DecodeDt(cmode);
31776                                          if (dt.Is(kDataTypeValueInvalid)) {
31777                                            UnallocatedT32(instr);
31778                                            return;
31779                                          }
31780                                          unsigned rd =
31781                                              ExtractDRegister(instr, 22, 12);
31782                                          DOperand imm =
31783                                              ImmediateVmvn::DecodeImmediate(
31784                                                  cmode,
31785                                                  (instr & 0xf) |
31786                                                      ((instr >> 12) & 0x70) |
31787                                                      ((instr >> 21) & 0x80));
31788                                          // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31789                                          vmvn(CurrentCond(),
31790                                               dt,
31791                                               DRegister(rd),
31792                                               imm);
31793                                          break;
31794                                        }
31795                                        default: {
31796                                          if (((instr & 0x920) == 0x100) ||
31797                                              ((instr & 0x520) == 0x100) ||
31798                                              ((instr & 0x820) == 0x20) ||
31799                                              ((instr & 0x420) == 0x20) ||
31800                                              ((instr & 0x220) == 0x20) ||
31801                                              ((instr & 0x120) == 0x120)) {
31802                                            UnallocatedT32(instr);
31803                                            return;
31804                                          }
31805                                          unsigned cmode =
31806                                              ((instr >> 8) & 0xf) |
31807                                              ((instr >> 1) & 0x10);
31808                                          DataType dt =
31809                                              ImmediateVmov::DecodeDt(cmode);
31810                                          if (dt.Is(kDataTypeValueInvalid)) {
31811                                            UnallocatedT32(instr);
31812                                            return;
31813                                          }
31814                                          unsigned rd =
31815                                              ExtractDRegister(instr, 22, 12);
31816                                          DOperand imm =
31817                                              ImmediateVmov::DecodeImmediate(
31818                                                  cmode,
31819                                                  (instr & 0xf) |
31820                                                      ((instr >> 12) & 0x70) |
31821                                                      ((instr >> 21) & 0x80));
31822                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31823                                          vmov(CurrentCond(),
31824                                               dt,
31825                                               DRegister(rd),
31826                                               imm);
31827                                          break;
31828                                        }
31829                                      }
31830                                      break;
31831                                    }
31832                                  }
31833                                  break;
31834                                }
31835                                case 0x00000100: {
31836                                  // 0xef800510
31837                                  switch (instr & 0x00000020) {
31838                                    case 0x00000000: {
31839                                      // 0xef800510
31840                                      if (((instr & 0x100) == 0x0) ||
31841                                          ((instr & 0xc00) == 0xc00)) {
31842                                        UnallocatedT32(instr);
31843                                        return;
31844                                      }
31845                                      unsigned cmode = (instr >> 8) & 0xf;
31846                                      DataType dt =
31847                                          ImmediateVorr::DecodeDt(cmode);
31848                                      if (dt.Is(kDataTypeValueInvalid)) {
31849                                        UnallocatedT32(instr);
31850                                        return;
31851                                      }
31852                                      unsigned rd =
31853                                          ExtractDRegister(instr, 22, 12);
31854                                      DOperand imm =
31855                                          ImmediateVorr::DecodeImmediate(
31856                                              cmode,
31857                                              (instr & 0xf) |
31858                                                  ((instr >> 12) & 0x70) |
31859                                                  ((instr >> 21) & 0x80));
31860                                      // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31861                                      vorr(CurrentCond(),
31862                                           dt,
31863                                           DRegister(rd),
31864                                           DRegister(rd),
31865                                           imm);
31866                                      break;
31867                                    }
31868                                    case 0x00000020: {
31869                                      // 0xef800530
31870                                      if (((instr & 0x100) == 0x0) ||
31871                                          ((instr & 0xc00) == 0xc00)) {
31872                                        UnallocatedT32(instr);
31873                                        return;
31874                                      }
31875                                      unsigned cmode = (instr >> 8) & 0xf;
31876                                      DataType dt =
31877                                          ImmediateVbic::DecodeDt(cmode);
31878                                      if (dt.Is(kDataTypeValueInvalid)) {
31879                                        UnallocatedT32(instr);
31880                                        return;
31881                                      }
31882                                      unsigned rd =
31883                                          ExtractDRegister(instr, 22, 12);
31884                                      DOperand imm =
31885                                          ImmediateVbic::DecodeImmediate(
31886                                              cmode,
31887                                              (instr & 0xf) |
31888                                                  ((instr >> 12) & 0x70) |
31889                                                  ((instr >> 21) & 0x80));
31890                                      // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31891                                      vbic(CurrentCond(),
31892                                           dt,
31893                                           DRegister(rd),
31894                                           DRegister(rd),
31895                                           imm);
31896                                      break;
31897                                    }
31898                                  }
31899                                  break;
31900                                }
31901                              }
31902                              break;
31903                            }
31904                            default: {
31905                              switch (instr & 0x00000300) {
31906                                case 0x00000000: {
31907                                  // 0xef800410
31908                                  if ((instr & 0x10000000) == 0x10000000) {
31909                                    if (((instr & 0x380080) == 0x0)) {
31910                                      UnallocatedT32(instr);
31911                                      return;
31912                                    }
31913                                    DataType dt = Dt_L_imm6_4_Decode(
31914                                        ((instr >> 19) & 0x7) |
31915                                        ((instr >> 4) & 0x8));
31916                                    if (dt.Is(kDataTypeValueInvalid)) {
31917                                      UnallocatedT32(instr);
31918                                      return;
31919                                    }
31920                                    unsigned rd =
31921                                        ExtractDRegister(instr, 22, 12);
31922                                    unsigned rm = ExtractDRegister(instr, 5, 0);
31923                                    uint32_t imm6 = (instr >> 16) & 0x3f;
31924                                    uint32_t imm =
31925                                        (dt.IsSize(64) ? 64
31926                                                       : (dt.GetSize() * 2)) -
31927                                        imm6;
31928                                    // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31929                                    vsri(CurrentCond(),
31930                                         dt,
31931                                         DRegister(rd),
31932                                         DRegister(rm),
31933                                         imm);
31934                                  } else {
31935                                    UnallocatedT32(instr);
31936                                  }
31937                                  break;
31938                                }
31939                                case 0x00000100: {
31940                                  // 0xef800510
31941                                  switch (instr & 0x10000000) {
31942                                    case 0x00000000: {
31943                                      // 0xef800510
31944                                      if (((instr & 0x380080) == 0x0)) {
31945                                        UnallocatedT32(instr);
31946                                        return;
31947                                      }
31948                                      DataType dt = Dt_L_imm6_3_Decode(
31949                                          ((instr >> 19) & 0x7) |
31950                                          ((instr >> 4) & 0x8));
31951                                      if (dt.Is(kDataTypeValueInvalid)) {
31952                                        UnallocatedT32(instr);
31953                                        return;
31954                                      }
31955                                      unsigned rd =
31956                                          ExtractDRegister(instr, 22, 12);
31957                                      unsigned rm =
31958                                          ExtractDRegister(instr, 5, 0);
31959                                      uint32_t imm6 = (instr >> 16) & 0x3f;
31960                                      uint32_t imm =
31961                                          imm6 -
31962                                          (dt.IsSize(64) ? 0 : dt.GetSize());
31963                                      // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31964                                      vshl(CurrentCond(),
31965                                           dt,
31966                                           DRegister(rd),
31967                                           DRegister(rm),
31968                                           imm);
31969                                      break;
31970                                    }
31971                                    case 0x10000000: {
31972                                      // 0xff800510
31973                                      if (((instr & 0x380080) == 0x0)) {
31974                                        UnallocatedT32(instr);
31975                                        return;
31976                                      }
31977                                      DataType dt = Dt_L_imm6_4_Decode(
31978                                          ((instr >> 19) & 0x7) |
31979                                          ((instr >> 4) & 0x8));
31980                                      if (dt.Is(kDataTypeValueInvalid)) {
31981                                        UnallocatedT32(instr);
31982                                        return;
31983                                      }
31984                                      unsigned rd =
31985                                          ExtractDRegister(instr, 22, 12);
31986                                      unsigned rm =
31987                                          ExtractDRegister(instr, 5, 0);
31988                                      uint32_t imm6 = (instr >> 16) & 0x3f;
31989                                      uint32_t imm =
31990                                          imm6 -
31991                                          (dt.IsSize(64) ? 0 : dt.GetSize());
31992                                      // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31993                                      vsli(CurrentCond(),
31994                                           dt,
31995                                           DRegister(rd),
31996                                           DRegister(rm),
31997                                           imm);
31998                                      break;
31999                                    }
32000                                  }
32001                                  break;
32002                                }
32003                                case 0x00000200: {
32004                                  // 0xef800610
32005                                  if (((instr & 0x380080) == 0x0)) {
32006                                    UnallocatedT32(instr);
32007                                    return;
32008                                  }
32009                                  DataType dt =
32010                                      Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
32011                                                             ((instr >> 4) &
32012                                                              0x8),
32013                                                         (instr >> 28) & 0x1);
32014                                  if (dt.Is(kDataTypeValueInvalid)) {
32015                                    UnallocatedT32(instr);
32016                                    return;
32017                                  }
32018                                  unsigned rd = ExtractDRegister(instr, 22, 12);
32019                                  unsigned rm = ExtractDRegister(instr, 5, 0);
32020                                  uint32_t imm6 = (instr >> 16) & 0x3f;
32021                                  uint32_t imm =
32022                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
32023                                  // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32024                                  vqshlu(CurrentCond(),
32025                                         dt,
32026                                         DRegister(rd),
32027                                         DRegister(rm),
32028                                         imm);
32029                                  break;
32030                                }
32031                                case 0x00000300: {
32032                                  // 0xef800710
32033                                  if (((instr & 0x380080) == 0x0)) {
32034                                    UnallocatedT32(instr);
32035                                    return;
32036                                  }
32037                                  DataType dt =
32038                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
32039                                                             ((instr >> 4) &
32040                                                              0x8),
32041                                                         (instr >> 28) & 0x1);
32042                                  if (dt.Is(kDataTypeValueInvalid)) {
32043                                    UnallocatedT32(instr);
32044                                    return;
32045                                  }
32046                                  unsigned rd = ExtractDRegister(instr, 22, 12);
32047                                  unsigned rm = ExtractDRegister(instr, 5, 0);
32048                                  uint32_t imm6 = (instr >> 16) & 0x3f;
32049                                  uint32_t imm =
32050                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
32051                                  // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32052                                  vqshl(CurrentCond(),
32053                                        dt,
32054                                        DRegister(rd),
32055                                        DRegister(rm),
32056                                        imm);
32057                                  break;
32058                                }
32059                              }
32060                              break;
32061                            }
32062                          }
32063                          break;
32064                        }
32065                        case 0x00000800: {
32066                          // 0xef800810
32067                          switch (instr & 0x00000080) {
32068                            case 0x00000000: {
32069                              // 0xef800810
32070                              switch (instr & 0x00380000) {
32071                                case 0x00000000: {
32072                                  // 0xef800810
32073                                  switch (instr & 0x00000100) {
32074                                    case 0x00000000: {
32075                                      // 0xef800810
32076                                      switch (instr & 0x00000200) {
32077                                        default: {
32078                                          switch (instr & 0x00000020) {
32079                                            case 0x00000020: {
32080                                              // 0xef800830
32081                                              if (((instr & 0xd00) == 0x100) ||
32082                                                  ((instr & 0xd00) == 0x500) ||
32083                                                  ((instr & 0xd00) == 0x900) ||
32084                                                  ((instr & 0xe00) == 0xe00)) {
32085                                                UnallocatedT32(instr);
32086                                                return;
32087                                              }
32088                                              unsigned cmode =
32089                                                  (instr >> 8) & 0xf;
32090                                              DataType dt =
32091                                                  ImmediateVmvn::DecodeDt(
32092                                                      cmode);
32093                                              if (dt.Is(
32094                                                      kDataTypeValueInvalid)) {
32095                                                UnallocatedT32(instr);
32096                                                return;
32097                                              }
32098                                              unsigned rd =
32099                                                  ExtractDRegister(instr,
32100                                                                   22,
32101                                                                   12);
32102                                              DOperand imm = ImmediateVmvn::
32103                                                  DecodeImmediate(cmode,
32104                                                                  (instr &
32105                                                                   0xf) |
32106                                                                      ((instr >>
32107                                                                        12) &
32108                                                                       0x70) |
32109                                                                      ((instr >>
32110                                                                        21) &
32111                                                                       0x80));
32112                                              // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
32113                                              vmvn(CurrentCond(),
32114                                                   dt,
32115                                                   DRegister(rd),
32116                                                   imm);
32117                                              break;
32118                                            }
32119                                            default: {
32120                                              if (((instr & 0x920) == 0x100) ||
32121                                                  ((instr & 0x520) == 0x100) ||
32122                                                  ((instr & 0x820) == 0x20) ||
32123                                                  ((instr & 0x420) == 0x20) ||
32124                                                  ((instr & 0x220) == 0x20) ||
32125                                                  ((instr & 0x120) == 0x120)) {
32126                                                UnallocatedT32(instr);
32127                                                return;
32128                                              }
32129                                              unsigned cmode =
32130                                                  ((instr >> 8) & 0xf) |
32131                                                  ((instr >> 1) & 0x10);
32132                                              DataType dt =
32133                                                  ImmediateVmov::DecodeDt(
32134                                                      cmode);
32135                                              if (dt.Is(
32136                                                      kDataTypeValueInvalid)) {
32137                                                UnallocatedT32(instr);
32138                                                return;
32139                                              }
32140                                              unsigned rd =
32141                                                  ExtractDRegister(instr,
32142                                                                   22,
32143                                                                   12);
32144                                              DOperand imm = ImmediateVmov::
32145                                                  DecodeImmediate(cmode,
32146                                                                  (instr &
32147                                                                   0xf) |
32148                                                                      ((instr >>
32149                                                                        12) &
32150                                                                       0x70) |
32151                                                                      ((instr >>
32152                                                                        21) &
32153                                                                       0x80));
32154                                              // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
32155                                              vmov(CurrentCond(),
32156                                                   dt,
32157                                                   DRegister(rd),
32158                                                   imm);
32159                                              break;
32160                                            }
32161                                          }
32162                                          break;
32163                                        }
32164                                      }
32165                                      break;
32166                                    }
32167                                    case 0x00000100: {
32168                                      // 0xef800910
32169                                      switch (instr & 0x00000020) {
32170                                        case 0x00000000: {
32171                                          // 0xef800910
32172                                          if (((instr & 0x100) == 0x0) ||
32173                                              ((instr & 0xc00) == 0xc00)) {
32174                                            UnallocatedT32(instr);
32175                                            return;
32176                                          }
32177                                          unsigned cmode = (instr >> 8) & 0xf;
32178                                          DataType dt =
32179                                              ImmediateVorr::DecodeDt(cmode);
32180                                          if (dt.Is(kDataTypeValueInvalid)) {
32181                                            UnallocatedT32(instr);
32182                                            return;
32183                                          }
32184                                          unsigned rd =
32185                                              ExtractDRegister(instr, 22, 12);
32186                                          DOperand imm =
32187                                              ImmediateVorr::DecodeImmediate(
32188                                                  cmode,
32189                                                  (instr & 0xf) |
32190                                                      ((instr >> 12) & 0x70) |
32191                                                      ((instr >> 21) & 0x80));
32192                                          // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
32193                                          vorr(CurrentCond(),
32194                                               dt,
32195                                               DRegister(rd),
32196                                               DRegister(rd),
32197                                               imm);
32198                                          break;
32199                                        }
32200                                        case 0x00000020: {
32201                                          // 0xef800930
32202                                          if (((instr & 0x100) == 0x0) ||
32203                                              ((instr & 0xc00) == 0xc00)) {
32204                                            UnallocatedT32(instr);
32205                                            return;
32206                                          }
32207                                          unsigned cmode = (instr >> 8) & 0xf;
32208                                          DataType dt =
32209                                              ImmediateVbic::DecodeDt(cmode);
32210                                          if (dt.Is(kDataTypeValueInvalid)) {
32211                                            UnallocatedT32(instr);
32212                                            return;
32213                                          }
32214                                          unsigned rd =
32215                                              ExtractDRegister(instr, 22, 12);
32216                                          DOperand imm =
32217                                              ImmediateVbic::DecodeImmediate(
32218                                                  cmode,
32219                                                  (instr & 0xf) |
32220                                                      ((instr >> 12) & 0x70) |
32221                                                      ((instr >> 21) & 0x80));
32222                                          // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
32223                                          vbic(CurrentCond(),
32224                                               dt,
32225                                               DRegister(rd),
32226                                               DRegister(rd),
32227                                               imm);
32228                                          break;
32229                                        }
32230                                      }
32231                                      break;
32232                                    }
32233                                  }
32234                                  break;
32235                                }
32236                                case 0x00180000: {
32237                                  // 0xef980810
32238                                  switch (instr & 0x00000300) {
32239                                    case 0x00000000: {
32240                                      // 0xef980810
32241                                      switch (instr & 0x10000000) {
32242                                        case 0x00000000: {
32243                                          // 0xef980810
32244                                          if (((instr & 0x380000) == 0x0)) {
32245                                            UnallocatedT32(instr);
32246                                            return;
32247                                          }
32248                                          DataType dt = Dt_imm6_3_Decode(
32249                                              (instr >> 19) & 0x7);
32250                                          if (dt.Is(kDataTypeValueInvalid)) {
32251                                            UnallocatedT32(instr);
32252                                            return;
32253                                          }
32254                                          unsigned rd =
32255                                              ExtractDRegister(instr, 22, 12);
32256                                          if ((instr & 1) != 0) {
32257                                            UnallocatedT32(instr);
32258                                            return;
32259                                          }
32260                                          unsigned rm =
32261                                              ExtractQRegister(instr, 5, 0);
32262                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32263                                          uint32_t imm = dt.GetSize() - imm6;
32264                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32265                                          vshrn(CurrentCond(),
32266                                                dt,
32267                                                DRegister(rd),
32268                                                QRegister(rm),
32269                                                imm);
32270                                          break;
32271                                        }
32272                                        case 0x10000000: {
32273                                          // 0xff980810
32274                                          if (((instr & 0x380000) == 0x0)) {
32275                                            UnallocatedT32(instr);
32276                                            return;
32277                                          }
32278                                          DataType dt =
32279                                              Dt_imm6_2_Decode((instr >> 19) &
32280                                                                   0x7,
32281                                                               (instr >> 28) &
32282                                                                   0x1);
32283                                          if (dt.Is(kDataTypeValueInvalid)) {
32284                                            UnallocatedT32(instr);
32285                                            return;
32286                                          }
32287                                          unsigned rd =
32288                                              ExtractDRegister(instr, 22, 12);
32289                                          if ((instr & 1) != 0) {
32290                                            UnallocatedT32(instr);
32291                                            return;
32292                                          }
32293                                          unsigned rm =
32294                                              ExtractQRegister(instr, 5, 0);
32295                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32296                                          uint32_t imm = dt.GetSize() - imm6;
32297                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32298                                          vqshrun(CurrentCond(),
32299                                                  dt,
32300                                                  DRegister(rd),
32301                                                  QRegister(rm),
32302                                                  imm);
32303                                          break;
32304                                        }
32305                                      }
32306                                      break;
32307                                    }
32308                                    case 0x00000100: {
32309                                      // 0xef980910
32310                                      if (((instr & 0x380000) == 0x0)) {
32311                                        UnallocatedT32(instr);
32312                                        return;
32313                                      }
32314                                      DataType dt =
32315                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32316                                                           (instr >> 28) & 0x1);
32317                                      if (dt.Is(kDataTypeValueInvalid)) {
32318                                        UnallocatedT32(instr);
32319                                        return;
32320                                      }
32321                                      unsigned rd =
32322                                          ExtractDRegister(instr, 22, 12);
32323                                      if ((instr & 1) != 0) {
32324                                        UnallocatedT32(instr);
32325                                        return;
32326                                      }
32327                                      unsigned rm =
32328                                          ExtractQRegister(instr, 5, 0);
32329                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32330                                      uint32_t imm = dt.GetSize() - imm6;
32331                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32332                                      vqshrn(CurrentCond(),
32333                                             dt,
32334                                             DRegister(rd),
32335                                             QRegister(rm),
32336                                             imm);
32337                                      break;
32338                                    }
32339                                    case 0x00000200: {
32340                                      // 0xef980a10
32341                                      if (((instr & 0x380000) == 0x0) ||
32342                                          ((instr & 0x3f0000) == 0x80000) ||
32343                                          ((instr & 0x3f0000) == 0x100000) ||
32344                                          ((instr & 0x3f0000) == 0x200000)) {
32345                                        UnallocatedT32(instr);
32346                                        return;
32347                                      }
32348                                      DataType dt =
32349                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
32350                                                           (instr >> 28) & 0x1);
32351                                      if (dt.Is(kDataTypeValueInvalid)) {
32352                                        UnallocatedT32(instr);
32353                                        return;
32354                                      }
32355                                      if (((instr >> 12) & 1) != 0) {
32356                                        UnallocatedT32(instr);
32357                                        return;
32358                                      }
32359                                      unsigned rd =
32360                                          ExtractQRegister(instr, 22, 12);
32361                                      unsigned rm =
32362                                          ExtractDRegister(instr, 5, 0);
32363                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32364                                      uint32_t imm = imm6 - dt.GetSize();
32365                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32366                                      vshll(CurrentCond(),
32367                                            dt,
32368                                            QRegister(rd),
32369                                            DRegister(rm),
32370                                            imm);
32371                                      break;
32372                                    }
32373                                    default:
32374                                      UnallocatedT32(instr);
32375                                      break;
32376                                  }
32377                                  break;
32378                                }
32379                                case 0x00280000: {
32380                                  // 0xefa80810
32381                                  switch (instr & 0x00000300) {
32382                                    case 0x00000000: {
32383                                      // 0xefa80810
32384                                      switch (instr & 0x10000000) {
32385                                        case 0x00000000: {
32386                                          // 0xefa80810
32387                                          if (((instr & 0x380000) == 0x0)) {
32388                                            UnallocatedT32(instr);
32389                                            return;
32390                                          }
32391                                          DataType dt = Dt_imm6_3_Decode(
32392                                              (instr >> 19) & 0x7);
32393                                          if (dt.Is(kDataTypeValueInvalid)) {
32394                                            UnallocatedT32(instr);
32395                                            return;
32396                                          }
32397                                          unsigned rd =
32398                                              ExtractDRegister(instr, 22, 12);
32399                                          if ((instr & 1) != 0) {
32400                                            UnallocatedT32(instr);
32401                                            return;
32402                                          }
32403                                          unsigned rm =
32404                                              ExtractQRegister(instr, 5, 0);
32405                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32406                                          uint32_t imm = dt.GetSize() - imm6;
32407                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32408                                          vshrn(CurrentCond(),
32409                                                dt,
32410                                                DRegister(rd),
32411                                                QRegister(rm),
32412                                                imm);
32413                                          break;
32414                                        }
32415                                        case 0x10000000: {
32416                                          // 0xffa80810
32417                                          if (((instr & 0x380000) == 0x0)) {
32418                                            UnallocatedT32(instr);
32419                                            return;
32420                                          }
32421                                          DataType dt =
32422                                              Dt_imm6_2_Decode((instr >> 19) &
32423                                                                   0x7,
32424                                                               (instr >> 28) &
32425                                                                   0x1);
32426                                          if (dt.Is(kDataTypeValueInvalid)) {
32427                                            UnallocatedT32(instr);
32428                                            return;
32429                                          }
32430                                          unsigned rd =
32431                                              ExtractDRegister(instr, 22, 12);
32432                                          if ((instr & 1) != 0) {
32433                                            UnallocatedT32(instr);
32434                                            return;
32435                                          }
32436                                          unsigned rm =
32437                                              ExtractQRegister(instr, 5, 0);
32438                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32439                                          uint32_t imm = dt.GetSize() - imm6;
32440                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32441                                          vqshrun(CurrentCond(),
32442                                                  dt,
32443                                                  DRegister(rd),
32444                                                  QRegister(rm),
32445                                                  imm);
32446                                          break;
32447                                        }
32448                                      }
32449                                      break;
32450                                    }
32451                                    case 0x00000100: {
32452                                      // 0xefa80910
32453                                      if (((instr & 0x380000) == 0x0)) {
32454                                        UnallocatedT32(instr);
32455                                        return;
32456                                      }
32457                                      DataType dt =
32458                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32459                                                           (instr >> 28) & 0x1);
32460                                      if (dt.Is(kDataTypeValueInvalid)) {
32461                                        UnallocatedT32(instr);
32462                                        return;
32463                                      }
32464                                      unsigned rd =
32465                                          ExtractDRegister(instr, 22, 12);
32466                                      if ((instr & 1) != 0) {
32467                                        UnallocatedT32(instr);
32468                                        return;
32469                                      }
32470                                      unsigned rm =
32471                                          ExtractQRegister(instr, 5, 0);
32472                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32473                                      uint32_t imm = dt.GetSize() - imm6;
32474                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32475                                      vqshrn(CurrentCond(),
32476                                             dt,
32477                                             DRegister(rd),
32478                                             QRegister(rm),
32479                                             imm);
32480                                      break;
32481                                    }
32482                                    case 0x00000200: {
32483                                      // 0xefa80a10
32484                                      if (((instr & 0x380000) == 0x0) ||
32485                                          ((instr & 0x3f0000) == 0x80000) ||
32486                                          ((instr & 0x3f0000) == 0x100000) ||
32487                                          ((instr & 0x3f0000) == 0x200000)) {
32488                                        UnallocatedT32(instr);
32489                                        return;
32490                                      }
32491                                      DataType dt =
32492                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
32493                                                           (instr >> 28) & 0x1);
32494                                      if (dt.Is(kDataTypeValueInvalid)) {
32495                                        UnallocatedT32(instr);
32496                                        return;
32497                                      }
32498                                      if (((instr >> 12) & 1) != 0) {
32499                                        UnallocatedT32(instr);
32500                                        return;
32501                                      }
32502                                      unsigned rd =
32503                                          ExtractQRegister(instr, 22, 12);
32504                                      unsigned rm =
32505                                          ExtractDRegister(instr, 5, 0);
32506                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32507                                      uint32_t imm = imm6 - dt.GetSize();
32508                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32509                                      vshll(CurrentCond(),
32510                                            dt,
32511                                            QRegister(rd),
32512                                            DRegister(rm),
32513                                            imm);
32514                                      break;
32515                                    }
32516                                    default:
32517                                      UnallocatedT32(instr);
32518                                      break;
32519                                  }
32520                                  break;
32521                                }
32522                                case 0x00300000: {
32523                                  // 0xefb00810
32524                                  switch (instr & 0x00000300) {
32525                                    case 0x00000000: {
32526                                      // 0xefb00810
32527                                      switch (instr & 0x10000000) {
32528                                        case 0x00000000: {
32529                                          // 0xefb00810
32530                                          if (((instr & 0x380000) == 0x0)) {
32531                                            UnallocatedT32(instr);
32532                                            return;
32533                                          }
32534                                          DataType dt = Dt_imm6_3_Decode(
32535                                              (instr >> 19) & 0x7);
32536                                          if (dt.Is(kDataTypeValueInvalid)) {
32537                                            UnallocatedT32(instr);
32538                                            return;
32539                                          }
32540                                          unsigned rd =
32541                                              ExtractDRegister(instr, 22, 12);
32542                                          if ((instr & 1) != 0) {
32543                                            UnallocatedT32(instr);
32544                                            return;
32545                                          }
32546                                          unsigned rm =
32547                                              ExtractQRegister(instr, 5, 0);
32548                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32549                                          uint32_t imm = dt.GetSize() - imm6;
32550                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32551                                          vshrn(CurrentCond(),
32552                                                dt,
32553                                                DRegister(rd),
32554                                                QRegister(rm),
32555                                                imm);
32556                                          break;
32557                                        }
32558                                        case 0x10000000: {
32559                                          // 0xffb00810
32560                                          if (((instr & 0x380000) == 0x0)) {
32561                                            UnallocatedT32(instr);
32562                                            return;
32563                                          }
32564                                          DataType dt =
32565                                              Dt_imm6_2_Decode((instr >> 19) &
32566                                                                   0x7,
32567                                                               (instr >> 28) &
32568                                                                   0x1);
32569                                          if (dt.Is(kDataTypeValueInvalid)) {
32570                                            UnallocatedT32(instr);
32571                                            return;
32572                                          }
32573                                          unsigned rd =
32574                                              ExtractDRegister(instr, 22, 12);
32575                                          if ((instr & 1) != 0) {
32576                                            UnallocatedT32(instr);
32577                                            return;
32578                                          }
32579                                          unsigned rm =
32580                                              ExtractQRegister(instr, 5, 0);
32581                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32582                                          uint32_t imm = dt.GetSize() - imm6;
32583                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32584                                          vqshrun(CurrentCond(),
32585                                                  dt,
32586                                                  DRegister(rd),
32587                                                  QRegister(rm),
32588                                                  imm);
32589                                          break;
32590                                        }
32591                                      }
32592                                      break;
32593                                    }
32594                                    case 0x00000100: {
32595                                      // 0xefb00910
32596                                      if (((instr & 0x380000) == 0x0)) {
32597                                        UnallocatedT32(instr);
32598                                        return;
32599                                      }
32600                                      DataType dt =
32601                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32602                                                           (instr >> 28) & 0x1);
32603                                      if (dt.Is(kDataTypeValueInvalid)) {
32604                                        UnallocatedT32(instr);
32605                                        return;
32606                                      }
32607                                      unsigned rd =
32608                                          ExtractDRegister(instr, 22, 12);
32609                                      if ((instr & 1) != 0) {
32610                                        UnallocatedT32(instr);
32611                                        return;
32612                                      }
32613                                      unsigned rm =
32614                                          ExtractQRegister(instr, 5, 0);
32615                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32616                                      uint32_t imm = dt.GetSize() - imm6;
32617                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32618                                      vqshrn(CurrentCond(),
32619                                             dt,
32620                                             DRegister(rd),
32621                                             QRegister(rm),
32622                                             imm);
32623                                      break;
32624                                    }
32625                                    case 0x00000200: {
32626                                      // 0xefb00a10
32627                                      if (((instr & 0x380000) == 0x0) ||
32628                                          ((instr & 0x3f0000) == 0x80000) ||
32629                                          ((instr & 0x3f0000) == 0x100000) ||
32630                                          ((instr & 0x3f0000) == 0x200000)) {
32631                                        UnallocatedT32(instr);
32632                                        return;
32633                                      }
32634                                      DataType dt =
32635                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
32636                                                           (instr >> 28) & 0x1);
32637                                      if (dt.Is(kDataTypeValueInvalid)) {
32638                                        UnallocatedT32(instr);
32639                                        return;
32640                                      }
32641                                      if (((instr >> 12) & 1) != 0) {
32642                                        UnallocatedT32(instr);
32643                                        return;
32644                                      }
32645                                      unsigned rd =
32646                                          ExtractQRegister(instr, 22, 12);
32647                                      unsigned rm =
32648                                          ExtractDRegister(instr, 5, 0);
32649                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32650                                      uint32_t imm = imm6 - dt.GetSize();
32651                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32652                                      vshll(CurrentCond(),
32653                                            dt,
32654                                            QRegister(rd),
32655                                            DRegister(rm),
32656                                            imm);
32657                                      break;
32658                                    }
32659                                    default:
32660                                      UnallocatedT32(instr);
32661                                      break;
32662                                  }
32663                                  break;
32664                                }
32665                                case 0x00380000: {
32666                                  // 0xefb80810
32667                                  switch (instr & 0x00000300) {
32668                                    case 0x00000000: {
32669                                      // 0xefb80810
32670                                      switch (instr & 0x10000000) {
32671                                        case 0x00000000: {
32672                                          // 0xefb80810
32673                                          if (((instr & 0x380000) == 0x0)) {
32674                                            UnallocatedT32(instr);
32675                                            return;
32676                                          }
32677                                          DataType dt = Dt_imm6_3_Decode(
32678                                              (instr >> 19) & 0x7);
32679                                          if (dt.Is(kDataTypeValueInvalid)) {
32680                                            UnallocatedT32(instr);
32681                                            return;
32682                                          }
32683                                          unsigned rd =
32684                                              ExtractDRegister(instr, 22, 12);
32685                                          if ((instr & 1) != 0) {
32686                                            UnallocatedT32(instr);
32687                                            return;
32688                                          }
32689                                          unsigned rm =
32690                                              ExtractQRegister(instr, 5, 0);
32691                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32692                                          uint32_t imm = dt.GetSize() - imm6;
32693                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32694                                          vshrn(CurrentCond(),
32695                                                dt,
32696                                                DRegister(rd),
32697                                                QRegister(rm),
32698                                                imm);
32699                                          break;
32700                                        }
32701                                        case 0x10000000: {
32702                                          // 0xffb80810
32703                                          if (((instr & 0x380000) == 0x0)) {
32704                                            UnallocatedT32(instr);
32705                                            return;
32706                                          }
32707                                          DataType dt =
32708                                              Dt_imm6_2_Decode((instr >> 19) &
32709                                                                   0x7,
32710                                                               (instr >> 28) &
32711                                                                   0x1);
32712                                          if (dt.Is(kDataTypeValueInvalid)) {
32713                                            UnallocatedT32(instr);
32714                                            return;
32715                                          }
32716                                          unsigned rd =
32717                                              ExtractDRegister(instr, 22, 12);
32718                                          if ((instr & 1) != 0) {
32719                                            UnallocatedT32(instr);
32720                                            return;
32721                                          }
32722                                          unsigned rm =
32723                                              ExtractQRegister(instr, 5, 0);
32724                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32725                                          uint32_t imm = dt.GetSize() - imm6;
32726                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32727                                          vqshrun(CurrentCond(),
32728                                                  dt,
32729                                                  DRegister(rd),
32730                                                  QRegister(rm),
32731                                                  imm);
32732                                          break;
32733                                        }
32734                                      }
32735                                      break;
32736                                    }
32737                                    case 0x00000100: {
32738                                      // 0xefb80910
32739                                      if (((instr & 0x380000) == 0x0)) {
32740                                        UnallocatedT32(instr);
32741                                        return;
32742                                      }
32743                                      DataType dt =
32744                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32745                                                           (instr >> 28) & 0x1);
32746                                      if (dt.Is(kDataTypeValueInvalid)) {
32747                                        UnallocatedT32(instr);
32748                                        return;
32749                                      }
32750                                      unsigned rd =
32751                                          ExtractDRegister(instr, 22, 12);
32752                                      if ((instr & 1) != 0) {
32753                                        UnallocatedT32(instr);
32754                                        return;
32755                                      }
32756                                      unsigned rm =
32757                                          ExtractQRegister(instr, 5, 0);
32758                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32759                                      uint32_t imm = dt.GetSize() - imm6;
32760                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32761                                      vqshrn(CurrentCond(),
32762                                             dt,
32763                                             DRegister(rd),
32764                                             QRegister(rm),
32765                                             imm);
32766                                      break;
32767                                    }
32768                                    case 0x00000200: {
32769                                      // 0xefb80a10
32770                                      if (((instr & 0x380000) == 0x0) ||
32771                                          ((instr & 0x3f0000) == 0x80000) ||
32772                                          ((instr & 0x3f0000) == 0x100000) ||
32773                                          ((instr & 0x3f0000) == 0x200000)) {
32774                                        UnallocatedT32(instr);
32775                                        return;
32776                                      }
32777                                      DataType dt =
32778                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
32779                                                           (instr >> 28) & 0x1);
32780                                      if (dt.Is(kDataTypeValueInvalid)) {
32781                                        UnallocatedT32(instr);
32782                                        return;
32783                                      }
32784                                      if (((instr >> 12) & 1) != 0) {
32785                                        UnallocatedT32(instr);
32786                                        return;
32787                                      }
32788                                      unsigned rd =
32789                                          ExtractQRegister(instr, 22, 12);
32790                                      unsigned rm =
32791                                          ExtractDRegister(instr, 5, 0);
32792                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32793                                      uint32_t imm = imm6 - dt.GetSize();
32794                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32795                                      vshll(CurrentCond(),
32796                                            dt,
32797                                            QRegister(rd),
32798                                            DRegister(rm),
32799                                            imm);
32800                                      break;
32801                                    }
32802                                    default:
32803                                      UnallocatedT32(instr);
32804                                      break;
32805                                  }
32806                                  break;
32807                                }
32808                                default: {
32809                                  switch (instr & 0x00000300) {
32810                                    case 0x00000000: {
32811                                      // 0xef800810
32812                                      switch (instr & 0x10000000) {
32813                                        case 0x00000000: {
32814                                          // 0xef800810
32815                                          if (((instr & 0x380000) == 0x0)) {
32816                                            UnallocatedT32(instr);
32817                                            return;
32818                                          }
32819                                          DataType dt = Dt_imm6_3_Decode(
32820                                              (instr >> 19) & 0x7);
32821                                          if (dt.Is(kDataTypeValueInvalid)) {
32822                                            UnallocatedT32(instr);
32823                                            return;
32824                                          }
32825                                          unsigned rd =
32826                                              ExtractDRegister(instr, 22, 12);
32827                                          if ((instr & 1) != 0) {
32828                                            UnallocatedT32(instr);
32829                                            return;
32830                                          }
32831                                          unsigned rm =
32832                                              ExtractQRegister(instr, 5, 0);
32833                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32834                                          uint32_t imm = dt.GetSize() - imm6;
32835                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32836                                          vshrn(CurrentCond(),
32837                                                dt,
32838                                                DRegister(rd),
32839                                                QRegister(rm),
32840                                                imm);
32841                                          break;
32842                                        }
32843                                        case 0x10000000: {
32844                                          // 0xff800810
32845                                          if (((instr & 0x380000) == 0x0)) {
32846                                            UnallocatedT32(instr);
32847                                            return;
32848                                          }
32849                                          DataType dt =
32850                                              Dt_imm6_2_Decode((instr >> 19) &
32851                                                                   0x7,
32852                                                               (instr >> 28) &
32853                                                                   0x1);
32854                                          if (dt.Is(kDataTypeValueInvalid)) {
32855                                            UnallocatedT32(instr);
32856                                            return;
32857                                          }
32858                                          unsigned rd =
32859                                              ExtractDRegister(instr, 22, 12);
32860                                          if ((instr & 1) != 0) {
32861                                            UnallocatedT32(instr);
32862                                            return;
32863                                          }
32864                                          unsigned rm =
32865                                              ExtractQRegister(instr, 5, 0);
32866                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32867                                          uint32_t imm = dt.GetSize() - imm6;
32868                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32869                                          vqshrun(CurrentCond(),
32870                                                  dt,
32871                                                  DRegister(rd),
32872                                                  QRegister(rm),
32873                                                  imm);
32874                                          break;
32875                                        }
32876                                      }
32877                                      break;
32878                                    }
32879                                    case 0x00000100: {
32880                                      // 0xef800910
32881                                      if (((instr & 0x380000) == 0x0)) {
32882                                        UnallocatedT32(instr);
32883                                        return;
32884                                      }
32885                                      DataType dt =
32886                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32887                                                           (instr >> 28) & 0x1);
32888                                      if (dt.Is(kDataTypeValueInvalid)) {
32889                                        UnallocatedT32(instr);
32890                                        return;
32891                                      }
32892                                      unsigned rd =
32893                                          ExtractDRegister(instr, 22, 12);
32894                                      if ((instr & 1) != 0) {
32895                                        UnallocatedT32(instr);
32896                                        return;
32897                                      }
32898                                      unsigned rm =
32899                                          ExtractQRegister(instr, 5, 0);
32900                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32901                                      uint32_t imm = dt.GetSize() - imm6;
32902                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32903                                      vqshrn(CurrentCond(),
32904                                             dt,
32905                                             DRegister(rd),
32906                                             QRegister(rm),
32907                                             imm);
32908                                      break;
32909                                    }
32910                                    case 0x00000200: {
32911                                      // 0xef800a10
32912                                      switch (instr & 0x00070000) {
32913                                        case 0x00000000: {
32914                                          // 0xef800a10
32915                                          switch (instr & 0x003f0000) {
32916                                            case 0x00080000: {
32917                                              // 0xef880a10
32918                                              if (((instr & 0x380000) == 0x0) ||
32919                                                  ((instr & 0x380000) ==
32920                                                   0x180000) ||
32921                                                  ((instr & 0x380000) ==
32922                                                   0x280000) ||
32923                                                  ((instr & 0x380000) ==
32924                                                   0x300000) ||
32925                                                  ((instr & 0x380000) ==
32926                                                   0x380000)) {
32927                                                UnallocatedT32(instr);
32928                                                return;
32929                                              }
32930                                              DataType dt = Dt_U_imm3H_1_Decode(
32931                                                  ((instr >> 19) & 0x7) |
32932                                                  ((instr >> 25) & 0x8));
32933                                              if (dt.Is(
32934                                                      kDataTypeValueInvalid)) {
32935                                                UnallocatedT32(instr);
32936                                                return;
32937                                              }
32938                                              if (((instr >> 12) & 1) != 0) {
32939                                                UnallocatedT32(instr);
32940                                                return;
32941                                              }
32942                                              unsigned rd =
32943                                                  ExtractQRegister(instr,
32944                                                                   22,
32945                                                                   12);
32946                                              unsigned rm =
32947                                                  ExtractDRegister(instr, 5, 0);
32948                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
32949                                              vmovl(CurrentCond(),
32950                                                    dt,
32951                                                    QRegister(rd),
32952                                                    DRegister(rm));
32953                                              break;
32954                                            }
32955                                            case 0x00090000: {
32956                                              // 0xef890a10
32957                                              if (((instr & 0x380000) == 0x0) ||
32958                                                  ((instr & 0x3f0000) ==
32959                                                   0x80000) ||
32960                                                  ((instr & 0x3f0000) ==
32961                                                   0x100000) ||
32962                                                  ((instr & 0x3f0000) ==
32963                                                   0x200000)) {
32964                                                UnallocatedT32(instr);
32965                                                return;
32966                                              }
32967                                              DataType dt =
32968                                                  Dt_imm6_4_Decode((instr >>
32969                                                                    19) &
32970                                                                       0x7,
32971                                                                   (instr >>
32972                                                                    28) &
32973                                                                       0x1);
32974                                              if (dt.Is(
32975                                                      kDataTypeValueInvalid)) {
32976                                                UnallocatedT32(instr);
32977                                                return;
32978                                              }
32979                                              if (((instr >> 12) & 1) != 0) {
32980                                                UnallocatedT32(instr);
32981                                                return;
32982                                              }
32983                                              unsigned rd =
32984                                                  ExtractQRegister(instr,
32985                                                                   22,
32986                                                                   12);
32987                                              unsigned rm =
32988                                                  ExtractDRegister(instr, 5, 0);
32989                                              uint32_t imm6 =
32990                                                  (instr >> 16) & 0x3f;
32991                                              uint32_t imm =
32992                                                  imm6 - dt.GetSize();
32993                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32994                                              vshll(CurrentCond(),
32995                                                    dt,
32996                                                    QRegister(rd),
32997                                                    DRegister(rm),
32998                                                    imm);
32999                                              break;
33000                                            }
33001                                            case 0x000a0000: {
33002                                              // 0xef8a0a10
33003                                              if (((instr & 0x380000) == 0x0) ||
33004                                                  ((instr & 0x3f0000) ==
33005                                                   0x80000) ||
33006                                                  ((instr & 0x3f0000) ==
33007                                                   0x100000) ||
33008                                                  ((instr & 0x3f0000) ==
33009                                                   0x200000)) {
33010                                                UnallocatedT32(instr);
33011                                                return;
33012                                              }
33013                                              DataType dt =
33014                                                  Dt_imm6_4_Decode((instr >>
33015                                                                    19) &
33016                                                                       0x7,
33017                                                                   (instr >>
33018                                                                    28) &
33019                                                                       0x1);
33020                                              if (dt.Is(
33021                                                      kDataTypeValueInvalid)) {
33022                                                UnallocatedT32(instr);
33023                                                return;
33024                                              }
33025                                              if (((instr >> 12) & 1) != 0) {
33026                                                UnallocatedT32(instr);
33027                                                return;
33028                                              }
33029                                              unsigned rd =
33030                                                  ExtractQRegister(instr,
33031                                                                   22,
33032                                                                   12);
33033                                              unsigned rm =
33034                                                  ExtractDRegister(instr, 5, 0);
33035                                              uint32_t imm6 =
33036                                                  (instr >> 16) & 0x3f;
33037                                              uint32_t imm =
33038                                                  imm6 - dt.GetSize();
33039                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33040                                              vshll(CurrentCond(),
33041                                                    dt,
33042                                                    QRegister(rd),
33043                                                    DRegister(rm),
33044                                                    imm);
33045                                              break;
33046                                            }
33047                                            case 0x000b0000: {
33048                                              // 0xef8b0a10
33049                                              if (((instr & 0x380000) == 0x0) ||
33050                                                  ((instr & 0x3f0000) ==
33051                                                   0x80000) ||
33052                                                  ((instr & 0x3f0000) ==
33053                                                   0x100000) ||
33054                                                  ((instr & 0x3f0000) ==
33055                                                   0x200000)) {
33056                                                UnallocatedT32(instr);
33057                                                return;
33058                                              }
33059                                              DataType dt =
33060                                                  Dt_imm6_4_Decode((instr >>
33061                                                                    19) &
33062                                                                       0x7,
33063                                                                   (instr >>
33064                                                                    28) &
33065                                                                       0x1);
33066                                              if (dt.Is(
33067                                                      kDataTypeValueInvalid)) {
33068                                                UnallocatedT32(instr);
33069                                                return;
33070                                              }
33071                                              if (((instr >> 12) & 1) != 0) {
33072                                                UnallocatedT32(instr);
33073                                                return;
33074                                              }
33075                                              unsigned rd =
33076                                                  ExtractQRegister(instr,
33077                                                                   22,
33078                                                                   12);
33079                                              unsigned rm =
33080                                                  ExtractDRegister(instr, 5, 0);
33081                                              uint32_t imm6 =
33082                                                  (instr >> 16) & 0x3f;
33083                                              uint32_t imm =
33084                                                  imm6 - dt.GetSize();
33085                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33086                                              vshll(CurrentCond(),
33087                                                    dt,
33088                                                    QRegister(rd),
33089                                                    DRegister(rm),
33090                                                    imm);
33091                                              break;
33092                                            }
33093                                            case 0x000c0000: {
33094                                              // 0xef8c0a10
33095                                              if (((instr & 0x380000) == 0x0) ||
33096                                                  ((instr & 0x3f0000) ==
33097                                                   0x80000) ||
33098                                                  ((instr & 0x3f0000) ==
33099                                                   0x100000) ||
33100                                                  ((instr & 0x3f0000) ==
33101                                                   0x200000)) {
33102                                                UnallocatedT32(instr);
33103                                                return;
33104                                              }
33105                                              DataType dt =
33106                                                  Dt_imm6_4_Decode((instr >>
33107                                                                    19) &
33108                                                                       0x7,
33109                                                                   (instr >>
33110                                                                    28) &
33111                                                                       0x1);
33112                                              if (dt.Is(
33113                                                      kDataTypeValueInvalid)) {
33114                                                UnallocatedT32(instr);
33115                                                return;
33116                                              }
33117                                              if (((instr >> 12) & 1) != 0) {
33118                                                UnallocatedT32(instr);
33119                                                return;
33120                                              }
33121                                              unsigned rd =
33122                                                  ExtractQRegister(instr,
33123                                                                   22,
33124                                                                   12);
33125                                              unsigned rm =
33126                                                  ExtractDRegister(instr, 5, 0);
33127                                              uint32_t imm6 =
33128                                                  (instr >> 16) & 0x3f;
33129                                              uint32_t imm =
33130                                                  imm6 - dt.GetSize();
33131                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33132                                              vshll(CurrentCond(),
33133                                                    dt,
33134                                                    QRegister(rd),
33135                                                    DRegister(rm),
33136                                                    imm);
33137                                              break;
33138                                            }
33139                                            case 0x000d0000: {
33140                                              // 0xef8d0a10
33141                                              if (((instr & 0x380000) == 0x0) ||
33142                                                  ((instr & 0x3f0000) ==
33143                                                   0x80000) ||
33144                                                  ((instr & 0x3f0000) ==
33145                                                   0x100000) ||
33146                                                  ((instr & 0x3f0000) ==
33147                                                   0x200000)) {
33148                                                UnallocatedT32(instr);
33149                                                return;
33150                                              }
33151                                              DataType dt =
33152                                                  Dt_imm6_4_Decode((instr >>
33153                                                                    19) &
33154                                                                       0x7,
33155                                                                   (instr >>
33156                                                                    28) &
33157                                                                       0x1);
33158                                              if (dt.Is(
33159                                                      kDataTypeValueInvalid)) {
33160                                                UnallocatedT32(instr);
33161                                                return;
33162                                              }
33163                                              if (((instr >> 12) & 1) != 0) {
33164                                                UnallocatedT32(instr);
33165                                                return;
33166                                              }
33167                                              unsigned rd =
33168                                                  ExtractQRegister(instr,
33169                                                                   22,
33170                                                                   12);
33171                                              unsigned rm =
33172                                                  ExtractDRegister(instr, 5, 0);
33173                                              uint32_t imm6 =
33174                                                  (instr >> 16) & 0x3f;
33175                                              uint32_t imm =
33176                                                  imm6 - dt.GetSize();
33177                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33178                                              vshll(CurrentCond(),
33179                                                    dt,
33180                                                    QRegister(rd),
33181                                                    DRegister(rm),
33182                                                    imm);
33183                                              break;
33184                                            }
33185                                            case 0x000e0000: {
33186                                              // 0xef8e0a10
33187                                              if (((instr & 0x380000) == 0x0) ||
33188                                                  ((instr & 0x3f0000) ==
33189                                                   0x80000) ||
33190                                                  ((instr & 0x3f0000) ==
33191                                                   0x100000) ||
33192                                                  ((instr & 0x3f0000) ==
33193                                                   0x200000)) {
33194                                                UnallocatedT32(instr);
33195                                                return;
33196                                              }
33197                                              DataType dt =
33198                                                  Dt_imm6_4_Decode((instr >>
33199                                                                    19) &
33200                                                                       0x7,
33201                                                                   (instr >>
33202                                                                    28) &
33203                                                                       0x1);
33204                                              if (dt.Is(
33205                                                      kDataTypeValueInvalid)) {
33206                                                UnallocatedT32(instr);
33207                                                return;
33208                                              }
33209                                              if (((instr >> 12) & 1) != 0) {
33210                                                UnallocatedT32(instr);
33211                                                return;
33212                                              }
33213                                              unsigned rd =
33214                                                  ExtractQRegister(instr,
33215                                                                   22,
33216                                                                   12);
33217                                              unsigned rm =
33218                                                  ExtractDRegister(instr, 5, 0);
33219                                              uint32_t imm6 =
33220                                                  (instr >> 16) & 0x3f;
33221                                              uint32_t imm =
33222                                                  imm6 - dt.GetSize();
33223                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33224                                              vshll(CurrentCond(),
33225                                                    dt,
33226                                                    QRegister(rd),
33227                                                    DRegister(rm),
33228                                                    imm);
33229                                              break;
33230                                            }
33231                                            case 0x000f0000: {
33232                                              // 0xef8f0a10
33233                                              if (((instr & 0x380000) == 0x0) ||
33234                                                  ((instr & 0x3f0000) ==
33235                                                   0x80000) ||
33236                                                  ((instr & 0x3f0000) ==
33237                                                   0x100000) ||
33238                                                  ((instr & 0x3f0000) ==
33239                                                   0x200000)) {
33240                                                UnallocatedT32(instr);
33241                                                return;
33242                                              }
33243                                              DataType dt =
33244                                                  Dt_imm6_4_Decode((instr >>
33245                                                                    19) &
33246                                                                       0x7,
33247                                                                   (instr >>
33248                                                                    28) &
33249                                                                       0x1);
33250                                              if (dt.Is(
33251                                                      kDataTypeValueInvalid)) {
33252                                                UnallocatedT32(instr);
33253                                                return;
33254                                              }
33255                                              if (((instr >> 12) & 1) != 0) {
33256                                                UnallocatedT32(instr);
33257                                                return;
33258                                              }
33259                                              unsigned rd =
33260                                                  ExtractQRegister(instr,
33261                                                                   22,
33262                                                                   12);
33263                                              unsigned rm =
33264                                                  ExtractDRegister(instr, 5, 0);
33265                                              uint32_t imm6 =
33266                                                  (instr >> 16) & 0x3f;
33267                                              uint32_t imm =
33268                                                  imm6 - dt.GetSize();
33269                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33270                                              vshll(CurrentCond(),
33271                                                    dt,
33272                                                    QRegister(rd),
33273                                                    DRegister(rm),
33274                                                    imm);
33275                                              break;
33276                                            }
33277                                            case 0x00100000: {
33278                                              // 0xef900a10
33279                                              if (((instr & 0x380000) == 0x0) ||
33280                                                  ((instr & 0x380000) ==
33281                                                   0x180000) ||
33282                                                  ((instr & 0x380000) ==
33283                                                   0x280000) ||
33284                                                  ((instr & 0x380000) ==
33285                                                   0x300000) ||
33286                                                  ((instr & 0x380000) ==
33287                                                   0x380000)) {
33288                                                UnallocatedT32(instr);
33289                                                return;
33290                                              }
33291                                              DataType dt = Dt_U_imm3H_1_Decode(
33292                                                  ((instr >> 19) & 0x7) |
33293                                                  ((instr >> 25) & 0x8));
33294                                              if (dt.Is(
33295                                                      kDataTypeValueInvalid)) {
33296                                                UnallocatedT32(instr);
33297                                                return;
33298                                              }
33299                                              if (((instr >> 12) & 1) != 0) {
33300                                                UnallocatedT32(instr);
33301                                                return;
33302                                              }
33303                                              unsigned rd =
33304                                                  ExtractQRegister(instr,
33305                                                                   22,
33306                                                                   12);
33307                                              unsigned rm =
33308                                                  ExtractDRegister(instr, 5, 0);
33309                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
33310                                              vmovl(CurrentCond(),
33311                                                    dt,
33312                                                    QRegister(rd),
33313                                                    DRegister(rm));
33314                                              break;
33315                                            }
33316                                            case 0x00110000: {
33317                                              // 0xef910a10
33318                                              if (((instr & 0x380000) == 0x0) ||
33319                                                  ((instr & 0x3f0000) ==
33320                                                   0x80000) ||
33321                                                  ((instr & 0x3f0000) ==
33322                                                   0x100000) ||
33323                                                  ((instr & 0x3f0000) ==
33324                                                   0x200000)) {
33325                                                UnallocatedT32(instr);
33326                                                return;
33327                                              }
33328                                              DataType dt =
33329                                                  Dt_imm6_4_Decode((instr >>
33330                                                                    19) &
33331                                                                       0x7,
33332                                                                   (instr >>
33333                                                                    28) &
33334                                                                       0x1);
33335                                              if (dt.Is(
33336                                                      kDataTypeValueInvalid)) {
33337                                                UnallocatedT32(instr);
33338                                                return;
33339                                              }
33340                                              if (((instr >> 12) & 1) != 0) {
33341                                                UnallocatedT32(instr);
33342                                                return;
33343                                              }
33344                                              unsigned rd =
33345                                                  ExtractQRegister(instr,
33346                                                                   22,
33347                                                                   12);
33348                                              unsigned rm =
33349                                                  ExtractDRegister(instr, 5, 0);
33350                                              uint32_t imm6 =
33351                                                  (instr >> 16) & 0x3f;
33352                                              uint32_t imm =
33353                                                  imm6 - dt.GetSize();
33354                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33355                                              vshll(CurrentCond(),
33356                                                    dt,
33357                                                    QRegister(rd),
33358                                                    DRegister(rm),
33359                                                    imm);
33360                                              break;
33361                                            }
33362                                            case 0x00120000: {
33363                                              // 0xef920a10
33364                                              if (((instr & 0x380000) == 0x0) ||
33365                                                  ((instr & 0x3f0000) ==
33366                                                   0x80000) ||
33367                                                  ((instr & 0x3f0000) ==
33368                                                   0x100000) ||
33369                                                  ((instr & 0x3f0000) ==
33370                                                   0x200000)) {
33371                                                UnallocatedT32(instr);
33372                                                return;
33373                                              }
33374                                              DataType dt =
33375                                                  Dt_imm6_4_Decode((instr >>
33376                                                                    19) &
33377                                                                       0x7,
33378                                                                   (instr >>
33379                                                                    28) &
33380                                                                       0x1);
33381                                              if (dt.Is(
33382                                                      kDataTypeValueInvalid)) {
33383                                                UnallocatedT32(instr);
33384                                                return;
33385                                              }
33386                                              if (((instr >> 12) & 1) != 0) {
33387                                                UnallocatedT32(instr);
33388                                                return;
33389                                              }
33390                                              unsigned rd =
33391                                                  ExtractQRegister(instr,
33392                                                                   22,
33393                                                                   12);
33394                                              unsigned rm =
33395                                                  ExtractDRegister(instr, 5, 0);
33396                                              uint32_t imm6 =
33397                                                  (instr >> 16) & 0x3f;
33398                                              uint32_t imm =
33399                                                  imm6 - dt.GetSize();
33400                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33401                                              vshll(CurrentCond(),
33402                                                    dt,
33403                                                    QRegister(rd),
33404                                                    DRegister(rm),
33405                                                    imm);
33406                                              break;
33407                                            }
33408                                            case 0x00130000: {
33409                                              // 0xef930a10
33410                                              if (((instr & 0x380000) == 0x0) ||
33411                                                  ((instr & 0x3f0000) ==
33412                                                   0x80000) ||
33413                                                  ((instr & 0x3f0000) ==
33414                                                   0x100000) ||
33415                                                  ((instr & 0x3f0000) ==
33416                                                   0x200000)) {
33417                                                UnallocatedT32(instr);
33418                                                return;
33419                                              }
33420                                              DataType dt =
33421                                                  Dt_imm6_4_Decode((instr >>
33422                                                                    19) &
33423                                                                       0x7,
33424                                                                   (instr >>
33425                                                                    28) &
33426                                                                       0x1);
33427                                              if (dt.Is(
33428                                                      kDataTypeValueInvalid)) {
33429                                                UnallocatedT32(instr);
33430                                                return;
33431                                              }
33432                                              if (((instr >> 12) & 1) != 0) {
33433                                                UnallocatedT32(instr);
33434                                                return;
33435                                              }
33436                                              unsigned rd =
33437                                                  ExtractQRegister(instr,
33438                                                                   22,
33439                                                                   12);
33440                                              unsigned rm =
33441                                                  ExtractDRegister(instr, 5, 0);
33442                                              uint32_t imm6 =
33443                                                  (instr >> 16) & 0x3f;
33444                                              uint32_t imm =
33445                                                  imm6 - dt.GetSize();
33446                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33447                                              vshll(CurrentCond(),
33448                                                    dt,
33449                                                    QRegister(rd),
33450                                                    DRegister(rm),
33451                                                    imm);
33452                                              break;
33453                                            }
33454                                            case 0x00140000: {
33455                                              // 0xef940a10
33456                                              if (((instr & 0x380000) == 0x0) ||
33457                                                  ((instr & 0x3f0000) ==
33458                                                   0x80000) ||
33459                                                  ((instr & 0x3f0000) ==
33460                                                   0x100000) ||
33461                                                  ((instr & 0x3f0000) ==
33462                                                   0x200000)) {
33463                                                UnallocatedT32(instr);
33464                                                return;
33465                                              }
33466                                              DataType dt =
33467                                                  Dt_imm6_4_Decode((instr >>
33468                                                                    19) &
33469                                                                       0x7,
33470                                                                   (instr >>
33471                                                                    28) &
33472                                                                       0x1);
33473                                              if (dt.Is(
33474                                                      kDataTypeValueInvalid)) {
33475                                                UnallocatedT32(instr);
33476                                                return;
33477                                              }
33478                                              if (((instr >> 12) & 1) != 0) {
33479                                                UnallocatedT32(instr);
33480                                                return;
33481                                              }
33482                                              unsigned rd =
33483                                                  ExtractQRegister(instr,
33484                                                                   22,
33485                                                                   12);
33486                                              unsigned rm =
33487                                                  ExtractDRegister(instr, 5, 0);
33488                                              uint32_t imm6 =
33489                                                  (instr >> 16) & 0x3f;
33490                                              uint32_t imm =
33491                                                  imm6 - dt.GetSize();
33492                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33493                                              vshll(CurrentCond(),
33494                                                    dt,
33495                                                    QRegister(rd),
33496                                                    DRegister(rm),
33497                                                    imm);
33498                                              break;
33499                                            }
33500                                            case 0x00150000: {
33501                                              // 0xef950a10
33502                                              if (((instr & 0x380000) == 0x0) ||
33503                                                  ((instr & 0x3f0000) ==
33504                                                   0x80000) ||
33505                                                  ((instr & 0x3f0000) ==
33506                                                   0x100000) ||
33507                                                  ((instr & 0x3f0000) ==
33508                                                   0x200000)) {
33509                                                UnallocatedT32(instr);
33510                                                return;
33511                                              }
33512                                              DataType dt =
33513                                                  Dt_imm6_4_Decode((instr >>
33514                                                                    19) &
33515                                                                       0x7,
33516                                                                   (instr >>
33517                                                                    28) &
33518                                                                       0x1);
33519                                              if (dt.Is(
33520                                                      kDataTypeValueInvalid)) {
33521                                                UnallocatedT32(instr);
33522                                                return;
33523                                              }
33524                                              if (((instr >> 12) & 1) != 0) {
33525                                                UnallocatedT32(instr);
33526                                                return;
33527                                              }
33528                                              unsigned rd =
33529                                                  ExtractQRegister(instr,
33530                                                                   22,
33531                                                                   12);
33532                                              unsigned rm =
33533                                                  ExtractDRegister(instr, 5, 0);
33534                                              uint32_t imm6 =
33535                                                  (instr >> 16) & 0x3f;
33536                                              uint32_t imm =
33537                                                  imm6 - dt.GetSize();
33538                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33539                                              vshll(CurrentCond(),
33540                                                    dt,
33541                                                    QRegister(rd),
33542                                                    DRegister(rm),
33543                                                    imm);
33544                                              break;
33545                                            }
33546                                            case 0x00160000: {
33547                                              // 0xef960a10
33548                                              if (((instr & 0x380000) == 0x0) ||
33549                                                  ((instr & 0x3f0000) ==
33550                                                   0x80000) ||
33551                                                  ((instr & 0x3f0000) ==
33552                                                   0x100000) ||
33553                                                  ((instr & 0x3f0000) ==
33554                                                   0x200000)) {
33555                                                UnallocatedT32(instr);
33556                                                return;
33557                                              }
33558                                              DataType dt =
33559                                                  Dt_imm6_4_Decode((instr >>
33560                                                                    19) &
33561                                                                       0x7,
33562                                                                   (instr >>
33563                                                                    28) &
33564                                                                       0x1);
33565                                              if (dt.Is(
33566                                                      kDataTypeValueInvalid)) {
33567                                                UnallocatedT32(instr);
33568                                                return;
33569                                              }
33570                                              if (((instr >> 12) & 1) != 0) {
33571                                                UnallocatedT32(instr);
33572                                                return;
33573                                              }
33574                                              unsigned rd =
33575                                                  ExtractQRegister(instr,
33576                                                                   22,
33577                                                                   12);
33578                                              unsigned rm =
33579                                                  ExtractDRegister(instr, 5, 0);
33580                                              uint32_t imm6 =
33581                                                  (instr >> 16) & 0x3f;
33582                                              uint32_t imm =
33583                                                  imm6 - dt.GetSize();
33584                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33585                                              vshll(CurrentCond(),
33586                                                    dt,
33587                                                    QRegister(rd),
33588                                                    DRegister(rm),
33589                                                    imm);
33590                                              break;
33591                                            }
33592                                            case 0x00170000: {
33593                                              // 0xef970a10
33594                                              if (((instr & 0x380000) == 0x0) ||
33595                                                  ((instr & 0x3f0000) ==
33596                                                   0x80000) ||
33597                                                  ((instr & 0x3f0000) ==
33598                                                   0x100000) ||
33599                                                  ((instr & 0x3f0000) ==
33600                                                   0x200000)) {
33601                                                UnallocatedT32(instr);
33602                                                return;
33603                                              }
33604                                              DataType dt =
33605                                                  Dt_imm6_4_Decode((instr >>
33606                                                                    19) &
33607                                                                       0x7,
33608                                                                   (instr >>
33609                                                                    28) &
33610                                                                       0x1);
33611                                              if (dt.Is(
33612                                                      kDataTypeValueInvalid)) {
33613                                                UnallocatedT32(instr);
33614                                                return;
33615                                              }
33616                                              if (((instr >> 12) & 1) != 0) {
33617                                                UnallocatedT32(instr);
33618                                                return;
33619                                              }
33620                                              unsigned rd =
33621                                                  ExtractQRegister(instr,
33622                                                                   22,
33623                                                                   12);
33624                                              unsigned rm =
33625                                                  ExtractDRegister(instr, 5, 0);
33626                                              uint32_t imm6 =
33627                                                  (instr >> 16) & 0x3f;
33628                                              uint32_t imm =
33629                                                  imm6 - dt.GetSize();
33630                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33631                                              vshll(CurrentCond(),
33632                                                    dt,
33633                                                    QRegister(rd),
33634                                                    DRegister(rm),
33635                                                    imm);
33636                                              break;
33637                                            }
33638                                            case 0x00180000: {
33639                                              // 0xef980a10
33640                                              if (((instr & 0x380000) == 0x0) ||
33641                                                  ((instr & 0x3f0000) ==
33642                                                   0x80000) ||
33643                                                  ((instr & 0x3f0000) ==
33644                                                   0x100000) ||
33645                                                  ((instr & 0x3f0000) ==
33646                                                   0x200000)) {
33647                                                UnallocatedT32(instr);
33648                                                return;
33649                                              }
33650                                              DataType dt =
33651                                                  Dt_imm6_4_Decode((instr >>
33652                                                                    19) &
33653                                                                       0x7,
33654                                                                   (instr >>
33655                                                                    28) &
33656                                                                       0x1);
33657                                              if (dt.Is(
33658                                                      kDataTypeValueInvalid)) {
33659                                                UnallocatedT32(instr);
33660                                                return;
33661                                              }
33662                                              if (((instr >> 12) & 1) != 0) {
33663                                                UnallocatedT32(instr);
33664                                                return;
33665                                              }
33666                                              unsigned rd =
33667                                                  ExtractQRegister(instr,
33668                                                                   22,
33669                                                                   12);
33670                                              unsigned rm =
33671                                                  ExtractDRegister(instr, 5, 0);
33672                                              uint32_t imm6 =
33673                                                  (instr >> 16) & 0x3f;
33674                                              uint32_t imm =
33675                                                  imm6 - dt.GetSize();
33676                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33677                                              vshll(CurrentCond(),
33678                                                    dt,
33679                                                    QRegister(rd),
33680                                                    DRegister(rm),
33681                                                    imm);
33682                                              break;
33683                                            }
33684                                            case 0x00190000: {
33685                                              // 0xef990a10
33686                                              if (((instr & 0x380000) == 0x0) ||
33687                                                  ((instr & 0x3f0000) ==
33688                                                   0x80000) ||
33689                                                  ((instr & 0x3f0000) ==
33690                                                   0x100000) ||
33691                                                  ((instr & 0x3f0000) ==
33692                                                   0x200000)) {
33693                                                UnallocatedT32(instr);
33694                                                return;
33695                                              }
33696                                              DataType dt =
33697                                                  Dt_imm6_4_Decode((instr >>
33698                                                                    19) &
33699                                                                       0x7,
33700                                                                   (instr >>
33701                                                                    28) &
33702                                                                       0x1);
33703                                              if (dt.Is(
33704                                                      kDataTypeValueInvalid)) {
33705                                                UnallocatedT32(instr);
33706                                                return;
33707                                              }
33708                                              if (((instr >> 12) & 1) != 0) {
33709                                                UnallocatedT32(instr);
33710                                                return;
33711                                              }
33712                                              unsigned rd =
33713                                                  ExtractQRegister(instr,
33714                                                                   22,
33715                                                                   12);
33716                                              unsigned rm =
33717                                                  ExtractDRegister(instr, 5, 0);
33718                                              uint32_t imm6 =
33719                                                  (instr >> 16) & 0x3f;
33720                                              uint32_t imm =
33721                                                  imm6 - dt.GetSize();
33722                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33723                                              vshll(CurrentCond(),
33724                                                    dt,
33725                                                    QRegister(rd),
33726                                                    DRegister(rm),
33727                                                    imm);
33728                                              break;
33729                                            }
33730                                            case 0x001a0000: {
33731                                              // 0xef9a0a10
33732                                              if (((instr & 0x380000) == 0x0) ||
33733                                                  ((instr & 0x3f0000) ==
33734                                                   0x80000) ||
33735                                                  ((instr & 0x3f0000) ==
33736                                                   0x100000) ||
33737                                                  ((instr & 0x3f0000) ==
33738                                                   0x200000)) {
33739                                                UnallocatedT32(instr);
33740                                                return;
33741                                              }
33742                                              DataType dt =
33743                                                  Dt_imm6_4_Decode((instr >>
33744                                                                    19) &
33745                                                                       0x7,
33746                                                                   (instr >>
33747                                                                    28) &
33748                                                                       0x1);
33749                                              if (dt.Is(
33750                                                      kDataTypeValueInvalid)) {
33751                                                UnallocatedT32(instr);
33752                                                return;
33753                                              }
33754                                              if (((instr >> 12) & 1) != 0) {
33755                                                UnallocatedT32(instr);
33756                                                return;
33757                                              }
33758                                              unsigned rd =
33759                                                  ExtractQRegister(instr,
33760                                                                   22,
33761                                                                   12);
33762                                              unsigned rm =
33763                                                  ExtractDRegister(instr, 5, 0);
33764                                              uint32_t imm6 =
33765                                                  (instr >> 16) & 0x3f;
33766                                              uint32_t imm =
33767                                                  imm6 - dt.GetSize();
33768                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33769                                              vshll(CurrentCond(),
33770                                                    dt,
33771                                                    QRegister(rd),
33772                                                    DRegister(rm),
33773                                                    imm);
33774                                              break;
33775                                            }
33776                                            case 0x001b0000: {
33777                                              // 0xef9b0a10
33778                                              if (((instr & 0x380000) == 0x0) ||
33779                                                  ((instr & 0x3f0000) ==
33780                                                   0x80000) ||
33781                                                  ((instr & 0x3f0000) ==
33782                                                   0x100000) ||
33783                                                  ((instr & 0x3f0000) ==
33784                                                   0x200000)) {
33785                                                UnallocatedT32(instr);
33786                                                return;
33787                                              }
33788                                              DataType dt =
33789                                                  Dt_imm6_4_Decode((instr >>
33790                                                                    19) &
33791                                                                       0x7,
33792                                                                   (instr >>
33793                                                                    28) &
33794                                                                       0x1);
33795                                              if (dt.Is(
33796                                                      kDataTypeValueInvalid)) {
33797                                                UnallocatedT32(instr);
33798                                                return;
33799                                              }
33800                                              if (((instr >> 12) & 1) != 0) {
33801                                                UnallocatedT32(instr);
33802                                                return;
33803                                              }
33804                                              unsigned rd =
33805                                                  ExtractQRegister(instr,
33806                                                                   22,
33807                                                                   12);
33808                                              unsigned rm =
33809                                                  ExtractDRegister(instr, 5, 0);
33810                                              uint32_t imm6 =
33811                                                  (instr >> 16) & 0x3f;
33812                                              uint32_t imm =
33813                                                  imm6 - dt.GetSize();
33814                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33815                                              vshll(CurrentCond(),
33816                                                    dt,
33817                                                    QRegister(rd),
33818                                                    DRegister(rm),
33819                                                    imm);
33820                                              break;
33821                                            }
33822                                            case 0x001c0000: {
33823                                              // 0xef9c0a10
33824                                              if (((instr & 0x380000) == 0x0) ||
33825                                                  ((instr & 0x3f0000) ==
33826                                                   0x80000) ||
33827                                                  ((instr & 0x3f0000) ==
33828                                                   0x100000) ||
33829                                                  ((instr & 0x3f0000) ==
33830                                                   0x200000)) {
33831                                                UnallocatedT32(instr);
33832                                                return;
33833                                              }
33834                                              DataType dt =
33835                                                  Dt_imm6_4_Decode((instr >>
33836                                                                    19) &
33837                                                                       0x7,
33838                                                                   (instr >>
33839                                                                    28) &
33840                                                                       0x1);
33841                                              if (dt.Is(
33842                                                      kDataTypeValueInvalid)) {
33843                                                UnallocatedT32(instr);
33844                                                return;
33845                                              }
33846                                              if (((instr >> 12) & 1) != 0) {
33847                                                UnallocatedT32(instr);
33848                                                return;
33849                                              }
33850                                              unsigned rd =
33851                                                  ExtractQRegister(instr,
33852                                                                   22,
33853                                                                   12);
33854                                              unsigned rm =
33855                                                  ExtractDRegister(instr, 5, 0);
33856                                              uint32_t imm6 =
33857                                                  (instr >> 16) & 0x3f;
33858                                              uint32_t imm =
33859                                                  imm6 - dt.GetSize();
33860                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33861                                              vshll(CurrentCond(),
33862                                                    dt,
33863                                                    QRegister(rd),
33864                                                    DRegister(rm),
33865                                                    imm);
33866                                              break;
33867                                            }
33868                                            case 0x001d0000: {
33869                                              // 0xef9d0a10
33870                                              if (((instr & 0x380000) == 0x0) ||
33871                                                  ((instr & 0x3f0000) ==
33872                                                   0x80000) ||
33873                                                  ((instr & 0x3f0000) ==
33874                                                   0x100000) ||
33875                                                  ((instr & 0x3f0000) ==
33876                                                   0x200000)) {
33877                                                UnallocatedT32(instr);
33878                                                return;
33879                                              }
33880                                              DataType dt =
33881                                                  Dt_imm6_4_Decode((instr >>
33882                                                                    19) &
33883                                                                       0x7,
33884                                                                   (instr >>
33885                                                                    28) &
33886                                                                       0x1);
33887                                              if (dt.Is(
33888                                                      kDataTypeValueInvalid)) {
33889                                                UnallocatedT32(instr);
33890                                                return;
33891                                              }
33892                                              if (((instr >> 12) & 1) != 0) {
33893                                                UnallocatedT32(instr);
33894                                                return;
33895                                              }
33896                                              unsigned rd =
33897                                                  ExtractQRegister(instr,
33898                                                                   22,
33899                                                                   12);
33900                                              unsigned rm =
33901                                                  ExtractDRegister(instr, 5, 0);
33902                                              uint32_t imm6 =
33903                                                  (instr >> 16) & 0x3f;
33904                                              uint32_t imm =
33905                                                  imm6 - dt.GetSize();
33906                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33907                                              vshll(CurrentCond(),
33908                                                    dt,
33909                                                    QRegister(rd),
33910                                                    DRegister(rm),
33911                                                    imm);
33912                                              break;
33913                                            }
33914                                            case 0x001e0000: {
33915                                              // 0xef9e0a10
33916                                              if (((instr & 0x380000) == 0x0) ||
33917                                                  ((instr & 0x3f0000) ==
33918                                                   0x80000) ||
33919                                                  ((instr & 0x3f0000) ==
33920                                                   0x100000) ||
33921                                                  ((instr & 0x3f0000) ==
33922                                                   0x200000)) {
33923                                                UnallocatedT32(instr);
33924                                                return;
33925                                              }
33926                                              DataType dt =
33927                                                  Dt_imm6_4_Decode((instr >>
33928                                                                    19) &
33929                                                                       0x7,
33930                                                                   (instr >>
33931                                                                    28) &
33932                                                                       0x1);
33933                                              if (dt.Is(
33934                                                      kDataTypeValueInvalid)) {
33935                                                UnallocatedT32(instr);
33936                                                return;
33937                                              }
33938                                              if (((instr >> 12) & 1) != 0) {
33939                                                UnallocatedT32(instr);
33940                                                return;
33941                                              }
33942                                              unsigned rd =
33943                                                  ExtractQRegister(instr,
33944                                                                   22,
33945                                                                   12);
33946                                              unsigned rm =
33947                                                  ExtractDRegister(instr, 5, 0);
33948                                              uint32_t imm6 =
33949                                                  (instr >> 16) & 0x3f;
33950                                              uint32_t imm =
33951                                                  imm6 - dt.GetSize();
33952                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33953                                              vshll(CurrentCond(),
33954                                                    dt,
33955                                                    QRegister(rd),
33956                                                    DRegister(rm),
33957                                                    imm);
33958                                              break;
33959                                            }
33960                                            case 0x001f0000: {
33961                                              // 0xef9f0a10
33962                                              if (((instr & 0x380000) == 0x0) ||
33963                                                  ((instr & 0x3f0000) ==
33964                                                   0x80000) ||
33965                                                  ((instr & 0x3f0000) ==
33966                                                   0x100000) ||
33967                                                  ((instr & 0x3f0000) ==
33968                                                   0x200000)) {
33969                                                UnallocatedT32(instr);
33970                                                return;
33971                                              }
33972                                              DataType dt =
33973                                                  Dt_imm6_4_Decode((instr >>
33974                                                                    19) &
33975                                                                       0x7,
33976                                                                   (instr >>
33977                                                                    28) &
33978                                                                       0x1);
33979                                              if (dt.Is(
33980                                                      kDataTypeValueInvalid)) {
33981                                                UnallocatedT32(instr);
33982                                                return;
33983                                              }
33984                                              if (((instr >> 12) & 1) != 0) {
33985                                                UnallocatedT32(instr);
33986                                                return;
33987                                              }
33988                                              unsigned rd =
33989                                                  ExtractQRegister(instr,
33990                                                                   22,
33991                                                                   12);
33992                                              unsigned rm =
33993                                                  ExtractDRegister(instr, 5, 0);
33994                                              uint32_t imm6 =
33995                                                  (instr >> 16) & 0x3f;
33996                                              uint32_t imm =
33997                                                  imm6 - dt.GetSize();
33998                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33999                                              vshll(CurrentCond(),
34000                                                    dt,
34001                                                    QRegister(rd),
34002                                                    DRegister(rm),
34003                                                    imm);
34004                                              break;
34005                                            }
34006                                            case 0x00200000: {
34007                                              // 0xefa00a10
34008                                              if (((instr & 0x380000) == 0x0) ||
34009                                                  ((instr & 0x380000) ==
34010                                                   0x180000) ||
34011                                                  ((instr & 0x380000) ==
34012                                                   0x280000) ||
34013                                                  ((instr & 0x380000) ==
34014                                                   0x300000) ||
34015                                                  ((instr & 0x380000) ==
34016                                                   0x380000)) {
34017                                                UnallocatedT32(instr);
34018                                                return;
34019                                              }
34020                                              DataType dt = Dt_U_imm3H_1_Decode(
34021                                                  ((instr >> 19) & 0x7) |
34022                                                  ((instr >> 25) & 0x8));
34023                                              if (dt.Is(
34024                                                      kDataTypeValueInvalid)) {
34025                                                UnallocatedT32(instr);
34026                                                return;
34027                                              }
34028                                              if (((instr >> 12) & 1) != 0) {
34029                                                UnallocatedT32(instr);
34030                                                return;
34031                                              }
34032                                              unsigned rd =
34033                                                  ExtractQRegister(instr,
34034                                                                   22,
34035                                                                   12);
34036                                              unsigned rm =
34037                                                  ExtractDRegister(instr, 5, 0);
34038                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
34039                                              vmovl(CurrentCond(),
34040                                                    dt,
34041                                                    QRegister(rd),
34042                                                    DRegister(rm));
34043                                              break;
34044                                            }
34045                                            case 0x00210000: {
34046                                              // 0xefa10a10
34047                                              if (((instr & 0x380000) == 0x0) ||
34048                                                  ((instr & 0x3f0000) ==
34049                                                   0x80000) ||
34050                                                  ((instr & 0x3f0000) ==
34051                                                   0x100000) ||
34052                                                  ((instr & 0x3f0000) ==
34053                                                   0x200000)) {
34054                                                UnallocatedT32(instr);
34055                                                return;
34056                                              }
34057                                              DataType dt =
34058                                                  Dt_imm6_4_Decode((instr >>
34059                                                                    19) &
34060                                                                       0x7,
34061                                                                   (instr >>
34062                                                                    28) &
34063                                                                       0x1);
34064                                              if (dt.Is(
34065                                                      kDataTypeValueInvalid)) {
34066                                                UnallocatedT32(instr);
34067                                                return;
34068                                              }
34069                                              if (((instr >> 12) & 1) != 0) {
34070                                                UnallocatedT32(instr);
34071                                                return;
34072                                              }
34073                                              unsigned rd =
34074                                                  ExtractQRegister(instr,
34075                                                                   22,
34076                                                                   12);
34077                                              unsigned rm =
34078                                                  ExtractDRegister(instr, 5, 0);
34079                                              uint32_t imm6 =
34080                                                  (instr >> 16) & 0x3f;
34081                                              uint32_t imm =
34082                                                  imm6 - dt.GetSize();
34083                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34084                                              vshll(CurrentCond(),
34085                                                    dt,
34086                                                    QRegister(rd),
34087                                                    DRegister(rm),
34088                                                    imm);
34089                                              break;
34090                                            }
34091                                            case 0x00220000: {
34092                                              // 0xefa20a10
34093                                              if (((instr & 0x380000) == 0x0) ||
34094                                                  ((instr & 0x3f0000) ==
34095                                                   0x80000) ||
34096                                                  ((instr & 0x3f0000) ==
34097                                                   0x100000) ||
34098                                                  ((instr & 0x3f0000) ==
34099                                                   0x200000)) {
34100                                                UnallocatedT32(instr);
34101                                                return;
34102                                              }
34103                                              DataType dt =
34104                                                  Dt_imm6_4_Decode((instr >>
34105                                                                    19) &
34106                                                                       0x7,
34107                                                                   (instr >>
34108                                                                    28) &
34109                                                                       0x1);
34110                                              if (dt.Is(
34111                                                      kDataTypeValueInvalid)) {
34112                                                UnallocatedT32(instr);
34113                                                return;
34114                                              }
34115                                              if (((instr >> 12) & 1) != 0) {
34116                                                UnallocatedT32(instr);
34117                                                return;
34118                                              }
34119                                              unsigned rd =
34120                                                  ExtractQRegister(instr,
34121                                                                   22,
34122                                                                   12);
34123                                              unsigned rm =
34124                                                  ExtractDRegister(instr, 5, 0);
34125                                              uint32_t imm6 =
34126                                                  (instr >> 16) & 0x3f;
34127                                              uint32_t imm =
34128                                                  imm6 - dt.GetSize();
34129                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34130                                              vshll(CurrentCond(),
34131                                                    dt,
34132                                                    QRegister(rd),
34133                                                    DRegister(rm),
34134                                                    imm);
34135                                              break;
34136                                            }
34137                                            case 0x00230000: {
34138                                              // 0xefa30a10
34139                                              if (((instr & 0x380000) == 0x0) ||
34140                                                  ((instr & 0x3f0000) ==
34141                                                   0x80000) ||
34142                                                  ((instr & 0x3f0000) ==
34143                                                   0x100000) ||
34144                                                  ((instr & 0x3f0000) ==
34145                                                   0x200000)) {
34146                                                UnallocatedT32(instr);
34147                                                return;
34148                                              }
34149                                              DataType dt =
34150                                                  Dt_imm6_4_Decode((instr >>
34151                                                                    19) &
34152                                                                       0x7,
34153                                                                   (instr >>
34154                                                                    28) &
34155                                                                       0x1);
34156                                              if (dt.Is(
34157                                                      kDataTypeValueInvalid)) {
34158                                                UnallocatedT32(instr);
34159                                                return;
34160                                              }
34161                                              if (((instr >> 12) & 1) != 0) {
34162                                                UnallocatedT32(instr);
34163                                                return;
34164                                              }
34165                                              unsigned rd =
34166                                                  ExtractQRegister(instr,
34167                                                                   22,
34168                                                                   12);
34169                                              unsigned rm =
34170                                                  ExtractDRegister(instr, 5, 0);
34171                                              uint32_t imm6 =
34172                                                  (instr >> 16) & 0x3f;
34173                                              uint32_t imm =
34174                                                  imm6 - dt.GetSize();
34175                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34176                                              vshll(CurrentCond(),
34177                                                    dt,
34178                                                    QRegister(rd),
34179                                                    DRegister(rm),
34180                                                    imm);
34181                                              break;
34182                                            }
34183                                            case 0x00240000: {
34184                                              // 0xefa40a10
34185                                              if (((instr & 0x380000) == 0x0) ||
34186                                                  ((instr & 0x3f0000) ==
34187                                                   0x80000) ||
34188                                                  ((instr & 0x3f0000) ==
34189                                                   0x100000) ||
34190                                                  ((instr & 0x3f0000) ==
34191                                                   0x200000)) {
34192                                                UnallocatedT32(instr);
34193                                                return;
34194                                              }
34195                                              DataType dt =
34196                                                  Dt_imm6_4_Decode((instr >>
34197                                                                    19) &
34198                                                                       0x7,
34199                                                                   (instr >>
34200                                                                    28) &
34201                                                                       0x1);
34202                                              if (dt.Is(
34203                                                      kDataTypeValueInvalid)) {
34204                                                UnallocatedT32(instr);
34205                                                return;
34206                                              }
34207                                              if (((instr >> 12) & 1) != 0) {
34208                                                UnallocatedT32(instr);
34209                                                return;
34210                                              }
34211                                              unsigned rd =
34212                                                  ExtractQRegister(instr,
34213                                                                   22,
34214                                                                   12);
34215                                              unsigned rm =
34216                                                  ExtractDRegister(instr, 5, 0);
34217                                              uint32_t imm6 =
34218                                                  (instr >> 16) & 0x3f;
34219                                              uint32_t imm =
34220                                                  imm6 - dt.GetSize();
34221                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34222                                              vshll(CurrentCond(),
34223                                                    dt,
34224                                                    QRegister(rd),
34225                                                    DRegister(rm),
34226                                                    imm);
34227                                              break;
34228                                            }
34229                                            case 0x00250000: {
34230                                              // 0xefa50a10
34231                                              if (((instr & 0x380000) == 0x0) ||
34232                                                  ((instr & 0x3f0000) ==
34233                                                   0x80000) ||
34234                                                  ((instr & 0x3f0000) ==
34235                                                   0x100000) ||
34236                                                  ((instr & 0x3f0000) ==
34237                                                   0x200000)) {
34238                                                UnallocatedT32(instr);
34239                                                return;
34240                                              }
34241                                              DataType dt =
34242                                                  Dt_imm6_4_Decode((instr >>
34243                                                                    19) &
34244                                                                       0x7,
34245                                                                   (instr >>
34246                                                                    28) &
34247                                                                       0x1);
34248                                              if (dt.Is(
34249                                                      kDataTypeValueInvalid)) {
34250                                                UnallocatedT32(instr);
34251                                                return;
34252                                              }
34253                                              if (((instr >> 12) & 1) != 0) {
34254                                                UnallocatedT32(instr);
34255                                                return;
34256                                              }
34257                                              unsigned rd =
34258                                                  ExtractQRegister(instr,
34259                                                                   22,
34260                                                                   12);
34261                                              unsigned rm =
34262                                                  ExtractDRegister(instr, 5, 0);
34263                                              uint32_t imm6 =
34264                                                  (instr >> 16) & 0x3f;
34265                                              uint32_t imm =
34266                                                  imm6 - dt.GetSize();
34267                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34268                                              vshll(CurrentCond(),
34269                                                    dt,
34270                                                    QRegister(rd),
34271                                                    DRegister(rm),
34272                                                    imm);
34273                                              break;
34274                                            }
34275                                            case 0x00260000: {
34276                                              // 0xefa60a10
34277                                              if (((instr & 0x380000) == 0x0) ||
34278                                                  ((instr & 0x3f0000) ==
34279                                                   0x80000) ||
34280                                                  ((instr & 0x3f0000) ==
34281                                                   0x100000) ||
34282                                                  ((instr & 0x3f0000) ==
34283                                                   0x200000)) {
34284                                                UnallocatedT32(instr);
34285                                                return;
34286                                              }
34287                                              DataType dt =
34288                                                  Dt_imm6_4_Decode((instr >>
34289                                                                    19) &
34290                                                                       0x7,
34291                                                                   (instr >>
34292                                                                    28) &
34293                                                                       0x1);
34294                                              if (dt.Is(
34295                                                      kDataTypeValueInvalid)) {
34296                                                UnallocatedT32(instr);
34297                                                return;
34298                                              }
34299                                              if (((instr >> 12) & 1) != 0) {
34300                                                UnallocatedT32(instr);
34301                                                return;
34302                                              }
34303                                              unsigned rd =
34304                                                  ExtractQRegister(instr,
34305                                                                   22,
34306                                                                   12);
34307                                              unsigned rm =
34308                                                  ExtractDRegister(instr, 5, 0);
34309                                              uint32_t imm6 =
34310                                                  (instr >> 16) & 0x3f;
34311                                              uint32_t imm =
34312                                                  imm6 - dt.GetSize();
34313                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34314                                              vshll(CurrentCond(),
34315                                                    dt,
34316                                                    QRegister(rd),
34317                                                    DRegister(rm),
34318                                                    imm);
34319                                              break;
34320                                            }
34321                                            case 0x00270000: {
34322                                              // 0xefa70a10
34323                                              if (((instr & 0x380000) == 0x0) ||
34324                                                  ((instr & 0x3f0000) ==
34325                                                   0x80000) ||
34326                                                  ((instr & 0x3f0000) ==
34327                                                   0x100000) ||
34328                                                  ((instr & 0x3f0000) ==
34329                                                   0x200000)) {
34330                                                UnallocatedT32(instr);
34331                                                return;
34332                                              }
34333                                              DataType dt =
34334                                                  Dt_imm6_4_Decode((instr >>
34335                                                                    19) &
34336                                                                       0x7,
34337                                                                   (instr >>
34338                                                                    28) &
34339                                                                       0x1);
34340                                              if (dt.Is(
34341                                                      kDataTypeValueInvalid)) {
34342                                                UnallocatedT32(instr);
34343                                                return;
34344                                              }
34345                                              if (((instr >> 12) & 1) != 0) {
34346                                                UnallocatedT32(instr);
34347                                                return;
34348                                              }
34349                                              unsigned rd =
34350                                                  ExtractQRegister(instr,
34351                                                                   22,
34352                                                                   12);
34353                                              unsigned rm =
34354                                                  ExtractDRegister(instr, 5, 0);
34355                                              uint32_t imm6 =
34356                                                  (instr >> 16) & 0x3f;
34357                                              uint32_t imm =
34358                                                  imm6 - dt.GetSize();
34359                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34360                                              vshll(CurrentCond(),
34361                                                    dt,
34362                                                    QRegister(rd),
34363                                                    DRegister(rm),
34364                                                    imm);
34365                                              break;
34366                                            }
34367                                            case 0x00280000: {
34368                                              // 0xefa80a10
34369                                              if (((instr & 0x380000) == 0x0) ||
34370                                                  ((instr & 0x3f0000) ==
34371                                                   0x80000) ||
34372                                                  ((instr & 0x3f0000) ==
34373                                                   0x100000) ||
34374                                                  ((instr & 0x3f0000) ==
34375                                                   0x200000)) {
34376                                                UnallocatedT32(instr);
34377                                                return;
34378                                              }
34379                                              DataType dt =
34380                                                  Dt_imm6_4_Decode((instr >>
34381                                                                    19) &
34382                                                                       0x7,
34383                                                                   (instr >>
34384                                                                    28) &
34385                                                                       0x1);
34386                                              if (dt.Is(
34387                                                      kDataTypeValueInvalid)) {
34388                                                UnallocatedT32(instr);
34389                                                return;
34390                                              }
34391                                              if (((instr >> 12) & 1) != 0) {
34392                                                UnallocatedT32(instr);
34393                                                return;
34394                                              }
34395                                              unsigned rd =
34396                                                  ExtractQRegister(instr,
34397                                                                   22,
34398                                                                   12);
34399                                              unsigned rm =
34400                                                  ExtractDRegister(instr, 5, 0);
34401                                              uint32_t imm6 =
34402                                                  (instr >> 16) & 0x3f;
34403                                              uint32_t imm =
34404                                                  imm6 - dt.GetSize();
34405                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34406                                              vshll(CurrentCond(),
34407                                                    dt,
34408                                                    QRegister(rd),
34409                                                    DRegister(rm),
34410                                                    imm);
34411                                              break;
34412                                            }
34413                                            case 0x00290000: {
34414                                              // 0xefa90a10
34415                                              if (((instr & 0x380000) == 0x0) ||
34416                                                  ((instr & 0x3f0000) ==
34417                                                   0x80000) ||
34418                                                  ((instr & 0x3f0000) ==
34419                                                   0x100000) ||
34420                                                  ((instr & 0x3f0000) ==
34421                                                   0x200000)) {
34422                                                UnallocatedT32(instr);
34423                                                return;
34424                                              }
34425                                              DataType dt =
34426                                                  Dt_imm6_4_Decode((instr >>
34427                                                                    19) &
34428                                                                       0x7,
34429                                                                   (instr >>
34430                                                                    28) &
34431                                                                       0x1);
34432                                              if (dt.Is(
34433                                                      kDataTypeValueInvalid)) {
34434                                                UnallocatedT32(instr);
34435                                                return;
34436                                              }
34437                                              if (((instr >> 12) & 1) != 0) {
34438                                                UnallocatedT32(instr);
34439                                                return;
34440                                              }
34441                                              unsigned rd =
34442                                                  ExtractQRegister(instr,
34443                                                                   22,
34444                                                                   12);
34445                                              unsigned rm =
34446                                                  ExtractDRegister(instr, 5, 0);
34447                                              uint32_t imm6 =
34448                                                  (instr >> 16) & 0x3f;
34449                                              uint32_t imm =
34450                                                  imm6 - dt.GetSize();
34451                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34452                                              vshll(CurrentCond(),
34453                                                    dt,
34454                                                    QRegister(rd),
34455                                                    DRegister(rm),
34456                                                    imm);
34457                                              break;
34458                                            }
34459                                            case 0x002a0000: {
34460                                              // 0xefaa0a10
34461                                              if (((instr & 0x380000) == 0x0) ||
34462                                                  ((instr & 0x3f0000) ==
34463                                                   0x80000) ||
34464                                                  ((instr & 0x3f0000) ==
34465                                                   0x100000) ||
34466                                                  ((instr & 0x3f0000) ==
34467                                                   0x200000)) {
34468                                                UnallocatedT32(instr);
34469                                                return;
34470                                              }
34471                                              DataType dt =
34472                                                  Dt_imm6_4_Decode((instr >>
34473                                                                    19) &
34474                                                                       0x7,
34475                                                                   (instr >>
34476                                                                    28) &
34477                                                                       0x1);
34478                                              if (dt.Is(
34479                                                      kDataTypeValueInvalid)) {
34480                                                UnallocatedT32(instr);
34481                                                return;
34482                                              }
34483                                              if (((instr >> 12) & 1) != 0) {
34484                                                UnallocatedT32(instr);
34485                                                return;
34486                                              }
34487                                              unsigned rd =
34488                                                  ExtractQRegister(instr,
34489                                                                   22,
34490                                                                   12);
34491                                              unsigned rm =
34492                                                  ExtractDRegister(instr, 5, 0);
34493                                              uint32_t imm6 =
34494                                                  (instr >> 16) & 0x3f;
34495                                              uint32_t imm =
34496                                                  imm6 - dt.GetSize();
34497                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34498                                              vshll(CurrentCond(),
34499                                                    dt,
34500                                                    QRegister(rd),
34501                                                    DRegister(rm),
34502                                                    imm);
34503                                              break;
34504                                            }
34505                                            case 0x002b0000: {
34506                                              // 0xefab0a10
34507                                              if (((instr & 0x380000) == 0x0) ||
34508                                                  ((instr & 0x3f0000) ==
34509                                                   0x80000) ||
34510                                                  ((instr & 0x3f0000) ==
34511                                                   0x100000) ||
34512                                                  ((instr & 0x3f0000) ==
34513                                                   0x200000)) {
34514                                                UnallocatedT32(instr);
34515                                                return;
34516                                              }
34517                                              DataType dt =
34518                                                  Dt_imm6_4_Decode((instr >>
34519                                                                    19) &
34520                                                                       0x7,
34521                                                                   (instr >>
34522                                                                    28) &
34523                                                                       0x1);
34524                                              if (dt.Is(
34525                                                      kDataTypeValueInvalid)) {
34526                                                UnallocatedT32(instr);
34527                                                return;
34528                                              }
34529                                              if (((instr >> 12) & 1) != 0) {
34530                                                UnallocatedT32(instr);
34531                                                return;
34532                                              }
34533                                              unsigned rd =
34534                                                  ExtractQRegister(instr,
34535                                                                   22,
34536                                                                   12);
34537                                              unsigned rm =
34538                                                  ExtractDRegister(instr, 5, 0);
34539                                              uint32_t imm6 =
34540                                                  (instr >> 16) & 0x3f;
34541                                              uint32_t imm =
34542                                                  imm6 - dt.GetSize();
34543                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34544                                              vshll(CurrentCond(),
34545                                                    dt,
34546                                                    QRegister(rd),
34547                                                    DRegister(rm),
34548                                                    imm);
34549                                              break;
34550                                            }
34551                                            case 0x002c0000: {
34552                                              // 0xefac0a10
34553                                              if (((instr & 0x380000) == 0x0) ||
34554                                                  ((instr & 0x3f0000) ==
34555                                                   0x80000) ||
34556                                                  ((instr & 0x3f0000) ==
34557                                                   0x100000) ||
34558                                                  ((instr & 0x3f0000) ==
34559                                                   0x200000)) {
34560                                                UnallocatedT32(instr);
34561                                                return;
34562                                              }
34563                                              DataType dt =
34564                                                  Dt_imm6_4_Decode((instr >>
34565                                                                    19) &
34566                                                                       0x7,
34567                                                                   (instr >>
34568                                                                    28) &
34569                                                                       0x1);
34570                                              if (dt.Is(
34571                                                      kDataTypeValueInvalid)) {
34572                                                UnallocatedT32(instr);
34573                                                return;
34574                                              }
34575                                              if (((instr >> 12) & 1) != 0) {
34576                                                UnallocatedT32(instr);
34577                                                return;
34578                                              }
34579                                              unsigned rd =
34580                                                  ExtractQRegister(instr,
34581                                                                   22,
34582                                                                   12);
34583                                              unsigned rm =
34584                                                  ExtractDRegister(instr, 5, 0);
34585                                              uint32_t imm6 =
34586                                                  (instr >> 16) & 0x3f;
34587                                              uint32_t imm =
34588                                                  imm6 - dt.GetSize();
34589                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34590                                              vshll(CurrentCond(),
34591                                                    dt,
34592                                                    QRegister(rd),
34593                                                    DRegister(rm),
34594                                                    imm);
34595                                              break;
34596                                            }
34597                                            case 0x002d0000: {
34598                                              // 0xefad0a10
34599                                              if (((instr & 0x380000) == 0x0) ||
34600                                                  ((instr & 0x3f0000) ==
34601                                                   0x80000) ||
34602                                                  ((instr & 0x3f0000) ==
34603                                                   0x100000) ||
34604                                                  ((instr & 0x3f0000) ==
34605                                                   0x200000)) {
34606                                                UnallocatedT32(instr);
34607                                                return;
34608                                              }
34609                                              DataType dt =
34610                                                  Dt_imm6_4_Decode((instr >>
34611                                                                    19) &
34612                                                                       0x7,
34613                                                                   (instr >>
34614                                                                    28) &
34615                                                                       0x1);
34616                                              if (dt.Is(
34617                                                      kDataTypeValueInvalid)) {
34618                                                UnallocatedT32(instr);
34619                                                return;
34620                                              }
34621                                              if (((instr >> 12) & 1) != 0) {
34622                                                UnallocatedT32(instr);
34623                                                return;
34624                                              }
34625                                              unsigned rd =
34626                                                  ExtractQRegister(instr,
34627                                                                   22,
34628                                                                   12);
34629                                              unsigned rm =
34630                                                  ExtractDRegister(instr, 5, 0);
34631                                              uint32_t imm6 =
34632                                                  (instr >> 16) & 0x3f;
34633                                              uint32_t imm =
34634                                                  imm6 - dt.GetSize();
34635                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34636                                              vshll(CurrentCond(),
34637                                                    dt,
34638                                                    QRegister(rd),
34639                                                    DRegister(rm),
34640                                                    imm);
34641                                              break;
34642                                            }
34643                                            case 0x002e0000: {
34644                                              // 0xefae0a10
34645                                              if (((instr & 0x380000) == 0x0) ||
34646                                                  ((instr & 0x3f0000) ==
34647                                                   0x80000) ||
34648                                                  ((instr & 0x3f0000) ==
34649                                                   0x100000) ||
34650                                                  ((instr & 0x3f0000) ==
34651                                                   0x200000)) {
34652                                                UnallocatedT32(instr);
34653                                                return;
34654                                              }
34655                                              DataType dt =
34656                                                  Dt_imm6_4_Decode((instr >>
34657                                                                    19) &
34658                                                                       0x7,
34659                                                                   (instr >>
34660                                                                    28) &
34661                                                                       0x1);
34662                                              if (dt.Is(
34663                                                      kDataTypeValueInvalid)) {
34664                                                UnallocatedT32(instr);
34665                                                return;
34666                                              }
34667                                              if (((instr >> 12) & 1) != 0) {
34668                                                UnallocatedT32(instr);
34669                                                return;
34670                                              }
34671                                              unsigned rd =
34672                                                  ExtractQRegister(instr,
34673                                                                   22,
34674                                                                   12);
34675                                              unsigned rm =
34676                                                  ExtractDRegister(instr, 5, 0);
34677                                              uint32_t imm6 =
34678                                                  (instr >> 16) & 0x3f;
34679                                              uint32_t imm =
34680                                                  imm6 - dt.GetSize();
34681                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34682                                              vshll(CurrentCond(),
34683                                                    dt,
34684                                                    QRegister(rd),
34685                                                    DRegister(rm),
34686                                                    imm);
34687                                              break;
34688                                            }
34689                                            case 0x002f0000: {
34690                                              // 0xefaf0a10
34691                                              if (((instr & 0x380000) == 0x0) ||
34692                                                  ((instr & 0x3f0000) ==
34693                                                   0x80000) ||
34694                                                  ((instr & 0x3f0000) ==
34695                                                   0x100000) ||
34696                                                  ((instr & 0x3f0000) ==
34697                                                   0x200000)) {
34698                                                UnallocatedT32(instr);
34699                                                return;
34700                                              }
34701                                              DataType dt =
34702                                                  Dt_imm6_4_Decode((instr >>
34703                                                                    19) &
34704                                                                       0x7,
34705                                                                   (instr >>
34706                                                                    28) &
34707                                                                       0x1);
34708                                              if (dt.Is(
34709                                                      kDataTypeValueInvalid)) {
34710                                                UnallocatedT32(instr);
34711                                                return;
34712                                              }
34713                                              if (((instr >> 12) & 1) != 0) {
34714                                                UnallocatedT32(instr);
34715                                                return;
34716                                              }
34717                                              unsigned rd =
34718                                                  ExtractQRegister(instr,
34719                                                                   22,
34720                                                                   12);
34721                                              unsigned rm =
34722                                                  ExtractDRegister(instr, 5, 0);
34723                                              uint32_t imm6 =
34724                                                  (instr >> 16) & 0x3f;
34725                                              uint32_t imm =
34726                                                  imm6 - dt.GetSize();
34727                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34728                                              vshll(CurrentCond(),
34729                                                    dt,
34730                                                    QRegister(rd),
34731                                                    DRegister(rm),
34732                                                    imm);
34733                                              break;
34734                                            }
34735                                            case 0x00300000: {
34736                                              // 0xefb00a10
34737                                              if (((instr & 0x380000) == 0x0) ||
34738                                                  ((instr & 0x3f0000) ==
34739                                                   0x80000) ||
34740                                                  ((instr & 0x3f0000) ==
34741                                                   0x100000) ||
34742                                                  ((instr & 0x3f0000) ==
34743                                                   0x200000)) {
34744                                                UnallocatedT32(instr);
34745                                                return;
34746                                              }
34747                                              DataType dt =
34748                                                  Dt_imm6_4_Decode((instr >>
34749                                                                    19) &
34750                                                                       0x7,
34751                                                                   (instr >>
34752                                                                    28) &
34753                                                                       0x1);
34754                                              if (dt.Is(
34755                                                      kDataTypeValueInvalid)) {
34756                                                UnallocatedT32(instr);
34757                                                return;
34758                                              }
34759                                              if (((instr >> 12) & 1) != 0) {
34760                                                UnallocatedT32(instr);
34761                                                return;
34762                                              }
34763                                              unsigned rd =
34764                                                  ExtractQRegister(instr,
34765                                                                   22,
34766                                                                   12);
34767                                              unsigned rm =
34768                                                  ExtractDRegister(instr, 5, 0);
34769                                              uint32_t imm6 =
34770                                                  (instr >> 16) & 0x3f;
34771                                              uint32_t imm =
34772                                                  imm6 - dt.GetSize();
34773                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34774                                              vshll(CurrentCond(),
34775                                                    dt,
34776                                                    QRegister(rd),
34777                                                    DRegister(rm),
34778                                                    imm);
34779                                              break;
34780                                            }
34781                                            case 0x00310000: {
34782                                              // 0xefb10a10
34783                                              if (((instr & 0x380000) == 0x0) ||
34784                                                  ((instr & 0x3f0000) ==
34785                                                   0x80000) ||
34786                                                  ((instr & 0x3f0000) ==
34787                                                   0x100000) ||
34788                                                  ((instr & 0x3f0000) ==
34789                                                   0x200000)) {
34790                                                UnallocatedT32(instr);
34791                                                return;
34792                                              }
34793                                              DataType dt =
34794                                                  Dt_imm6_4_Decode((instr >>
34795                                                                    19) &
34796                                                                       0x7,
34797                                                                   (instr >>
34798                                                                    28) &
34799                                                                       0x1);
34800                                              if (dt.Is(
34801                                                      kDataTypeValueInvalid)) {
34802                                                UnallocatedT32(instr);
34803                                                return;
34804                                              }
34805                                              if (((instr >> 12) & 1) != 0) {
34806                                                UnallocatedT32(instr);
34807                                                return;
34808                                              }
34809                                              unsigned rd =
34810                                                  ExtractQRegister(instr,
34811                                                                   22,
34812                                                                   12);
34813                                              unsigned rm =
34814                                                  ExtractDRegister(instr, 5, 0);
34815                                              uint32_t imm6 =
34816                                                  (instr >> 16) & 0x3f;
34817                                              uint32_t imm =
34818                                                  imm6 - dt.GetSize();
34819                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34820                                              vshll(CurrentCond(),
34821                                                    dt,
34822                                                    QRegister(rd),
34823                                                    DRegister(rm),
34824                                                    imm);
34825                                              break;
34826                                            }
34827                                            case 0x00320000: {
34828                                              // 0xefb20a10
34829                                              if (((instr & 0x380000) == 0x0) ||
34830                                                  ((instr & 0x3f0000) ==
34831                                                   0x80000) ||
34832                                                  ((instr & 0x3f0000) ==
34833                                                   0x100000) ||
34834                                                  ((instr & 0x3f0000) ==
34835                                                   0x200000)) {
34836                                                UnallocatedT32(instr);
34837                                                return;
34838                                              }
34839                                              DataType dt =
34840                                                  Dt_imm6_4_Decode((instr >>
34841                                                                    19) &
34842                                                                       0x7,
34843                                                                   (instr >>
34844                                                                    28) &
34845                                                                       0x1);
34846                                              if (dt.Is(
34847                                                      kDataTypeValueInvalid)) {
34848                                                UnallocatedT32(instr);
34849                                                return;
34850                                              }
34851                                              if (((instr >> 12) & 1) != 0) {
34852                                                UnallocatedT32(instr);
34853                                                return;
34854                                              }
34855                                              unsigned rd =
34856                                                  ExtractQRegister(instr,
34857                                                                   22,
34858                                                                   12);
34859                                              unsigned rm =
34860                                                  ExtractDRegister(instr, 5, 0);
34861                                              uint32_t imm6 =
34862                                                  (instr >> 16) & 0x3f;
34863                                              uint32_t imm =
34864                                                  imm6 - dt.GetSize();
34865                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34866                                              vshll(CurrentCond(),
34867                                                    dt,
34868                                                    QRegister(rd),
34869                                                    DRegister(rm),
34870                                                    imm);
34871                                              break;
34872                                            }
34873                                            case 0x00330000: {
34874                                              // 0xefb30a10
34875                                              if (((instr & 0x380000) == 0x0) ||
34876                                                  ((instr & 0x3f0000) ==
34877                                                   0x80000) ||
34878                                                  ((instr & 0x3f0000) ==
34879                                                   0x100000) ||
34880                                                  ((instr & 0x3f0000) ==
34881                                                   0x200000)) {
34882                                                UnallocatedT32(instr);
34883                                                return;
34884                                              }
34885                                              DataType dt =
34886                                                  Dt_imm6_4_Decode((instr >>
34887                                                                    19) &
34888                                                                       0x7,
34889                                                                   (instr >>
34890                                                                    28) &
34891                                                                       0x1);
34892                                              if (dt.Is(
34893                                                      kDataTypeValueInvalid)) {
34894                                                UnallocatedT32(instr);
34895                                                return;
34896                                              }
34897                                              if (((instr >> 12) & 1) != 0) {
34898                                                UnallocatedT32(instr);
34899                                                return;
34900                                              }
34901                                              unsigned rd =
34902                                                  ExtractQRegister(instr,
34903                                                                   22,
34904                                                                   12);
34905                                              unsigned rm =
34906                                                  ExtractDRegister(instr, 5, 0);
34907                                              uint32_t imm6 =
34908                                                  (instr >> 16) & 0x3f;
34909                                              uint32_t imm =
34910                                                  imm6 - dt.GetSize();
34911                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34912                                              vshll(CurrentCond(),
34913                                                    dt,
34914                                                    QRegister(rd),
34915                                                    DRegister(rm),
34916                                                    imm);
34917                                              break;
34918                                            }
34919                                            case 0x00340000: {
34920                                              // 0xefb40a10
34921                                              if (((instr & 0x380000) == 0x0) ||
34922                                                  ((instr & 0x3f0000) ==
34923                                                   0x80000) ||
34924                                                  ((instr & 0x3f0000) ==
34925                                                   0x100000) ||
34926                                                  ((instr & 0x3f0000) ==
34927                                                   0x200000)) {
34928                                                UnallocatedT32(instr);
34929                                                return;
34930                                              }
34931                                              DataType dt =
34932                                                  Dt_imm6_4_Decode((instr >>
34933                                                                    19) &
34934                                                                       0x7,
34935                                                                   (instr >>
34936                                                                    28) &
34937                                                                       0x1);
34938                                              if (dt.Is(
34939                                                      kDataTypeValueInvalid)) {
34940                                                UnallocatedT32(instr);
34941                                                return;
34942                                              }
34943                                              if (((instr >> 12) & 1) != 0) {
34944                                                UnallocatedT32(instr);
34945                                                return;
34946                                              }
34947                                              unsigned rd =
34948                                                  ExtractQRegister(instr,
34949                                                                   22,
34950                                                                   12);
34951                                              unsigned rm =
34952                                                  ExtractDRegister(instr, 5, 0);
34953                                              uint32_t imm6 =
34954                                                  (instr >> 16) & 0x3f;
34955                                              uint32_t imm =
34956                                                  imm6 - dt.GetSize();
34957                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34958                                              vshll(CurrentCond(),
34959                                                    dt,
34960                                                    QRegister(rd),
34961                                                    DRegister(rm),
34962                                                    imm);
34963                                              break;
34964                                            }
34965                                            case 0x00350000: {
34966                                              // 0xefb50a10
34967                                              if (((instr & 0x380000) == 0x0) ||
34968                                                  ((instr & 0x3f0000) ==
34969                                                   0x80000) ||
34970                                                  ((instr & 0x3f0000) ==
34971                                                   0x100000) ||
34972                                                  ((instr & 0x3f0000) ==
34973                                                   0x200000)) {
34974                                                UnallocatedT32(instr);
34975                                                return;
34976                                              }
34977                                              DataType dt =
34978                                                  Dt_imm6_4_Decode((instr >>
34979                                                                    19) &
34980                                                                       0x7,
34981                                                                   (instr >>
34982                                                                    28) &
34983                                                                       0x1);
34984                                              if (dt.Is(
34985                                                      kDataTypeValueInvalid)) {
34986                                                UnallocatedT32(instr);
34987                                                return;
34988                                              }
34989                                              if (((instr >> 12) & 1) != 0) {
34990                                                UnallocatedT32(instr);
34991                                                return;
34992                                              }
34993                                              unsigned rd =
34994                                                  ExtractQRegister(instr,
34995                                                                   22,
34996                                                                   12);
34997                                              unsigned rm =
34998                                                  ExtractDRegister(instr, 5, 0);
34999                                              uint32_t imm6 =
35000                                                  (instr >> 16) & 0x3f;
35001                                              uint32_t imm =
35002                                                  imm6 - dt.GetSize();
35003                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35004                                              vshll(CurrentCond(),
35005                                                    dt,
35006                                                    QRegister(rd),
35007                                                    DRegister(rm),
35008                                                    imm);
35009                                              break;
35010                                            }
35011                                            case 0x00360000: {
35012                                              // 0xefb60a10
35013                                              if (((instr & 0x380000) == 0x0) ||
35014                                                  ((instr & 0x3f0000) ==
35015                                                   0x80000) ||
35016                                                  ((instr & 0x3f0000) ==
35017                                                   0x100000) ||
35018                                                  ((instr & 0x3f0000) ==
35019                                                   0x200000)) {
35020                                                UnallocatedT32(instr);
35021                                                return;
35022                                              }
35023                                              DataType dt =
35024                                                  Dt_imm6_4_Decode((instr >>
35025                                                                    19) &
35026                                                                       0x7,
35027                                                                   (instr >>
35028                                                                    28) &
35029                                                                       0x1);
35030                                              if (dt.Is(
35031                                                      kDataTypeValueInvalid)) {
35032                                                UnallocatedT32(instr);
35033                                                return;
35034                                              }
35035                                              if (((instr >> 12) & 1) != 0) {
35036                                                UnallocatedT32(instr);
35037                                                return;
35038                                              }
35039                                              unsigned rd =
35040                                                  ExtractQRegister(instr,
35041                                                                   22,
35042                                                                   12);
35043                                              unsigned rm =
35044                                                  ExtractDRegister(instr, 5, 0);
35045                                              uint32_t imm6 =
35046                                                  (instr >> 16) & 0x3f;
35047                                              uint32_t imm =
35048                                                  imm6 - dt.GetSize();
35049                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35050                                              vshll(CurrentCond(),
35051                                                    dt,
35052                                                    QRegister(rd),
35053                                                    DRegister(rm),
35054                                                    imm);
35055                                              break;
35056                                            }
35057                                            case 0x00370000: {
35058                                              // 0xefb70a10
35059                                              if (((instr & 0x380000) == 0x0) ||
35060                                                  ((instr & 0x3f0000) ==
35061                                                   0x80000) ||
35062                                                  ((instr & 0x3f0000) ==
35063                                                   0x100000) ||
35064                                                  ((instr & 0x3f0000) ==
35065                                                   0x200000)) {
35066                                                UnallocatedT32(instr);
35067                                                return;
35068                                              }
35069                                              DataType dt =
35070                                                  Dt_imm6_4_Decode((instr >>
35071                                                                    19) &
35072                                                                       0x7,
35073                                                                   (instr >>
35074                                                                    28) &
35075                                                                       0x1);
35076                                              if (dt.Is(
35077                                                      kDataTypeValueInvalid)) {
35078                                                UnallocatedT32(instr);
35079                                                return;
35080                                              }
35081                                              if (((instr >> 12) & 1) != 0) {
35082                                                UnallocatedT32(instr);
35083                                                return;
35084                                              }
35085                                              unsigned rd =
35086                                                  ExtractQRegister(instr,
35087                                                                   22,
35088                                                                   12);
35089                                              unsigned rm =
35090                                                  ExtractDRegister(instr, 5, 0);
35091                                              uint32_t imm6 =
35092                                                  (instr >> 16) & 0x3f;
35093                                              uint32_t imm =
35094                                                  imm6 - dt.GetSize();
35095                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35096                                              vshll(CurrentCond(),
35097                                                    dt,
35098                                                    QRegister(rd),
35099                                                    DRegister(rm),
35100                                                    imm);
35101                                              break;
35102                                            }
35103                                            case 0x00380000: {
35104                                              // 0xefb80a10
35105                                              if (((instr & 0x380000) == 0x0) ||
35106                                                  ((instr & 0x3f0000) ==
35107                                                   0x80000) ||
35108                                                  ((instr & 0x3f0000) ==
35109                                                   0x100000) ||
35110                                                  ((instr & 0x3f0000) ==
35111                                                   0x200000)) {
35112                                                UnallocatedT32(instr);
35113                                                return;
35114                                              }
35115                                              DataType dt =
35116                                                  Dt_imm6_4_Decode((instr >>
35117                                                                    19) &
35118                                                                       0x7,
35119                                                                   (instr >>
35120                                                                    28) &
35121                                                                       0x1);
35122                                              if (dt.Is(
35123                                                      kDataTypeValueInvalid)) {
35124                                                UnallocatedT32(instr);
35125                                                return;
35126                                              }
35127                                              if (((instr >> 12) & 1) != 0) {
35128                                                UnallocatedT32(instr);
35129                                                return;
35130                                              }
35131                                              unsigned rd =
35132                                                  ExtractQRegister(instr,
35133                                                                   22,
35134                                                                   12);
35135                                              unsigned rm =
35136                                                  ExtractDRegister(instr, 5, 0);
35137                                              uint32_t imm6 =
35138                                                  (instr >> 16) & 0x3f;
35139                                              uint32_t imm =
35140                                                  imm6 - dt.GetSize();
35141                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35142                                              vshll(CurrentCond(),
35143                                                    dt,
35144                                                    QRegister(rd),
35145                                                    DRegister(rm),
35146                                                    imm);
35147                                              break;
35148                                            }
35149                                            case 0x00390000: {
35150                                              // 0xefb90a10
35151                                              if (((instr & 0x380000) == 0x0) ||
35152                                                  ((instr & 0x3f0000) ==
35153                                                   0x80000) ||
35154                                                  ((instr & 0x3f0000) ==
35155                                                   0x100000) ||
35156                                                  ((instr & 0x3f0000) ==
35157                                                   0x200000)) {
35158                                                UnallocatedT32(instr);
35159                                                return;
35160                                              }
35161                                              DataType dt =
35162                                                  Dt_imm6_4_Decode((instr >>
35163                                                                    19) &
35164                                                                       0x7,
35165                                                                   (instr >>
35166                                                                    28) &
35167                                                                       0x1);
35168                                              if (dt.Is(
35169                                                      kDataTypeValueInvalid)) {
35170                                                UnallocatedT32(instr);
35171                                                return;
35172                                              }
35173                                              if (((instr >> 12) & 1) != 0) {
35174                                                UnallocatedT32(instr);
35175                                                return;
35176                                              }
35177                                              unsigned rd =
35178                                                  ExtractQRegister(instr,
35179                                                                   22,
35180                                                                   12);
35181                                              unsigned rm =
35182                                                  ExtractDRegister(instr, 5, 0);
35183                                              uint32_t imm6 =
35184                                                  (instr >> 16) & 0x3f;
35185                                              uint32_t imm =
35186                                                  imm6 - dt.GetSize();
35187                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35188                                              vshll(CurrentCond(),
35189                                                    dt,
35190                                                    QRegister(rd),
35191                                                    DRegister(rm),
35192                                                    imm);
35193                                              break;
35194                                            }
35195                                            case 0x003a0000: {
35196                                              // 0xefba0a10
35197                                              if (((instr & 0x380000) == 0x0) ||
35198                                                  ((instr & 0x3f0000) ==
35199                                                   0x80000) ||
35200                                                  ((instr & 0x3f0000) ==
35201                                                   0x100000) ||
35202                                                  ((instr & 0x3f0000) ==
35203                                                   0x200000)) {
35204                                                UnallocatedT32(instr);
35205                                                return;
35206                                              }
35207                                              DataType dt =
35208                                                  Dt_imm6_4_Decode((instr >>
35209                                                                    19) &
35210                                                                       0x7,
35211                                                                   (instr >>
35212                                                                    28) &
35213                                                                       0x1);
35214                                              if (dt.Is(
35215                                                      kDataTypeValueInvalid)) {
35216                                                UnallocatedT32(instr);
35217                                                return;
35218                                              }
35219                                              if (((instr >> 12) & 1) != 0) {
35220                                                UnallocatedT32(instr);
35221                                                return;
35222                                              }
35223                                              unsigned rd =
35224                                                  ExtractQRegister(instr,
35225                                                                   22,
35226                                                                   12);
35227                                              unsigned rm =
35228                                                  ExtractDRegister(instr, 5, 0);
35229                                              uint32_t imm6 =
35230                                                  (instr >> 16) & 0x3f;
35231                                              uint32_t imm =
35232                                                  imm6 - dt.GetSize();
35233                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35234                                              vshll(CurrentCond(),
35235                                                    dt,
35236                                                    QRegister(rd),
35237                                                    DRegister(rm),
35238                                                    imm);
35239                                              break;
35240                                            }
35241                                            case 0x003b0000: {
35242                                              // 0xefbb0a10
35243                                              if (((instr & 0x380000) == 0x0) ||
35244                                                  ((instr & 0x3f0000) ==
35245                                                   0x80000) ||
35246                                                  ((instr & 0x3f0000) ==
35247                                                   0x100000) ||
35248                                                  ((instr & 0x3f0000) ==
35249                                                   0x200000)) {
35250                                                UnallocatedT32(instr);
35251                                                return;
35252                                              }
35253                                              DataType dt =
35254                                                  Dt_imm6_4_Decode((instr >>
35255                                                                    19) &
35256                                                                       0x7,
35257                                                                   (instr >>
35258                                                                    28) &
35259                                                                       0x1);
35260                                              if (dt.Is(
35261                                                      kDataTypeValueInvalid)) {
35262                                                UnallocatedT32(instr);
35263                                                return;
35264                                              }
35265                                              if (((instr >> 12) & 1) != 0) {
35266                                                UnallocatedT32(instr);
35267                                                return;
35268                                              }
35269                                              unsigned rd =
35270                                                  ExtractQRegister(instr,
35271                                                                   22,
35272                                                                   12);
35273                                              unsigned rm =
35274                                                  ExtractDRegister(instr, 5, 0);
35275                                              uint32_t imm6 =
35276                                                  (instr >> 16) & 0x3f;
35277                                              uint32_t imm =
35278                                                  imm6 - dt.GetSize();
35279                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35280                                              vshll(CurrentCond(),
35281                                                    dt,
35282                                                    QRegister(rd),
35283                                                    DRegister(rm),
35284                                                    imm);
35285                                              break;
35286                                            }
35287                                            case 0x003c0000: {
35288                                              // 0xefbc0a10
35289                                              if (((instr & 0x380000) == 0x0) ||
35290                                                  ((instr & 0x3f0000) ==
35291                                                   0x80000) ||
35292                                                  ((instr & 0x3f0000) ==
35293                                                   0x100000) ||
35294                                                  ((instr & 0x3f0000) ==
35295                                                   0x200000)) {
35296                                                UnallocatedT32(instr);
35297                                                return;
35298                                              }
35299                                              DataType dt =
35300                                                  Dt_imm6_4_Decode((instr >>
35301                                                                    19) &
35302                                                                       0x7,
35303                                                                   (instr >>
35304                                                                    28) &
35305                                                                       0x1);
35306                                              if (dt.Is(
35307                                                      kDataTypeValueInvalid)) {
35308                                                UnallocatedT32(instr);
35309                                                return;
35310                                              }
35311                                              if (((instr >> 12) & 1) != 0) {
35312                                                UnallocatedT32(instr);
35313                                                return;
35314                                              }
35315                                              unsigned rd =
35316                                                  ExtractQRegister(instr,
35317                                                                   22,
35318                                                                   12);
35319                                              unsigned rm =
35320                                                  ExtractDRegister(instr, 5, 0);
35321                                              uint32_t imm6 =
35322                                                  (instr >> 16) & 0x3f;
35323                                              uint32_t imm =
35324                                                  imm6 - dt.GetSize();
35325                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35326                                              vshll(CurrentCond(),
35327                                                    dt,
35328                                                    QRegister(rd),
35329                                                    DRegister(rm),
35330                                                    imm);
35331                                              break;
35332                                            }
35333                                            case 0x003d0000: {
35334                                              // 0xefbd0a10
35335                                              if (((instr & 0x380000) == 0x0) ||
35336                                                  ((instr & 0x3f0000) ==
35337                                                   0x80000) ||
35338                                                  ((instr & 0x3f0000) ==
35339                                                   0x100000) ||
35340                                                  ((instr & 0x3f0000) ==
35341                                                   0x200000)) {
35342                                                UnallocatedT32(instr);
35343                                                return;
35344                                              }
35345                                              DataType dt =
35346                                                  Dt_imm6_4_Decode((instr >>
35347                                                                    19) &
35348                                                                       0x7,
35349                                                                   (instr >>
35350                                                                    28) &
35351                                                                       0x1);
35352                                              if (dt.Is(
35353                                                      kDataTypeValueInvalid)) {
35354                                                UnallocatedT32(instr);
35355                                                return;
35356                                              }
35357                                              if (((instr >> 12) & 1) != 0) {
35358                                                UnallocatedT32(instr);
35359                                                return;
35360                                              }
35361                                              unsigned rd =
35362                                                  ExtractQRegister(instr,
35363                                                                   22,
35364                                                                   12);
35365                                              unsigned rm =
35366                                                  ExtractDRegister(instr, 5, 0);
35367                                              uint32_t imm6 =
35368                                                  (instr >> 16) & 0x3f;
35369                                              uint32_t imm =
35370                                                  imm6 - dt.GetSize();
35371                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35372                                              vshll(CurrentCond(),
35373                                                    dt,
35374                                                    QRegister(rd),
35375                                                    DRegister(rm),
35376                                                    imm);
35377                                              break;
35378                                            }
35379                                            case 0x003e0000: {
35380                                              // 0xefbe0a10
35381                                              if (((instr & 0x380000) == 0x0) ||
35382                                                  ((instr & 0x3f0000) ==
35383                                                   0x80000) ||
35384                                                  ((instr & 0x3f0000) ==
35385                                                   0x100000) ||
35386                                                  ((instr & 0x3f0000) ==
35387                                                   0x200000)) {
35388                                                UnallocatedT32(instr);
35389                                                return;
35390                                              }
35391                                              DataType dt =
35392                                                  Dt_imm6_4_Decode((instr >>
35393                                                                    19) &
35394                                                                       0x7,
35395                                                                   (instr >>
35396                                                                    28) &
35397                                                                       0x1);
35398                                              if (dt.Is(
35399                                                      kDataTypeValueInvalid)) {
35400                                                UnallocatedT32(instr);
35401                                                return;
35402                                              }
35403                                              if (((instr >> 12) & 1) != 0) {
35404                                                UnallocatedT32(instr);
35405                                                return;
35406                                              }
35407                                              unsigned rd =
35408                                                  ExtractQRegister(instr,
35409                                                                   22,
35410                                                                   12);
35411                                              unsigned rm =
35412                                                  ExtractDRegister(instr, 5, 0);
35413                                              uint32_t imm6 =
35414                                                  (instr >> 16) & 0x3f;
35415                                              uint32_t imm =
35416                                                  imm6 - dt.GetSize();
35417                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35418                                              vshll(CurrentCond(),
35419                                                    dt,
35420                                                    QRegister(rd),
35421                                                    DRegister(rm),
35422                                                    imm);
35423                                              break;
35424                                            }
35425                                            case 0x003f0000: {
35426                                              // 0xefbf0a10
35427                                              if (((instr & 0x380000) == 0x0) ||
35428                                                  ((instr & 0x3f0000) ==
35429                                                   0x80000) ||
35430                                                  ((instr & 0x3f0000) ==
35431                                                   0x100000) ||
35432                                                  ((instr & 0x3f0000) ==
35433                                                   0x200000)) {
35434                                                UnallocatedT32(instr);
35435                                                return;
35436                                              }
35437                                              DataType dt =
35438                                                  Dt_imm6_4_Decode((instr >>
35439                                                                    19) &
35440                                                                       0x7,
35441                                                                   (instr >>
35442                                                                    28) &
35443                                                                       0x1);
35444                                              if (dt.Is(
35445                                                      kDataTypeValueInvalid)) {
35446                                                UnallocatedT32(instr);
35447                                                return;
35448                                              }
35449                                              if (((instr >> 12) & 1) != 0) {
35450                                                UnallocatedT32(instr);
35451                                                return;
35452                                              }
35453                                              unsigned rd =
35454                                                  ExtractQRegister(instr,
35455                                                                   22,
35456                                                                   12);
35457                                              unsigned rm =
35458                                                  ExtractDRegister(instr, 5, 0);
35459                                              uint32_t imm6 =
35460                                                  (instr >> 16) & 0x3f;
35461                                              uint32_t imm =
35462                                                  imm6 - dt.GetSize();
35463                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35464                                              vshll(CurrentCond(),
35465                                                    dt,
35466                                                    QRegister(rd),
35467                                                    DRegister(rm),
35468                                                    imm);
35469                                              break;
35470                                            }
35471                                            default:
35472                                              UnallocatedT32(instr);
35473                                              break;
35474                                          }
35475                                          break;
35476                                        }
35477                                        default: {
35478                                          if (((instr & 0x380000) == 0x0) ||
35479                                              ((instr & 0x3f0000) == 0x80000) ||
35480                                              ((instr & 0x3f0000) ==
35481                                               0x100000) ||
35482                                              ((instr & 0x3f0000) ==
35483                                               0x200000)) {
35484                                            UnallocatedT32(instr);
35485                                            return;
35486                                          }
35487                                          DataType dt =
35488                                              Dt_imm6_4_Decode((instr >> 19) &
35489                                                                   0x7,
35490                                                               (instr >> 28) &
35491                                                                   0x1);
35492                                          if (dt.Is(kDataTypeValueInvalid)) {
35493                                            UnallocatedT32(instr);
35494                                            return;
35495                                          }
35496                                          if (((instr >> 12) & 1) != 0) {
35497                                            UnallocatedT32(instr);
35498                                            return;
35499                                          }
35500                                          unsigned rd =
35501                                              ExtractQRegister(instr, 22, 12);
35502                                          unsigned rm =
35503                                              ExtractDRegister(instr, 5, 0);
35504                                          uint32_t imm6 = (instr >> 16) & 0x3f;
35505                                          uint32_t imm = imm6 - dt.GetSize();
35506                                          // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35507                                          vshll(CurrentCond(),
35508                                                dt,
35509                                                QRegister(rd),
35510                                                DRegister(rm),
35511                                                imm);
35512                                          break;
35513                                        }
35514                                      }
35515                                      break;
35516                                    }
35517                                    default:
35518                                      UnallocatedT32(instr);
35519                                      break;
35520                                  }
35521                                  break;
35522                                }
35523                              }
35524                              break;
35525                            }
35526                            default:
35527                              UnallocatedT32(instr);
35528                              break;
35529                          }
35530                          break;
35531                        }
35532                        case 0x00000c00: {
35533                          // 0xef800c10
35534                          switch (instr & 0x00000080) {
35535                            case 0x00000000: {
35536                              // 0xef800c10
35537                              switch (instr & 0x00200000) {
35538                                case 0x00000000: {
35539                                  // 0xef800c10
35540                                  switch (instr & 0x00180000) {
35541                                    case 0x00000000: {
35542                                      // 0xef800c10
35543                                      switch (instr & 0x00000300) {
35544                                        case 0x00000200: {
35545                                          // 0xef800e10
35546                                          if (((instr & 0x920) == 0x100) ||
35547                                              ((instr & 0x520) == 0x100) ||
35548                                              ((instr & 0x820) == 0x20) ||
35549                                              ((instr & 0x420) == 0x20) ||
35550                                              ((instr & 0x220) == 0x20) ||
35551                                              ((instr & 0x120) == 0x120)) {
35552                                            UnallocatedT32(instr);
35553                                            return;
35554                                          }
35555                                          unsigned cmode =
35556                                              ((instr >> 8) & 0xf) |
35557                                              ((instr >> 1) & 0x10);
35558                                          DataType dt =
35559                                              ImmediateVmov::DecodeDt(cmode);
35560                                          if (dt.Is(kDataTypeValueInvalid)) {
35561                                            UnallocatedT32(instr);
35562                                            return;
35563                                          }
35564                                          unsigned rd =
35565                                              ExtractDRegister(instr, 22, 12);
35566                                          DOperand imm =
35567                                              ImmediateVmov::DecodeImmediate(
35568                                                  cmode,
35569                                                  (instr & 0xf) |
35570                                                      ((instr >> 12) & 0x70) |
35571                                                      ((instr >> 21) & 0x80));
35572                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35573                                          vmov(CurrentCond(),
35574                                               dt,
35575                                               DRegister(rd),
35576                                               imm);
35577                                          break;
35578                                        }
35579                                        case 0x00000300: {
35580                                          // 0xef800f10
35581                                          if (((instr & 0x920) == 0x100) ||
35582                                              ((instr & 0x520) == 0x100) ||
35583                                              ((instr & 0x820) == 0x20) ||
35584                                              ((instr & 0x420) == 0x20) ||
35585                                              ((instr & 0x220) == 0x20) ||
35586                                              ((instr & 0x120) == 0x120)) {
35587                                            UnallocatedT32(instr);
35588                                            return;
35589                                          }
35590                                          unsigned cmode =
35591                                              ((instr >> 8) & 0xf) |
35592                                              ((instr >> 1) & 0x10);
35593                                          DataType dt =
35594                                              ImmediateVmov::DecodeDt(cmode);
35595                                          if (dt.Is(kDataTypeValueInvalid)) {
35596                                            UnallocatedT32(instr);
35597                                            return;
35598                                          }
35599                                          unsigned rd =
35600                                              ExtractDRegister(instr, 22, 12);
35601                                          DOperand imm =
35602                                              ImmediateVmov::DecodeImmediate(
35603                                                  cmode,
35604                                                  (instr & 0xf) |
35605                                                      ((instr >> 12) & 0x70) |
35606                                                      ((instr >> 21) & 0x80));
35607                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35608                                          vmov(CurrentCond(),
35609                                               dt,
35610                                               DRegister(rd),
35611                                               imm);
35612                                          break;
35613                                        }
35614                                        default: {
35615                                          switch (instr & 0x00000020) {
35616                                            case 0x00000020: {
35617                                              // 0xef800c30
35618                                              switch (instr & 0x00000f20) {
35619                                                case 0x00000000: {
35620                                                  // 0xef800c10
35621                                                  if (((instr & 0x920) ==
35622                                                       0x100) ||
35623                                                      ((instr & 0x520) ==
35624                                                       0x100) ||
35625                                                      ((instr & 0x820) ==
35626                                                       0x20) ||
35627                                                      ((instr & 0x420) ==
35628                                                       0x20) ||
35629                                                      ((instr & 0x220) ==
35630                                                       0x20) ||
35631                                                      ((instr & 0x120) ==
35632                                                       0x120)) {
35633                                                    UnallocatedT32(instr);
35634                                                    return;
35635                                                  }
35636                                                  unsigned cmode =
35637                                                      ((instr >> 8) & 0xf) |
35638                                                      ((instr >> 1) & 0x10);
35639                                                  DataType dt =
35640                                                      ImmediateVmov::DecodeDt(
35641                                                          cmode);
35642                                                  if (dt.Is(
35643                                                          kDataTypeValueInvalid)) {
35644                                                    UnallocatedT32(instr);
35645                                                    return;
35646                                                  }
35647                                                  unsigned rd =
35648                                                      ExtractDRegister(instr,
35649                                                                       22,
35650                                                                       12);
35651                                                  DOperand imm = ImmediateVmov::
35652                                                      DecodeImmediate(
35653                                                          cmode,
35654                                                          (instr & 0xf) |
35655                                                              ((instr >> 12) &
35656                                                               0x70) |
35657                                                              ((instr >> 21) &
35658                                                               0x80));
35659                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35660                                                  vmov(CurrentCond(),
35661                                                       dt,
35662                                                       DRegister(rd),
35663                                                       imm);
35664                                                  break;
35665                                                }
35666                                                case 0x00000020: {
35667                                                  // 0xef800c30
35668                                                  if (((instr & 0xd00) ==
35669                                                       0x100) ||
35670                                                      ((instr & 0xd00) ==
35671                                                       0x500) ||
35672                                                      ((instr & 0xd00) ==
35673                                                       0x900) ||
35674                                                      ((instr & 0xe00) ==
35675                                                       0xe00)) {
35676                                                    UnallocatedT32(instr);
35677                                                    return;
35678                                                  }
35679                                                  unsigned cmode =
35680                                                      (instr >> 8) & 0xf;
35681                                                  DataType dt =
35682                                                      ImmediateVmvn::DecodeDt(
35683                                                          cmode);
35684                                                  if (dt.Is(
35685                                                          kDataTypeValueInvalid)) {
35686                                                    UnallocatedT32(instr);
35687                                                    return;
35688                                                  }
35689                                                  unsigned rd =
35690                                                      ExtractDRegister(instr,
35691                                                                       22,
35692                                                                       12);
35693                                                  DOperand imm = ImmediateVmvn::
35694                                                      DecodeImmediate(
35695                                                          cmode,
35696                                                          (instr & 0xf) |
35697                                                              ((instr >> 12) &
35698                                                               0x70) |
35699                                                              ((instr >> 21) &
35700                                                               0x80));
35701                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35702                                                  vmvn(CurrentCond(),
35703                                                       dt,
35704                                                       DRegister(rd),
35705                                                       imm);
35706                                                  break;
35707                                                }
35708                                                case 0x00000200: {
35709                                                  // 0xef800e10
35710                                                  if (((instr & 0x920) ==
35711                                                       0x100) ||
35712                                                      ((instr & 0x520) ==
35713                                                       0x100) ||
35714                                                      ((instr & 0x820) ==
35715                                                       0x20) ||
35716                                                      ((instr & 0x420) ==
35717                                                       0x20) ||
35718                                                      ((instr & 0x220) ==
35719                                                       0x20) ||
35720                                                      ((instr & 0x120) ==
35721                                                       0x120)) {
35722                                                    UnallocatedT32(instr);
35723                                                    return;
35724                                                  }
35725                                                  unsigned cmode =
35726                                                      ((instr >> 8) & 0xf) |
35727                                                      ((instr >> 1) & 0x10);
35728                                                  DataType dt =
35729                                                      ImmediateVmov::DecodeDt(
35730                                                          cmode);
35731                                                  if (dt.Is(
35732                                                          kDataTypeValueInvalid)) {
35733                                                    UnallocatedT32(instr);
35734                                                    return;
35735                                                  }
35736                                                  unsigned rd =
35737                                                      ExtractDRegister(instr,
35738                                                                       22,
35739                                                                       12);
35740                                                  DOperand imm = ImmediateVmov::
35741                                                      DecodeImmediate(
35742                                                          cmode,
35743                                                          (instr & 0xf) |
35744                                                              ((instr >> 12) &
35745                                                               0x70) |
35746                                                              ((instr >> 21) &
35747                                                               0x80));
35748                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35749                                                  vmov(CurrentCond(),
35750                                                       dt,
35751                                                       DRegister(rd),
35752                                                       imm);
35753                                                  break;
35754                                                }
35755                                                case 0x00000220: {
35756                                                  // 0xef800e30
35757                                                  if (((instr & 0xd00) ==
35758                                                       0x100) ||
35759                                                      ((instr & 0xd00) ==
35760                                                       0x500) ||
35761                                                      ((instr & 0xd00) ==
35762                                                       0x900) ||
35763                                                      ((instr & 0xe00) ==
35764                                                       0xe00)) {
35765                                                    UnallocatedT32(instr);
35766                                                    return;
35767                                                  }
35768                                                  unsigned cmode =
35769                                                      (instr >> 8) & 0xf;
35770                                                  DataType dt =
35771                                                      ImmediateVmvn::DecodeDt(
35772                                                          cmode);
35773                                                  if (dt.Is(
35774                                                          kDataTypeValueInvalid)) {
35775                                                    UnallocatedT32(instr);
35776                                                    return;
35777                                                  }
35778                                                  unsigned rd =
35779                                                      ExtractDRegister(instr,
35780                                                                       22,
35781                                                                       12);
35782                                                  DOperand imm = ImmediateVmvn::
35783                                                      DecodeImmediate(
35784                                                          cmode,
35785                                                          (instr & 0xf) |
35786                                                              ((instr >> 12) &
35787                                                               0x70) |
35788                                                              ((instr >> 21) &
35789                                                               0x80));
35790                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35791                                                  vmvn(CurrentCond(),
35792                                                       dt,
35793                                                       DRegister(rd),
35794                                                       imm);
35795                                                  break;
35796                                                }
35797                                                case 0x00000400: {
35798                                                  // 0xef800c10
35799                                                  if (((instr & 0x920) ==
35800                                                       0x100) ||
35801                                                      ((instr & 0x520) ==
35802                                                       0x100) ||
35803                                                      ((instr & 0x820) ==
35804                                                       0x20) ||
35805                                                      ((instr & 0x420) ==
35806                                                       0x20) ||
35807                                                      ((instr & 0x220) ==
35808                                                       0x20) ||
35809                                                      ((instr & 0x120) ==
35810                                                       0x120)) {
35811                                                    UnallocatedT32(instr);
35812                                                    return;
35813                                                  }
35814                                                  unsigned cmode =
35815                                                      ((instr >> 8) & 0xf) |
35816                                                      ((instr >> 1) & 0x10);
35817                                                  DataType dt =
35818                                                      ImmediateVmov::DecodeDt(
35819                                                          cmode);
35820                                                  if (dt.Is(
35821                                                          kDataTypeValueInvalid)) {
35822                                                    UnallocatedT32(instr);
35823                                                    return;
35824                                                  }
35825                                                  unsigned rd =
35826                                                      ExtractDRegister(instr,
35827                                                                       22,
35828                                                                       12);
35829                                                  DOperand imm = ImmediateVmov::
35830                                                      DecodeImmediate(
35831                                                          cmode,
35832                                                          (instr & 0xf) |
35833                                                              ((instr >> 12) &
35834                                                               0x70) |
35835                                                              ((instr >> 21) &
35836                                                               0x80));
35837                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35838                                                  vmov(CurrentCond(),
35839                                                       dt,
35840                                                       DRegister(rd),
35841                                                       imm);
35842                                                  break;
35843                                                }
35844                                                case 0x00000420: {
35845                                                  // 0xef800c30
35846                                                  if (((instr & 0xd00) ==
35847                                                       0x100) ||
35848                                                      ((instr & 0xd00) ==
35849                                                       0x500) ||
35850                                                      ((instr & 0xd00) ==
35851                                                       0x900) ||
35852                                                      ((instr & 0xe00) ==
35853                                                       0xe00)) {
35854                                                    UnallocatedT32(instr);
35855                                                    return;
35856                                                  }
35857                                                  unsigned cmode =
35858                                                      (instr >> 8) & 0xf;
35859                                                  DataType dt =
35860                                                      ImmediateVmvn::DecodeDt(
35861                                                          cmode);
35862                                                  if (dt.Is(
35863                                                          kDataTypeValueInvalid)) {
35864                                                    UnallocatedT32(instr);
35865                                                    return;
35866                                                  }
35867                                                  unsigned rd =
35868                                                      ExtractDRegister(instr,
35869                                                                       22,
35870                                                                       12);
35871                                                  DOperand imm = ImmediateVmvn::
35872                                                      DecodeImmediate(
35873                                                          cmode,
35874                                                          (instr & 0xf) |
35875                                                              ((instr >> 12) &
35876                                                               0x70) |
35877                                                              ((instr >> 21) &
35878                                                               0x80));
35879                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35880                                                  vmvn(CurrentCond(),
35881                                                       dt,
35882                                                       DRegister(rd),
35883                                                       imm);
35884                                                  break;
35885                                                }
35886                                                case 0x00000600: {
35887                                                  // 0xef800e10
35888                                                  if (((instr & 0x920) ==
35889                                                       0x100) ||
35890                                                      ((instr & 0x520) ==
35891                                                       0x100) ||
35892                                                      ((instr & 0x820) ==
35893                                                       0x20) ||
35894                                                      ((instr & 0x420) ==
35895                                                       0x20) ||
35896                                                      ((instr & 0x220) ==
35897                                                       0x20) ||
35898                                                      ((instr & 0x120) ==
35899                                                       0x120)) {
35900                                                    UnallocatedT32(instr);
35901                                                    return;
35902                                                  }
35903                                                  unsigned cmode =
35904                                                      ((instr >> 8) & 0xf) |
35905                                                      ((instr >> 1) & 0x10);
35906                                                  DataType dt =
35907                                                      ImmediateVmov::DecodeDt(
35908                                                          cmode);
35909                                                  if (dt.Is(
35910                                                          kDataTypeValueInvalid)) {
35911                                                    UnallocatedT32(instr);
35912                                                    return;
35913                                                  }
35914                                                  unsigned rd =
35915                                                      ExtractDRegister(instr,
35916                                                                       22,
35917                                                                       12);
35918                                                  DOperand imm = ImmediateVmov::
35919                                                      DecodeImmediate(
35920                                                          cmode,
35921                                                          (instr & 0xf) |
35922                                                              ((instr >> 12) &
35923                                                               0x70) |
35924                                                              ((instr >> 21) &
35925                                                               0x80));
35926                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35927                                                  vmov(CurrentCond(),
35928                                                       dt,
35929                                                       DRegister(rd),
35930                                                       imm);
35931                                                  break;
35932                                                }
35933                                                case 0x00000620: {
35934                                                  // 0xef800e30
35935                                                  if (((instr & 0xd00) ==
35936                                                       0x100) ||
35937                                                      ((instr & 0xd00) ==
35938                                                       0x500) ||
35939                                                      ((instr & 0xd00) ==
35940                                                       0x900) ||
35941                                                      ((instr & 0xe00) ==
35942                                                       0xe00)) {
35943                                                    UnallocatedT32(instr);
35944                                                    return;
35945                                                  }
35946                                                  unsigned cmode =
35947                                                      (instr >> 8) & 0xf;
35948                                                  DataType dt =
35949                                                      ImmediateVmvn::DecodeDt(
35950                                                          cmode);
35951                                                  if (dt.Is(
35952                                                          kDataTypeValueInvalid)) {
35953                                                    UnallocatedT32(instr);
35954                                                    return;
35955                                                  }
35956                                                  unsigned rd =
35957                                                      ExtractDRegister(instr,
35958                                                                       22,
35959                                                                       12);
35960                                                  DOperand imm = ImmediateVmvn::
35961                                                      DecodeImmediate(
35962                                                          cmode,
35963                                                          (instr & 0xf) |
35964                                                              ((instr >> 12) &
35965                                                               0x70) |
35966                                                              ((instr >> 21) &
35967                                                               0x80));
35968                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35969                                                  vmvn(CurrentCond(),
35970                                                       dt,
35971                                                       DRegister(rd),
35972                                                       imm);
35973                                                  break;
35974                                                }
35975                                                case 0x00000800: {
35976                                                  // 0xef800c10
35977                                                  if (((instr & 0x920) ==
35978                                                       0x100) ||
35979                                                      ((instr & 0x520) ==
35980                                                       0x100) ||
35981                                                      ((instr & 0x820) ==
35982                                                       0x20) ||
35983                                                      ((instr & 0x420) ==
35984                                                       0x20) ||
35985                                                      ((instr & 0x220) ==
35986                                                       0x20) ||
35987                                                      ((instr & 0x120) ==
35988                                                       0x120)) {
35989                                                    UnallocatedT32(instr);
35990                                                    return;
35991                                                  }
35992                                                  unsigned cmode =
35993                                                      ((instr >> 8) & 0xf) |
35994                                                      ((instr >> 1) & 0x10);
35995                                                  DataType dt =
35996                                                      ImmediateVmov::DecodeDt(
35997                                                          cmode);
35998                                                  if (dt.Is(
35999                                                          kDataTypeValueInvalid)) {
36000                                                    UnallocatedT32(instr);
36001                                                    return;
36002                                                  }
36003                                                  unsigned rd =
36004                                                      ExtractDRegister(instr,
36005                                                                       22,
36006                                                                       12);
36007                                                  DOperand imm = ImmediateVmov::
36008                                                      DecodeImmediate(
36009                                                          cmode,
36010                                                          (instr & 0xf) |
36011                                                              ((instr >> 12) &
36012                                                               0x70) |
36013                                                              ((instr >> 21) &
36014                                                               0x80));
36015                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36016                                                  vmov(CurrentCond(),
36017                                                       dt,
36018                                                       DRegister(rd),
36019                                                       imm);
36020                                                  break;
36021                                                }
36022                                                case 0x00000820: {
36023                                                  // 0xef800c30
36024                                                  if (((instr & 0xd00) ==
36025                                                       0x100) ||
36026                                                      ((instr & 0xd00) ==
36027                                                       0x500) ||
36028                                                      ((instr & 0xd00) ==
36029                                                       0x900) ||
36030                                                      ((instr & 0xe00) ==
36031                                                       0xe00)) {
36032                                                    UnallocatedT32(instr);
36033                                                    return;
36034                                                  }
36035                                                  unsigned cmode =
36036                                                      (instr >> 8) & 0xf;
36037                                                  DataType dt =
36038                                                      ImmediateVmvn::DecodeDt(
36039                                                          cmode);
36040                                                  if (dt.Is(
36041                                                          kDataTypeValueInvalid)) {
36042                                                    UnallocatedT32(instr);
36043                                                    return;
36044                                                  }
36045                                                  unsigned rd =
36046                                                      ExtractDRegister(instr,
36047                                                                       22,
36048                                                                       12);
36049                                                  DOperand imm = ImmediateVmvn::
36050                                                      DecodeImmediate(
36051                                                          cmode,
36052                                                          (instr & 0xf) |
36053                                                              ((instr >> 12) &
36054                                                               0x70) |
36055                                                              ((instr >> 21) &
36056                                                               0x80));
36057                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36058                                                  vmvn(CurrentCond(),
36059                                                       dt,
36060                                                       DRegister(rd),
36061                                                       imm);
36062                                                  break;
36063                                                }
36064                                                case 0x00000a00: {
36065                                                  // 0xef800e10
36066                                                  if (((instr & 0x920) ==
36067                                                       0x100) ||
36068                                                      ((instr & 0x520) ==
36069                                                       0x100) ||
36070                                                      ((instr & 0x820) ==
36071                                                       0x20) ||
36072                                                      ((instr & 0x420) ==
36073                                                       0x20) ||
36074                                                      ((instr & 0x220) ==
36075                                                       0x20) ||
36076                                                      ((instr & 0x120) ==
36077                                                       0x120)) {
36078                                                    UnallocatedT32(instr);
36079                                                    return;
36080                                                  }
36081                                                  unsigned cmode =
36082                                                      ((instr >> 8) & 0xf) |
36083                                                      ((instr >> 1) & 0x10);
36084                                                  DataType dt =
36085                                                      ImmediateVmov::DecodeDt(
36086                                                          cmode);
36087                                                  if (dt.Is(
36088                                                          kDataTypeValueInvalid)) {
36089                                                    UnallocatedT32(instr);
36090                                                    return;
36091                                                  }
36092                                                  unsigned rd =
36093                                                      ExtractDRegister(instr,
36094                                                                       22,
36095                                                                       12);
36096                                                  DOperand imm = ImmediateVmov::
36097                                                      DecodeImmediate(
36098                                                          cmode,
36099                                                          (instr & 0xf) |
36100                                                              ((instr >> 12) &
36101                                                               0x70) |
36102                                                              ((instr >> 21) &
36103                                                               0x80));
36104                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36105                                                  vmov(CurrentCond(),
36106                                                       dt,
36107                                                       DRegister(rd),
36108                                                       imm);
36109                                                  break;
36110                                                }
36111                                                case 0x00000a20: {
36112                                                  // 0xef800e30
36113                                                  if (((instr & 0xd00) ==
36114                                                       0x100) ||
36115                                                      ((instr & 0xd00) ==
36116                                                       0x500) ||
36117                                                      ((instr & 0xd00) ==
36118                                                       0x900) ||
36119                                                      ((instr & 0xe00) ==
36120                                                       0xe00)) {
36121                                                    UnallocatedT32(instr);
36122                                                    return;
36123                                                  }
36124                                                  unsigned cmode =
36125                                                      (instr >> 8) & 0xf;
36126                                                  DataType dt =
36127                                                      ImmediateVmvn::DecodeDt(
36128                                                          cmode);
36129                                                  if (dt.Is(
36130                                                          kDataTypeValueInvalid)) {
36131                                                    UnallocatedT32(instr);
36132                                                    return;
36133                                                  }
36134                                                  unsigned rd =
36135                                                      ExtractDRegister(instr,
36136                                                                       22,
36137                                                                       12);
36138                                                  DOperand imm = ImmediateVmvn::
36139                                                      DecodeImmediate(
36140                                                          cmode,
36141                                                          (instr & 0xf) |
36142                                                              ((instr >> 12) &
36143                                                               0x70) |
36144                                                              ((instr >> 21) &
36145                                                               0x80));
36146                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36147                                                  vmvn(CurrentCond(),
36148                                                       dt,
36149                                                       DRegister(rd),
36150                                                       imm);
36151                                                  break;
36152                                                }
36153                                                case 0x00000c00: {
36154                                                  // 0xef800c10
36155                                                  if (((instr & 0x920) ==
36156                                                       0x100) ||
36157                                                      ((instr & 0x520) ==
36158                                                       0x100) ||
36159                                                      ((instr & 0x820) ==
36160                                                       0x20) ||
36161                                                      ((instr & 0x420) ==
36162                                                       0x20) ||
36163                                                      ((instr & 0x220) ==
36164                                                       0x20) ||
36165                                                      ((instr & 0x120) ==
36166                                                       0x120)) {
36167                                                    UnallocatedT32(instr);
36168                                                    return;
36169                                                  }
36170                                                  unsigned cmode =
36171                                                      ((instr >> 8) & 0xf) |
36172                                                      ((instr >> 1) & 0x10);
36173                                                  DataType dt =
36174                                                      ImmediateVmov::DecodeDt(
36175                                                          cmode);
36176                                                  if (dt.Is(
36177                                                          kDataTypeValueInvalid)) {
36178                                                    UnallocatedT32(instr);
36179                                                    return;
36180                                                  }
36181                                                  unsigned rd =
36182                                                      ExtractDRegister(instr,
36183                                                                       22,
36184                                                                       12);
36185                                                  DOperand imm = ImmediateVmov::
36186                                                      DecodeImmediate(
36187                                                          cmode,
36188                                                          (instr & 0xf) |
36189                                                              ((instr >> 12) &
36190                                                               0x70) |
36191                                                              ((instr >> 21) &
36192                                                               0x80));
36193                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36194                                                  vmov(CurrentCond(),
36195                                                       dt,
36196                                                       DRegister(rd),
36197                                                       imm);
36198                                                  break;
36199                                                }
36200                                                case 0x00000c20: {
36201                                                  // 0xef800c30
36202                                                  if (((instr & 0xd00) ==
36203                                                       0x100) ||
36204                                                      ((instr & 0xd00) ==
36205                                                       0x500) ||
36206                                                      ((instr & 0xd00) ==
36207                                                       0x900) ||
36208                                                      ((instr & 0xe00) ==
36209                                                       0xe00)) {
36210                                                    UnallocatedT32(instr);
36211                                                    return;
36212                                                  }
36213                                                  unsigned cmode =
36214                                                      (instr >> 8) & 0xf;
36215                                                  DataType dt =
36216                                                      ImmediateVmvn::DecodeDt(
36217                                                          cmode);
36218                                                  if (dt.Is(
36219                                                          kDataTypeValueInvalid)) {
36220                                                    UnallocatedT32(instr);
36221                                                    return;
36222                                                  }
36223                                                  unsigned rd =
36224                                                      ExtractDRegister(instr,
36225                                                                       22,
36226                                                                       12);
36227                                                  DOperand imm = ImmediateVmvn::
36228                                                      DecodeImmediate(
36229                                                          cmode,
36230                                                          (instr & 0xf) |
36231                                                              ((instr >> 12) &
36232                                                               0x70) |
36233                                                              ((instr >> 21) &
36234                                                               0x80));
36235                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36236                                                  vmvn(CurrentCond(),
36237                                                       dt,
36238                                                       DRegister(rd),
36239                                                       imm);
36240                                                  break;
36241                                                }
36242                                                case 0x00000d00: {
36243                                                  // 0xef800d10
36244                                                  if (((instr & 0x920) ==
36245                                                       0x100) ||
36246                                                      ((instr & 0x520) ==
36247                                                       0x100) ||
36248                                                      ((instr & 0x820) ==
36249                                                       0x20) ||
36250                                                      ((instr & 0x420) ==
36251                                                       0x20) ||
36252                                                      ((instr & 0x220) ==
36253                                                       0x20) ||
36254                                                      ((instr & 0x120) ==
36255                                                       0x120)) {
36256                                                    UnallocatedT32(instr);
36257                                                    return;
36258                                                  }
36259                                                  unsigned cmode =
36260                                                      ((instr >> 8) & 0xf) |
36261                                                      ((instr >> 1) & 0x10);
36262                                                  DataType dt =
36263                                                      ImmediateVmov::DecodeDt(
36264                                                          cmode);
36265                                                  if (dt.Is(
36266                                                          kDataTypeValueInvalid)) {
36267                                                    UnallocatedT32(instr);
36268                                                    return;
36269                                                  }
36270                                                  unsigned rd =
36271                                                      ExtractDRegister(instr,
36272                                                                       22,
36273                                                                       12);
36274                                                  DOperand imm = ImmediateVmov::
36275                                                      DecodeImmediate(
36276                                                          cmode,
36277                                                          (instr & 0xf) |
36278                                                              ((instr >> 12) &
36279                                                               0x70) |
36280                                                              ((instr >> 21) &
36281                                                               0x80));
36282                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36283                                                  vmov(CurrentCond(),
36284                                                       dt,
36285                                                       DRegister(rd),
36286                                                       imm);
36287                                                  break;
36288                                                }
36289                                                case 0x00000d20: {
36290                                                  // 0xef800d30
36291                                                  if (((instr & 0xd00) ==
36292                                                       0x100) ||
36293                                                      ((instr & 0xd00) ==
36294                                                       0x500) ||
36295                                                      ((instr & 0xd00) ==
36296                                                       0x900) ||
36297                                                      ((instr & 0xe00) ==
36298                                                       0xe00)) {
36299                                                    UnallocatedT32(instr);
36300                                                    return;
36301                                                  }
36302                                                  unsigned cmode =
36303                                                      (instr >> 8) & 0xf;
36304                                                  DataType dt =
36305                                                      ImmediateVmvn::DecodeDt(
36306                                                          cmode);
36307                                                  if (dt.Is(
36308                                                          kDataTypeValueInvalid)) {
36309                                                    UnallocatedT32(instr);
36310                                                    return;
36311                                                  }
36312                                                  unsigned rd =
36313                                                      ExtractDRegister(instr,
36314                                                                       22,
36315                                                                       12);
36316                                                  DOperand imm = ImmediateVmvn::
36317                                                      DecodeImmediate(
36318                                                          cmode,
36319                                                          (instr & 0xf) |
36320                                                              ((instr >> 12) &
36321                                                               0x70) |
36322                                                              ((instr >> 21) &
36323                                                               0x80));
36324                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36325                                                  vmvn(CurrentCond(),
36326                                                       dt,
36327                                                       DRegister(rd),
36328                                                       imm);
36329                                                  break;
36330                                                }
36331                                                case 0x00000e00: {
36332                                                  // 0xef800e10
36333                                                  if (((instr & 0x920) ==
36334                                                       0x100) ||
36335                                                      ((instr & 0x520) ==
36336                                                       0x100) ||
36337                                                      ((instr & 0x820) ==
36338                                                       0x20) ||
36339                                                      ((instr & 0x420) ==
36340                                                       0x20) ||
36341                                                      ((instr & 0x220) ==
36342                                                       0x20) ||
36343                                                      ((instr & 0x120) ==
36344                                                       0x120)) {
36345                                                    UnallocatedT32(instr);
36346                                                    return;
36347                                                  }
36348                                                  unsigned cmode =
36349                                                      ((instr >> 8) & 0xf) |
36350                                                      ((instr >> 1) & 0x10);
36351                                                  DataType dt =
36352                                                      ImmediateVmov::DecodeDt(
36353                                                          cmode);
36354                                                  if (dt.Is(
36355                                                          kDataTypeValueInvalid)) {
36356                                                    UnallocatedT32(instr);
36357                                                    return;
36358                                                  }
36359                                                  unsigned rd =
36360                                                      ExtractDRegister(instr,
36361                                                                       22,
36362                                                                       12);
36363                                                  DOperand imm = ImmediateVmov::
36364                                                      DecodeImmediate(
36365                                                          cmode,
36366                                                          (instr & 0xf) |
36367                                                              ((instr >> 12) &
36368                                                               0x70) |
36369                                                              ((instr >> 21) &
36370                                                               0x80));
36371                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36372                                                  vmov(CurrentCond(),
36373                                                       dt,
36374                                                       DRegister(rd),
36375                                                       imm);
36376                                                  break;
36377                                                }
36378                                                case 0x00000e20: {
36379                                                  // 0xef800e30
36380                                                  if (((instr & 0x920) ==
36381                                                       0x100) ||
36382                                                      ((instr & 0x520) ==
36383                                                       0x100) ||
36384                                                      ((instr & 0x820) ==
36385                                                       0x20) ||
36386                                                      ((instr & 0x420) ==
36387                                                       0x20) ||
36388                                                      ((instr & 0x220) ==
36389                                                       0x20) ||
36390                                                      ((instr & 0x120) ==
36391                                                       0x120)) {
36392                                                    UnallocatedT32(instr);
36393                                                    return;
36394                                                  }
36395                                                  unsigned cmode =
36396                                                      ((instr >> 8) & 0xf) |
36397                                                      ((instr >> 1) & 0x10);
36398                                                  DataType dt =
36399                                                      ImmediateVmov::DecodeDt(
36400                                                          cmode);
36401                                                  if (dt.Is(
36402                                                          kDataTypeValueInvalid)) {
36403                                                    UnallocatedT32(instr);
36404                                                    return;
36405                                                  }
36406                                                  unsigned rd =
36407                                                      ExtractDRegister(instr,
36408                                                                       22,
36409                                                                       12);
36410                                                  DOperand imm = ImmediateVmov::
36411                                                      DecodeImmediate(
36412                                                          cmode,
36413                                                          (instr & 0xf) |
36414                                                              ((instr >> 12) &
36415                                                               0x70) |
36416                                                              ((instr >> 21) &
36417                                                               0x80));
36418                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36419                                                  vmov(CurrentCond(),
36420                                                       dt,
36421                                                       DRegister(rd),
36422                                                       imm);
36423                                                  break;
36424                                                }
36425                                                case 0x00000f00: {
36426                                                  // 0xef800f10
36427                                                  if (((instr & 0x920) ==
36428                                                       0x100) ||
36429                                                      ((instr & 0x520) ==
36430                                                       0x100) ||
36431                                                      ((instr & 0x820) ==
36432                                                       0x20) ||
36433                                                      ((instr & 0x420) ==
36434                                                       0x20) ||
36435                                                      ((instr & 0x220) ==
36436                                                       0x20) ||
36437                                                      ((instr & 0x120) ==
36438                                                       0x120)) {
36439                                                    UnallocatedT32(instr);
36440                                                    return;
36441                                                  }
36442                                                  unsigned cmode =
36443                                                      ((instr >> 8) & 0xf) |
36444                                                      ((instr >> 1) & 0x10);
36445                                                  DataType dt =
36446                                                      ImmediateVmov::DecodeDt(
36447                                                          cmode);
36448                                                  if (dt.Is(
36449                                                          kDataTypeValueInvalid)) {
36450                                                    UnallocatedT32(instr);
36451                                                    return;
36452                                                  }
36453                                                  unsigned rd =
36454                                                      ExtractDRegister(instr,
36455                                                                       22,
36456                                                                       12);
36457                                                  DOperand imm = ImmediateVmov::
36458                                                      DecodeImmediate(
36459                                                          cmode,
36460                                                          (instr & 0xf) |
36461                                                              ((instr >> 12) &
36462                                                               0x70) |
36463                                                              ((instr >> 21) &
36464                                                               0x80));
36465                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36466                                                  vmov(CurrentCond(),
36467                                                       dt,
36468                                                       DRegister(rd),
36469                                                       imm);
36470                                                  break;
36471                                                }
36472                                                default:
36473                                                  UnallocatedT32(instr);
36474                                                  break;
36475                                              }
36476                                              break;
36477                                            }
36478                                            default: {
36479                                              if (((instr & 0x920) == 0x100) ||
36480                                                  ((instr & 0x520) == 0x100) ||
36481                                                  ((instr & 0x820) == 0x20) ||
36482                                                  ((instr & 0x420) == 0x20) ||
36483                                                  ((instr & 0x220) == 0x20) ||
36484                                                  ((instr & 0x120) == 0x120)) {
36485                                                UnallocatedT32(instr);
36486                                                return;
36487                                              }
36488                                              unsigned cmode =
36489                                                  ((instr >> 8) & 0xf) |
36490                                                  ((instr >> 1) & 0x10);
36491                                              DataType dt =
36492                                                  ImmediateVmov::DecodeDt(
36493                                                      cmode);
36494                                              if (dt.Is(
36495                                                      kDataTypeValueInvalid)) {
36496                                                UnallocatedT32(instr);
36497                                                return;
36498                                              }
36499                                              unsigned rd =
36500                                                  ExtractDRegister(instr,
36501                                                                   22,
36502                                                                   12);
36503                                              DOperand imm = ImmediateVmov::
36504                                                  DecodeImmediate(cmode,
36505                                                                  (instr &
36506                                                                   0xf) |
36507                                                                      ((instr >>
36508                                                                        12) &
36509                                                                       0x70) |
36510                                                                      ((instr >>
36511                                                                        21) &
36512                                                                       0x80));
36513                                              // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36514                                              vmov(CurrentCond(),
36515                                                   dt,
36516                                                   DRegister(rd),
36517                                                   imm);
36518                                              break;
36519                                            }
36520                                          }
36521                                          break;
36522                                        }
36523                                      }
36524                                      break;
36525                                    }
36526                                    default:
36527                                      UnallocatedT32(instr);
36528                                      break;
36529                                  }
36530                                  break;
36531                                }
36532                                default: {
36533                                  if ((instr & 0x00000200) == 0x00000200) {
36534                                    if (((instr & 0x200000) == 0x0)) {
36535                                      UnallocatedT32(instr);
36536                                      return;
36537                                    }
36538                                    DataType dt1 = Dt_op_U_1_Decode1(
36539                                        ((instr >> 28) & 0x1) |
36540                                        ((instr >> 7) & 0x2));
36541                                    if (dt1.Is(kDataTypeValueInvalid)) {
36542                                      UnallocatedT32(instr);
36543                                      return;
36544                                    }
36545                                    DataType dt2 = Dt_op_U_1_Decode2(
36546                                        ((instr >> 28) & 0x1) |
36547                                        ((instr >> 7) & 0x2));
36548                                    if (dt2.Is(kDataTypeValueInvalid)) {
36549                                      UnallocatedT32(instr);
36550                                      return;
36551                                    }
36552                                    unsigned rd =
36553                                        ExtractDRegister(instr, 22, 12);
36554                                    unsigned rm = ExtractDRegister(instr, 5, 0);
36555                                    uint32_t fbits =
36556                                        64 - ((instr >> 16) & 0x3f);
36557                                    // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
36558                                    vcvt(CurrentCond(),
36559                                         dt1,
36560                                         dt2,
36561                                         DRegister(rd),
36562                                         DRegister(rm),
36563                                         fbits);
36564                                  } else {
36565                                    UnallocatedT32(instr);
36566                                  }
36567                                  break;
36568                                }
36569                              }
36570                              break;
36571                            }
36572                            default:
36573                              UnallocatedT32(instr);
36574                              break;
36575                          }
36576                          break;
36577                        }
36578                      }
36579                      break;
36580                    }
36581                    case 0x00800040: {
36582                      // 0xef800050
36583                      switch (instr & 0x00000c00) {
36584                        case 0x00000000: {
36585                          // 0xef800050
36586                          switch (instr & 0x00380080) {
36587                            case 0x00000000: {
36588                              // 0xef800050
36589                              switch (instr & 0x00000100) {
36590                                case 0x00000000: {
36591                                  // 0xef800050
36592                                  switch (instr & 0x00000200) {
36593                                    default: {
36594                                      switch (instr & 0x00000020) {
36595                                        case 0x00000020: {
36596                                          // 0xef800070
36597                                          if (((instr & 0xd00) == 0x100) ||
36598                                              ((instr & 0xd00) == 0x500) ||
36599                                              ((instr & 0xd00) == 0x900) ||
36600                                              ((instr & 0xe00) == 0xe00)) {
36601                                            UnallocatedT32(instr);
36602                                            return;
36603                                          }
36604                                          unsigned cmode = (instr >> 8) & 0xf;
36605                                          DataType dt =
36606                                              ImmediateVmvn::DecodeDt(cmode);
36607                                          if (dt.Is(kDataTypeValueInvalid)) {
36608                                            UnallocatedT32(instr);
36609                                            return;
36610                                          }
36611                                          if (((instr >> 12) & 1) != 0) {
36612                                            UnallocatedT32(instr);
36613                                            return;
36614                                          }
36615                                          unsigned rd =
36616                                              ExtractQRegister(instr, 22, 12);
36617                                          QOperand imm =
36618                                              ImmediateVmvn::DecodeImmediate(
36619                                                  cmode,
36620                                                  (instr & 0xf) |
36621                                                      ((instr >> 12) & 0x70) |
36622                                                      ((instr >> 21) & 0x80));
36623                                          // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36624                                          vmvn(CurrentCond(),
36625                                               dt,
36626                                               QRegister(rd),
36627                                               imm);
36628                                          break;
36629                                        }
36630                                        default: {
36631                                          if (((instr & 0x920) == 0x100) ||
36632                                              ((instr & 0x520) == 0x100) ||
36633                                              ((instr & 0x820) == 0x20) ||
36634                                              ((instr & 0x420) == 0x20) ||
36635                                              ((instr & 0x220) == 0x20) ||
36636                                              ((instr & 0x120) == 0x120)) {
36637                                            UnallocatedT32(instr);
36638                                            return;
36639                                          }
36640                                          unsigned cmode =
36641                                              ((instr >> 8) & 0xf) |
36642                                              ((instr >> 1) & 0x10);
36643                                          DataType dt =
36644                                              ImmediateVmov::DecodeDt(cmode);
36645                                          if (dt.Is(kDataTypeValueInvalid)) {
36646                                            UnallocatedT32(instr);
36647                                            return;
36648                                          }
36649                                          if (((instr >> 12) & 1) != 0) {
36650                                            UnallocatedT32(instr);
36651                                            return;
36652                                          }
36653                                          unsigned rd =
36654                                              ExtractQRegister(instr, 22, 12);
36655                                          QOperand imm =
36656                                              ImmediateVmov::DecodeImmediate(
36657                                                  cmode,
36658                                                  (instr & 0xf) |
36659                                                      ((instr >> 12) & 0x70) |
36660                                                      ((instr >> 21) & 0x80));
36661                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36662                                          vmov(CurrentCond(),
36663                                               dt,
36664                                               QRegister(rd),
36665                                               imm);
36666                                          break;
36667                                        }
36668                                      }
36669                                      break;
36670                                    }
36671                                  }
36672                                  break;
36673                                }
36674                                case 0x00000100: {
36675                                  // 0xef800150
36676                                  switch (instr & 0x00000020) {
36677                                    case 0x00000000: {
36678                                      // 0xef800150
36679                                      if (((instr & 0x100) == 0x0) ||
36680                                          ((instr & 0xc00) == 0xc00)) {
36681                                        UnallocatedT32(instr);
36682                                        return;
36683                                      }
36684                                      unsigned cmode = (instr >> 8) & 0xf;
36685                                      DataType dt =
36686                                          ImmediateVorr::DecodeDt(cmode);
36687                                      if (dt.Is(kDataTypeValueInvalid)) {
36688                                        UnallocatedT32(instr);
36689                                        return;
36690                                      }
36691                                      if (((instr >> 12) & 1) != 0) {
36692                                        UnallocatedT32(instr);
36693                                        return;
36694                                      }
36695                                      unsigned rd =
36696                                          ExtractQRegister(instr, 22, 12);
36697                                      QOperand imm =
36698                                          ImmediateVorr::DecodeImmediate(
36699                                              cmode,
36700                                              (instr & 0xf) |
36701                                                  ((instr >> 12) & 0x70) |
36702                                                  ((instr >> 21) & 0x80));
36703                                      // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36704                                      vorr(CurrentCond(),
36705                                           dt,
36706                                           QRegister(rd),
36707                                           QRegister(rd),
36708                                           imm);
36709                                      break;
36710                                    }
36711                                    case 0x00000020: {
36712                                      // 0xef800170
36713                                      if (((instr & 0x100) == 0x0) ||
36714                                          ((instr & 0xc00) == 0xc00)) {
36715                                        UnallocatedT32(instr);
36716                                        return;
36717                                      }
36718                                      unsigned cmode = (instr >> 8) & 0xf;
36719                                      DataType dt =
36720                                          ImmediateVbic::DecodeDt(cmode);
36721                                      if (dt.Is(kDataTypeValueInvalid)) {
36722                                        UnallocatedT32(instr);
36723                                        return;
36724                                      }
36725                                      if (((instr >> 12) & 1) != 0) {
36726                                        UnallocatedT32(instr);
36727                                        return;
36728                                      }
36729                                      unsigned rd =
36730                                          ExtractQRegister(instr, 22, 12);
36731                                      QOperand imm =
36732                                          ImmediateVbic::DecodeImmediate(
36733                                              cmode,
36734                                              (instr & 0xf) |
36735                                                  ((instr >> 12) & 0x70) |
36736                                                  ((instr >> 21) & 0x80));
36737                                      // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36738                                      vbic(CurrentCond(),
36739                                           dt,
36740                                           QRegister(rd),
36741                                           QRegister(rd),
36742                                           imm);
36743                                      break;
36744                                    }
36745                                  }
36746                                  break;
36747                                }
36748                              }
36749                              break;
36750                            }
36751                            default: {
36752                              switch (instr & 0x00000300) {
36753                                case 0x00000000: {
36754                                  // 0xef800050
36755                                  if (((instr & 0x380080) == 0x0)) {
36756                                    UnallocatedT32(instr);
36757                                    return;
36758                                  }
36759                                  DataType dt =
36760                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36761                                                             ((instr >> 4) &
36762                                                              0x8),
36763                                                         (instr >> 28) & 0x1);
36764                                  if (dt.Is(kDataTypeValueInvalid)) {
36765                                    UnallocatedT32(instr);
36766                                    return;
36767                                  }
36768                                  if (((instr >> 12) & 1) != 0) {
36769                                    UnallocatedT32(instr);
36770                                    return;
36771                                  }
36772                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36773                                  if ((instr & 1) != 0) {
36774                                    UnallocatedT32(instr);
36775                                    return;
36776                                  }
36777                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36778                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36779                                  uint32_t imm =
36780                                      (dt.IsSize(64) ? 64
36781                                                     : (dt.GetSize() * 2)) -
36782                                      imm6;
36783                                  // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36784                                  vshr(CurrentCond(),
36785                                       dt,
36786                                       QRegister(rd),
36787                                       QRegister(rm),
36788                                       imm);
36789                                  break;
36790                                }
36791                                case 0x00000100: {
36792                                  // 0xef800150
36793                                  if (((instr & 0x380080) == 0x0)) {
36794                                    UnallocatedT32(instr);
36795                                    return;
36796                                  }
36797                                  DataType dt =
36798                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36799                                                             ((instr >> 4) &
36800                                                              0x8),
36801                                                         (instr >> 28) & 0x1);
36802                                  if (dt.Is(kDataTypeValueInvalid)) {
36803                                    UnallocatedT32(instr);
36804                                    return;
36805                                  }
36806                                  if (((instr >> 12) & 1) != 0) {
36807                                    UnallocatedT32(instr);
36808                                    return;
36809                                  }
36810                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36811                                  if ((instr & 1) != 0) {
36812                                    UnallocatedT32(instr);
36813                                    return;
36814                                  }
36815                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36816                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36817                                  uint32_t imm =
36818                                      (dt.IsSize(64) ? 64
36819                                                     : (dt.GetSize() * 2)) -
36820                                      imm6;
36821                                  // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36822                                  vsra(CurrentCond(),
36823                                       dt,
36824                                       QRegister(rd),
36825                                       QRegister(rm),
36826                                       imm);
36827                                  break;
36828                                }
36829                                case 0x00000200: {
36830                                  // 0xef800250
36831                                  if (((instr & 0x380080) == 0x0)) {
36832                                    UnallocatedT32(instr);
36833                                    return;
36834                                  }
36835                                  DataType dt =
36836                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36837                                                             ((instr >> 4) &
36838                                                              0x8),
36839                                                         (instr >> 28) & 0x1);
36840                                  if (dt.Is(kDataTypeValueInvalid)) {
36841                                    UnallocatedT32(instr);
36842                                    return;
36843                                  }
36844                                  if (((instr >> 12) & 1) != 0) {
36845                                    UnallocatedT32(instr);
36846                                    return;
36847                                  }
36848                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36849                                  if ((instr & 1) != 0) {
36850                                    UnallocatedT32(instr);
36851                                    return;
36852                                  }
36853                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36854                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36855                                  uint32_t imm =
36856                                      (dt.IsSize(64) ? 64
36857                                                     : (dt.GetSize() * 2)) -
36858                                      imm6;
36859                                  // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36860                                  vrshr(CurrentCond(),
36861                                        dt,
36862                                        QRegister(rd),
36863                                        QRegister(rm),
36864                                        imm);
36865                                  break;
36866                                }
36867                                case 0x00000300: {
36868                                  // 0xef800350
36869                                  if (((instr & 0x380080) == 0x0)) {
36870                                    UnallocatedT32(instr);
36871                                    return;
36872                                  }
36873                                  DataType dt =
36874                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36875                                                             ((instr >> 4) &
36876                                                              0x8),
36877                                                         (instr >> 28) & 0x1);
36878                                  if (dt.Is(kDataTypeValueInvalid)) {
36879                                    UnallocatedT32(instr);
36880                                    return;
36881                                  }
36882                                  if (((instr >> 12) & 1) != 0) {
36883                                    UnallocatedT32(instr);
36884                                    return;
36885                                  }
36886                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36887                                  if ((instr & 1) != 0) {
36888                                    UnallocatedT32(instr);
36889                                    return;
36890                                  }
36891                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36892                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36893                                  uint32_t imm =
36894                                      (dt.IsSize(64) ? 64
36895                                                     : (dt.GetSize() * 2)) -
36896                                      imm6;
36897                                  // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36898                                  vrsra(CurrentCond(),
36899                                        dt,
36900                                        QRegister(rd),
36901                                        QRegister(rm),
36902                                        imm);
36903                                  break;
36904                                }
36905                              }
36906                              break;
36907                            }
36908                          }
36909                          break;
36910                        }
36911                        case 0x00000400: {
36912                          // 0xef800450
36913                          switch (instr & 0x00380080) {
36914                            case 0x00000000: {
36915                              // 0xef800450
36916                              switch (instr & 0x00000100) {
36917                                case 0x00000000: {
36918                                  // 0xef800450
36919                                  switch (instr & 0x00000200) {
36920                                    default: {
36921                                      switch (instr & 0x00000020) {
36922                                        case 0x00000020: {
36923                                          // 0xef800470
36924                                          if (((instr & 0xd00) == 0x100) ||
36925                                              ((instr & 0xd00) == 0x500) ||
36926                                              ((instr & 0xd00) == 0x900) ||
36927                                              ((instr & 0xe00) == 0xe00)) {
36928                                            UnallocatedT32(instr);
36929                                            return;
36930                                          }
36931                                          unsigned cmode = (instr >> 8) & 0xf;
36932                                          DataType dt =
36933                                              ImmediateVmvn::DecodeDt(cmode);
36934                                          if (dt.Is(kDataTypeValueInvalid)) {
36935                                            UnallocatedT32(instr);
36936                                            return;
36937                                          }
36938                                          if (((instr >> 12) & 1) != 0) {
36939                                            UnallocatedT32(instr);
36940                                            return;
36941                                          }
36942                                          unsigned rd =
36943                                              ExtractQRegister(instr, 22, 12);
36944                                          QOperand imm =
36945                                              ImmediateVmvn::DecodeImmediate(
36946                                                  cmode,
36947                                                  (instr & 0xf) |
36948                                                      ((instr >> 12) & 0x70) |
36949                                                      ((instr >> 21) & 0x80));
36950                                          // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36951                                          vmvn(CurrentCond(),
36952                                               dt,
36953                                               QRegister(rd),
36954                                               imm);
36955                                          break;
36956                                        }
36957                                        default: {
36958                                          if (((instr & 0x920) == 0x100) ||
36959                                              ((instr & 0x520) == 0x100) ||
36960                                              ((instr & 0x820) == 0x20) ||
36961                                              ((instr & 0x420) == 0x20) ||
36962                                              ((instr & 0x220) == 0x20) ||
36963                                              ((instr & 0x120) == 0x120)) {
36964                                            UnallocatedT32(instr);
36965                                            return;
36966                                          }
36967                                          unsigned cmode =
36968                                              ((instr >> 8) & 0xf) |
36969                                              ((instr >> 1) & 0x10);
36970                                          DataType dt =
36971                                              ImmediateVmov::DecodeDt(cmode);
36972                                          if (dt.Is(kDataTypeValueInvalid)) {
36973                                            UnallocatedT32(instr);
36974                                            return;
36975                                          }
36976                                          if (((instr >> 12) & 1) != 0) {
36977                                            UnallocatedT32(instr);
36978                                            return;
36979                                          }
36980                                          unsigned rd =
36981                                              ExtractQRegister(instr, 22, 12);
36982                                          QOperand imm =
36983                                              ImmediateVmov::DecodeImmediate(
36984                                                  cmode,
36985                                                  (instr & 0xf) |
36986                                                      ((instr >> 12) & 0x70) |
36987                                                      ((instr >> 21) & 0x80));
36988                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36989                                          vmov(CurrentCond(),
36990                                               dt,
36991                                               QRegister(rd),
36992                                               imm);
36993                                          break;
36994                                        }
36995                                      }
36996                                      break;
36997                                    }
36998                                  }
36999                                  break;
37000                                }
37001                                case 0x00000100: {
37002                                  // 0xef800550
37003                                  switch (instr & 0x00000020) {
37004                                    case 0x00000000: {
37005                                      // 0xef800550
37006                                      if (((instr & 0x100) == 0x0) ||
37007                                          ((instr & 0xc00) == 0xc00)) {
37008                                        UnallocatedT32(instr);
37009                                        return;
37010                                      }
37011                                      unsigned cmode = (instr >> 8) & 0xf;
37012                                      DataType dt =
37013                                          ImmediateVorr::DecodeDt(cmode);
37014                                      if (dt.Is(kDataTypeValueInvalid)) {
37015                                        UnallocatedT32(instr);
37016                                        return;
37017                                      }
37018                                      if (((instr >> 12) & 1) != 0) {
37019                                        UnallocatedT32(instr);
37020                                        return;
37021                                      }
37022                                      unsigned rd =
37023                                          ExtractQRegister(instr, 22, 12);
37024                                      QOperand imm =
37025                                          ImmediateVorr::DecodeImmediate(
37026                                              cmode,
37027                                              (instr & 0xf) |
37028                                                  ((instr >> 12) & 0x70) |
37029                                                  ((instr >> 21) & 0x80));
37030                                      // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
37031                                      vorr(CurrentCond(),
37032                                           dt,
37033                                           QRegister(rd),
37034                                           QRegister(rd),
37035                                           imm);
37036                                      break;
37037                                    }
37038                                    case 0x00000020: {
37039                                      // 0xef800570
37040                                      if (((instr & 0x100) == 0x0) ||
37041                                          ((instr & 0xc00) == 0xc00)) {
37042                                        UnallocatedT32(instr);
37043                                        return;
37044                                      }
37045                                      unsigned cmode = (instr >> 8) & 0xf;
37046                                      DataType dt =
37047                                          ImmediateVbic::DecodeDt(cmode);
37048                                      if (dt.Is(kDataTypeValueInvalid)) {
37049                                        UnallocatedT32(instr);
37050                                        return;
37051                                      }
37052                                      if (((instr >> 12) & 1) != 0) {
37053                                        UnallocatedT32(instr);
37054                                        return;
37055                                      }
37056                                      unsigned rd =
37057                                          ExtractQRegister(instr, 22, 12);
37058                                      QOperand imm =
37059                                          ImmediateVbic::DecodeImmediate(
37060                                              cmode,
37061                                              (instr & 0xf) |
37062                                                  ((instr >> 12) & 0x70) |
37063                                                  ((instr >> 21) & 0x80));
37064                                      // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
37065                                      vbic(CurrentCond(),
37066                                           dt,
37067                                           QRegister(rd),
37068                                           QRegister(rd),
37069                                           imm);
37070                                      break;
37071                                    }
37072                                  }
37073                                  break;
37074                                }
37075                              }
37076                              break;
37077                            }
37078                            default: {
37079                              switch (instr & 0x00000300) {
37080                                case 0x00000000: {
37081                                  // 0xef800450
37082                                  if ((instr & 0x10000000) == 0x10000000) {
37083                                    if (((instr & 0x380080) == 0x0)) {
37084                                      UnallocatedT32(instr);
37085                                      return;
37086                                    }
37087                                    DataType dt = Dt_L_imm6_4_Decode(
37088                                        ((instr >> 19) & 0x7) |
37089                                        ((instr >> 4) & 0x8));
37090                                    if (dt.Is(kDataTypeValueInvalid)) {
37091                                      UnallocatedT32(instr);
37092                                      return;
37093                                    }
37094                                    if (((instr >> 12) & 1) != 0) {
37095                                      UnallocatedT32(instr);
37096                                      return;
37097                                    }
37098                                    unsigned rd =
37099                                        ExtractQRegister(instr, 22, 12);
37100                                    if ((instr & 1) != 0) {
37101                                      UnallocatedT32(instr);
37102                                      return;
37103                                    }
37104                                    unsigned rm = ExtractQRegister(instr, 5, 0);
37105                                    uint32_t imm6 = (instr >> 16) & 0x3f;
37106                                    uint32_t imm =
37107                                        (dt.IsSize(64) ? 64
37108                                                       : (dt.GetSize() * 2)) -
37109                                        imm6;
37110                                    // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37111                                    vsri(CurrentCond(),
37112                                         dt,
37113                                         QRegister(rd),
37114                                         QRegister(rm),
37115                                         imm);
37116                                  } else {
37117                                    UnallocatedT32(instr);
37118                                  }
37119                                  break;
37120                                }
37121                                case 0x00000100: {
37122                                  // 0xef800550
37123                                  switch (instr & 0x10000000) {
37124                                    case 0x00000000: {
37125                                      // 0xef800550
37126                                      if (((instr & 0x380080) == 0x0)) {
37127                                        UnallocatedT32(instr);
37128                                        return;
37129                                      }
37130                                      DataType dt = Dt_L_imm6_3_Decode(
37131                                          ((instr >> 19) & 0x7) |
37132                                          ((instr >> 4) & 0x8));
37133                                      if (dt.Is(kDataTypeValueInvalid)) {
37134                                        UnallocatedT32(instr);
37135                                        return;
37136                                      }
37137                                      if (((instr >> 12) & 1) != 0) {
37138                                        UnallocatedT32(instr);
37139                                        return;
37140                                      }
37141                                      unsigned rd =
37142                                          ExtractQRegister(instr, 22, 12);
37143                                      if ((instr & 1) != 0) {
37144                                        UnallocatedT32(instr);
37145                                        return;
37146                                      }
37147                                      unsigned rm =
37148                                          ExtractQRegister(instr, 5, 0);
37149                                      uint32_t imm6 = (instr >> 16) & 0x3f;
37150                                      uint32_t imm =
37151                                          imm6 -
37152                                          (dt.IsSize(64) ? 0 : dt.GetSize());
37153                                      // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37154                                      vshl(CurrentCond(),
37155                                           dt,
37156                                           QRegister(rd),
37157                                           QRegister(rm),
37158                                           imm);
37159                                      break;
37160                                    }
37161                                    case 0x10000000: {
37162                                      // 0xff800550
37163                                      if (((instr & 0x380080) == 0x0)) {
37164                                        UnallocatedT32(instr);
37165                                        return;
37166                                      }
37167                                      DataType dt = Dt_L_imm6_4_Decode(
37168                                          ((instr >> 19) & 0x7) |
37169                                          ((instr >> 4) & 0x8));
37170                                      if (dt.Is(kDataTypeValueInvalid)) {
37171                                        UnallocatedT32(instr);
37172                                        return;
37173                                      }
37174                                      if (((instr >> 12) & 1) != 0) {
37175                                        UnallocatedT32(instr);
37176                                        return;
37177                                      }
37178                                      unsigned rd =
37179                                          ExtractQRegister(instr, 22, 12);
37180                                      if ((instr & 1) != 0) {
37181                                        UnallocatedT32(instr);
37182                                        return;
37183                                      }
37184                                      unsigned rm =
37185                                          ExtractQRegister(instr, 5, 0);
37186                                      uint32_t imm6 = (instr >> 16) & 0x3f;
37187                                      uint32_t imm =
37188                                          imm6 -
37189                                          (dt.IsSize(64) ? 0 : dt.GetSize());
37190                                      // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37191                                      vsli(CurrentCond(),
37192                                           dt,
37193                                           QRegister(rd),
37194                                           QRegister(rm),
37195                                           imm);
37196                                      break;
37197                                    }
37198                                  }
37199                                  break;
37200                                }
37201                                case 0x00000200: {
37202                                  // 0xef800650
37203                                  if (((instr & 0x380080) == 0x0)) {
37204                                    UnallocatedT32(instr);
37205                                    return;
37206                                  }
37207                                  DataType dt =
37208                                      Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
37209                                                             ((instr >> 4) &
37210                                                              0x8),
37211                                                         (instr >> 28) & 0x1);
37212                                  if (dt.Is(kDataTypeValueInvalid)) {
37213                                    UnallocatedT32(instr);
37214                                    return;
37215                                  }
37216                                  if (((instr >> 12) & 1) != 0) {
37217                                    UnallocatedT32(instr);
37218                                    return;
37219                                  }
37220                                  unsigned rd = ExtractQRegister(instr, 22, 12);
37221                                  if ((instr & 1) != 0) {
37222                                    UnallocatedT32(instr);
37223                                    return;
37224                                  }
37225                                  unsigned rm = ExtractQRegister(instr, 5, 0);
37226                                  uint32_t imm6 = (instr >> 16) & 0x3f;
37227                                  uint32_t imm =
37228                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
37229                                  // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37230                                  vqshlu(CurrentCond(),
37231                                         dt,
37232                                         QRegister(rd),
37233                                         QRegister(rm),
37234                                         imm);
37235                                  break;
37236                                }
37237                                case 0x00000300: {
37238                                  // 0xef800750
37239                                  if (((instr & 0x380080) == 0x0)) {
37240                                    UnallocatedT32(instr);
37241                                    return;
37242                                  }
37243                                  DataType dt =
37244                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
37245                                                             ((instr >> 4) &
37246                                                              0x8),
37247                                                         (instr >> 28) & 0x1);
37248                                  if (dt.Is(kDataTypeValueInvalid)) {
37249                                    UnallocatedT32(instr);
37250                                    return;
37251                                  }
37252                                  if (((instr >> 12) & 1) != 0) {
37253                                    UnallocatedT32(instr);
37254                                    return;
37255                                  }
37256                                  unsigned rd = ExtractQRegister(instr, 22, 12);
37257                                  if ((instr & 1) != 0) {
37258                                    UnallocatedT32(instr);
37259                                    return;
37260                                  }
37261                                  unsigned rm = ExtractQRegister(instr, 5, 0);
37262                                  uint32_t imm6 = (instr >> 16) & 0x3f;
37263                                  uint32_t imm =
37264                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
37265                                  // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37266                                  vqshl(CurrentCond(),
37267                                        dt,
37268                                        QRegister(rd),
37269                                        QRegister(rm),
37270                                        imm);
37271                                  break;
37272                                }
37273                              }
37274                              break;
37275                            }
37276                          }
37277                          break;
37278                        }
37279                        case 0x00000800: {
37280                          // 0xef800850
37281                          switch (instr & 0x00000080) {
37282                            case 0x00000000: {
37283                              // 0xef800850
37284                              switch (instr & 0x00380000) {
37285                                case 0x00000000: {
37286                                  // 0xef800850
37287                                  switch (instr & 0x00000100) {
37288                                    case 0x00000000: {
37289                                      // 0xef800850
37290                                      switch (instr & 0x00000200) {
37291                                        default: {
37292                                          switch (instr & 0x00000020) {
37293                                            case 0x00000020: {
37294                                              // 0xef800870
37295                                              if (((instr & 0xd00) == 0x100) ||
37296                                                  ((instr & 0xd00) == 0x500) ||
37297                                                  ((instr & 0xd00) == 0x900) ||
37298                                                  ((instr & 0xe00) == 0xe00)) {
37299                                                UnallocatedT32(instr);
37300                                                return;
37301                                              }
37302                                              unsigned cmode =
37303                                                  (instr >> 8) & 0xf;
37304                                              DataType dt =
37305                                                  ImmediateVmvn::DecodeDt(
37306                                                      cmode);
37307                                              if (dt.Is(
37308                                                      kDataTypeValueInvalid)) {
37309                                                UnallocatedT32(instr);
37310                                                return;
37311                                              }
37312                                              if (((instr >> 12) & 1) != 0) {
37313                                                UnallocatedT32(instr);
37314                                                return;
37315                                              }
37316                                              unsigned rd =
37317                                                  ExtractQRegister(instr,
37318                                                                   22,
37319                                                                   12);
37320                                              QOperand imm = ImmediateVmvn::
37321                                                  DecodeImmediate(cmode,
37322                                                                  (instr &
37323                                                                   0xf) |
37324                                                                      ((instr >>
37325                                                                        12) &
37326                                                                       0x70) |
37327                                                                      ((instr >>
37328                                                                        21) &
37329                                                                       0x80));
37330                                              // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37331                                              vmvn(CurrentCond(),
37332                                                   dt,
37333                                                   QRegister(rd),
37334                                                   imm);
37335                                              break;
37336                                            }
37337                                            default: {
37338                                              if (((instr & 0x920) == 0x100) ||
37339                                                  ((instr & 0x520) == 0x100) ||
37340                                                  ((instr & 0x820) == 0x20) ||
37341                                                  ((instr & 0x420) == 0x20) ||
37342                                                  ((instr & 0x220) == 0x20) ||
37343                                                  ((instr & 0x120) == 0x120)) {
37344                                                UnallocatedT32(instr);
37345                                                return;
37346                                              }
37347                                              unsigned cmode =
37348                                                  ((instr >> 8) & 0xf) |
37349                                                  ((instr >> 1) & 0x10);
37350                                              DataType dt =
37351                                                  ImmediateVmov::DecodeDt(
37352                                                      cmode);
37353                                              if (dt.Is(
37354                                                      kDataTypeValueInvalid)) {
37355                                                UnallocatedT32(instr);
37356                                                return;
37357                                              }
37358                                              if (((instr >> 12) & 1) != 0) {
37359                                                UnallocatedT32(instr);
37360                                                return;
37361                                              }
37362                                              unsigned rd =
37363                                                  ExtractQRegister(instr,
37364                                                                   22,
37365                                                                   12);
37366                                              QOperand imm = ImmediateVmov::
37367                                                  DecodeImmediate(cmode,
37368                                                                  (instr &
37369                                                                   0xf) |
37370                                                                      ((instr >>
37371                                                                        12) &
37372                                                                       0x70) |
37373                                                                      ((instr >>
37374                                                                        21) &
37375                                                                       0x80));
37376                                              // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37377                                              vmov(CurrentCond(),
37378                                                   dt,
37379                                                   QRegister(rd),
37380                                                   imm);
37381                                              break;
37382                                            }
37383                                          }
37384                                          break;
37385                                        }
37386                                      }
37387                                      break;
37388                                    }
37389                                    case 0x00000100: {
37390                                      // 0xef800950
37391                                      switch (instr & 0x00000020) {
37392                                        case 0x00000000: {
37393                                          // 0xef800950
37394                                          if (((instr & 0x100) == 0x0) ||
37395                                              ((instr & 0xc00) == 0xc00)) {
37396                                            UnallocatedT32(instr);
37397                                            return;
37398                                          }
37399                                          unsigned cmode = (instr >> 8) & 0xf;
37400                                          DataType dt =
37401                                              ImmediateVorr::DecodeDt(cmode);
37402                                          if (dt.Is(kDataTypeValueInvalid)) {
37403                                            UnallocatedT32(instr);
37404                                            return;
37405                                          }
37406                                          if (((instr >> 12) & 1) != 0) {
37407                                            UnallocatedT32(instr);
37408                                            return;
37409                                          }
37410                                          unsigned rd =
37411                                              ExtractQRegister(instr, 22, 12);
37412                                          QOperand imm =
37413                                              ImmediateVorr::DecodeImmediate(
37414                                                  cmode,
37415                                                  (instr & 0xf) |
37416                                                      ((instr >> 12) & 0x70) |
37417                                                      ((instr >> 21) & 0x80));
37418                                          // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
37419                                          vorr(CurrentCond(),
37420                                               dt,
37421                                               QRegister(rd),
37422                                               QRegister(rd),
37423                                               imm);
37424                                          break;
37425                                        }
37426                                        case 0x00000020: {
37427                                          // 0xef800970
37428                                          if (((instr & 0x100) == 0x0) ||
37429                                              ((instr & 0xc00) == 0xc00)) {
37430                                            UnallocatedT32(instr);
37431                                            return;
37432                                          }
37433                                          unsigned cmode = (instr >> 8) & 0xf;
37434                                          DataType dt =
37435                                              ImmediateVbic::DecodeDt(cmode);
37436                                          if (dt.Is(kDataTypeValueInvalid)) {
37437                                            UnallocatedT32(instr);
37438                                            return;
37439                                          }
37440                                          if (((instr >> 12) & 1) != 0) {
37441                                            UnallocatedT32(instr);
37442                                            return;
37443                                          }
37444                                          unsigned rd =
37445                                              ExtractQRegister(instr, 22, 12);
37446                                          QOperand imm =
37447                                              ImmediateVbic::DecodeImmediate(
37448                                                  cmode,
37449                                                  (instr & 0xf) |
37450                                                      ((instr >> 12) & 0x70) |
37451                                                      ((instr >> 21) & 0x80));
37452                                          // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
37453                                          vbic(CurrentCond(),
37454                                               dt,
37455                                               QRegister(rd),
37456                                               QRegister(rd),
37457                                               imm);
37458                                          break;
37459                                        }
37460                                      }
37461                                      break;
37462                                    }
37463                                  }
37464                                  break;
37465                                }
37466                                default: {
37467                                  switch (instr & 0x00000300) {
37468                                    case 0x00000000: {
37469                                      // 0xef800850
37470                                      switch (instr & 0x10000000) {
37471                                        case 0x00000000: {
37472                                          // 0xef800850
37473                                          if (((instr & 0x380000) == 0x0)) {
37474                                            UnallocatedT32(instr);
37475                                            return;
37476                                          }
37477                                          DataType dt = Dt_imm6_3_Decode(
37478                                              (instr >> 19) & 0x7);
37479                                          if (dt.Is(kDataTypeValueInvalid)) {
37480                                            UnallocatedT32(instr);
37481                                            return;
37482                                          }
37483                                          unsigned rd =
37484                                              ExtractDRegister(instr, 22, 12);
37485                                          if ((instr & 1) != 0) {
37486                                            UnallocatedT32(instr);
37487                                            return;
37488                                          }
37489                                          unsigned rm =
37490                                              ExtractQRegister(instr, 5, 0);
37491                                          uint32_t imm6 = (instr >> 16) & 0x3f;
37492                                          uint32_t imm = dt.GetSize() - imm6;
37493                                          // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37494                                          vrshrn(CurrentCond(),
37495                                                 dt,
37496                                                 DRegister(rd),
37497                                                 QRegister(rm),
37498                                                 imm);
37499                                          break;
37500                                        }
37501                                        case 0x10000000: {
37502                                          // 0xff800850
37503                                          if (((instr & 0x380000) == 0x0)) {
37504                                            UnallocatedT32(instr);
37505                                            return;
37506                                          }
37507                                          DataType dt =
37508                                              Dt_imm6_2_Decode((instr >> 19) &
37509                                                                   0x7,
37510                                                               (instr >> 28) &
37511                                                                   0x1);
37512                                          if (dt.Is(kDataTypeValueInvalid)) {
37513                                            UnallocatedT32(instr);
37514                                            return;
37515                                          }
37516                                          unsigned rd =
37517                                              ExtractDRegister(instr, 22, 12);
37518                                          if ((instr & 1) != 0) {
37519                                            UnallocatedT32(instr);
37520                                            return;
37521                                          }
37522                                          unsigned rm =
37523                                              ExtractQRegister(instr, 5, 0);
37524                                          uint32_t imm6 = (instr >> 16) & 0x3f;
37525                                          uint32_t imm = dt.GetSize() - imm6;
37526                                          // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37527                                          vqrshrun(CurrentCond(),
37528                                                   dt,
37529                                                   DRegister(rd),
37530                                                   QRegister(rm),
37531                                                   imm);
37532                                          break;
37533                                        }
37534                                      }
37535                                      break;
37536                                    }
37537                                    case 0x00000100: {
37538                                      // 0xef800950
37539                                      if (((instr & 0x380000) == 0x0)) {
37540                                        UnallocatedT32(instr);
37541                                        return;
37542                                      }
37543                                      DataType dt =
37544                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
37545                                                           (instr >> 28) & 0x1);
37546                                      if (dt.Is(kDataTypeValueInvalid)) {
37547                                        UnallocatedT32(instr);
37548                                        return;
37549                                      }
37550                                      unsigned rd =
37551                                          ExtractDRegister(instr, 22, 12);
37552                                      if ((instr & 1) != 0) {
37553                                        UnallocatedT32(instr);
37554                                        return;
37555                                      }
37556                                      unsigned rm =
37557                                          ExtractQRegister(instr, 5, 0);
37558                                      uint32_t imm6 = (instr >> 16) & 0x3f;
37559                                      uint32_t imm = dt.GetSize() - imm6;
37560                                      // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37561                                      vqrshrn(CurrentCond(),
37562                                              dt,
37563                                              DRegister(rd),
37564                                              QRegister(rm),
37565                                              imm);
37566                                      break;
37567                                    }
37568                                    default:
37569                                      UnallocatedT32(instr);
37570                                      break;
37571                                  }
37572                                  break;
37573                                }
37574                              }
37575                              break;
37576                            }
37577                            default:
37578                              UnallocatedT32(instr);
37579                              break;
37580                          }
37581                          break;
37582                        }
37583                        case 0x00000c00: {
37584                          // 0xef800c50
37585                          switch (instr & 0x00000080) {
37586                            case 0x00000000: {
37587                              // 0xef800c50
37588                              switch (instr & 0x00200000) {
37589                                case 0x00000000: {
37590                                  // 0xef800c50
37591                                  switch (instr & 0x00180000) {
37592                                    case 0x00000000: {
37593                                      // 0xef800c50
37594                                      switch (instr & 0x00000300) {
37595                                        case 0x00000200: {
37596                                          // 0xef800e50
37597                                          if (((instr & 0x920) == 0x100) ||
37598                                              ((instr & 0x520) == 0x100) ||
37599                                              ((instr & 0x820) == 0x20) ||
37600                                              ((instr & 0x420) == 0x20) ||
37601                                              ((instr & 0x220) == 0x20) ||
37602                                              ((instr & 0x120) == 0x120)) {
37603                                            UnallocatedT32(instr);
37604                                            return;
37605                                          }
37606                                          unsigned cmode =
37607                                              ((instr >> 8) & 0xf) |
37608                                              ((instr >> 1) & 0x10);
37609                                          DataType dt =
37610                                              ImmediateVmov::DecodeDt(cmode);
37611                                          if (dt.Is(kDataTypeValueInvalid)) {
37612                                            UnallocatedT32(instr);
37613                                            return;
37614                                          }
37615                                          if (((instr >> 12) & 1) != 0) {
37616                                            UnallocatedT32(instr);
37617                                            return;
37618                                          }
37619                                          unsigned rd =
37620                                              ExtractQRegister(instr, 22, 12);
37621                                          QOperand imm =
37622                                              ImmediateVmov::DecodeImmediate(
37623                                                  cmode,
37624                                                  (instr & 0xf) |
37625                                                      ((instr >> 12) & 0x70) |
37626                                                      ((instr >> 21) & 0x80));
37627                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37628                                          vmov(CurrentCond(),
37629                                               dt,
37630                                               QRegister(rd),
37631                                               imm);
37632                                          break;
37633                                        }
37634                                        case 0x00000300: {
37635                                          // 0xef800f50
37636                                          if (((instr & 0x920) == 0x100) ||
37637                                              ((instr & 0x520) == 0x100) ||
37638                                              ((instr & 0x820) == 0x20) ||
37639                                              ((instr & 0x420) == 0x20) ||
37640                                              ((instr & 0x220) == 0x20) ||
37641                                              ((instr & 0x120) == 0x120)) {
37642                                            UnallocatedT32(instr);
37643                                            return;
37644                                          }
37645                                          unsigned cmode =
37646                                              ((instr >> 8) & 0xf) |
37647                                              ((instr >> 1) & 0x10);
37648                                          DataType dt =
37649                                              ImmediateVmov::DecodeDt(cmode);
37650                                          if (dt.Is(kDataTypeValueInvalid)) {
37651                                            UnallocatedT32(instr);
37652                                            return;
37653                                          }
37654                                          if (((instr >> 12) & 1) != 0) {
37655                                            UnallocatedT32(instr);
37656                                            return;
37657                                          }
37658                                          unsigned rd =
37659                                              ExtractQRegister(instr, 22, 12);
37660                                          QOperand imm =
37661                                              ImmediateVmov::DecodeImmediate(
37662                                                  cmode,
37663                                                  (instr & 0xf) |
37664                                                      ((instr >> 12) & 0x70) |
37665                                                      ((instr >> 21) & 0x80));
37666                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37667                                          vmov(CurrentCond(),
37668                                               dt,
37669                                               QRegister(rd),
37670                                               imm);
37671                                          break;
37672                                        }
37673                                        default: {
37674                                          switch (instr & 0x00000020) {
37675                                            case 0x00000020: {
37676                                              // 0xef800c70
37677                                              switch (instr & 0x00000f20) {
37678                                                case 0x00000000: {
37679                                                  // 0xef800c50
37680                                                  if (((instr & 0x920) ==
37681                                                       0x100) ||
37682                                                      ((instr & 0x520) ==
37683                                                       0x100) ||
37684                                                      ((instr & 0x820) ==
37685                                                       0x20) ||
37686                                                      ((instr & 0x420) ==
37687                                                       0x20) ||
37688                                                      ((instr & 0x220) ==
37689                                                       0x20) ||
37690                                                      ((instr & 0x120) ==
37691                                                       0x120)) {
37692                                                    UnallocatedT32(instr);
37693                                                    return;
37694                                                  }
37695                                                  unsigned cmode =
37696                                                      ((instr >> 8) & 0xf) |
37697                                                      ((instr >> 1) & 0x10);
37698                                                  DataType dt =
37699                                                      ImmediateVmov::DecodeDt(
37700                                                          cmode);
37701                                                  if (dt.Is(
37702                                                          kDataTypeValueInvalid)) {
37703                                                    UnallocatedT32(instr);
37704                                                    return;
37705                                                  }
37706                                                  if (((instr >> 12) & 1) !=
37707                                                      0) {
37708                                                    UnallocatedT32(instr);
37709                                                    return;
37710                                                  }
37711                                                  unsigned rd =
37712                                                      ExtractQRegister(instr,
37713                                                                       22,
37714                                                                       12);
37715                                                  QOperand imm = ImmediateVmov::
37716                                                      DecodeImmediate(
37717                                                          cmode,
37718                                                          (instr & 0xf) |
37719                                                              ((instr >> 12) &
37720                                                               0x70) |
37721                                                              ((instr >> 21) &
37722                                                               0x80));
37723                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37724                                                  vmov(CurrentCond(),
37725                                                       dt,
37726                                                       QRegister(rd),
37727                                                       imm);
37728                                                  break;
37729                                                }
37730                                                case 0x00000020: {
37731                                                  // 0xef800c70
37732                                                  if (((instr & 0xd00) ==
37733                                                       0x100) ||
37734                                                      ((instr & 0xd00) ==
37735                                                       0x500) ||
37736                                                      ((instr & 0xd00) ==
37737                                                       0x900) ||
37738                                                      ((instr & 0xe00) ==
37739                                                       0xe00)) {
37740                                                    UnallocatedT32(instr);
37741                                                    return;
37742                                                  }
37743                                                  unsigned cmode =
37744                                                      (instr >> 8) & 0xf;
37745                                                  DataType dt =
37746                                                      ImmediateVmvn::DecodeDt(
37747                                                          cmode);
37748                                                  if (dt.Is(
37749                                                          kDataTypeValueInvalid)) {
37750                                                    UnallocatedT32(instr);
37751                                                    return;
37752                                                  }
37753                                                  if (((instr >> 12) & 1) !=
37754                                                      0) {
37755                                                    UnallocatedT32(instr);
37756                                                    return;
37757                                                  }
37758                                                  unsigned rd =
37759                                                      ExtractQRegister(instr,
37760                                                                       22,
37761                                                                       12);
37762                                                  QOperand imm = ImmediateVmvn::
37763                                                      DecodeImmediate(
37764                                                          cmode,
37765                                                          (instr & 0xf) |
37766                                                              ((instr >> 12) &
37767                                                               0x70) |
37768                                                              ((instr >> 21) &
37769                                                               0x80));
37770                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37771                                                  vmvn(CurrentCond(),
37772                                                       dt,
37773                                                       QRegister(rd),
37774                                                       imm);
37775                                                  break;
37776                                                }
37777                                                case 0x00000200: {
37778                                                  // 0xef800e50
37779                                                  if (((instr & 0x920) ==
37780                                                       0x100) ||
37781                                                      ((instr & 0x520) ==
37782                                                       0x100) ||
37783                                                      ((instr & 0x820) ==
37784                                                       0x20) ||
37785                                                      ((instr & 0x420) ==
37786                                                       0x20) ||
37787                                                      ((instr & 0x220) ==
37788                                                       0x20) ||
37789                                                      ((instr & 0x120) ==
37790                                                       0x120)) {
37791                                                    UnallocatedT32(instr);
37792                                                    return;
37793                                                  }
37794                                                  unsigned cmode =
37795                                                      ((instr >> 8) & 0xf) |
37796                                                      ((instr >> 1) & 0x10);
37797                                                  DataType dt =
37798                                                      ImmediateVmov::DecodeDt(
37799                                                          cmode);
37800                                                  if (dt.Is(
37801                                                          kDataTypeValueInvalid)) {
37802                                                    UnallocatedT32(instr);
37803                                                    return;
37804                                                  }
37805                                                  if (((instr >> 12) & 1) !=
37806                                                      0) {
37807                                                    UnallocatedT32(instr);
37808                                                    return;
37809                                                  }
37810                                                  unsigned rd =
37811                                                      ExtractQRegister(instr,
37812                                                                       22,
37813                                                                       12);
37814                                                  QOperand imm = ImmediateVmov::
37815                                                      DecodeImmediate(
37816                                                          cmode,
37817                                                          (instr & 0xf) |
37818                                                              ((instr >> 12) &
37819                                                               0x70) |
37820                                                              ((instr >> 21) &
37821                                                               0x80));
37822                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37823                                                  vmov(CurrentCond(),
37824                                                       dt,
37825                                                       QRegister(rd),
37826                                                       imm);
37827                                                  break;
37828                                                }
37829                                                case 0x00000220: {
37830                                                  // 0xef800e70
37831                                                  if (((instr & 0xd00) ==
37832                                                       0x100) ||
37833                                                      ((instr & 0xd00) ==
37834                                                       0x500) ||
37835                                                      ((instr & 0xd00) ==
37836                                                       0x900) ||
37837                                                      ((instr & 0xe00) ==
37838                                                       0xe00)) {
37839                                                    UnallocatedT32(instr);
37840                                                    return;
37841                                                  }
37842                                                  unsigned cmode =
37843                                                      (instr >> 8) & 0xf;
37844                                                  DataType dt =
37845                                                      ImmediateVmvn::DecodeDt(
37846                                                          cmode);
37847                                                  if (dt.Is(
37848                                                          kDataTypeValueInvalid)) {
37849                                                    UnallocatedT32(instr);
37850                                                    return;
37851                                                  }
37852                                                  if (((instr >> 12) & 1) !=
37853                                                      0) {
37854                                                    UnallocatedT32(instr);
37855                                                    return;
37856                                                  }
37857                                                  unsigned rd =
37858                                                      ExtractQRegister(instr,
37859                                                                       22,
37860                                                                       12);
37861                                                  QOperand imm = ImmediateVmvn::
37862                                                      DecodeImmediate(
37863                                                          cmode,
37864                                                          (instr & 0xf) |
37865                                                              ((instr >> 12) &
37866                                                               0x70) |
37867                                                              ((instr >> 21) &
37868                                                               0x80));
37869                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37870                                                  vmvn(CurrentCond(),
37871                                                       dt,
37872                                                       QRegister(rd),
37873                                                       imm);
37874                                                  break;
37875                                                }
37876                                                case 0x00000400: {
37877                                                  // 0xef800c50
37878                                                  if (((instr & 0x920) ==
37879                                                       0x100) ||
37880                                                      ((instr & 0x520) ==
37881                                                       0x100) ||
37882                                                      ((instr & 0x820) ==
37883                                                       0x20) ||
37884                                                      ((instr & 0x420) ==
37885                                                       0x20) ||
37886                                                      ((instr & 0x220) ==
37887                                                       0x20) ||
37888                                                      ((instr & 0x120) ==
37889                                                       0x120)) {
37890                                                    UnallocatedT32(instr);
37891                                                    return;
37892                                                  }
37893                                                  unsigned cmode =
37894                                                      ((instr >> 8) & 0xf) |
37895                                                      ((instr >> 1) & 0x10);
37896                                                  DataType dt =
37897                                                      ImmediateVmov::DecodeDt(
37898                                                          cmode);
37899                                                  if (dt.Is(
37900                                                          kDataTypeValueInvalid)) {
37901                                                    UnallocatedT32(instr);
37902                                                    return;
37903                                                  }
37904                                                  if (((instr >> 12) & 1) !=
37905                                                      0) {
37906                                                    UnallocatedT32(instr);
37907                                                    return;
37908                                                  }
37909                                                  unsigned rd =
37910                                                      ExtractQRegister(instr,
37911                                                                       22,
37912                                                                       12);
37913                                                  QOperand imm = ImmediateVmov::
37914                                                      DecodeImmediate(
37915                                                          cmode,
37916                                                          (instr & 0xf) |
37917                                                              ((instr >> 12) &
37918                                                               0x70) |
37919                                                              ((instr >> 21) &
37920                                                               0x80));
37921                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37922                                                  vmov(CurrentCond(),
37923                                                       dt,
37924                                                       QRegister(rd),
37925                                                       imm);
37926                                                  break;
37927                                                }
37928                                                case 0x00000420: {
37929                                                  // 0xef800c70
37930                                                  if (((instr & 0xd00) ==
37931                                                       0x100) ||
37932                                                      ((instr & 0xd00) ==
37933                                                       0x500) ||
37934                                                      ((instr & 0xd00) ==
37935                                                       0x900) ||
37936                                                      ((instr & 0xe00) ==
37937                                                       0xe00)) {
37938                                                    UnallocatedT32(instr);
37939                                                    return;
37940                                                  }
37941                                                  unsigned cmode =
37942                                                      (instr >> 8) & 0xf;
37943                                                  DataType dt =
37944                                                      ImmediateVmvn::DecodeDt(
37945                                                          cmode);
37946                                                  if (dt.Is(
37947                                                          kDataTypeValueInvalid)) {
37948                                                    UnallocatedT32(instr);
37949                                                    return;
37950                                                  }
37951                                                  if (((instr >> 12) & 1) !=
37952                                                      0) {
37953                                                    UnallocatedT32(instr);
37954                                                    return;
37955                                                  }
37956                                                  unsigned rd =
37957                                                      ExtractQRegister(instr,
37958                                                                       22,
37959                                                                       12);
37960                                                  QOperand imm = ImmediateVmvn::
37961                                                      DecodeImmediate(
37962                                                          cmode,
37963                                                          (instr & 0xf) |
37964                                                              ((instr >> 12) &
37965                                                               0x70) |
37966                                                              ((instr >> 21) &
37967                                                               0x80));
37968                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37969                                                  vmvn(CurrentCond(),
37970                                                       dt,
37971                                                       QRegister(rd),
37972                                                       imm);
37973                                                  break;
37974                                                }
37975                                                case 0x00000600: {
37976                                                  // 0xef800e50
37977                                                  if (((instr & 0x920) ==
37978                                                       0x100) ||
37979                                                      ((instr & 0x520) ==
37980                                                       0x100) ||
37981                                                      ((instr & 0x820) ==
37982                                                       0x20) ||
37983                                                      ((instr & 0x420) ==
37984                                                       0x20) ||
37985                                                      ((instr & 0x220) ==
37986                                                       0x20) ||
37987                                                      ((instr & 0x120) ==
37988                                                       0x120)) {
37989                                                    UnallocatedT32(instr);
37990                                                    return;
37991                                                  }
37992                                                  unsigned cmode =
37993                                                      ((instr >> 8) & 0xf) |
37994                                                      ((instr >> 1) & 0x10);
37995                                                  DataType dt =
37996                                                      ImmediateVmov::DecodeDt(
37997                                                          cmode);
37998                                                  if (dt.Is(
37999                                                          kDataTypeValueInvalid)) {
38000                                                    UnallocatedT32(instr);
38001                                                    return;
38002                                                  }
38003                                                  if (((instr >> 12) & 1) !=
38004                                                      0) {
38005                                                    UnallocatedT32(instr);
38006                                                    return;
38007                                                  }
38008                                                  unsigned rd =
38009                                                      ExtractQRegister(instr,
38010                                                                       22,
38011                                                                       12);
38012                                                  QOperand imm = ImmediateVmov::
38013                                                      DecodeImmediate(
38014                                                          cmode,
38015                                                          (instr & 0xf) |
38016                                                              ((instr >> 12) &
38017                                                               0x70) |
38018                                                              ((instr >> 21) &
38019                                                               0x80));
38020                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38021                                                  vmov(CurrentCond(),
38022                                                       dt,
38023                                                       QRegister(rd),
38024                                                       imm);
38025                                                  break;
38026                                                }
38027                                                case 0x00000620: {
38028                                                  // 0xef800e70
38029                                                  if (((instr & 0xd00) ==
38030                                                       0x100) ||
38031                                                      ((instr & 0xd00) ==
38032                                                       0x500) ||
38033                                                      ((instr & 0xd00) ==
38034                                                       0x900) ||
38035                                                      ((instr & 0xe00) ==
38036                                                       0xe00)) {
38037                                                    UnallocatedT32(instr);
38038                                                    return;
38039                                                  }
38040                                                  unsigned cmode =
38041                                                      (instr >> 8) & 0xf;
38042                                                  DataType dt =
38043                                                      ImmediateVmvn::DecodeDt(
38044                                                          cmode);
38045                                                  if (dt.Is(
38046                                                          kDataTypeValueInvalid)) {
38047                                                    UnallocatedT32(instr);
38048                                                    return;
38049                                                  }
38050                                                  if (((instr >> 12) & 1) !=
38051                                                      0) {
38052                                                    UnallocatedT32(instr);
38053                                                    return;
38054                                                  }
38055                                                  unsigned rd =
38056                                                      ExtractQRegister(instr,
38057                                                                       22,
38058                                                                       12);
38059                                                  QOperand imm = ImmediateVmvn::
38060                                                      DecodeImmediate(
38061                                                          cmode,
38062                                                          (instr & 0xf) |
38063                                                              ((instr >> 12) &
38064                                                               0x70) |
38065                                                              ((instr >> 21) &
38066                                                               0x80));
38067                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38068                                                  vmvn(CurrentCond(),
38069                                                       dt,
38070                                                       QRegister(rd),
38071                                                       imm);
38072                                                  break;
38073                                                }
38074                                                case 0x00000800: {
38075                                                  // 0xef800c50
38076                                                  if (((instr & 0x920) ==
38077                                                       0x100) ||
38078                                                      ((instr & 0x520) ==
38079                                                       0x100) ||
38080                                                      ((instr & 0x820) ==
38081                                                       0x20) ||
38082                                                      ((instr & 0x420) ==
38083                                                       0x20) ||
38084                                                      ((instr & 0x220) ==
38085                                                       0x20) ||
38086                                                      ((instr & 0x120) ==
38087                                                       0x120)) {
38088                                                    UnallocatedT32(instr);
38089                                                    return;
38090                                                  }
38091                                                  unsigned cmode =
38092                                                      ((instr >> 8) & 0xf) |
38093                                                      ((instr >> 1) & 0x10);
38094                                                  DataType dt =
38095                                                      ImmediateVmov::DecodeDt(
38096                                                          cmode);
38097                                                  if (dt.Is(
38098                                                          kDataTypeValueInvalid)) {
38099                                                    UnallocatedT32(instr);
38100                                                    return;
38101                                                  }
38102                                                  if (((instr >> 12) & 1) !=
38103                                                      0) {
38104                                                    UnallocatedT32(instr);
38105                                                    return;
38106                                                  }
38107                                                  unsigned rd =
38108                                                      ExtractQRegister(instr,
38109                                                                       22,
38110                                                                       12);
38111                                                  QOperand imm = ImmediateVmov::
38112                                                      DecodeImmediate(
38113                                                          cmode,
38114                                                          (instr & 0xf) |
38115                                                              ((instr >> 12) &
38116                                                               0x70) |
38117                                                              ((instr >> 21) &
38118                                                               0x80));
38119                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38120                                                  vmov(CurrentCond(),
38121                                                       dt,
38122                                                       QRegister(rd),
38123                                                       imm);
38124                                                  break;
38125                                                }
38126                                                case 0x00000820: {
38127                                                  // 0xef800c70
38128                                                  if (((instr & 0xd00) ==
38129                                                       0x100) ||
38130                                                      ((instr & 0xd00) ==
38131                                                       0x500) ||
38132                                                      ((instr & 0xd00) ==
38133                                                       0x900) ||
38134                                                      ((instr & 0xe00) ==
38135                                                       0xe00)) {
38136                                                    UnallocatedT32(instr);
38137                                                    return;
38138                                                  }
38139                                                  unsigned cmode =
38140                                                      (instr >> 8) & 0xf;
38141                                                  DataType dt =
38142                                                      ImmediateVmvn::DecodeDt(
38143                                                          cmode);
38144                                                  if (dt.Is(
38145                                                          kDataTypeValueInvalid)) {
38146                                                    UnallocatedT32(instr);
38147                                                    return;
38148                                                  }
38149                                                  if (((instr >> 12) & 1) !=
38150                                                      0) {
38151                                                    UnallocatedT32(instr);
38152                                                    return;
38153                                                  }
38154                                                  unsigned rd =
38155                                                      ExtractQRegister(instr,
38156                                                                       22,
38157                                                                       12);
38158                                                  QOperand imm = ImmediateVmvn::
38159                                                      DecodeImmediate(
38160                                                          cmode,
38161                                                          (instr & 0xf) |
38162                                                              ((instr >> 12) &
38163                                                               0x70) |
38164                                                              ((instr >> 21) &
38165                                                               0x80));
38166                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38167                                                  vmvn(CurrentCond(),
38168                                                       dt,
38169                                                       QRegister(rd),
38170                                                       imm);
38171                                                  break;
38172                                                }
38173                                                case 0x00000a00: {
38174                                                  // 0xef800e50
38175                                                  if (((instr & 0x920) ==
38176                                                       0x100) ||
38177                                                      ((instr & 0x520) ==
38178                                                       0x100) ||
38179                                                      ((instr & 0x820) ==
38180                                                       0x20) ||
38181                                                      ((instr & 0x420) ==
38182                                                       0x20) ||
38183                                                      ((instr & 0x220) ==
38184                                                       0x20) ||
38185                                                      ((instr & 0x120) ==
38186                                                       0x120)) {
38187                                                    UnallocatedT32(instr);
38188                                                    return;
38189                                                  }
38190                                                  unsigned cmode =
38191                                                      ((instr >> 8) & 0xf) |
38192                                                      ((instr >> 1) & 0x10);
38193                                                  DataType dt =
38194                                                      ImmediateVmov::DecodeDt(
38195                                                          cmode);
38196                                                  if (dt.Is(
38197                                                          kDataTypeValueInvalid)) {
38198                                                    UnallocatedT32(instr);
38199                                                    return;
38200                                                  }
38201                                                  if (((instr >> 12) & 1) !=
38202                                                      0) {
38203                                                    UnallocatedT32(instr);
38204                                                    return;
38205                                                  }
38206                                                  unsigned rd =
38207                                                      ExtractQRegister(instr,
38208                                                                       22,
38209                                                                       12);
38210                                                  QOperand imm = ImmediateVmov::
38211                                                      DecodeImmediate(
38212                                                          cmode,
38213                                                          (instr & 0xf) |
38214                                                              ((instr >> 12) &
38215                                                               0x70) |
38216                                                              ((instr >> 21) &
38217                                                               0x80));
38218                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38219                                                  vmov(CurrentCond(),
38220                                                       dt,
38221                                                       QRegister(rd),
38222                                                       imm);
38223                                                  break;
38224                                                }
38225                                                case 0x00000a20: {
38226                                                  // 0xef800e70
38227                                                  if (((instr & 0xd00) ==
38228                                                       0x100) ||
38229                                                      ((instr & 0xd00) ==
38230                                                       0x500) ||
38231                                                      ((instr & 0xd00) ==
38232                                                       0x900) ||
38233                                                      ((instr & 0xe00) ==
38234                                                       0xe00)) {
38235                                                    UnallocatedT32(instr);
38236                                                    return;
38237                                                  }
38238                                                  unsigned cmode =
38239                                                      (instr >> 8) & 0xf;
38240                                                  DataType dt =
38241                                                      ImmediateVmvn::DecodeDt(
38242                                                          cmode);
38243                                                  if (dt.Is(
38244                                                          kDataTypeValueInvalid)) {
38245                                                    UnallocatedT32(instr);
38246                                                    return;
38247                                                  }
38248                                                  if (((instr >> 12) & 1) !=
38249                                                      0) {
38250                                                    UnallocatedT32(instr);
38251                                                    return;
38252                                                  }
38253                                                  unsigned rd =
38254                                                      ExtractQRegister(instr,
38255                                                                       22,
38256                                                                       12);
38257                                                  QOperand imm = ImmediateVmvn::
38258                                                      DecodeImmediate(
38259                                                          cmode,
38260                                                          (instr & 0xf) |
38261                                                              ((instr >> 12) &
38262                                                               0x70) |
38263                                                              ((instr >> 21) &
38264                                                               0x80));
38265                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38266                                                  vmvn(CurrentCond(),
38267                                                       dt,
38268                                                       QRegister(rd),
38269                                                       imm);
38270                                                  break;
38271                                                }
38272                                                case 0x00000c00: {
38273                                                  // 0xef800c50
38274                                                  if (((instr & 0x920) ==
38275                                                       0x100) ||
38276                                                      ((instr & 0x520) ==
38277                                                       0x100) ||
38278                                                      ((instr & 0x820) ==
38279                                                       0x20) ||
38280                                                      ((instr & 0x420) ==
38281                                                       0x20) ||
38282                                                      ((instr & 0x220) ==
38283                                                       0x20) ||
38284                                                      ((instr & 0x120) ==
38285                                                       0x120)) {
38286                                                    UnallocatedT32(instr);
38287                                                    return;
38288                                                  }
38289                                                  unsigned cmode =
38290                                                      ((instr >> 8) & 0xf) |
38291                                                      ((instr >> 1) & 0x10);
38292                                                  DataType dt =
38293                                                      ImmediateVmov::DecodeDt(
38294                                                          cmode);
38295                                                  if (dt.Is(
38296                                                          kDataTypeValueInvalid)) {
38297                                                    UnallocatedT32(instr);
38298                                                    return;
38299                                                  }
38300                                                  if (((instr >> 12) & 1) !=
38301                                                      0) {
38302                                                    UnallocatedT32(instr);
38303                                                    return;
38304                                                  }
38305                                                  unsigned rd =
38306                                                      ExtractQRegister(instr,
38307                                                                       22,
38308                                                                       12);
38309                                                  QOperand imm = ImmediateVmov::
38310                                                      DecodeImmediate(
38311                                                          cmode,
38312                                                          (instr & 0xf) |
38313                                                              ((instr >> 12) &
38314                                                               0x70) |
38315                                                              ((instr >> 21) &
38316                                                               0x80));
38317                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38318                                                  vmov(CurrentCond(),
38319                                                       dt,
38320                                                       QRegister(rd),
38321                                                       imm);
38322                                                  break;
38323                                                }
38324                                                case 0x00000c20: {
38325                                                  // 0xef800c70
38326                                                  if (((instr & 0xd00) ==
38327                                                       0x100) ||
38328                                                      ((instr & 0xd00) ==
38329                                                       0x500) ||
38330                                                      ((instr & 0xd00) ==
38331                                                       0x900) ||
38332                                                      ((instr & 0xe00) ==
38333                                                       0xe00)) {
38334                                                    UnallocatedT32(instr);
38335                                                    return;
38336                                                  }
38337                                                  unsigned cmode =
38338                                                      (instr >> 8) & 0xf;
38339                                                  DataType dt =
38340                                                      ImmediateVmvn::DecodeDt(
38341                                                          cmode);
38342                                                  if (dt.Is(
38343                                                          kDataTypeValueInvalid)) {
38344                                                    UnallocatedT32(instr);
38345                                                    return;
38346                                                  }
38347                                                  if (((instr >> 12) & 1) !=
38348                                                      0) {
38349                                                    UnallocatedT32(instr);
38350                                                    return;
38351                                                  }
38352                                                  unsigned rd =
38353                                                      ExtractQRegister(instr,
38354                                                                       22,
38355                                                                       12);
38356                                                  QOperand imm = ImmediateVmvn::
38357                                                      DecodeImmediate(
38358                                                          cmode,
38359                                                          (instr & 0xf) |
38360                                                              ((instr >> 12) &
38361                                                               0x70) |
38362                                                              ((instr >> 21) &
38363                                                               0x80));
38364                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38365                                                  vmvn(CurrentCond(),
38366                                                       dt,
38367                                                       QRegister(rd),
38368                                                       imm);
38369                                                  break;
38370                                                }
38371                                                case 0x00000d00: {
38372                                                  // 0xef800d50
38373                                                  if (((instr & 0x920) ==
38374                                                       0x100) ||
38375                                                      ((instr & 0x520) ==
38376                                                       0x100) ||
38377                                                      ((instr & 0x820) ==
38378                                                       0x20) ||
38379                                                      ((instr & 0x420) ==
38380                                                       0x20) ||
38381                                                      ((instr & 0x220) ==
38382                                                       0x20) ||
38383                                                      ((instr & 0x120) ==
38384                                                       0x120)) {
38385                                                    UnallocatedT32(instr);
38386                                                    return;
38387                                                  }
38388                                                  unsigned cmode =
38389                                                      ((instr >> 8) & 0xf) |
38390                                                      ((instr >> 1) & 0x10);
38391                                                  DataType dt =
38392                                                      ImmediateVmov::DecodeDt(
38393                                                          cmode);
38394                                                  if (dt.Is(
38395                                                          kDataTypeValueInvalid)) {
38396                                                    UnallocatedT32(instr);
38397                                                    return;
38398                                                  }
38399                                                  if (((instr >> 12) & 1) !=
38400                                                      0) {
38401                                                    UnallocatedT32(instr);
38402                                                    return;
38403                                                  }
38404                                                  unsigned rd =
38405                                                      ExtractQRegister(instr,
38406                                                                       22,
38407                                                                       12);
38408                                                  QOperand imm = ImmediateVmov::
38409                                                      DecodeImmediate(
38410                                                          cmode,
38411                                                          (instr & 0xf) |
38412                                                              ((instr >> 12) &
38413                                                               0x70) |
38414                                                              ((instr >> 21) &
38415                                                               0x80));
38416                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38417                                                  vmov(CurrentCond(),
38418                                                       dt,
38419                                                       QRegister(rd),
38420                                                       imm);
38421                                                  break;
38422                                                }
38423                                                case 0x00000d20: {
38424                                                  // 0xef800d70
38425                                                  if (((instr & 0xd00) ==
38426                                                       0x100) ||
38427                                                      ((instr & 0xd00) ==
38428                                                       0x500) ||
38429                                                      ((instr & 0xd00) ==
38430                                                       0x900) ||
38431                                                      ((instr & 0xe00) ==
38432                                                       0xe00)) {
38433                                                    UnallocatedT32(instr);
38434                                                    return;
38435                                                  }
38436                                                  unsigned cmode =
38437                                                      (instr >> 8) & 0xf;
38438                                                  DataType dt =
38439                                                      ImmediateVmvn::DecodeDt(
38440                                                          cmode);
38441                                                  if (dt.Is(
38442                                                          kDataTypeValueInvalid)) {
38443                                                    UnallocatedT32(instr);
38444                                                    return;
38445                                                  }
38446                                                  if (((instr >> 12) & 1) !=
38447                                                      0) {
38448                                                    UnallocatedT32(instr);
38449                                                    return;
38450                                                  }
38451                                                  unsigned rd =
38452                                                      ExtractQRegister(instr,
38453                                                                       22,
38454                                                                       12);
38455                                                  QOperand imm = ImmediateVmvn::
38456                                                      DecodeImmediate(
38457                                                          cmode,
38458                                                          (instr & 0xf) |
38459                                                              ((instr >> 12) &
38460                                                               0x70) |
38461                                                              ((instr >> 21) &
38462                                                               0x80));
38463                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38464                                                  vmvn(CurrentCond(),
38465                                                       dt,
38466                                                       QRegister(rd),
38467                                                       imm);
38468                                                  break;
38469                                                }
38470                                                case 0x00000e00: {
38471                                                  // 0xef800e50
38472                                                  if (((instr & 0x920) ==
38473                                                       0x100) ||
38474                                                      ((instr & 0x520) ==
38475                                                       0x100) ||
38476                                                      ((instr & 0x820) ==
38477                                                       0x20) ||
38478                                                      ((instr & 0x420) ==
38479                                                       0x20) ||
38480                                                      ((instr & 0x220) ==
38481                                                       0x20) ||
38482                                                      ((instr & 0x120) ==
38483                                                       0x120)) {
38484                                                    UnallocatedT32(instr);
38485                                                    return;
38486                                                  }
38487                                                  unsigned cmode =
38488                                                      ((instr >> 8) & 0xf) |
38489                                                      ((instr >> 1) & 0x10);
38490                                                  DataType dt =
38491                                                      ImmediateVmov::DecodeDt(
38492                                                          cmode);
38493                                                  if (dt.Is(
38494                                                          kDataTypeValueInvalid)) {
38495                                                    UnallocatedT32(instr);
38496                                                    return;
38497                                                  }
38498                                                  if (((instr >> 12) & 1) !=
38499                                                      0) {
38500                                                    UnallocatedT32(instr);
38501                                                    return;
38502                                                  }
38503                                                  unsigned rd =
38504                                                      ExtractQRegister(instr,
38505                                                                       22,
38506                                                                       12);
38507                                                  QOperand imm = ImmediateVmov::
38508                                                      DecodeImmediate(
38509                                                          cmode,
38510                                                          (instr & 0xf) |
38511                                                              ((instr >> 12) &
38512                                                               0x70) |
38513                                                              ((instr >> 21) &
38514                                                               0x80));
38515                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38516                                                  vmov(CurrentCond(),
38517                                                       dt,
38518                                                       QRegister(rd),
38519                                                       imm);
38520                                                  break;
38521                                                }
38522                                                case 0x00000e20: {
38523                                                  // 0xef800e70
38524                                                  if (((instr & 0x920) ==
38525                                                       0x100) ||
38526                                                      ((instr & 0x520) ==
38527                                                       0x100) ||
38528                                                      ((instr & 0x820) ==
38529                                                       0x20) ||
38530                                                      ((instr & 0x420) ==
38531                                                       0x20) ||
38532                                                      ((instr & 0x220) ==
38533                                                       0x20) ||
38534                                                      ((instr & 0x120) ==
38535                                                       0x120)) {
38536                                                    UnallocatedT32(instr);
38537                                                    return;
38538                                                  }
38539                                                  unsigned cmode =
38540                                                      ((instr >> 8) & 0xf) |
38541                                                      ((instr >> 1) & 0x10);
38542                                                  DataType dt =
38543                                                      ImmediateVmov::DecodeDt(
38544                                                          cmode);
38545                                                  if (dt.Is(
38546                                                          kDataTypeValueInvalid)) {
38547                                                    UnallocatedT32(instr);
38548                                                    return;
38549                                                  }
38550                                                  if (((instr >> 12) & 1) !=
38551                                                      0) {
38552                                                    UnallocatedT32(instr);
38553                                                    return;
38554                                                  }
38555                                                  unsigned rd =
38556                                                      ExtractQRegister(instr,
38557                                                                       22,
38558                                                                       12);
38559                                                  QOperand imm = ImmediateVmov::
38560                                                      DecodeImmediate(
38561                                                          cmode,
38562                                                          (instr & 0xf) |
38563                                                              ((instr >> 12) &
38564                                                               0x70) |
38565                                                              ((instr >> 21) &
38566                                                               0x80));
38567                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38568                                                  vmov(CurrentCond(),
38569                                                       dt,
38570                                                       QRegister(rd),
38571                                                       imm);
38572                                                  break;
38573                                                }
38574                                                case 0x00000f00: {
38575                                                  // 0xef800f50
38576                                                  if (((instr & 0x920) ==
38577                                                       0x100) ||
38578                                                      ((instr & 0x520) ==
38579                                                       0x100) ||
38580                                                      ((instr & 0x820) ==
38581                                                       0x20) ||
38582                                                      ((instr & 0x420) ==
38583                                                       0x20) ||
38584                                                      ((instr & 0x220) ==
38585                                                       0x20) ||
38586                                                      ((instr & 0x120) ==
38587                                                       0x120)) {
38588                                                    UnallocatedT32(instr);
38589                                                    return;
38590                                                  }
38591                                                  unsigned cmode =
38592                                                      ((instr >> 8) & 0xf) |
38593                                                      ((instr >> 1) & 0x10);
38594                                                  DataType dt =
38595                                                      ImmediateVmov::DecodeDt(
38596                                                          cmode);
38597                                                  if (dt.Is(
38598                                                          kDataTypeValueInvalid)) {
38599                                                    UnallocatedT32(instr);
38600                                                    return;
38601                                                  }
38602                                                  if (((instr >> 12) & 1) !=
38603                                                      0) {
38604                                                    UnallocatedT32(instr);
38605                                                    return;
38606                                                  }
38607                                                  unsigned rd =
38608                                                      ExtractQRegister(instr,
38609                                                                       22,
38610                                                                       12);
38611                                                  QOperand imm = ImmediateVmov::
38612                                                      DecodeImmediate(
38613                                                          cmode,
38614                                                          (instr & 0xf) |
38615                                                              ((instr >> 12) &
38616                                                               0x70) |
38617                                                              ((instr >> 21) &
38618                                                               0x80));
38619                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38620                                                  vmov(CurrentCond(),
38621                                                       dt,
38622                                                       QRegister(rd),
38623                                                       imm);
38624                                                  break;
38625                                                }
38626                                                default:
38627                                                  UnallocatedT32(instr);
38628                                                  break;
38629                                              }
38630                                              break;
38631                                            }
38632                                            default: {
38633                                              if (((instr & 0x920) == 0x100) ||
38634                                                  ((instr & 0x520) == 0x100) ||
38635                                                  ((instr & 0x820) == 0x20) ||
38636                                                  ((instr & 0x420) == 0x20) ||
38637                                                  ((instr & 0x220) == 0x20) ||
38638                                                  ((instr & 0x120) == 0x120)) {
38639                                                UnallocatedT32(instr);
38640                                                return;
38641                                              }
38642                                              unsigned cmode =
38643                                                  ((instr >> 8) & 0xf) |
38644                                                  ((instr >> 1) & 0x10);
38645                                              DataType dt =
38646                                                  ImmediateVmov::DecodeDt(
38647                                                      cmode);
38648                                              if (dt.Is(
38649                                                      kDataTypeValueInvalid)) {
38650                                                UnallocatedT32(instr);
38651                                                return;
38652                                              }
38653                                              if (((instr >> 12) & 1) != 0) {
38654                                                UnallocatedT32(instr);
38655                                                return;
38656                                              }
38657                                              unsigned rd =
38658                                                  ExtractQRegister(instr,
38659                                                                   22,
38660                                                                   12);
38661                                              QOperand imm = ImmediateVmov::
38662                                                  DecodeImmediate(cmode,
38663                                                                  (instr &
38664                                                                   0xf) |
38665                                                                      ((instr >>
38666                                                                        12) &
38667                                                                       0x70) |
38668                                                                      ((instr >>
38669                                                                        21) &
38670                                                                       0x80));
38671                                              // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38672                                              vmov(CurrentCond(),
38673                                                   dt,
38674                                                   QRegister(rd),
38675                                                   imm);
38676                                              break;
38677                                            }
38678                                          }
38679                                          break;
38680                                        }
38681                                      }
38682                                      break;
38683                                    }
38684                                    default:
38685                                      UnallocatedT32(instr);
38686                                      break;
38687                                  }
38688                                  break;
38689                                }
38690                                default: {
38691                                  if ((instr & 0x00000200) == 0x00000200) {
38692                                    if (((instr & 0x200000) == 0x0)) {
38693                                      UnallocatedT32(instr);
38694                                      return;
38695                                    }
38696                                    DataType dt1 = Dt_op_U_1_Decode1(
38697                                        ((instr >> 28) & 0x1) |
38698                                        ((instr >> 7) & 0x2));
38699                                    if (dt1.Is(kDataTypeValueInvalid)) {
38700                                      UnallocatedT32(instr);
38701                                      return;
38702                                    }
38703                                    DataType dt2 = Dt_op_U_1_Decode2(
38704                                        ((instr >> 28) & 0x1) |
38705                                        ((instr >> 7) & 0x2));
38706                                    if (dt2.Is(kDataTypeValueInvalid)) {
38707                                      UnallocatedT32(instr);
38708                                      return;
38709                                    }
38710                                    if (((instr >> 12) & 1) != 0) {
38711                                      UnallocatedT32(instr);
38712                                      return;
38713                                    }
38714                                    unsigned rd =
38715                                        ExtractQRegister(instr, 22, 12);
38716                                    if ((instr & 1) != 0) {
38717                                      UnallocatedT32(instr);
38718                                      return;
38719                                    }
38720                                    unsigned rm = ExtractQRegister(instr, 5, 0);
38721                                    uint32_t fbits =
38722                                        64 - ((instr >> 16) & 0x3f);
38723                                    // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
38724                                    vcvt(CurrentCond(),
38725                                         dt1,
38726                                         dt2,
38727                                         QRegister(rd),
38728                                         QRegister(rm),
38729                                         fbits);
38730                                  } else {
38731                                    UnallocatedT32(instr);
38732                                  }
38733                                  break;
38734                                }
38735                              }
38736                              break;
38737                            }
38738                            default:
38739                              UnallocatedT32(instr);
38740                              break;
38741                          }
38742                          break;
38743                        }
38744                      }
38745                      break;
38746                    }
38747                  }
38748                  break;
38749                }
38750              }
38751              break;
38752            }
38753          }
38754          break;
38755        }
38756      }
38757      break;
38758    }
38759  }
38760}  // NOLINT(readability/fn_size)
38761
38762void Disassembler::DecodeA32(uint32_t instr) {
38763  A32CodeAddressIncrementer incrementer(&code_address_);
38764  if ((instr & 0xf0000000) == 0xf0000000) {
38765    switch (instr & 0x0e000000) {
38766      case 0x00000000: {
38767        // 0xf0000000
38768        switch (instr & 0x01f10020) {
38769          case 0x01000000: {
38770            // 0xf1000000
38771            switch (instr & 0x000e0000) {
38772              case 0x00020000: {
38773                // 0xf1020000
38774                if ((instr & 0x000001c0) == 0x00000000) {
38775                  UnimplementedA32("CPS", instr);
38776                } else {
38777                  UnallocatedA32(instr);
38778                }
38779                break;
38780              }
38781              case 0x00080000: {
38782                // 0xf1080000
38783                if ((instr & 0x0000001f) == 0x00000000) {
38784                  UnimplementedA32("CPSIE", instr);
38785                } else {
38786                  UnallocatedA32(instr);
38787                }
38788                break;
38789              }
38790              case 0x000a0000: {
38791                // 0xf10a0000
38792                UnimplementedA32("CPSIE", instr);
38793                break;
38794              }
38795              case 0x000c0000: {
38796                // 0xf10c0000
38797                if ((instr & 0x0000001f) == 0x00000000) {
38798                  UnimplementedA32("CPSID", instr);
38799                } else {
38800                  UnallocatedA32(instr);
38801                }
38802                break;
38803              }
38804              case 0x000e0000: {
38805                // 0xf10e0000
38806                UnimplementedA32("CPSID", instr);
38807                break;
38808              }
38809              default:
38810                UnallocatedA32(instr);
38811                break;
38812            }
38813            break;
38814          }
38815          case 0x01010000: {
38816            // 0xf1010000
38817            if ((instr & 0x000000d0) == 0x00000000) {
38818              UnimplementedA32("SETEND", instr);
38819            } else {
38820              UnallocatedA32(instr);
38821            }
38822            break;
38823          }
38824          default:
38825            UnallocatedA32(instr);
38826            break;
38827        }
38828        break;
38829      }
38830      case 0x02000000: {
38831        // 0xf2000000
38832        switch (instr & 0x00800010) {
38833          case 0x00000000: {
38834            // 0xf2000000
38835            switch (instr & 0x00000f40) {
38836              case 0x00000000: {
38837                // 0xf2000000
38838                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38839                                                 ((instr >> 22) & 0x4));
38840                if (dt.Is(kDataTypeValueInvalid)) {
38841                  UnallocatedA32(instr);
38842                  return;
38843                }
38844                unsigned rd = ExtractDRegister(instr, 22, 12);
38845                unsigned rn = ExtractDRegister(instr, 7, 16);
38846                unsigned rm = ExtractDRegister(instr, 5, 0);
38847                // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38848                vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38849                break;
38850              }
38851              case 0x00000040: {
38852                // 0xf2000040
38853                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38854                                                 ((instr >> 22) & 0x4));
38855                if (dt.Is(kDataTypeValueInvalid)) {
38856                  UnallocatedA32(instr);
38857                  return;
38858                }
38859                if (((instr >> 12) & 1) != 0) {
38860                  UnallocatedA32(instr);
38861                  return;
38862                }
38863                unsigned rd = ExtractQRegister(instr, 22, 12);
38864                if (((instr >> 16) & 1) != 0) {
38865                  UnallocatedA32(instr);
38866                  return;
38867                }
38868                unsigned rn = ExtractQRegister(instr, 7, 16);
38869                if ((instr & 1) != 0) {
38870                  UnallocatedA32(instr);
38871                  return;
38872                }
38873                unsigned rm = ExtractQRegister(instr, 5, 0);
38874                // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38875                vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38876                break;
38877              }
38878              case 0x00000100: {
38879                // 0xf2000100
38880                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38881                                                 ((instr >> 22) & 0x4));
38882                if (dt.Is(kDataTypeValueInvalid)) {
38883                  UnallocatedA32(instr);
38884                  return;
38885                }
38886                unsigned rd = ExtractDRegister(instr, 22, 12);
38887                unsigned rn = ExtractDRegister(instr, 7, 16);
38888                unsigned rm = ExtractDRegister(instr, 5, 0);
38889                // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38890                vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38891                break;
38892              }
38893              case 0x00000140: {
38894                // 0xf2000140
38895                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38896                                                 ((instr >> 22) & 0x4));
38897                if (dt.Is(kDataTypeValueInvalid)) {
38898                  UnallocatedA32(instr);
38899                  return;
38900                }
38901                if (((instr >> 12) & 1) != 0) {
38902                  UnallocatedA32(instr);
38903                  return;
38904                }
38905                unsigned rd = ExtractQRegister(instr, 22, 12);
38906                if (((instr >> 16) & 1) != 0) {
38907                  UnallocatedA32(instr);
38908                  return;
38909                }
38910                unsigned rn = ExtractQRegister(instr, 7, 16);
38911                if ((instr & 1) != 0) {
38912                  UnallocatedA32(instr);
38913                  return;
38914                }
38915                unsigned rm = ExtractQRegister(instr, 5, 0);
38916                // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38917                vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38918                break;
38919              }
38920              case 0x00000200: {
38921                // 0xf2000200
38922                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38923                                                 ((instr >> 22) & 0x4));
38924                if (dt.Is(kDataTypeValueInvalid)) {
38925                  UnallocatedA32(instr);
38926                  return;
38927                }
38928                unsigned rd = ExtractDRegister(instr, 22, 12);
38929                unsigned rn = ExtractDRegister(instr, 7, 16);
38930                unsigned rm = ExtractDRegister(instr, 5, 0);
38931                // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38932                vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38933                break;
38934              }
38935              case 0x00000240: {
38936                // 0xf2000240
38937                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38938                                                 ((instr >> 22) & 0x4));
38939                if (dt.Is(kDataTypeValueInvalid)) {
38940                  UnallocatedA32(instr);
38941                  return;
38942                }
38943                if (((instr >> 12) & 1) != 0) {
38944                  UnallocatedA32(instr);
38945                  return;
38946                }
38947                unsigned rd = ExtractQRegister(instr, 22, 12);
38948                if (((instr >> 16) & 1) != 0) {
38949                  UnallocatedA32(instr);
38950                  return;
38951                }
38952                unsigned rn = ExtractQRegister(instr, 7, 16);
38953                if ((instr & 1) != 0) {
38954                  UnallocatedA32(instr);
38955                  return;
38956                }
38957                unsigned rm = ExtractQRegister(instr, 5, 0);
38958                // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38959                vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38960                break;
38961              }
38962              case 0x00000300: {
38963                // 0xf2000300
38964                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38965                                                 ((instr >> 22) & 0x4));
38966                if (dt.Is(kDataTypeValueInvalid)) {
38967                  UnallocatedA32(instr);
38968                  return;
38969                }
38970                unsigned rd = ExtractDRegister(instr, 22, 12);
38971                unsigned rn = ExtractDRegister(instr, 7, 16);
38972                unsigned rm = ExtractDRegister(instr, 5, 0);
38973                // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38974                vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38975                break;
38976              }
38977              case 0x00000340: {
38978                // 0xf2000340
38979                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38980                                                 ((instr >> 22) & 0x4));
38981                if (dt.Is(kDataTypeValueInvalid)) {
38982                  UnallocatedA32(instr);
38983                  return;
38984                }
38985                if (((instr >> 12) & 1) != 0) {
38986                  UnallocatedA32(instr);
38987                  return;
38988                }
38989                unsigned rd = ExtractQRegister(instr, 22, 12);
38990                if (((instr >> 16) & 1) != 0) {
38991                  UnallocatedA32(instr);
38992                  return;
38993                }
38994                unsigned rn = ExtractQRegister(instr, 7, 16);
38995                if ((instr & 1) != 0) {
38996                  UnallocatedA32(instr);
38997                  return;
38998                }
38999                unsigned rm = ExtractQRegister(instr, 5, 0);
39000                // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39001                vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39002                break;
39003              }
39004              case 0x00000400: {
39005                // 0xf2000400
39006                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39007                                                 ((instr >> 22) & 0x4));
39008                if (dt.Is(kDataTypeValueInvalid)) {
39009                  UnallocatedA32(instr);
39010                  return;
39011                }
39012                unsigned rd = ExtractDRegister(instr, 22, 12);
39013                unsigned rm = ExtractDRegister(instr, 5, 0);
39014                unsigned rn = ExtractDRegister(instr, 7, 16);
39015                // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
39016                vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
39017                break;
39018              }
39019              case 0x00000440: {
39020                // 0xf2000440
39021                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39022                                                 ((instr >> 22) & 0x4));
39023                if (dt.Is(kDataTypeValueInvalid)) {
39024                  UnallocatedA32(instr);
39025                  return;
39026                }
39027                if (((instr >> 12) & 1) != 0) {
39028                  UnallocatedA32(instr);
39029                  return;
39030                }
39031                unsigned rd = ExtractQRegister(instr, 22, 12);
39032                if ((instr & 1) != 0) {
39033                  UnallocatedA32(instr);
39034                  return;
39035                }
39036                unsigned rm = ExtractQRegister(instr, 5, 0);
39037                if (((instr >> 16) & 1) != 0) {
39038                  UnallocatedA32(instr);
39039                  return;
39040                }
39041                unsigned rn = ExtractQRegister(instr, 7, 16);
39042                // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
39043                vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
39044                break;
39045              }
39046              case 0x00000500: {
39047                // 0xf2000500
39048                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39049                                                 ((instr >> 22) & 0x4));
39050                if (dt.Is(kDataTypeValueInvalid)) {
39051                  UnallocatedA32(instr);
39052                  return;
39053                }
39054                unsigned rd = ExtractDRegister(instr, 22, 12);
39055                unsigned rm = ExtractDRegister(instr, 5, 0);
39056                unsigned rn = ExtractDRegister(instr, 7, 16);
39057                // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
39058                vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
39059                break;
39060              }
39061              case 0x00000540: {
39062                // 0xf2000540
39063                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39064                                                 ((instr >> 22) & 0x4));
39065                if (dt.Is(kDataTypeValueInvalid)) {
39066                  UnallocatedA32(instr);
39067                  return;
39068                }
39069                if (((instr >> 12) & 1) != 0) {
39070                  UnallocatedA32(instr);
39071                  return;
39072                }
39073                unsigned rd = ExtractQRegister(instr, 22, 12);
39074                if ((instr & 1) != 0) {
39075                  UnallocatedA32(instr);
39076                  return;
39077                }
39078                unsigned rm = ExtractQRegister(instr, 5, 0);
39079                if (((instr >> 16) & 1) != 0) {
39080                  UnallocatedA32(instr);
39081                  return;
39082                }
39083                unsigned rn = ExtractQRegister(instr, 7, 16);
39084                // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
39085                vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
39086                break;
39087              }
39088              case 0x00000600: {
39089                // 0xf2000600
39090                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39091                                                 ((instr >> 22) & 0x4));
39092                if (dt.Is(kDataTypeValueInvalid)) {
39093                  UnallocatedA32(instr);
39094                  return;
39095                }
39096                unsigned rd = ExtractDRegister(instr, 22, 12);
39097                unsigned rn = ExtractDRegister(instr, 7, 16);
39098                unsigned rm = ExtractDRegister(instr, 5, 0);
39099                // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39100                vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39101                break;
39102              }
39103              case 0x00000640: {
39104                // 0xf2000640
39105                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39106                                                 ((instr >> 22) & 0x4));
39107                if (dt.Is(kDataTypeValueInvalid)) {
39108                  UnallocatedA32(instr);
39109                  return;
39110                }
39111                if (((instr >> 12) & 1) != 0) {
39112                  UnallocatedA32(instr);
39113                  return;
39114                }
39115                unsigned rd = ExtractQRegister(instr, 22, 12);
39116                if (((instr >> 16) & 1) != 0) {
39117                  UnallocatedA32(instr);
39118                  return;
39119                }
39120                unsigned rn = ExtractQRegister(instr, 7, 16);
39121                if ((instr & 1) != 0) {
39122                  UnallocatedA32(instr);
39123                  return;
39124                }
39125                unsigned rm = ExtractQRegister(instr, 5, 0);
39126                // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39127                vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39128                break;
39129              }
39130              case 0x00000700: {
39131                // 0xf2000700
39132                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39133                                                 ((instr >> 22) & 0x4));
39134                if (dt.Is(kDataTypeValueInvalid)) {
39135                  UnallocatedA32(instr);
39136                  return;
39137                }
39138                unsigned rd = ExtractDRegister(instr, 22, 12);
39139                unsigned rn = ExtractDRegister(instr, 7, 16);
39140                unsigned rm = ExtractDRegister(instr, 5, 0);
39141                // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39142                vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39143                break;
39144              }
39145              case 0x00000740: {
39146                // 0xf2000740
39147                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39148                                                 ((instr >> 22) & 0x4));
39149                if (dt.Is(kDataTypeValueInvalid)) {
39150                  UnallocatedA32(instr);
39151                  return;
39152                }
39153                if (((instr >> 12) & 1) != 0) {
39154                  UnallocatedA32(instr);
39155                  return;
39156                }
39157                unsigned rd = ExtractQRegister(instr, 22, 12);
39158                if (((instr >> 16) & 1) != 0) {
39159                  UnallocatedA32(instr);
39160                  return;
39161                }
39162                unsigned rn = ExtractQRegister(instr, 7, 16);
39163                if ((instr & 1) != 0) {
39164                  UnallocatedA32(instr);
39165                  return;
39166                }
39167                unsigned rm = ExtractQRegister(instr, 5, 0);
39168                // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39169                vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39170                break;
39171              }
39172              case 0x00000800: {
39173                // 0xf2000800
39174                switch (instr & 0x01000000) {
39175                  case 0x00000000: {
39176                    // 0xf2000800
39177                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
39178                    if (dt.Is(kDataTypeValueInvalid)) {
39179                      UnallocatedA32(instr);
39180                      return;
39181                    }
39182                    unsigned rd = ExtractDRegister(instr, 22, 12);
39183                    unsigned rn = ExtractDRegister(instr, 7, 16);
39184                    unsigned rm = ExtractDRegister(instr, 5, 0);
39185                    // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39186                    vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39187                    break;
39188                  }
39189                  case 0x01000000: {
39190                    // 0xf3000800
39191                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
39192                    if (dt.Is(kDataTypeValueInvalid)) {
39193                      UnallocatedA32(instr);
39194                      return;
39195                    }
39196                    unsigned rd = ExtractDRegister(instr, 22, 12);
39197                    unsigned rn = ExtractDRegister(instr, 7, 16);
39198                    unsigned rm = ExtractDRegister(instr, 5, 0);
39199                    // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39200                    vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39201                    break;
39202                  }
39203                }
39204                break;
39205              }
39206              case 0x00000840: {
39207                // 0xf2000840
39208                switch (instr & 0x01000000) {
39209                  case 0x00000000: {
39210                    // 0xf2000840
39211                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
39212                    if (dt.Is(kDataTypeValueInvalid)) {
39213                      UnallocatedA32(instr);
39214                      return;
39215                    }
39216                    if (((instr >> 12) & 1) != 0) {
39217                      UnallocatedA32(instr);
39218                      return;
39219                    }
39220                    unsigned rd = ExtractQRegister(instr, 22, 12);
39221                    if (((instr >> 16) & 1) != 0) {
39222                      UnallocatedA32(instr);
39223                      return;
39224                    }
39225                    unsigned rn = ExtractQRegister(instr, 7, 16);
39226                    if ((instr & 1) != 0) {
39227                      UnallocatedA32(instr);
39228                      return;
39229                    }
39230                    unsigned rm = ExtractQRegister(instr, 5, 0);
39231                    // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39232                    vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39233                    break;
39234                  }
39235                  case 0x01000000: {
39236                    // 0xf3000840
39237                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
39238                    if (dt.Is(kDataTypeValueInvalid)) {
39239                      UnallocatedA32(instr);
39240                      return;
39241                    }
39242                    if (((instr >> 12) & 1) != 0) {
39243                      UnallocatedA32(instr);
39244                      return;
39245                    }
39246                    unsigned rd = ExtractQRegister(instr, 22, 12);
39247                    if (((instr >> 16) & 1) != 0) {
39248                      UnallocatedA32(instr);
39249                      return;
39250                    }
39251                    unsigned rn = ExtractQRegister(instr, 7, 16);
39252                    if ((instr & 1) != 0) {
39253                      UnallocatedA32(instr);
39254                      return;
39255                    }
39256                    unsigned rm = ExtractQRegister(instr, 5, 0);
39257                    // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39258                    vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39259                    break;
39260                  }
39261                }
39262                break;
39263              }
39264              case 0x00000900: {
39265                // 0xf2000900
39266                switch (instr & 0x01000000) {
39267                  case 0x00000000: {
39268                    // 0xf2000900
39269                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
39270                    if (dt.Is(kDataTypeValueInvalid)) {
39271                      UnallocatedA32(instr);
39272                      return;
39273                    }
39274                    unsigned rd = ExtractDRegister(instr, 22, 12);
39275                    unsigned rn = ExtractDRegister(instr, 7, 16);
39276                    unsigned rm = ExtractDRegister(instr, 5, 0);
39277                    // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
39278                    vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39279                    break;
39280                  }
39281                  case 0x01000000: {
39282                    // 0xf3000900
39283                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
39284                    if (dt.Is(kDataTypeValueInvalid)) {
39285                      UnallocatedA32(instr);
39286                      return;
39287                    }
39288                    unsigned rd = ExtractDRegister(instr, 22, 12);
39289                    unsigned rn = ExtractDRegister(instr, 7, 16);
39290                    unsigned rm = ExtractDRegister(instr, 5, 0);
39291                    // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
39292                    vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39293                    break;
39294                  }
39295                }
39296                break;
39297              }
39298              case 0x00000940: {
39299                // 0xf2000940
39300                switch (instr & 0x01000000) {
39301                  case 0x00000000: {
39302                    // 0xf2000940
39303                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
39304                    if (dt.Is(kDataTypeValueInvalid)) {
39305                      UnallocatedA32(instr);
39306                      return;
39307                    }
39308                    if (((instr >> 12) & 1) != 0) {
39309                      UnallocatedA32(instr);
39310                      return;
39311                    }
39312                    unsigned rd = ExtractQRegister(instr, 22, 12);
39313                    if (((instr >> 16) & 1) != 0) {
39314                      UnallocatedA32(instr);
39315                      return;
39316                    }
39317                    unsigned rn = ExtractQRegister(instr, 7, 16);
39318                    if ((instr & 1) != 0) {
39319                      UnallocatedA32(instr);
39320                      return;
39321                    }
39322                    unsigned rm = ExtractQRegister(instr, 5, 0);
39323                    // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
39324                    vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39325                    break;
39326                  }
39327                  case 0x01000000: {
39328                    // 0xf3000940
39329                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
39330                    if (dt.Is(kDataTypeValueInvalid)) {
39331                      UnallocatedA32(instr);
39332                      return;
39333                    }
39334                    if (((instr >> 12) & 1) != 0) {
39335                      UnallocatedA32(instr);
39336                      return;
39337                    }
39338                    unsigned rd = ExtractQRegister(instr, 22, 12);
39339                    if (((instr >> 16) & 1) != 0) {
39340                      UnallocatedA32(instr);
39341                      return;
39342                    }
39343                    unsigned rn = ExtractQRegister(instr, 7, 16);
39344                    if ((instr & 1) != 0) {
39345                      UnallocatedA32(instr);
39346                      return;
39347                    }
39348                    unsigned rm = ExtractQRegister(instr, 5, 0);
39349                    // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
39350                    vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39351                    break;
39352                  }
39353                }
39354                break;
39355              }
39356              case 0x00000a00: {
39357                // 0xf2000a00
39358                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39359                                                 ((instr >> 22) & 0x4));
39360                if (dt.Is(kDataTypeValueInvalid)) {
39361                  UnallocatedA32(instr);
39362                  return;
39363                }
39364                unsigned rd = ExtractDRegister(instr, 22, 12);
39365                unsigned rn = ExtractDRegister(instr, 7, 16);
39366                unsigned rm = ExtractDRegister(instr, 5, 0);
39367                // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39368                vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39369                break;
39370              }
39371              case 0x00000b00: {
39372                // 0xf2000b00
39373                switch (instr & 0x01000000) {
39374                  case 0x00000000: {
39375                    // 0xf2000b00
39376                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
39377                    if (dt.Is(kDataTypeValueInvalid)) {
39378                      UnallocatedA32(instr);
39379                      return;
39380                    }
39381                    unsigned rd = ExtractDRegister(instr, 22, 12);
39382                    unsigned rn = ExtractDRegister(instr, 7, 16);
39383                    unsigned rm = ExtractDRegister(instr, 5, 0);
39384                    // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39385                    vqdmulh(al,
39386                            dt,
39387                            DRegister(rd),
39388                            DRegister(rn),
39389                            DRegister(rm));
39390                    break;
39391                  }
39392                  case 0x01000000: {
39393                    // 0xf3000b00
39394                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
39395                    if (dt.Is(kDataTypeValueInvalid)) {
39396                      UnallocatedA32(instr);
39397                      return;
39398                    }
39399                    unsigned rd = ExtractDRegister(instr, 22, 12);
39400                    unsigned rn = ExtractDRegister(instr, 7, 16);
39401                    unsigned rm = ExtractDRegister(instr, 5, 0);
39402                    // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39403                    vqrdmulh(al,
39404                             dt,
39405                             DRegister(rd),
39406                             DRegister(rn),
39407                             DRegister(rm));
39408                    break;
39409                  }
39410                }
39411                break;
39412              }
39413              case 0x00000b40: {
39414                // 0xf2000b40
39415                switch (instr & 0x01000000) {
39416                  case 0x00000000: {
39417                    // 0xf2000b40
39418                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
39419                    if (dt.Is(kDataTypeValueInvalid)) {
39420                      UnallocatedA32(instr);
39421                      return;
39422                    }
39423                    if (((instr >> 12) & 1) != 0) {
39424                      UnallocatedA32(instr);
39425                      return;
39426                    }
39427                    unsigned rd = ExtractQRegister(instr, 22, 12);
39428                    if (((instr >> 16) & 1) != 0) {
39429                      UnallocatedA32(instr);
39430                      return;
39431                    }
39432                    unsigned rn = ExtractQRegister(instr, 7, 16);
39433                    if ((instr & 1) != 0) {
39434                      UnallocatedA32(instr);
39435                      return;
39436                    }
39437                    unsigned rm = ExtractQRegister(instr, 5, 0);
39438                    // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39439                    vqdmulh(al,
39440                            dt,
39441                            QRegister(rd),
39442                            QRegister(rn),
39443                            QRegister(rm));
39444                    break;
39445                  }
39446                  case 0x01000000: {
39447                    // 0xf3000b40
39448                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
39449                    if (dt.Is(kDataTypeValueInvalid)) {
39450                      UnallocatedA32(instr);
39451                      return;
39452                    }
39453                    if (((instr >> 12) & 1) != 0) {
39454                      UnallocatedA32(instr);
39455                      return;
39456                    }
39457                    unsigned rd = ExtractQRegister(instr, 22, 12);
39458                    if (((instr >> 16) & 1) != 0) {
39459                      UnallocatedA32(instr);
39460                      return;
39461                    }
39462                    unsigned rn = ExtractQRegister(instr, 7, 16);
39463                    if ((instr & 1) != 0) {
39464                      UnallocatedA32(instr);
39465                      return;
39466                    }
39467                    unsigned rm = ExtractQRegister(instr, 5, 0);
39468                    // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39469                    vqrdmulh(al,
39470                             dt,
39471                             QRegister(rd),
39472                             QRegister(rn),
39473                             QRegister(rm));
39474                    break;
39475                  }
39476                }
39477                break;
39478              }
39479              case 0x00000c40: {
39480                // 0xf2000c40
39481                switch (instr & 0x01300000) {
39482                  case 0x00000000: {
39483                    // 0xf2000c40
39484                    UnimplementedA32("SHA1C", instr);
39485                    break;
39486                  }
39487                  case 0x00100000: {
39488                    // 0xf2100c40
39489                    UnimplementedA32("SHA1P", instr);
39490                    break;
39491                  }
39492                  case 0x00200000: {
39493                    // 0xf2200c40
39494                    UnimplementedA32("SHA1M", instr);
39495                    break;
39496                  }
39497                  case 0x00300000: {
39498                    // 0xf2300c40
39499                    UnimplementedA32("SHA1SU0", instr);
39500                    break;
39501                  }
39502                  case 0x01000000: {
39503                    // 0xf3000c40
39504                    UnimplementedA32("SHA256H", instr);
39505                    break;
39506                  }
39507                  case 0x01100000: {
39508                    // 0xf3100c40
39509                    UnimplementedA32("SHA256H2", instr);
39510                    break;
39511                  }
39512                  case 0x01200000: {
39513                    // 0xf3200c40
39514                    UnimplementedA32("SHA256SU1", instr);
39515                    break;
39516                  }
39517                  default:
39518                    UnallocatedA32(instr);
39519                    break;
39520                }
39521                break;
39522              }
39523              case 0x00000d00: {
39524                // 0xf2000d00
39525                switch (instr & 0x01300000) {
39526                  case 0x00000000: {
39527                    // 0xf2000d00
39528                    unsigned rd = ExtractDRegister(instr, 22, 12);
39529                    unsigned rn = ExtractDRegister(instr, 7, 16);
39530                    unsigned rm = ExtractDRegister(instr, 5, 0);
39531                    // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39532                    vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39533                    break;
39534                  }
39535                  case 0x00200000: {
39536                    // 0xf2200d00
39537                    unsigned rd = ExtractDRegister(instr, 22, 12);
39538                    unsigned rn = ExtractDRegister(instr, 7, 16);
39539                    unsigned rm = ExtractDRegister(instr, 5, 0);
39540                    // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39541                    vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39542                    break;
39543                  }
39544                  case 0x01000000: {
39545                    // 0xf3000d00
39546                    unsigned rd = ExtractDRegister(instr, 22, 12);
39547                    unsigned rn = ExtractDRegister(instr, 7, 16);
39548                    unsigned rm = ExtractDRegister(instr, 5, 0);
39549                    // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39550                    vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39551                    break;
39552                  }
39553                  case 0x01200000: {
39554                    // 0xf3200d00
39555                    unsigned rd = ExtractDRegister(instr, 22, 12);
39556                    unsigned rn = ExtractDRegister(instr, 7, 16);
39557                    unsigned rm = ExtractDRegister(instr, 5, 0);
39558                    // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39559                    vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39560                    break;
39561                  }
39562                  default:
39563                    UnallocatedA32(instr);
39564                    break;
39565                }
39566                break;
39567              }
39568              case 0x00000d40: {
39569                // 0xf2000d40
39570                switch (instr & 0x01300000) {
39571                  case 0x00000000: {
39572                    // 0xf2000d40
39573                    if (((instr >> 12) & 1) != 0) {
39574                      UnallocatedA32(instr);
39575                      return;
39576                    }
39577                    unsigned rd = ExtractQRegister(instr, 22, 12);
39578                    if (((instr >> 16) & 1) != 0) {
39579                      UnallocatedA32(instr);
39580                      return;
39581                    }
39582                    unsigned rn = ExtractQRegister(instr, 7, 16);
39583                    if ((instr & 1) != 0) {
39584                      UnallocatedA32(instr);
39585                      return;
39586                    }
39587                    unsigned rm = ExtractQRegister(instr, 5, 0);
39588                    // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39589                    vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39590                    break;
39591                  }
39592                  case 0x00200000: {
39593                    // 0xf2200d40
39594                    if (((instr >> 12) & 1) != 0) {
39595                      UnallocatedA32(instr);
39596                      return;
39597                    }
39598                    unsigned rd = ExtractQRegister(instr, 22, 12);
39599                    if (((instr >> 16) & 1) != 0) {
39600                      UnallocatedA32(instr);
39601                      return;
39602                    }
39603                    unsigned rn = ExtractQRegister(instr, 7, 16);
39604                    if ((instr & 1) != 0) {
39605                      UnallocatedA32(instr);
39606                      return;
39607                    }
39608                    unsigned rm = ExtractQRegister(instr, 5, 0);
39609                    // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39610                    vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39611                    break;
39612                  }
39613                  case 0x01200000: {
39614                    // 0xf3200d40
39615                    if (((instr >> 12) & 1) != 0) {
39616                      UnallocatedA32(instr);
39617                      return;
39618                    }
39619                    unsigned rd = ExtractQRegister(instr, 22, 12);
39620                    if (((instr >> 16) & 1) != 0) {
39621                      UnallocatedA32(instr);
39622                      return;
39623                    }
39624                    unsigned rn = ExtractQRegister(instr, 7, 16);
39625                    if ((instr & 1) != 0) {
39626                      UnallocatedA32(instr);
39627                      return;
39628                    }
39629                    unsigned rm = ExtractQRegister(instr, 5, 0);
39630                    // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39631                    vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39632                    break;
39633                  }
39634                  default:
39635                    UnallocatedA32(instr);
39636                    break;
39637                }
39638                break;
39639              }
39640              case 0x00000e00: {
39641                // 0xf2000e00
39642                switch (instr & 0x01200000) {
39643                  case 0x00000000: {
39644                    // 0xf2000e00
39645                    DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
39646                    if (dt.Is(kDataTypeValueInvalid)) {
39647                      UnallocatedA32(instr);
39648                      return;
39649                    }
39650                    unsigned rd = ExtractDRegister(instr, 22, 12);
39651                    unsigned rn = ExtractDRegister(instr, 7, 16);
39652                    unsigned rm = ExtractDRegister(instr, 5, 0);
39653                    // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2
39654                    vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39655                    break;
39656                  }
39657                  case 0x01000000: {
39658                    // 0xf3000e00
39659                    if ((instr & 0x00100000) == 0x00000000) {
39660                      unsigned rd = ExtractDRegister(instr, 22, 12);
39661                      unsigned rn = ExtractDRegister(instr, 7, 16);
39662                      unsigned rm = ExtractDRegister(instr, 5, 0);
39663                      // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
39664                      vcge(al,
39665                           F32,
39666                           DRegister(rd),
39667                           DRegister(rn),
39668                           DRegister(rm));
39669                    } else {
39670                      UnallocatedA32(instr);
39671                    }
39672                    break;
39673                  }
39674                  case 0x01200000: {
39675                    // 0xf3200e00
39676                    if ((instr & 0x00100000) == 0x00000000) {
39677                      unsigned rd = ExtractDRegister(instr, 22, 12);
39678                      unsigned rn = ExtractDRegister(instr, 7, 16);
39679                      unsigned rm = ExtractDRegister(instr, 5, 0);
39680                      // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
39681                      vcgt(al,
39682                           F32,
39683                           DRegister(rd),
39684                           DRegister(rn),
39685                           DRegister(rm));
39686                    } else {
39687                      UnallocatedA32(instr);
39688                    }
39689                    break;
39690                  }
39691                  default:
39692                    UnallocatedA32(instr);
39693                    break;
39694                }
39695                break;
39696              }
39697              case 0x00000e40: {
39698                // 0xf2000e40
39699                switch (instr & 0x01200000) {
39700                  case 0x00000000: {
39701                    // 0xf2000e40
39702                    DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
39703                    if (dt.Is(kDataTypeValueInvalid)) {
39704                      UnallocatedA32(instr);
39705                      return;
39706                    }
39707                    if (((instr >> 12) & 1) != 0) {
39708                      UnallocatedA32(instr);
39709                      return;
39710                    }
39711                    unsigned rd = ExtractQRegister(instr, 22, 12);
39712                    if (((instr >> 16) & 1) != 0) {
39713                      UnallocatedA32(instr);
39714                      return;
39715                    }
39716                    unsigned rn = ExtractQRegister(instr, 7, 16);
39717                    if ((instr & 1) != 0) {
39718                      UnallocatedA32(instr);
39719                      return;
39720                    }
39721                    unsigned rm = ExtractQRegister(instr, 5, 0);
39722                    // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2
39723                    vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39724                    break;
39725                  }
39726                  case 0x01000000: {
39727                    // 0xf3000e40
39728                    if ((instr & 0x00100000) == 0x00000000) {
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                      // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
39745                      vcge(al,
39746                           F32,
39747                           QRegister(rd),
39748                           QRegister(rn),
39749                           QRegister(rm));
39750                    } else {
39751                      UnallocatedA32(instr);
39752                    }
39753                    break;
39754                  }
39755                  case 0x01200000: {
39756                    // 0xf3200e40
39757                    if ((instr & 0x00100000) == 0x00000000) {
39758                      if (((instr >> 12) & 1) != 0) {
39759                        UnallocatedA32(instr);
39760                        return;
39761                      }
39762                      unsigned rd = ExtractQRegister(instr, 22, 12);
39763                      if (((instr >> 16) & 1) != 0) {
39764                        UnallocatedA32(instr);
39765                        return;
39766                      }
39767                      unsigned rn = ExtractQRegister(instr, 7, 16);
39768                      if ((instr & 1) != 0) {
39769                        UnallocatedA32(instr);
39770                        return;
39771                      }
39772                      unsigned rm = ExtractQRegister(instr, 5, 0);
39773                      // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
39774                      vcgt(al,
39775                           F32,
39776                           QRegister(rd),
39777                           QRegister(rn),
39778                           QRegister(rm));
39779                    } else {
39780                      UnallocatedA32(instr);
39781                    }
39782                    break;
39783                  }
39784                  default:
39785                    UnallocatedA32(instr);
39786                    break;
39787                }
39788                break;
39789              }
39790              case 0x00000f00: {
39791                // 0xf2000f00
39792                switch (instr & 0x01300000) {
39793                  case 0x00000000: {
39794                    // 0xf2000f00
39795                    unsigned rd = ExtractDRegister(instr, 22, 12);
39796                    unsigned rn = ExtractDRegister(instr, 7, 16);
39797                    unsigned rm = ExtractDRegister(instr, 5, 0);
39798                    // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39799                    vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39800                    break;
39801                  }
39802                  case 0x00200000: {
39803                    // 0xf2200f00
39804                    unsigned rd = ExtractDRegister(instr, 22, 12);
39805                    unsigned rn = ExtractDRegister(instr, 7, 16);
39806                    unsigned rm = ExtractDRegister(instr, 5, 0);
39807                    // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39808                    vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39809                    break;
39810                  }
39811                  case 0x01000000: {
39812                    // 0xf3000f00
39813                    unsigned rd = ExtractDRegister(instr, 22, 12);
39814                    unsigned rn = ExtractDRegister(instr, 7, 16);
39815                    unsigned rm = ExtractDRegister(instr, 5, 0);
39816                    // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39817                    vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39818                    break;
39819                  }
39820                  case 0x01200000: {
39821                    // 0xf3200f00
39822                    unsigned rd = ExtractDRegister(instr, 22, 12);
39823                    unsigned rn = ExtractDRegister(instr, 7, 16);
39824                    unsigned rm = ExtractDRegister(instr, 5, 0);
39825                    // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39826                    vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39827                    break;
39828                  }
39829                  default:
39830                    UnallocatedA32(instr);
39831                    break;
39832                }
39833                break;
39834              }
39835              case 0x00000f40: {
39836                // 0xf2000f40
39837                switch (instr & 0x01300000) {
39838                  case 0x00000000: {
39839                    // 0xf2000f40
39840                    if (((instr >> 12) & 1) != 0) {
39841                      UnallocatedA32(instr);
39842                      return;
39843                    }
39844                    unsigned rd = ExtractQRegister(instr, 22, 12);
39845                    if (((instr >> 16) & 1) != 0) {
39846                      UnallocatedA32(instr);
39847                      return;
39848                    }
39849                    unsigned rn = ExtractQRegister(instr, 7, 16);
39850                    if ((instr & 1) != 0) {
39851                      UnallocatedA32(instr);
39852                      return;
39853                    }
39854                    unsigned rm = ExtractQRegister(instr, 5, 0);
39855                    // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39856                    vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39857                    break;
39858                  }
39859                  case 0x00200000: {
39860                    // 0xf2200f40
39861                    if (((instr >> 12) & 1) != 0) {
39862                      UnallocatedA32(instr);
39863                      return;
39864                    }
39865                    unsigned rd = ExtractQRegister(instr, 22, 12);
39866                    if (((instr >> 16) & 1) != 0) {
39867                      UnallocatedA32(instr);
39868                      return;
39869                    }
39870                    unsigned rn = ExtractQRegister(instr, 7, 16);
39871                    if ((instr & 1) != 0) {
39872                      UnallocatedA32(instr);
39873                      return;
39874                    }
39875                    unsigned rm = ExtractQRegister(instr, 5, 0);
39876                    // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39877                    vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39878                    break;
39879                  }
39880                  default:
39881                    UnallocatedA32(instr);
39882                    break;
39883                }
39884                break;
39885              }
39886              default:
39887                UnallocatedA32(instr);
39888                break;
39889            }
39890            break;
39891          }
39892          case 0x00000010: {
39893            // 0xf2000010
39894            switch (instr & 0x00000f40) {
39895              case 0x00000000: {
39896                // 0xf2000010
39897                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39898                                                 ((instr >> 22) & 0x4));
39899                if (dt.Is(kDataTypeValueInvalid)) {
39900                  UnallocatedA32(instr);
39901                  return;
39902                }
39903                unsigned rd = ExtractDRegister(instr, 22, 12);
39904                unsigned rn = ExtractDRegister(instr, 7, 16);
39905                unsigned rm = ExtractDRegister(instr, 5, 0);
39906                // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39907                vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39908                break;
39909              }
39910              case 0x00000040: {
39911                // 0xf2000050
39912                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39913                                                 ((instr >> 22) & 0x4));
39914                if (dt.Is(kDataTypeValueInvalid)) {
39915                  UnallocatedA32(instr);
39916                  return;
39917                }
39918                if (((instr >> 12) & 1) != 0) {
39919                  UnallocatedA32(instr);
39920                  return;
39921                }
39922                unsigned rd = ExtractQRegister(instr, 22, 12);
39923                if (((instr >> 16) & 1) != 0) {
39924                  UnallocatedA32(instr);
39925                  return;
39926                }
39927                unsigned rn = ExtractQRegister(instr, 7, 16);
39928                if ((instr & 1) != 0) {
39929                  UnallocatedA32(instr);
39930                  return;
39931                }
39932                unsigned rm = ExtractQRegister(instr, 5, 0);
39933                // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39934                vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39935                break;
39936              }
39937              case 0x00000100: {
39938                // 0xf2000110
39939                switch (instr & 0x01300000) {
39940                  case 0x00000000: {
39941                    // 0xf2000110
39942                    unsigned rd = ExtractDRegister(instr, 22, 12);
39943                    unsigned rn = ExtractDRegister(instr, 7, 16);
39944                    unsigned rm = ExtractDRegister(instr, 5, 0);
39945                    // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39946                    vand(al,
39947                         kDataTypeValueNone,
39948                         DRegister(rd),
39949                         DRegister(rn),
39950                         DRegister(rm));
39951                    break;
39952                  }
39953                  case 0x00100000: {
39954                    // 0xf2100110
39955                    unsigned rd = ExtractDRegister(instr, 22, 12);
39956                    unsigned rn = ExtractDRegister(instr, 7, 16);
39957                    unsigned rm = ExtractDRegister(instr, 5, 0);
39958                    // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39959                    vbic(al,
39960                         kDataTypeValueNone,
39961                         DRegister(rd),
39962                         DRegister(rn),
39963                         DRegister(rm));
39964                    break;
39965                  }
39966                  case 0x00200000: {
39967                    // 0xf2200110
39968                    if (((instr & 0x00000040) == 0x00000000) &&
39969                        ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
39970                          (Uint32((instr >> 16)) & Uint32(0xf))) ==
39971                         (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
39972                          (Uint32(instr) & Uint32(0xf))))) {
39973                      unsigned rd = ExtractDRegister(instr, 22, 12);
39974                      unsigned rm = ExtractDRegister(instr, 7, 16);
39975                      // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
39976                      vmov(al,
39977                           kDataTypeValueNone,
39978                           DRegister(rd),
39979                           DRegister(rm));
39980                      return;
39981                    }
39982                    unsigned rd = ExtractDRegister(instr, 22, 12);
39983                    unsigned rn = ExtractDRegister(instr, 7, 16);
39984                    unsigned rm = ExtractDRegister(instr, 5, 0);
39985                    // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39986                    vorr(al,
39987                         kDataTypeValueNone,
39988                         DRegister(rd),
39989                         DRegister(rn),
39990                         DRegister(rm));
39991                    break;
39992                  }
39993                  case 0x00300000: {
39994                    // 0xf2300110
39995                    unsigned rd = ExtractDRegister(instr, 22, 12);
39996                    unsigned rn = ExtractDRegister(instr, 7, 16);
39997                    unsigned rm = ExtractDRegister(instr, 5, 0);
39998                    // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39999                    vorn(al,
40000                         kDataTypeValueNone,
40001                         DRegister(rd),
40002                         DRegister(rn),
40003                         DRegister(rm));
40004                    break;
40005                  }
40006                  case 0x01000000: {
40007                    // 0xf3000110
40008                    unsigned rd = ExtractDRegister(instr, 22, 12);
40009                    unsigned rn = ExtractDRegister(instr, 7, 16);
40010                    unsigned rm = ExtractDRegister(instr, 5, 0);
40011                    // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
40012                    veor(al,
40013                         kDataTypeValueNone,
40014                         DRegister(rd),
40015                         DRegister(rn),
40016                         DRegister(rm));
40017                    break;
40018                  }
40019                  case 0x01100000: {
40020                    // 0xf3100110
40021                    unsigned rd = ExtractDRegister(instr, 22, 12);
40022                    unsigned rn = ExtractDRegister(instr, 7, 16);
40023                    unsigned rm = ExtractDRegister(instr, 5, 0);
40024                    // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
40025                    vbsl(al,
40026                         kDataTypeValueNone,
40027                         DRegister(rd),
40028                         DRegister(rn),
40029                         DRegister(rm));
40030                    break;
40031                  }
40032                  case 0x01200000: {
40033                    // 0xf3200110
40034                    unsigned rd = ExtractDRegister(instr, 22, 12);
40035                    unsigned rn = ExtractDRegister(instr, 7, 16);
40036                    unsigned rm = ExtractDRegister(instr, 5, 0);
40037                    // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
40038                    vbit(al,
40039                         kDataTypeValueNone,
40040                         DRegister(rd),
40041                         DRegister(rn),
40042                         DRegister(rm));
40043                    break;
40044                  }
40045                  case 0x01300000: {
40046                    // 0xf3300110
40047                    unsigned rd = ExtractDRegister(instr, 22, 12);
40048                    unsigned rn = ExtractDRegister(instr, 7, 16);
40049                    unsigned rm = ExtractDRegister(instr, 5, 0);
40050                    // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
40051                    vbif(al,
40052                         kDataTypeValueNone,
40053                         DRegister(rd),
40054                         DRegister(rn),
40055                         DRegister(rm));
40056                    break;
40057                  }
40058                }
40059                break;
40060              }
40061              case 0x00000140: {
40062                // 0xf2000150
40063                switch (instr & 0x01300000) {
40064                  case 0x00000000: {
40065                    // 0xf2000150
40066                    if (((instr >> 12) & 1) != 0) {
40067                      UnallocatedA32(instr);
40068                      return;
40069                    }
40070                    unsigned rd = ExtractQRegister(instr, 22, 12);
40071                    if (((instr >> 16) & 1) != 0) {
40072                      UnallocatedA32(instr);
40073                      return;
40074                    }
40075                    unsigned rn = ExtractQRegister(instr, 7, 16);
40076                    if ((instr & 1) != 0) {
40077                      UnallocatedA32(instr);
40078                      return;
40079                    }
40080                    unsigned rm = ExtractQRegister(instr, 5, 0);
40081                    // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40082                    vand(al,
40083                         kDataTypeValueNone,
40084                         QRegister(rd),
40085                         QRegister(rn),
40086                         QRegister(rm));
40087                    break;
40088                  }
40089                  case 0x00100000: {
40090                    // 0xf2100150
40091                    if (((instr >> 12) & 1) != 0) {
40092                      UnallocatedA32(instr);
40093                      return;
40094                    }
40095                    unsigned rd = ExtractQRegister(instr, 22, 12);
40096                    if (((instr >> 16) & 1) != 0) {
40097                      UnallocatedA32(instr);
40098                      return;
40099                    }
40100                    unsigned rn = ExtractQRegister(instr, 7, 16);
40101                    if ((instr & 1) != 0) {
40102                      UnallocatedA32(instr);
40103                      return;
40104                    }
40105                    unsigned rm = ExtractQRegister(instr, 5, 0);
40106                    // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40107                    vbic(al,
40108                         kDataTypeValueNone,
40109                         QRegister(rd),
40110                         QRegister(rn),
40111                         QRegister(rm));
40112                    break;
40113                  }
40114                  case 0x00200000: {
40115                    // 0xf2200150
40116                    if (((instr & 0x00000040) == 0x00000040) &&
40117                        ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
40118                          (Uint32((instr >> 16)) & Uint32(0xf))) ==
40119                         (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
40120                          (Uint32(instr) & Uint32(0xf))))) {
40121                      if (((instr >> 12) & 1) != 0) {
40122                        UnallocatedA32(instr);
40123                        return;
40124                      }
40125                      unsigned rd = ExtractQRegister(instr, 22, 12);
40126                      if (((instr >> 16) & 1) != 0) {
40127                        UnallocatedA32(instr);
40128                        return;
40129                      }
40130                      unsigned rm = ExtractQRegister(instr, 7, 16);
40131                      // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
40132                      vmov(al,
40133                           kDataTypeValueNone,
40134                           QRegister(rd),
40135                           QRegister(rm));
40136                      return;
40137                    }
40138                    if (((instr >> 12) & 1) != 0) {
40139                      UnallocatedA32(instr);
40140                      return;
40141                    }
40142                    unsigned rd = ExtractQRegister(instr, 22, 12);
40143                    if (((instr >> 16) & 1) != 0) {
40144                      UnallocatedA32(instr);
40145                      return;
40146                    }
40147                    unsigned rn = ExtractQRegister(instr, 7, 16);
40148                    if ((instr & 1) != 0) {
40149                      UnallocatedA32(instr);
40150                      return;
40151                    }
40152                    unsigned rm = ExtractQRegister(instr, 5, 0);
40153                    // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40154                    vorr(al,
40155                         kDataTypeValueNone,
40156                         QRegister(rd),
40157                         QRegister(rn),
40158                         QRegister(rm));
40159                    break;
40160                  }
40161                  case 0x00300000: {
40162                    // 0xf2300150
40163                    if (((instr >> 12) & 1) != 0) {
40164                      UnallocatedA32(instr);
40165                      return;
40166                    }
40167                    unsigned rd = ExtractQRegister(instr, 22, 12);
40168                    if (((instr >> 16) & 1) != 0) {
40169                      UnallocatedA32(instr);
40170                      return;
40171                    }
40172                    unsigned rn = ExtractQRegister(instr, 7, 16);
40173                    if ((instr & 1) != 0) {
40174                      UnallocatedA32(instr);
40175                      return;
40176                    }
40177                    unsigned rm = ExtractQRegister(instr, 5, 0);
40178                    // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40179                    vorn(al,
40180                         kDataTypeValueNone,
40181                         QRegister(rd),
40182                         QRegister(rn),
40183                         QRegister(rm));
40184                    break;
40185                  }
40186                  case 0x01000000: {
40187                    // 0xf3000150
40188                    if (((instr >> 12) & 1) != 0) {
40189                      UnallocatedA32(instr);
40190                      return;
40191                    }
40192                    unsigned rd = ExtractQRegister(instr, 22, 12);
40193                    if (((instr >> 16) & 1) != 0) {
40194                      UnallocatedA32(instr);
40195                      return;
40196                    }
40197                    unsigned rn = ExtractQRegister(instr, 7, 16);
40198                    if ((instr & 1) != 0) {
40199                      UnallocatedA32(instr);
40200                      return;
40201                    }
40202                    unsigned rm = ExtractQRegister(instr, 5, 0);
40203                    // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40204                    veor(al,
40205                         kDataTypeValueNone,
40206                         QRegister(rd),
40207                         QRegister(rn),
40208                         QRegister(rm));
40209                    break;
40210                  }
40211                  case 0x01100000: {
40212                    // 0xf3100150
40213                    if (((instr >> 12) & 1) != 0) {
40214                      UnallocatedA32(instr);
40215                      return;
40216                    }
40217                    unsigned rd = ExtractQRegister(instr, 22, 12);
40218                    if (((instr >> 16) & 1) != 0) {
40219                      UnallocatedA32(instr);
40220                      return;
40221                    }
40222                    unsigned rn = ExtractQRegister(instr, 7, 16);
40223                    if ((instr & 1) != 0) {
40224                      UnallocatedA32(instr);
40225                      return;
40226                    }
40227                    unsigned rm = ExtractQRegister(instr, 5, 0);
40228                    // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40229                    vbsl(al,
40230                         kDataTypeValueNone,
40231                         QRegister(rd),
40232                         QRegister(rn),
40233                         QRegister(rm));
40234                    break;
40235                  }
40236                  case 0x01200000: {
40237                    // 0xf3200150
40238                    if (((instr >> 12) & 1) != 0) {
40239                      UnallocatedA32(instr);
40240                      return;
40241                    }
40242                    unsigned rd = ExtractQRegister(instr, 22, 12);
40243                    if (((instr >> 16) & 1) != 0) {
40244                      UnallocatedA32(instr);
40245                      return;
40246                    }
40247                    unsigned rn = ExtractQRegister(instr, 7, 16);
40248                    if ((instr & 1) != 0) {
40249                      UnallocatedA32(instr);
40250                      return;
40251                    }
40252                    unsigned rm = ExtractQRegister(instr, 5, 0);
40253                    // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40254                    vbit(al,
40255                         kDataTypeValueNone,
40256                         QRegister(rd),
40257                         QRegister(rn),
40258                         QRegister(rm));
40259                    break;
40260                  }
40261                  case 0x01300000: {
40262                    // 0xf3300150
40263                    if (((instr >> 12) & 1) != 0) {
40264                      UnallocatedA32(instr);
40265                      return;
40266                    }
40267                    unsigned rd = ExtractQRegister(instr, 22, 12);
40268                    if (((instr >> 16) & 1) != 0) {
40269                      UnallocatedA32(instr);
40270                      return;
40271                    }
40272                    unsigned rn = ExtractQRegister(instr, 7, 16);
40273                    if ((instr & 1) != 0) {
40274                      UnallocatedA32(instr);
40275                      return;
40276                    }
40277                    unsigned rm = ExtractQRegister(instr, 5, 0);
40278                    // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40279                    vbif(al,
40280                         kDataTypeValueNone,
40281                         QRegister(rd),
40282                         QRegister(rn),
40283                         QRegister(rm));
40284                    break;
40285                  }
40286                }
40287                break;
40288              }
40289              case 0x00000200: {
40290                // 0xf2000210
40291                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40292                                                 ((instr >> 22) & 0x4));
40293                if (dt.Is(kDataTypeValueInvalid)) {
40294                  UnallocatedA32(instr);
40295                  return;
40296                }
40297                unsigned rd = ExtractDRegister(instr, 22, 12);
40298                unsigned rn = ExtractDRegister(instr, 7, 16);
40299                unsigned rm = ExtractDRegister(instr, 5, 0);
40300                // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40301                vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40302                break;
40303              }
40304              case 0x00000240: {
40305                // 0xf2000250
40306                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40307                                                 ((instr >> 22) & 0x4));
40308                if (dt.Is(kDataTypeValueInvalid)) {
40309                  UnallocatedA32(instr);
40310                  return;
40311                }
40312                if (((instr >> 12) & 1) != 0) {
40313                  UnallocatedA32(instr);
40314                  return;
40315                }
40316                unsigned rd = ExtractQRegister(instr, 22, 12);
40317                if (((instr >> 16) & 1) != 0) {
40318                  UnallocatedA32(instr);
40319                  return;
40320                }
40321                unsigned rn = ExtractQRegister(instr, 7, 16);
40322                if ((instr & 1) != 0) {
40323                  UnallocatedA32(instr);
40324                  return;
40325                }
40326                unsigned rm = ExtractQRegister(instr, 5, 0);
40327                // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40328                vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40329                break;
40330              }
40331              case 0x00000300: {
40332                // 0xf2000310
40333                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40334                                                 ((instr >> 22) & 0x4));
40335                if (dt.Is(kDataTypeValueInvalid)) {
40336                  UnallocatedA32(instr);
40337                  return;
40338                }
40339                unsigned rd = ExtractDRegister(instr, 22, 12);
40340                unsigned rn = ExtractDRegister(instr, 7, 16);
40341                unsigned rm = ExtractDRegister(instr, 5, 0);
40342                // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40343                vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40344                break;
40345              }
40346              case 0x00000340: {
40347                // 0xf2000350
40348                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40349                                                 ((instr >> 22) & 0x4));
40350                if (dt.Is(kDataTypeValueInvalid)) {
40351                  UnallocatedA32(instr);
40352                  return;
40353                }
40354                if (((instr >> 12) & 1) != 0) {
40355                  UnallocatedA32(instr);
40356                  return;
40357                }
40358                unsigned rd = ExtractQRegister(instr, 22, 12);
40359                if (((instr >> 16) & 1) != 0) {
40360                  UnallocatedA32(instr);
40361                  return;
40362                }
40363                unsigned rn = ExtractQRegister(instr, 7, 16);
40364                if ((instr & 1) != 0) {
40365                  UnallocatedA32(instr);
40366                  return;
40367                }
40368                unsigned rm = ExtractQRegister(instr, 5, 0);
40369                // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40370                vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40371                break;
40372              }
40373              case 0x00000400: {
40374                // 0xf2000410
40375                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40376                                                 ((instr >> 22) & 0x4));
40377                if (dt.Is(kDataTypeValueInvalid)) {
40378                  UnallocatedA32(instr);
40379                  return;
40380                }
40381                unsigned rd = ExtractDRegister(instr, 22, 12);
40382                unsigned rm = ExtractDRegister(instr, 5, 0);
40383                unsigned rn = ExtractDRegister(instr, 7, 16);
40384                // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
40385                vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
40386                break;
40387              }
40388              case 0x00000440: {
40389                // 0xf2000450
40390                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40391                                                 ((instr >> 22) & 0x4));
40392                if (dt.Is(kDataTypeValueInvalid)) {
40393                  UnallocatedA32(instr);
40394                  return;
40395                }
40396                if (((instr >> 12) & 1) != 0) {
40397                  UnallocatedA32(instr);
40398                  return;
40399                }
40400                unsigned rd = ExtractQRegister(instr, 22, 12);
40401                if ((instr & 1) != 0) {
40402                  UnallocatedA32(instr);
40403                  return;
40404                }
40405                unsigned rm = ExtractQRegister(instr, 5, 0);
40406                if (((instr >> 16) & 1) != 0) {
40407                  UnallocatedA32(instr);
40408                  return;
40409                }
40410                unsigned rn = ExtractQRegister(instr, 7, 16);
40411                // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
40412                vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
40413                break;
40414              }
40415              case 0x00000500: {
40416                // 0xf2000510
40417                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40418                                                 ((instr >> 22) & 0x4));
40419                if (dt.Is(kDataTypeValueInvalid)) {
40420                  UnallocatedA32(instr);
40421                  return;
40422                }
40423                unsigned rd = ExtractDRegister(instr, 22, 12);
40424                unsigned rm = ExtractDRegister(instr, 5, 0);
40425                unsigned rn = ExtractDRegister(instr, 7, 16);
40426                // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
40427                vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
40428                break;
40429              }
40430              case 0x00000540: {
40431                // 0xf2000550
40432                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40433                                                 ((instr >> 22) & 0x4));
40434                if (dt.Is(kDataTypeValueInvalid)) {
40435                  UnallocatedA32(instr);
40436                  return;
40437                }
40438                if (((instr >> 12) & 1) != 0) {
40439                  UnallocatedA32(instr);
40440                  return;
40441                }
40442                unsigned rd = ExtractQRegister(instr, 22, 12);
40443                if ((instr & 1) != 0) {
40444                  UnallocatedA32(instr);
40445                  return;
40446                }
40447                unsigned rm = ExtractQRegister(instr, 5, 0);
40448                if (((instr >> 16) & 1) != 0) {
40449                  UnallocatedA32(instr);
40450                  return;
40451                }
40452                unsigned rn = ExtractQRegister(instr, 7, 16);
40453                // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
40454                vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
40455                break;
40456              }
40457              case 0x00000600: {
40458                // 0xf2000610
40459                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40460                                                 ((instr >> 22) & 0x4));
40461                if (dt.Is(kDataTypeValueInvalid)) {
40462                  UnallocatedA32(instr);
40463                  return;
40464                }
40465                unsigned rd = ExtractDRegister(instr, 22, 12);
40466                unsigned rn = ExtractDRegister(instr, 7, 16);
40467                unsigned rm = ExtractDRegister(instr, 5, 0);
40468                // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40469                vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40470                break;
40471              }
40472              case 0x00000640: {
40473                // 0xf2000650
40474                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40475                                                 ((instr >> 22) & 0x4));
40476                if (dt.Is(kDataTypeValueInvalid)) {
40477                  UnallocatedA32(instr);
40478                  return;
40479                }
40480                if (((instr >> 12) & 1) != 0) {
40481                  UnallocatedA32(instr);
40482                  return;
40483                }
40484                unsigned rd = ExtractQRegister(instr, 22, 12);
40485                if (((instr >> 16) & 1) != 0) {
40486                  UnallocatedA32(instr);
40487                  return;
40488                }
40489                unsigned rn = ExtractQRegister(instr, 7, 16);
40490                if ((instr & 1) != 0) {
40491                  UnallocatedA32(instr);
40492                  return;
40493                }
40494                unsigned rm = ExtractQRegister(instr, 5, 0);
40495                // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40496                vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40497                break;
40498              }
40499              case 0x00000700: {
40500                // 0xf2000710
40501                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40502                                                 ((instr >> 22) & 0x4));
40503                if (dt.Is(kDataTypeValueInvalid)) {
40504                  UnallocatedA32(instr);
40505                  return;
40506                }
40507                unsigned rd = ExtractDRegister(instr, 22, 12);
40508                unsigned rn = ExtractDRegister(instr, 7, 16);
40509                unsigned rm = ExtractDRegister(instr, 5, 0);
40510                // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1
40511                vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40512                break;
40513              }
40514              case 0x00000740: {
40515                // 0xf2000750
40516                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40517                                                 ((instr >> 22) & 0x4));
40518                if (dt.Is(kDataTypeValueInvalid)) {
40519                  UnallocatedA32(instr);
40520                  return;
40521                }
40522                if (((instr >> 12) & 1) != 0) {
40523                  UnallocatedA32(instr);
40524                  return;
40525                }
40526                unsigned rd = ExtractQRegister(instr, 22, 12);
40527                if (((instr >> 16) & 1) != 0) {
40528                  UnallocatedA32(instr);
40529                  return;
40530                }
40531                unsigned rn = ExtractQRegister(instr, 7, 16);
40532                if ((instr & 1) != 0) {
40533                  UnallocatedA32(instr);
40534                  return;
40535                }
40536                unsigned rm = ExtractQRegister(instr, 5, 0);
40537                // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1
40538                vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40539                break;
40540              }
40541              case 0x00000800: {
40542                // 0xf2000810
40543                switch (instr & 0x01000000) {
40544                  case 0x00000000: {
40545                    // 0xf2000810
40546                    DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
40547                    if (dt.Is(kDataTypeValueInvalid)) {
40548                      UnallocatedA32(instr);
40549                      return;
40550                    }
40551                    unsigned rd = ExtractDRegister(instr, 22, 12);
40552                    unsigned rn = ExtractDRegister(instr, 7, 16);
40553                    unsigned rm = ExtractDRegister(instr, 5, 0);
40554                    // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40555                    vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40556                    break;
40557                  }
40558                  case 0x01000000: {
40559                    // 0xf3000810
40560                    DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40561                    if (dt.Is(kDataTypeValueInvalid)) {
40562                      UnallocatedA32(instr);
40563                      return;
40564                    }
40565                    unsigned rd = ExtractDRegister(instr, 22, 12);
40566                    unsigned rn = ExtractDRegister(instr, 7, 16);
40567                    unsigned rm = ExtractDRegister(instr, 5, 0);
40568                    // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40569                    vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40570                    break;
40571                  }
40572                }
40573                break;
40574              }
40575              case 0x00000840: {
40576                // 0xf2000850
40577                switch (instr & 0x01000000) {
40578                  case 0x00000000: {
40579                    // 0xf2000850
40580                    DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
40581                    if (dt.Is(kDataTypeValueInvalid)) {
40582                      UnallocatedA32(instr);
40583                      return;
40584                    }
40585                    if (((instr >> 12) & 1) != 0) {
40586                      UnallocatedA32(instr);
40587                      return;
40588                    }
40589                    unsigned rd = ExtractQRegister(instr, 22, 12);
40590                    if (((instr >> 16) & 1) != 0) {
40591                      UnallocatedA32(instr);
40592                      return;
40593                    }
40594                    unsigned rn = ExtractQRegister(instr, 7, 16);
40595                    if ((instr & 1) != 0) {
40596                      UnallocatedA32(instr);
40597                      return;
40598                    }
40599                    unsigned rm = ExtractQRegister(instr, 5, 0);
40600                    // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40601                    vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40602                    break;
40603                  }
40604                  case 0x01000000: {
40605                    // 0xf3000850
40606                    DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40607                    if (dt.Is(kDataTypeValueInvalid)) {
40608                      UnallocatedA32(instr);
40609                      return;
40610                    }
40611                    if (((instr >> 12) & 1) != 0) {
40612                      UnallocatedA32(instr);
40613                      return;
40614                    }
40615                    unsigned rd = ExtractQRegister(instr, 22, 12);
40616                    if (((instr >> 16) & 1) != 0) {
40617                      UnallocatedA32(instr);
40618                      return;
40619                    }
40620                    unsigned rn = ExtractQRegister(instr, 7, 16);
40621                    if ((instr & 1) != 0) {
40622                      UnallocatedA32(instr);
40623                      return;
40624                    }
40625                    unsigned rm = ExtractQRegister(instr, 5, 0);
40626                    // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40627                    vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40628                    break;
40629                  }
40630                }
40631                break;
40632              }
40633              case 0x00000900: {
40634                // 0xf2000910
40635                DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
40636                                                  ((instr >> 22) & 0x4));
40637                if (dt.Is(kDataTypeValueInvalid)) {
40638                  UnallocatedA32(instr);
40639                  return;
40640                }
40641                unsigned rd = ExtractDRegister(instr, 22, 12);
40642                unsigned rn = ExtractDRegister(instr, 7, 16);
40643                unsigned rm = ExtractDRegister(instr, 5, 0);
40644                // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40645                vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40646                break;
40647              }
40648              case 0x00000940: {
40649                // 0xf2000950
40650                DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
40651                                                  ((instr >> 22) & 0x4));
40652                if (dt.Is(kDataTypeValueInvalid)) {
40653                  UnallocatedA32(instr);
40654                  return;
40655                }
40656                if (((instr >> 12) & 1) != 0) {
40657                  UnallocatedA32(instr);
40658                  return;
40659                }
40660                unsigned rd = ExtractQRegister(instr, 22, 12);
40661                if (((instr >> 16) & 1) != 0) {
40662                  UnallocatedA32(instr);
40663                  return;
40664                }
40665                unsigned rn = ExtractQRegister(instr, 7, 16);
40666                if ((instr & 1) != 0) {
40667                  UnallocatedA32(instr);
40668                  return;
40669                }
40670                unsigned rm = ExtractQRegister(instr, 5, 0);
40671                // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40672                vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40673                break;
40674              }
40675              case 0x00000a00: {
40676                // 0xf2000a10
40677                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40678                                                 ((instr >> 22) & 0x4));
40679                if (dt.Is(kDataTypeValueInvalid)) {
40680                  UnallocatedA32(instr);
40681                  return;
40682                }
40683                unsigned rd = ExtractDRegister(instr, 22, 12);
40684                unsigned rn = ExtractDRegister(instr, 7, 16);
40685                unsigned rm = ExtractDRegister(instr, 5, 0);
40686                // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40687                vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40688                break;
40689              }
40690              case 0x00000b00: {
40691                // 0xf2000b10
40692                if ((instr & 0x01000000) == 0x00000000) {
40693                  DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40694                  if (dt.Is(kDataTypeValueInvalid)) {
40695                    UnallocatedA32(instr);
40696                    return;
40697                  }
40698                  unsigned rd = ExtractDRegister(instr, 22, 12);
40699                  unsigned rn = ExtractDRegister(instr, 7, 16);
40700                  unsigned rm = ExtractDRegister(instr, 5, 0);
40701                  // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40702                  vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40703                } else {
40704                  UnallocatedA32(instr);
40705                }
40706                break;
40707              }
40708              case 0x00000c00: {
40709                // 0xf2000c10
40710                switch (instr & 0x01300000) {
40711                  case 0x00000000: {
40712                    // 0xf2000c10
40713                    unsigned rd = ExtractDRegister(instr, 22, 12);
40714                    unsigned rn = ExtractDRegister(instr, 7, 16);
40715                    unsigned rm = ExtractDRegister(instr, 5, 0);
40716                    // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40717                    vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40718                    break;
40719                  }
40720                  case 0x00200000: {
40721                    // 0xf2200c10
40722                    unsigned rd = ExtractDRegister(instr, 22, 12);
40723                    unsigned rn = ExtractDRegister(instr, 7, 16);
40724                    unsigned rm = ExtractDRegister(instr, 5, 0);
40725                    // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40726                    vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40727                    break;
40728                  }
40729                  default:
40730                    UnallocatedA32(instr);
40731                    break;
40732                }
40733                break;
40734              }
40735              case 0x00000c40: {
40736                // 0xf2000c50
40737                switch (instr & 0x01300000) {
40738                  case 0x00000000: {
40739                    // 0xf2000c50
40740                    if (((instr >> 12) & 1) != 0) {
40741                      UnallocatedA32(instr);
40742                      return;
40743                    }
40744                    unsigned rd = ExtractQRegister(instr, 22, 12);
40745                    if (((instr >> 16) & 1) != 0) {
40746                      UnallocatedA32(instr);
40747                      return;
40748                    }
40749                    unsigned rn = ExtractQRegister(instr, 7, 16);
40750                    if ((instr & 1) != 0) {
40751                      UnallocatedA32(instr);
40752                      return;
40753                    }
40754                    unsigned rm = ExtractQRegister(instr, 5, 0);
40755                    // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40756                    vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40757                    break;
40758                  }
40759                  case 0x00200000: {
40760                    // 0xf2200c50
40761                    if (((instr >> 12) & 1) != 0) {
40762                      UnallocatedA32(instr);
40763                      return;
40764                    }
40765                    unsigned rd = ExtractQRegister(instr, 22, 12);
40766                    if (((instr >> 16) & 1) != 0) {
40767                      UnallocatedA32(instr);
40768                      return;
40769                    }
40770                    unsigned rn = ExtractQRegister(instr, 7, 16);
40771                    if ((instr & 1) != 0) {
40772                      UnallocatedA32(instr);
40773                      return;
40774                    }
40775                    unsigned rm = ExtractQRegister(instr, 5, 0);
40776                    // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40777                    vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40778                    break;
40779                  }
40780                  default:
40781                    UnallocatedA32(instr);
40782                    break;
40783                }
40784                break;
40785              }
40786              case 0x00000d00: {
40787                // 0xf2000d10
40788                switch (instr & 0x01300000) {
40789                  case 0x00000000: {
40790                    // 0xf2000d10
40791                    unsigned rd = ExtractDRegister(instr, 22, 12);
40792                    unsigned rn = ExtractDRegister(instr, 7, 16);
40793                    unsigned rm = ExtractDRegister(instr, 5, 0);
40794                    // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40795                    vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40796                    break;
40797                  }
40798                  case 0x00200000: {
40799                    // 0xf2200d10
40800                    unsigned rd = ExtractDRegister(instr, 22, 12);
40801                    unsigned rn = ExtractDRegister(instr, 7, 16);
40802                    unsigned rm = ExtractDRegister(instr, 5, 0);
40803                    // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40804                    vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40805                    break;
40806                  }
40807                  case 0x01000000: {
40808                    // 0xf3000d10
40809                    unsigned rd = ExtractDRegister(instr, 22, 12);
40810                    unsigned rn = ExtractDRegister(instr, 7, 16);
40811                    unsigned rm = ExtractDRegister(instr, 5, 0);
40812                    // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40813                    vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40814                    break;
40815                  }
40816                  default:
40817                    UnallocatedA32(instr);
40818                    break;
40819                }
40820                break;
40821              }
40822              case 0x00000d40: {
40823                // 0xf2000d50
40824                switch (instr & 0x01300000) {
40825                  case 0x00000000: {
40826                    // 0xf2000d50
40827                    if (((instr >> 12) & 1) != 0) {
40828                      UnallocatedA32(instr);
40829                      return;
40830                    }
40831                    unsigned rd = ExtractQRegister(instr, 22, 12);
40832                    if (((instr >> 16) & 1) != 0) {
40833                      UnallocatedA32(instr);
40834                      return;
40835                    }
40836                    unsigned rn = ExtractQRegister(instr, 7, 16);
40837                    if ((instr & 1) != 0) {
40838                      UnallocatedA32(instr);
40839                      return;
40840                    }
40841                    unsigned rm = ExtractQRegister(instr, 5, 0);
40842                    // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40843                    vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40844                    break;
40845                  }
40846                  case 0x00200000: {
40847                    // 0xf2200d50
40848                    if (((instr >> 12) & 1) != 0) {
40849                      UnallocatedA32(instr);
40850                      return;
40851                    }
40852                    unsigned rd = ExtractQRegister(instr, 22, 12);
40853                    if (((instr >> 16) & 1) != 0) {
40854                      UnallocatedA32(instr);
40855                      return;
40856                    }
40857                    unsigned rn = ExtractQRegister(instr, 7, 16);
40858                    if ((instr & 1) != 0) {
40859                      UnallocatedA32(instr);
40860                      return;
40861                    }
40862                    unsigned rm = ExtractQRegister(instr, 5, 0);
40863                    // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40864                    vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40865                    break;
40866                  }
40867                  case 0x01000000: {
40868                    // 0xf3000d50
40869                    if (((instr >> 12) & 1) != 0) {
40870                      UnallocatedA32(instr);
40871                      return;
40872                    }
40873                    unsigned rd = ExtractQRegister(instr, 22, 12);
40874                    if (((instr >> 16) & 1) != 0) {
40875                      UnallocatedA32(instr);
40876                      return;
40877                    }
40878                    unsigned rn = ExtractQRegister(instr, 7, 16);
40879                    if ((instr & 1) != 0) {
40880                      UnallocatedA32(instr);
40881                      return;
40882                    }
40883                    unsigned rm = ExtractQRegister(instr, 5, 0);
40884                    // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40885                    vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40886                    break;
40887                  }
40888                  default:
40889                    UnallocatedA32(instr);
40890                    break;
40891                }
40892                break;
40893              }
40894              case 0x00000e00: {
40895                // 0xf2000e10
40896                switch (instr & 0x01300000) {
40897                  case 0x01000000: {
40898                    // 0xf3000e10
40899                    unsigned rd = ExtractDRegister(instr, 22, 12);
40900                    unsigned rn = ExtractDRegister(instr, 7, 16);
40901                    unsigned rm = ExtractDRegister(instr, 5, 0);
40902                    // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40903                    vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40904                    break;
40905                  }
40906                  case 0x01200000: {
40907                    // 0xf3200e10
40908                    unsigned rd = ExtractDRegister(instr, 22, 12);
40909                    unsigned rn = ExtractDRegister(instr, 7, 16);
40910                    unsigned rm = ExtractDRegister(instr, 5, 0);
40911                    // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40912                    vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40913                    break;
40914                  }
40915                  default:
40916                    UnallocatedA32(instr);
40917                    break;
40918                }
40919                break;
40920              }
40921              case 0x00000e40: {
40922                // 0xf2000e50
40923                switch (instr & 0x01300000) {
40924                  case 0x01000000: {
40925                    // 0xf3000e50
40926                    if (((instr >> 12) & 1) != 0) {
40927                      UnallocatedA32(instr);
40928                      return;
40929                    }
40930                    unsigned rd = ExtractQRegister(instr, 22, 12);
40931                    if (((instr >> 16) & 1) != 0) {
40932                      UnallocatedA32(instr);
40933                      return;
40934                    }
40935                    unsigned rn = ExtractQRegister(instr, 7, 16);
40936                    if ((instr & 1) != 0) {
40937                      UnallocatedA32(instr);
40938                      return;
40939                    }
40940                    unsigned rm = ExtractQRegister(instr, 5, 0);
40941                    // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40942                    vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40943                    break;
40944                  }
40945                  case 0x01200000: {
40946                    // 0xf3200e50
40947                    if (((instr >> 12) & 1) != 0) {
40948                      UnallocatedA32(instr);
40949                      return;
40950                    }
40951                    unsigned rd = ExtractQRegister(instr, 22, 12);
40952                    if (((instr >> 16) & 1) != 0) {
40953                      UnallocatedA32(instr);
40954                      return;
40955                    }
40956                    unsigned rn = ExtractQRegister(instr, 7, 16);
40957                    if ((instr & 1) != 0) {
40958                      UnallocatedA32(instr);
40959                      return;
40960                    }
40961                    unsigned rm = ExtractQRegister(instr, 5, 0);
40962                    // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40963                    vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40964                    break;
40965                  }
40966                  default:
40967                    UnallocatedA32(instr);
40968                    break;
40969                }
40970                break;
40971              }
40972              case 0x00000f00: {
40973                // 0xf2000f10
40974                switch (instr & 0x01300000) {
40975                  case 0x00000000: {
40976                    // 0xf2000f10
40977                    unsigned rd = ExtractDRegister(instr, 22, 12);
40978                    unsigned rn = ExtractDRegister(instr, 7, 16);
40979                    unsigned rm = ExtractDRegister(instr, 5, 0);
40980                    // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40981                    vrecps(al,
40982                           F32,
40983                           DRegister(rd),
40984                           DRegister(rn),
40985                           DRegister(rm));
40986                    break;
40987                  }
40988                  case 0x00200000: {
40989                    // 0xf2200f10
40990                    unsigned rd = ExtractDRegister(instr, 22, 12);
40991                    unsigned rn = ExtractDRegister(instr, 7, 16);
40992                    unsigned rm = ExtractDRegister(instr, 5, 0);
40993                    // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40994                    vrsqrts(al,
40995                            F32,
40996                            DRegister(rd),
40997                            DRegister(rn),
40998                            DRegister(rm));
40999                    break;
41000                  }
41001                  case 0x01000000: {
41002                    // 0xf3000f10
41003                    unsigned rd = ExtractDRegister(instr, 22, 12);
41004                    unsigned rn = ExtractDRegister(instr, 7, 16);
41005                    unsigned rm = ExtractDRegister(instr, 5, 0);
41006                    // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
41007                    vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
41008                    break;
41009                  }
41010                  case 0x01200000: {
41011                    // 0xf3200f10
41012                    unsigned rd = ExtractDRegister(instr, 22, 12);
41013                    unsigned rn = ExtractDRegister(instr, 7, 16);
41014                    unsigned rm = ExtractDRegister(instr, 5, 0);
41015                    // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
41016                    vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
41017                    break;
41018                  }
41019                  default:
41020                    UnallocatedA32(instr);
41021                    break;
41022                }
41023                break;
41024              }
41025              case 0x00000f40: {
41026                // 0xf2000f50
41027                switch (instr & 0x01300000) {
41028                  case 0x00000000: {
41029                    // 0xf2000f50
41030                    if (((instr >> 12) & 1) != 0) {
41031                      UnallocatedA32(instr);
41032                      return;
41033                    }
41034                    unsigned rd = ExtractQRegister(instr, 22, 12);
41035                    if (((instr >> 16) & 1) != 0) {
41036                      UnallocatedA32(instr);
41037                      return;
41038                    }
41039                    unsigned rn = ExtractQRegister(instr, 7, 16);
41040                    if ((instr & 1) != 0) {
41041                      UnallocatedA32(instr);
41042                      return;
41043                    }
41044                    unsigned rm = ExtractQRegister(instr, 5, 0);
41045                    // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
41046                    vrecps(al,
41047                           F32,
41048                           QRegister(rd),
41049                           QRegister(rn),
41050                           QRegister(rm));
41051                    break;
41052                  }
41053                  case 0x00200000: {
41054                    // 0xf2200f50
41055                    if (((instr >> 12) & 1) != 0) {
41056                      UnallocatedA32(instr);
41057                      return;
41058                    }
41059                    unsigned rd = ExtractQRegister(instr, 22, 12);
41060                    if (((instr >> 16) & 1) != 0) {
41061                      UnallocatedA32(instr);
41062                      return;
41063                    }
41064                    unsigned rn = ExtractQRegister(instr, 7, 16);
41065                    if ((instr & 1) != 0) {
41066                      UnallocatedA32(instr);
41067                      return;
41068                    }
41069                    unsigned rm = ExtractQRegister(instr, 5, 0);
41070                    // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
41071                    vrsqrts(al,
41072                            F32,
41073                            QRegister(rd),
41074                            QRegister(rn),
41075                            QRegister(rm));
41076                    break;
41077                  }
41078                  case 0x01000000: {
41079                    // 0xf3000f50
41080                    if (((instr >> 12) & 1) != 0) {
41081                      UnallocatedA32(instr);
41082                      return;
41083                    }
41084                    unsigned rd = ExtractQRegister(instr, 22, 12);
41085                    if (((instr >> 16) & 1) != 0) {
41086                      UnallocatedA32(instr);
41087                      return;
41088                    }
41089                    unsigned rn = ExtractQRegister(instr, 7, 16);
41090                    if ((instr & 1) != 0) {
41091                      UnallocatedA32(instr);
41092                      return;
41093                    }
41094                    unsigned rm = ExtractQRegister(instr, 5, 0);
41095                    // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
41096                    vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
41097                    break;
41098                  }
41099                  case 0x01200000: {
41100                    // 0xf3200f50
41101                    if (((instr >> 12) & 1) != 0) {
41102                      UnallocatedA32(instr);
41103                      return;
41104                    }
41105                    unsigned rd = ExtractQRegister(instr, 22, 12);
41106                    if (((instr >> 16) & 1) != 0) {
41107                      UnallocatedA32(instr);
41108                      return;
41109                    }
41110                    unsigned rn = ExtractQRegister(instr, 7, 16);
41111                    if ((instr & 1) != 0) {
41112                      UnallocatedA32(instr);
41113                      return;
41114                    }
41115                    unsigned rm = ExtractQRegister(instr, 5, 0);
41116                    // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
41117                    vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
41118                    break;
41119                  }
41120                  default:
41121                    UnallocatedA32(instr);
41122                    break;
41123                }
41124                break;
41125              }
41126              default:
41127                UnallocatedA32(instr);
41128                break;
41129            }
41130            break;
41131          }
41132          case 0x00800000: {
41133            // 0xf2800000
41134            switch (instr & 0x00300000) {
41135              case 0x00300000: {
41136                // 0xf2b00000
41137                switch (instr & 0x01000000) {
41138                  case 0x00000000: {
41139                    // 0xf2b00000
41140                    switch (instr & 0x00000040) {
41141                      case 0x00000000: {
41142                        // 0xf2b00000
41143                        if (((instr & 0x800) == 0x800)) {
41144                          UnallocatedA32(instr);
41145                          return;
41146                        }
41147                        unsigned rd = ExtractDRegister(instr, 22, 12);
41148                        unsigned rn = ExtractDRegister(instr, 7, 16);
41149                        unsigned rm = ExtractDRegister(instr, 5, 0);
41150                        uint32_t imm = (instr >> 8) & 0xf;
41151                        // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1
41152                        vext(al,
41153                             Untyped8,
41154                             DRegister(rd),
41155                             DRegister(rn),
41156                             DRegister(rm),
41157                             imm);
41158                        break;
41159                      }
41160                      case 0x00000040: {
41161                        // 0xf2b00040
41162                        if (((instr >> 12) & 1) != 0) {
41163                          UnallocatedA32(instr);
41164                          return;
41165                        }
41166                        unsigned rd = ExtractQRegister(instr, 22, 12);
41167                        if (((instr >> 16) & 1) != 0) {
41168                          UnallocatedA32(instr);
41169                          return;
41170                        }
41171                        unsigned rn = ExtractQRegister(instr, 7, 16);
41172                        if ((instr & 1) != 0) {
41173                          UnallocatedA32(instr);
41174                          return;
41175                        }
41176                        unsigned rm = ExtractQRegister(instr, 5, 0);
41177                        uint32_t imm = (instr >> 8) & 0xf;
41178                        // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1
41179                        vext(al,
41180                             Untyped8,
41181                             QRegister(rd),
41182                             QRegister(rn),
41183                             QRegister(rm),
41184                             imm);
41185                        break;
41186                      }
41187                    }
41188                    break;
41189                  }
41190                  case 0x01000000: {
41191                    // 0xf3b00000
41192                    switch (instr & 0x00000800) {
41193                      case 0x00000000: {
41194                        // 0xf3b00000
41195                        switch (instr & 0x00030200) {
41196                          case 0x00000000: {
41197                            // 0xf3b00000
41198                            switch (instr & 0x000005c0) {
41199                              case 0x00000000: {
41200                                // 0xf3b00000
41201                                DataType dt =
41202                                    Dt_size_7_Decode((instr >> 18) & 0x3);
41203                                if (dt.Is(kDataTypeValueInvalid)) {
41204                                  UnallocatedA32(instr);
41205                                  return;
41206                                }
41207                                unsigned rd = ExtractDRegister(instr, 22, 12);
41208                                unsigned rm = ExtractDRegister(instr, 5, 0);
41209                                // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41210                                vrev64(al, dt, DRegister(rd), DRegister(rm));
41211                                break;
41212                              }
41213                              case 0x00000040: {
41214                                // 0xf3b00040
41215                                DataType dt =
41216                                    Dt_size_7_Decode((instr >> 18) & 0x3);
41217                                if (dt.Is(kDataTypeValueInvalid)) {
41218                                  UnallocatedA32(instr);
41219                                  return;
41220                                }
41221                                if (((instr >> 12) & 1) != 0) {
41222                                  UnallocatedA32(instr);
41223                                  return;
41224                                }
41225                                unsigned rd = ExtractQRegister(instr, 22, 12);
41226                                if ((instr & 1) != 0) {
41227                                  UnallocatedA32(instr);
41228                                  return;
41229                                }
41230                                unsigned rm = ExtractQRegister(instr, 5, 0);
41231                                // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41232                                vrev64(al, dt, QRegister(rd), QRegister(rm));
41233                                break;
41234                              }
41235                              case 0x00000080: {
41236                                // 0xf3b00080
41237                                DataType dt =
41238                                    Dt_size_15_Decode((instr >> 18) & 0x3);
41239                                if (dt.Is(kDataTypeValueInvalid)) {
41240                                  UnallocatedA32(instr);
41241                                  return;
41242                                }
41243                                unsigned rd = ExtractDRegister(instr, 22, 12);
41244                                unsigned rm = ExtractDRegister(instr, 5, 0);
41245                                // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41246                                vrev32(al, dt, DRegister(rd), DRegister(rm));
41247                                break;
41248                              }
41249                              case 0x000000c0: {
41250                                // 0xf3b000c0
41251                                DataType dt =
41252                                    Dt_size_15_Decode((instr >> 18) & 0x3);
41253                                if (dt.Is(kDataTypeValueInvalid)) {
41254                                  UnallocatedA32(instr);
41255                                  return;
41256                                }
41257                                if (((instr >> 12) & 1) != 0) {
41258                                  UnallocatedA32(instr);
41259                                  return;
41260                                }
41261                                unsigned rd = ExtractQRegister(instr, 22, 12);
41262                                if ((instr & 1) != 0) {
41263                                  UnallocatedA32(instr);
41264                                  return;
41265                                }
41266                                unsigned rm = ExtractQRegister(instr, 5, 0);
41267                                // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41268                                vrev32(al, dt, QRegister(rd), QRegister(rm));
41269                                break;
41270                              }
41271                              case 0x00000100: {
41272                                // 0xf3b00100
41273                                DataType dt =
41274                                    Dt_size_1_Decode((instr >> 18) & 0x3);
41275                                if (dt.Is(kDataTypeValueInvalid)) {
41276                                  UnallocatedA32(instr);
41277                                  return;
41278                                }
41279                                unsigned rd = ExtractDRegister(instr, 22, 12);
41280                                unsigned rm = ExtractDRegister(instr, 5, 0);
41281                                // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41282                                vrev16(al, dt, DRegister(rd), DRegister(rm));
41283                                break;
41284                              }
41285                              case 0x00000140: {
41286                                // 0xf3b00140
41287                                DataType dt =
41288                                    Dt_size_1_Decode((instr >> 18) & 0x3);
41289                                if (dt.Is(kDataTypeValueInvalid)) {
41290                                  UnallocatedA32(instr);
41291                                  return;
41292                                }
41293                                if (((instr >> 12) & 1) != 0) {
41294                                  UnallocatedA32(instr);
41295                                  return;
41296                                }
41297                                unsigned rd = ExtractQRegister(instr, 22, 12);
41298                                if ((instr & 1) != 0) {
41299                                  UnallocatedA32(instr);
41300                                  return;
41301                                }
41302                                unsigned rm = ExtractQRegister(instr, 5, 0);
41303                                // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41304                                vrev16(al, dt, QRegister(rd), QRegister(rm));
41305                                break;
41306                              }
41307                              case 0x00000400: {
41308                                // 0xf3b00400
41309                                DataType dt =
41310                                    Dt_size_5_Decode((instr >> 18) & 0x3);
41311                                if (dt.Is(kDataTypeValueInvalid)) {
41312                                  UnallocatedA32(instr);
41313                                  return;
41314                                }
41315                                unsigned rd = ExtractDRegister(instr, 22, 12);
41316                                unsigned rm = ExtractDRegister(instr, 5, 0);
41317                                // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41318                                vcls(al, dt, DRegister(rd), DRegister(rm));
41319                                break;
41320                              }
41321                              case 0x00000440: {
41322                                // 0xf3b00440
41323                                DataType dt =
41324                                    Dt_size_5_Decode((instr >> 18) & 0x3);
41325                                if (dt.Is(kDataTypeValueInvalid)) {
41326                                  UnallocatedA32(instr);
41327                                  return;
41328                                }
41329                                if (((instr >> 12) & 1) != 0) {
41330                                  UnallocatedA32(instr);
41331                                  return;
41332                                }
41333                                unsigned rd = ExtractQRegister(instr, 22, 12);
41334                                if ((instr & 1) != 0) {
41335                                  UnallocatedA32(instr);
41336                                  return;
41337                                }
41338                                unsigned rm = ExtractQRegister(instr, 5, 0);
41339                                // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41340                                vcls(al, dt, QRegister(rd), QRegister(rm));
41341                                break;
41342                              }
41343                              case 0x00000480: {
41344                                // 0xf3b00480
41345                                DataType dt =
41346                                    Dt_size_4_Decode((instr >> 18) & 0x3);
41347                                if (dt.Is(kDataTypeValueInvalid)) {
41348                                  UnallocatedA32(instr);
41349                                  return;
41350                                }
41351                                unsigned rd = ExtractDRegister(instr, 22, 12);
41352                                unsigned rm = ExtractDRegister(instr, 5, 0);
41353                                // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41354                                vclz(al, dt, DRegister(rd), DRegister(rm));
41355                                break;
41356                              }
41357                              case 0x000004c0: {
41358                                // 0xf3b004c0
41359                                DataType dt =
41360                                    Dt_size_4_Decode((instr >> 18) & 0x3);
41361                                if (dt.Is(kDataTypeValueInvalid)) {
41362                                  UnallocatedA32(instr);
41363                                  return;
41364                                }
41365                                if (((instr >> 12) & 1) != 0) {
41366                                  UnallocatedA32(instr);
41367                                  return;
41368                                }
41369                                unsigned rd = ExtractQRegister(instr, 22, 12);
41370                                if ((instr & 1) != 0) {
41371                                  UnallocatedA32(instr);
41372                                  return;
41373                                }
41374                                unsigned rm = ExtractQRegister(instr, 5, 0);
41375                                // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41376                                vclz(al, dt, QRegister(rd), QRegister(rm));
41377                                break;
41378                              }
41379                              case 0x00000500: {
41380                                // 0xf3b00500
41381                                if ((instr & 0x000c0000) == 0x00000000) {
41382                                  unsigned rd = ExtractDRegister(instr, 22, 12);
41383                                  unsigned rm = ExtractDRegister(instr, 5, 0);
41384                                  // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1
41385                                  vcnt(al,
41386                                       Untyped8,
41387                                       DRegister(rd),
41388                                       DRegister(rm));
41389                                } else {
41390                                  UnallocatedA32(instr);
41391                                }
41392                                break;
41393                              }
41394                              case 0x00000540: {
41395                                // 0xf3b00540
41396                                if ((instr & 0x000c0000) == 0x00000000) {
41397                                  if (((instr >> 12) & 1) != 0) {
41398                                    UnallocatedA32(instr);
41399                                    return;
41400                                  }
41401                                  unsigned rd = ExtractQRegister(instr, 22, 12);
41402                                  if ((instr & 1) != 0) {
41403                                    UnallocatedA32(instr);
41404                                    return;
41405                                  }
41406                                  unsigned rm = ExtractQRegister(instr, 5, 0);
41407                                  // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1
41408                                  vcnt(al,
41409                                       Untyped8,
41410                                       QRegister(rd),
41411                                       QRegister(rm));
41412                                } else {
41413                                  UnallocatedA32(instr);
41414                                }
41415                                break;
41416                              }
41417                              case 0x00000580: {
41418                                // 0xf3b00580
41419                                if ((instr & 0x000c0000) == 0x00000000) {
41420                                  unsigned rd = ExtractDRegister(instr, 22, 12);
41421                                  unsigned rm = ExtractDRegister(instr, 5, 0);
41422                                  // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
41423                                  vmvn(al,
41424                                       kDataTypeValueNone,
41425                                       DRegister(rd),
41426                                       DRegister(rm));
41427                                } else {
41428                                  UnallocatedA32(instr);
41429                                }
41430                                break;
41431                              }
41432                              case 0x000005c0: {
41433                                // 0xf3b005c0
41434                                if ((instr & 0x000c0000) == 0x00000000) {
41435                                  if (((instr >> 12) & 1) != 0) {
41436                                    UnallocatedA32(instr);
41437                                    return;
41438                                  }
41439                                  unsigned rd = ExtractQRegister(instr, 22, 12);
41440                                  if ((instr & 1) != 0) {
41441                                    UnallocatedA32(instr);
41442                                    return;
41443                                  }
41444                                  unsigned rm = ExtractQRegister(instr, 5, 0);
41445                                  // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
41446                                  vmvn(al,
41447                                       kDataTypeValueNone,
41448                                       QRegister(rd),
41449                                       QRegister(rm));
41450                                } else {
41451                                  UnallocatedA32(instr);
41452                                }
41453                                break;
41454                              }
41455                              default:
41456                                UnallocatedA32(instr);
41457                                break;
41458                            }
41459                            break;
41460                          }
41461                          case 0x00000200: {
41462                            // 0xf3b00200
41463                            switch (instr & 0x00000540) {
41464                              case 0x00000000: {
41465                                // 0xf3b00200
41466                                DataType dt =
41467                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41468                                                        ((instr >> 5) & 0x4));
41469                                if (dt.Is(kDataTypeValueInvalid)) {
41470                                  UnallocatedA32(instr);
41471                                  return;
41472                                }
41473                                unsigned rd = ExtractDRegister(instr, 22, 12);
41474                                unsigned rm = ExtractDRegister(instr, 5, 0);
41475                                // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41476                                vpaddl(al, dt, DRegister(rd), DRegister(rm));
41477                                break;
41478                              }
41479                              case 0x00000040: {
41480                                // 0xf3b00240
41481                                DataType dt =
41482                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41483                                                        ((instr >> 5) & 0x4));
41484                                if (dt.Is(kDataTypeValueInvalid)) {
41485                                  UnallocatedA32(instr);
41486                                  return;
41487                                }
41488                                if (((instr >> 12) & 1) != 0) {
41489                                  UnallocatedA32(instr);
41490                                  return;
41491                                }
41492                                unsigned rd = ExtractQRegister(instr, 22, 12);
41493                                if ((instr & 1) != 0) {
41494                                  UnallocatedA32(instr);
41495                                  return;
41496                                }
41497                                unsigned rm = ExtractQRegister(instr, 5, 0);
41498                                // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41499                                vpaddl(al, dt, QRegister(rd), QRegister(rm));
41500                                break;
41501                              }
41502                              case 0x00000100: {
41503                                // 0xf3b00300
41504                                switch (instr & 0x00000080) {
41505                                  case 0x00000000: {
41506                                    // 0xf3b00300
41507                                    UnimplementedA32("AESE", instr);
41508                                    break;
41509                                  }
41510                                  case 0x00000080: {
41511                                    // 0xf3b00380
41512                                    UnimplementedA32("AESMC", instr);
41513                                    break;
41514                                  }
41515                                }
41516                                break;
41517                              }
41518                              case 0x00000140: {
41519                                // 0xf3b00340
41520                                switch (instr & 0x00000080) {
41521                                  case 0x00000000: {
41522                                    // 0xf3b00340
41523                                    UnimplementedA32("AESD", instr);
41524                                    break;
41525                                  }
41526                                  case 0x00000080: {
41527                                    // 0xf3b003c0
41528                                    UnimplementedA32("AESIMC", instr);
41529                                    break;
41530                                  }
41531                                }
41532                                break;
41533                              }
41534                              case 0x00000400: {
41535                                // 0xf3b00600
41536                                DataType dt =
41537                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41538                                                        ((instr >> 5) & 0x4));
41539                                if (dt.Is(kDataTypeValueInvalid)) {
41540                                  UnallocatedA32(instr);
41541                                  return;
41542                                }
41543                                unsigned rd = ExtractDRegister(instr, 22, 12);
41544                                unsigned rm = ExtractDRegister(instr, 5, 0);
41545                                // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41546                                vpadal(al, dt, DRegister(rd), DRegister(rm));
41547                                break;
41548                              }
41549                              case 0x00000440: {
41550                                // 0xf3b00640
41551                                DataType dt =
41552                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41553                                                        ((instr >> 5) & 0x4));
41554                                if (dt.Is(kDataTypeValueInvalid)) {
41555                                  UnallocatedA32(instr);
41556                                  return;
41557                                }
41558                                if (((instr >> 12) & 1) != 0) {
41559                                  UnallocatedA32(instr);
41560                                  return;
41561                                }
41562                                unsigned rd = ExtractQRegister(instr, 22, 12);
41563                                if ((instr & 1) != 0) {
41564                                  UnallocatedA32(instr);
41565                                  return;
41566                                }
41567                                unsigned rm = ExtractQRegister(instr, 5, 0);
41568                                // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41569                                vpadal(al, dt, QRegister(rd), QRegister(rm));
41570                                break;
41571                              }
41572                              case 0x00000500: {
41573                                // 0xf3b00700
41574                                switch (instr & 0x00000080) {
41575                                  case 0x00000000: {
41576                                    // 0xf3b00700
41577                                    DataType dt =
41578                                        Dt_size_5_Decode((instr >> 18) & 0x3);
41579                                    if (dt.Is(kDataTypeValueInvalid)) {
41580                                      UnallocatedA32(instr);
41581                                      return;
41582                                    }
41583                                    unsigned rd =
41584                                        ExtractDRegister(instr, 22, 12);
41585                                    unsigned rm = ExtractDRegister(instr, 5, 0);
41586                                    // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41587                                    vqabs(al, dt, DRegister(rd), DRegister(rm));
41588                                    break;
41589                                  }
41590                                  case 0x00000080: {
41591                                    // 0xf3b00780
41592                                    DataType dt =
41593                                        Dt_size_5_Decode((instr >> 18) & 0x3);
41594                                    if (dt.Is(kDataTypeValueInvalid)) {
41595                                      UnallocatedA32(instr);
41596                                      return;
41597                                    }
41598                                    unsigned rd =
41599                                        ExtractDRegister(instr, 22, 12);
41600                                    unsigned rm = ExtractDRegister(instr, 5, 0);
41601                                    // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41602                                    vqneg(al, dt, DRegister(rd), DRegister(rm));
41603                                    break;
41604                                  }
41605                                }
41606                                break;
41607                              }
41608                              case 0x00000540: {
41609                                // 0xf3b00740
41610                                switch (instr & 0x00000080) {
41611                                  case 0x00000000: {
41612                                    // 0xf3b00740
41613                                    DataType dt =
41614                                        Dt_size_5_Decode((instr >> 18) & 0x3);
41615                                    if (dt.Is(kDataTypeValueInvalid)) {
41616                                      UnallocatedA32(instr);
41617                                      return;
41618                                    }
41619                                    if (((instr >> 12) & 1) != 0) {
41620                                      UnallocatedA32(instr);
41621                                      return;
41622                                    }
41623                                    unsigned rd =
41624                                        ExtractQRegister(instr, 22, 12);
41625                                    if ((instr & 1) != 0) {
41626                                      UnallocatedA32(instr);
41627                                      return;
41628                                    }
41629                                    unsigned rm = ExtractQRegister(instr, 5, 0);
41630                                    // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41631                                    vqabs(al, dt, QRegister(rd), QRegister(rm));
41632                                    break;
41633                                  }
41634                                  case 0x00000080: {
41635                                    // 0xf3b007c0
41636                                    DataType dt =
41637                                        Dt_size_5_Decode((instr >> 18) & 0x3);
41638                                    if (dt.Is(kDataTypeValueInvalid)) {
41639                                      UnallocatedA32(instr);
41640                                      return;
41641                                    }
41642                                    if (((instr >> 12) & 1) != 0) {
41643                                      UnallocatedA32(instr);
41644                                      return;
41645                                    }
41646                                    unsigned rd =
41647                                        ExtractQRegister(instr, 22, 12);
41648                                    if ((instr & 1) != 0) {
41649                                      UnallocatedA32(instr);
41650                                      return;
41651                                    }
41652                                    unsigned rm = ExtractQRegister(instr, 5, 0);
41653                                    // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41654                                    vqneg(al, dt, QRegister(rd), QRegister(rm));
41655                                    break;
41656                                  }
41657                                }
41658                                break;
41659                              }
41660                            }
41661                            break;
41662                          }
41663                          case 0x00010000: {
41664                            // 0xf3b10000
41665                            switch (instr & 0x000001c0) {
41666                              case 0x00000000: {
41667                                // 0xf3b10000
41668                                DataType dt =
41669                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41670                                                       ((instr >> 8) & 0x4));
41671                                if (dt.Is(kDataTypeValueInvalid)) {
41672                                  UnallocatedA32(instr);
41673                                  return;
41674                                }
41675                                unsigned rd = ExtractDRegister(instr, 22, 12);
41676                                unsigned rm = ExtractDRegister(instr, 5, 0);
41677                                // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41678                                vcgt(al,
41679                                     dt,
41680                                     DRegister(rd),
41681                                     DRegister(rm),
41682                                     UINT32_C(0));
41683                                break;
41684                              }
41685                              case 0x00000040: {
41686                                // 0xf3b10040
41687                                DataType dt =
41688                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41689                                                       ((instr >> 8) & 0x4));
41690                                if (dt.Is(kDataTypeValueInvalid)) {
41691                                  UnallocatedA32(instr);
41692                                  return;
41693                                }
41694                                if (((instr >> 12) & 1) != 0) {
41695                                  UnallocatedA32(instr);
41696                                  return;
41697                                }
41698                                unsigned rd = ExtractQRegister(instr, 22, 12);
41699                                if ((instr & 1) != 0) {
41700                                  UnallocatedA32(instr);
41701                                  return;
41702                                }
41703                                unsigned rm = ExtractQRegister(instr, 5, 0);
41704                                // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41705                                vcgt(al,
41706                                     dt,
41707                                     QRegister(rd),
41708                                     QRegister(rm),
41709                                     UINT32_C(0));
41710                                break;
41711                              }
41712                              case 0x00000080: {
41713                                // 0xf3b10080
41714                                DataType dt =
41715                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41716                                                       ((instr >> 8) & 0x4));
41717                                if (dt.Is(kDataTypeValueInvalid)) {
41718                                  UnallocatedA32(instr);
41719                                  return;
41720                                }
41721                                unsigned rd = ExtractDRegister(instr, 22, 12);
41722                                unsigned rm = ExtractDRegister(instr, 5, 0);
41723                                // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41724                                vcge(al,
41725                                     dt,
41726                                     DRegister(rd),
41727                                     DRegister(rm),
41728                                     UINT32_C(0));
41729                                break;
41730                              }
41731                              case 0x000000c0: {
41732                                // 0xf3b100c0
41733                                DataType dt =
41734                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41735                                                       ((instr >> 8) & 0x4));
41736                                if (dt.Is(kDataTypeValueInvalid)) {
41737                                  UnallocatedA32(instr);
41738                                  return;
41739                                }
41740                                if (((instr >> 12) & 1) != 0) {
41741                                  UnallocatedA32(instr);
41742                                  return;
41743                                }
41744                                unsigned rd = ExtractQRegister(instr, 22, 12);
41745                                if ((instr & 1) != 0) {
41746                                  UnallocatedA32(instr);
41747                                  return;
41748                                }
41749                                unsigned rm = ExtractQRegister(instr, 5, 0);
41750                                // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41751                                vcge(al,
41752                                     dt,
41753                                     QRegister(rd),
41754                                     QRegister(rm),
41755                                     UINT32_C(0));
41756                                break;
41757                              }
41758                              case 0x00000100: {
41759                                // 0xf3b10100
41760                                DataType dt =
41761                                    Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
41762                                                       ((instr >> 8) & 0x4));
41763                                if (dt.Is(kDataTypeValueInvalid)) {
41764                                  UnallocatedA32(instr);
41765                                  return;
41766                                }
41767                                unsigned rd = ExtractDRegister(instr, 22, 12);
41768                                unsigned rm = ExtractDRegister(instr, 5, 0);
41769                                // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41770                                vceq(al,
41771                                     dt,
41772                                     DRegister(rd),
41773                                     DRegister(rm),
41774                                     UINT32_C(0));
41775                                break;
41776                              }
41777                              case 0x00000140: {
41778                                // 0xf3b10140
41779                                DataType dt =
41780                                    Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
41781                                                       ((instr >> 8) & 0x4));
41782                                if (dt.Is(kDataTypeValueInvalid)) {
41783                                  UnallocatedA32(instr);
41784                                  return;
41785                                }
41786                                if (((instr >> 12) & 1) != 0) {
41787                                  UnallocatedA32(instr);
41788                                  return;
41789                                }
41790                                unsigned rd = ExtractQRegister(instr, 22, 12);
41791                                if ((instr & 1) != 0) {
41792                                  UnallocatedA32(instr);
41793                                  return;
41794                                }
41795                                unsigned rm = ExtractQRegister(instr, 5, 0);
41796                                // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41797                                vceq(al,
41798                                     dt,
41799                                     QRegister(rd),
41800                                     QRegister(rm),
41801                                     UINT32_C(0));
41802                                break;
41803                              }
41804                              case 0x00000180: {
41805                                // 0xf3b10180
41806                                DataType dt =
41807                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41808                                                       ((instr >> 8) & 0x4));
41809                                if (dt.Is(kDataTypeValueInvalid)) {
41810                                  UnallocatedA32(instr);
41811                                  return;
41812                                }
41813                                unsigned rd = ExtractDRegister(instr, 22, 12);
41814                                unsigned rm = ExtractDRegister(instr, 5, 0);
41815                                // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41816                                vcle(al,
41817                                     dt,
41818                                     DRegister(rd),
41819                                     DRegister(rm),
41820                                     UINT32_C(0));
41821                                break;
41822                              }
41823                              case 0x000001c0: {
41824                                // 0xf3b101c0
41825                                DataType dt =
41826                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41827                                                       ((instr >> 8) & 0x4));
41828                                if (dt.Is(kDataTypeValueInvalid)) {
41829                                  UnallocatedA32(instr);
41830                                  return;
41831                                }
41832                                if (((instr >> 12) & 1) != 0) {
41833                                  UnallocatedA32(instr);
41834                                  return;
41835                                }
41836                                unsigned rd = ExtractQRegister(instr, 22, 12);
41837                                if ((instr & 1) != 0) {
41838                                  UnallocatedA32(instr);
41839                                  return;
41840                                }
41841                                unsigned rm = ExtractQRegister(instr, 5, 0);
41842                                // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41843                                vcle(al,
41844                                     dt,
41845                                     QRegister(rd),
41846                                     QRegister(rm),
41847                                     UINT32_C(0));
41848                                break;
41849                              }
41850                            }
41851                            break;
41852                          }
41853                          case 0x00010200: {
41854                            // 0xf3b10200
41855                            switch (instr & 0x000001c0) {
41856                              case 0x00000000: {
41857                                // 0xf3b10200
41858                                DataType dt =
41859                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41860                                                       ((instr >> 8) & 0x4));
41861                                if (dt.Is(kDataTypeValueInvalid)) {
41862                                  UnallocatedA32(instr);
41863                                  return;
41864                                }
41865                                unsigned rd = ExtractDRegister(instr, 22, 12);
41866                                unsigned rm = ExtractDRegister(instr, 5, 0);
41867                                // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41868                                vclt(al,
41869                                     dt,
41870                                     DRegister(rd),
41871                                     DRegister(rm),
41872                                     UINT32_C(0));
41873                                break;
41874                              }
41875                              case 0x00000040: {
41876                                // 0xf3b10240
41877                                DataType dt =
41878                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41879                                                       ((instr >> 8) & 0x4));
41880                                if (dt.Is(kDataTypeValueInvalid)) {
41881                                  UnallocatedA32(instr);
41882                                  return;
41883                                }
41884                                if (((instr >> 12) & 1) != 0) {
41885                                  UnallocatedA32(instr);
41886                                  return;
41887                                }
41888                                unsigned rd = ExtractQRegister(instr, 22, 12);
41889                                if ((instr & 1) != 0) {
41890                                  UnallocatedA32(instr);
41891                                  return;
41892                                }
41893                                unsigned rm = ExtractQRegister(instr, 5, 0);
41894                                // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41895                                vclt(al,
41896                                     dt,
41897                                     QRegister(rd),
41898                                     QRegister(rm),
41899                                     UINT32_C(0));
41900                                break;
41901                              }
41902                              case 0x000000c0: {
41903                                // 0xf3b102c0
41904                                if ((instr & 0x000c0400) == 0x00080000) {
41905                                  UnimplementedA32("SHA1H", instr);
41906                                } else {
41907                                  UnallocatedA32(instr);
41908                                }
41909                                break;
41910                              }
41911                              case 0x00000100: {
41912                                // 0xf3b10300
41913                                DataType dt =
41914                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41915                                                       ((instr >> 8) & 0x4));
41916                                if (dt.Is(kDataTypeValueInvalid)) {
41917                                  UnallocatedA32(instr);
41918                                  return;
41919                                }
41920                                unsigned rd = ExtractDRegister(instr, 22, 12);
41921                                unsigned rm = ExtractDRegister(instr, 5, 0);
41922                                // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41923                                vabs(al, dt, DRegister(rd), DRegister(rm));
41924                                break;
41925                              }
41926                              case 0x00000140: {
41927                                // 0xf3b10340
41928                                DataType dt =
41929                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41930                                                       ((instr >> 8) & 0x4));
41931                                if (dt.Is(kDataTypeValueInvalid)) {
41932                                  UnallocatedA32(instr);
41933                                  return;
41934                                }
41935                                if (((instr >> 12) & 1) != 0) {
41936                                  UnallocatedA32(instr);
41937                                  return;
41938                                }
41939                                unsigned rd = ExtractQRegister(instr, 22, 12);
41940                                if ((instr & 1) != 0) {
41941                                  UnallocatedA32(instr);
41942                                  return;
41943                                }
41944                                unsigned rm = ExtractQRegister(instr, 5, 0);
41945                                // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41946                                vabs(al, dt, QRegister(rd), QRegister(rm));
41947                                break;
41948                              }
41949                              case 0x00000180: {
41950                                // 0xf3b10380
41951                                DataType dt =
41952                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41953                                                       ((instr >> 8) & 0x4));
41954                                if (dt.Is(kDataTypeValueInvalid)) {
41955                                  UnallocatedA32(instr);
41956                                  return;
41957                                }
41958                                unsigned rd = ExtractDRegister(instr, 22, 12);
41959                                unsigned rm = ExtractDRegister(instr, 5, 0);
41960                                // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41961                                vneg(al, dt, DRegister(rd), DRegister(rm));
41962                                break;
41963                              }
41964                              case 0x000001c0: {
41965                                // 0xf3b103c0
41966                                DataType dt =
41967                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41968                                                       ((instr >> 8) & 0x4));
41969                                if (dt.Is(kDataTypeValueInvalid)) {
41970                                  UnallocatedA32(instr);
41971                                  return;
41972                                }
41973                                if (((instr >> 12) & 1) != 0) {
41974                                  UnallocatedA32(instr);
41975                                  return;
41976                                }
41977                                unsigned rd = ExtractQRegister(instr, 22, 12);
41978                                if ((instr & 1) != 0) {
41979                                  UnallocatedA32(instr);
41980                                  return;
41981                                }
41982                                unsigned rm = ExtractQRegister(instr, 5, 0);
41983                                // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41984                                vneg(al, dt, QRegister(rd), QRegister(rm));
41985                                break;
41986                              }
41987                              default:
41988                                UnallocatedA32(instr);
41989                                break;
41990                            }
41991                            break;
41992                          }
41993                          case 0x00020000: {
41994                            // 0xf3b20000
41995                            switch (instr & 0x000005c0) {
41996                              case 0x00000000: {
41997                                // 0xf3b20000
41998                                if ((instr & 0x000c0000) == 0x00000000) {
41999                                  unsigned rd = ExtractDRegister(instr, 22, 12);
42000                                  unsigned rm = ExtractDRegister(instr, 5, 0);
42001                                  // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
42002                                  vswp(al,
42003                                       kDataTypeValueNone,
42004                                       DRegister(rd),
42005                                       DRegister(rm));
42006                                } else {
42007                                  UnallocatedA32(instr);
42008                                }
42009                                break;
42010                              }
42011                              case 0x00000040: {
42012                                // 0xf3b20040
42013                                if ((instr & 0x000c0000) == 0x00000000) {
42014                                  if (((instr >> 12) & 1) != 0) {
42015                                    UnallocatedA32(instr);
42016                                    return;
42017                                  }
42018                                  unsigned rd = ExtractQRegister(instr, 22, 12);
42019                                  if ((instr & 1) != 0) {
42020                                    UnallocatedA32(instr);
42021                                    return;
42022                                  }
42023                                  unsigned rm = ExtractQRegister(instr, 5, 0);
42024                                  // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
42025                                  vswp(al,
42026                                       kDataTypeValueNone,
42027                                       QRegister(rd),
42028                                       QRegister(rm));
42029                                } else {
42030                                  UnallocatedA32(instr);
42031                                }
42032                                break;
42033                              }
42034                              case 0x00000080: {
42035                                // 0xf3b20080
42036                                DataType dt =
42037                                    Dt_size_7_Decode((instr >> 18) & 0x3);
42038                                if (dt.Is(kDataTypeValueInvalid)) {
42039                                  UnallocatedA32(instr);
42040                                  return;
42041                                }
42042                                unsigned rd = ExtractDRegister(instr, 22, 12);
42043                                unsigned rm = ExtractDRegister(instr, 5, 0);
42044                                // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42045                                vtrn(al, dt, DRegister(rd), DRegister(rm));
42046                                break;
42047                              }
42048                              case 0x000000c0: {
42049                                // 0xf3b200c0
42050                                DataType dt =
42051                                    Dt_size_7_Decode((instr >> 18) & 0x3);
42052                                if (dt.Is(kDataTypeValueInvalid)) {
42053                                  UnallocatedA32(instr);
42054                                  return;
42055                                }
42056                                if (((instr >> 12) & 1) != 0) {
42057                                  UnallocatedA32(instr);
42058                                  return;
42059                                }
42060                                unsigned rd = ExtractQRegister(instr, 22, 12);
42061                                if ((instr & 1) != 0) {
42062                                  UnallocatedA32(instr);
42063                                  return;
42064                                }
42065                                unsigned rm = ExtractQRegister(instr, 5, 0);
42066                                // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42067                                vtrn(al, dt, QRegister(rd), QRegister(rm));
42068                                break;
42069                              }
42070                              case 0x00000100: {
42071                                // 0xf3b20100
42072                                DataType dt =
42073                                    Dt_size_15_Decode((instr >> 18) & 0x3);
42074                                if (dt.Is(kDataTypeValueInvalid)) {
42075                                  UnallocatedA32(instr);
42076                                  return;
42077                                }
42078                                unsigned rd = ExtractDRegister(instr, 22, 12);
42079                                unsigned rm = ExtractDRegister(instr, 5, 0);
42080                                // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42081                                vuzp(al, dt, DRegister(rd), DRegister(rm));
42082                                break;
42083                              }
42084                              case 0x00000140: {
42085                                // 0xf3b20140
42086                                DataType dt =
42087                                    Dt_size_7_Decode((instr >> 18) & 0x3);
42088                                if (dt.Is(kDataTypeValueInvalid)) {
42089                                  UnallocatedA32(instr);
42090                                  return;
42091                                }
42092                                if (((instr >> 12) & 1) != 0) {
42093                                  UnallocatedA32(instr);
42094                                  return;
42095                                }
42096                                unsigned rd = ExtractQRegister(instr, 22, 12);
42097                                if ((instr & 1) != 0) {
42098                                  UnallocatedA32(instr);
42099                                  return;
42100                                }
42101                                unsigned rm = ExtractQRegister(instr, 5, 0);
42102                                // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42103                                vuzp(al, dt, QRegister(rd), QRegister(rm));
42104                                break;
42105                              }
42106                              case 0x00000180: {
42107                                // 0xf3b20180
42108                                DataType dt =
42109                                    Dt_size_15_Decode((instr >> 18) & 0x3);
42110                                if (dt.Is(kDataTypeValueInvalid)) {
42111                                  UnallocatedA32(instr);
42112                                  return;
42113                                }
42114                                unsigned rd = ExtractDRegister(instr, 22, 12);
42115                                unsigned rm = ExtractDRegister(instr, 5, 0);
42116                                // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42117                                vzip(al, dt, DRegister(rd), DRegister(rm));
42118                                break;
42119                              }
42120                              case 0x000001c0: {
42121                                // 0xf3b201c0
42122                                DataType dt =
42123                                    Dt_size_7_Decode((instr >> 18) & 0x3);
42124                                if (dt.Is(kDataTypeValueInvalid)) {
42125                                  UnallocatedA32(instr);
42126                                  return;
42127                                }
42128                                if (((instr >> 12) & 1) != 0) {
42129                                  UnallocatedA32(instr);
42130                                  return;
42131                                }
42132                                unsigned rd = ExtractQRegister(instr, 22, 12);
42133                                if ((instr & 1) != 0) {
42134                                  UnallocatedA32(instr);
42135                                  return;
42136                                }
42137                                unsigned rm = ExtractQRegister(instr, 5, 0);
42138                                // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42139                                vzip(al, dt, QRegister(rd), QRegister(rm));
42140                                break;
42141                              }
42142                              case 0x00000400: {
42143                                // 0xf3b20400
42144                                if ((instr & 0x000c0000) == 0x00080000) {
42145                                  unsigned rd = ExtractDRegister(instr, 22, 12);
42146                                  unsigned rm = ExtractDRegister(instr, 5, 0);
42147                                  // VRINTN{<q>}.F32.F32 <Dd>, <Dm> ; A1
42148                                  vrintn(F32,
42149                                         F32,
42150                                         DRegister(rd),
42151                                         DRegister(rm));
42152                                } else {
42153                                  UnallocatedA32(instr);
42154                                }
42155                                break;
42156                              }
42157                              case 0x00000440: {
42158                                // 0xf3b20440
42159                                if ((instr & 0x000c0000) == 0x00080000) {
42160                                  if (((instr >> 12) & 1) != 0) {
42161                                    UnallocatedA32(instr);
42162                                    return;
42163                                  }
42164                                  unsigned rd = ExtractQRegister(instr, 22, 12);
42165                                  if ((instr & 1) != 0) {
42166                                    UnallocatedA32(instr);
42167                                    return;
42168                                  }
42169                                  unsigned rm = ExtractQRegister(instr, 5, 0);
42170                                  // VRINTN{<q>}.F32.F32 <Qd>, <Qm> ; A1
42171                                  vrintn(F32,
42172                                         F32,
42173                                         QRegister(rd),
42174                                         QRegister(rm));
42175                                } else {
42176                                  UnallocatedA32(instr);
42177                                }
42178                                break;
42179                              }
42180                              case 0x00000480: {
42181                                // 0xf3b20480
42182                                if ((instr & 0x000c0000) == 0x00080000) {
42183                                  unsigned rd = ExtractDRegister(instr, 22, 12);
42184                                  unsigned rm = ExtractDRegister(instr, 5, 0);
42185                                  // VRINTX{<q>}.F32.F32 <Dd>, <Dm> ; A1
42186                                  vrintx(al,
42187                                         F32,
42188                                         F32,
42189                                         DRegister(rd),
42190                                         DRegister(rm));
42191                                } else {
42192                                  UnallocatedA32(instr);
42193                                }
42194                                break;
42195                              }
42196                              case 0x000004c0: {
42197                                // 0xf3b204c0
42198                                if ((instr & 0x000c0000) == 0x00080000) {
42199                                  if (((instr >> 12) & 1) != 0) {
42200                                    UnallocatedA32(instr);
42201                                    return;
42202                                  }
42203                                  unsigned rd = ExtractQRegister(instr, 22, 12);
42204                                  if ((instr & 1) != 0) {
42205                                    UnallocatedA32(instr);
42206                                    return;
42207                                  }
42208                                  unsigned rm = ExtractQRegister(instr, 5, 0);
42209                                  // VRINTX{<q>}.F32.F32 <Qd>, <Qm> ; A1
42210                                  vrintx(F32,
42211                                         F32,
42212                                         QRegister(rd),
42213                                         QRegister(rm));
42214                                } else {
42215                                  UnallocatedA32(instr);
42216                                }
42217                                break;
42218                              }
42219                              case 0x00000500: {
42220                                // 0xf3b20500
42221                                if ((instr & 0x000c0000) == 0x00080000) {
42222                                  unsigned rd = ExtractDRegister(instr, 22, 12);
42223                                  unsigned rm = ExtractDRegister(instr, 5, 0);
42224                                  // VRINTA{<q>}.F32.F32 <Dd>, <Dm> ; A1
42225                                  vrinta(F32,
42226                                         F32,
42227                                         DRegister(rd),
42228                                         DRegister(rm));
42229                                } else {
42230                                  UnallocatedA32(instr);
42231                                }
42232                                break;
42233                              }
42234                              case 0x00000540: {
42235                                // 0xf3b20540
42236                                if ((instr & 0x000c0000) == 0x00080000) {
42237                                  if (((instr >> 12) & 1) != 0) {
42238                                    UnallocatedA32(instr);
42239                                    return;
42240                                  }
42241                                  unsigned rd = ExtractQRegister(instr, 22, 12);
42242                                  if ((instr & 1) != 0) {
42243                                    UnallocatedA32(instr);
42244                                    return;
42245                                  }
42246                                  unsigned rm = ExtractQRegister(instr, 5, 0);
42247                                  // VRINTA{<q>}.F32.F32 <Qd>, <Qm> ; A1
42248                                  vrinta(F32,
42249                                         F32,
42250                                         QRegister(rd),
42251                                         QRegister(rm));
42252                                } else {
42253                                  UnallocatedA32(instr);
42254                                }
42255                                break;
42256                              }
42257                              case 0x00000580: {
42258                                // 0xf3b20580
42259                                if ((instr & 0x000c0000) == 0x00080000) {
42260                                  unsigned rd = ExtractDRegister(instr, 22, 12);
42261                                  unsigned rm = ExtractDRegister(instr, 5, 0);
42262                                  // VRINTZ{<q>}.F32.F32 <Dd>, <Dm> ; A1
42263                                  vrintz(al,
42264                                         F32,
42265                                         F32,
42266                                         DRegister(rd),
42267                                         DRegister(rm));
42268                                } else {
42269                                  UnallocatedA32(instr);
42270                                }
42271                                break;
42272                              }
42273                              case 0x000005c0: {
42274                                // 0xf3b205c0
42275                                if ((instr & 0x000c0000) == 0x00080000) {
42276                                  if (((instr >> 12) & 1) != 0) {
42277                                    UnallocatedA32(instr);
42278                                    return;
42279                                  }
42280                                  unsigned rd = ExtractQRegister(instr, 22, 12);
42281                                  if ((instr & 1) != 0) {
42282                                    UnallocatedA32(instr);
42283                                    return;
42284                                  }
42285                                  unsigned rm = ExtractQRegister(instr, 5, 0);
42286                                  // VRINTZ{<q>}.F32.F32 <Qd>, <Qm> ; A1
42287                                  vrintz(F32,
42288                                         F32,
42289                                         QRegister(rd),
42290                                         QRegister(rm));
42291                                } else {
42292                                  UnallocatedA32(instr);
42293                                }
42294                                break;
42295                              }
42296                            }
42297                            break;
42298                          }
42299                          case 0x00020200: {
42300                            // 0xf3b20200
42301                            switch (instr & 0x00000580) {
42302                              case 0x00000000: {
42303                                // 0xf3b20200
42304                                switch (instr & 0x00000040) {
42305                                  case 0x00000000: {
42306                                    // 0xf3b20200
42307                                    DataType dt =
42308                                        Dt_size_3_Decode((instr >> 18) & 0x3);
42309                                    if (dt.Is(kDataTypeValueInvalid)) {
42310                                      UnallocatedA32(instr);
42311                                      return;
42312                                    }
42313                                    unsigned rd =
42314                                        ExtractDRegister(instr, 22, 12);
42315                                    if ((instr & 1) != 0) {
42316                                      UnallocatedA32(instr);
42317                                      return;
42318                                    }
42319                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42320                                    // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
42321                                    vmovn(al, dt, DRegister(rd), QRegister(rm));
42322                                    break;
42323                                  }
42324                                  case 0x00000040: {
42325                                    // 0xf3b20240
42326                                    DataType dt =
42327                                        Dt_size_14_Decode((instr >> 18) & 0x3);
42328                                    if (dt.Is(kDataTypeValueInvalid)) {
42329                                      UnallocatedA32(instr);
42330                                      return;
42331                                    }
42332                                    unsigned rd =
42333                                        ExtractDRegister(instr, 22, 12);
42334                                    if ((instr & 1) != 0) {
42335                                      UnallocatedA32(instr);
42336                                      return;
42337                                    }
42338                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42339                                    // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
42340                                    vqmovun(al,
42341                                            dt,
42342                                            DRegister(rd),
42343                                            QRegister(rm));
42344                                    break;
42345                                  }
42346                                }
42347                                break;
42348                              }
42349                              case 0x00000080: {
42350                                // 0xf3b20280
42351                                DataType dt =
42352                                    Dt_op_size_3_Decode(((instr >> 18) & 0x3) |
42353                                                        ((instr >> 4) & 0x4));
42354                                if (dt.Is(kDataTypeValueInvalid)) {
42355                                  UnallocatedA32(instr);
42356                                  return;
42357                                }
42358                                unsigned rd = ExtractDRegister(instr, 22, 12);
42359                                if ((instr & 1) != 0) {
42360                                  UnallocatedA32(instr);
42361                                  return;
42362                                }
42363                                unsigned rm = ExtractQRegister(instr, 5, 0);
42364                                // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
42365                                vqmovn(al, dt, DRegister(rd), QRegister(rm));
42366                                break;
42367                              }
42368                              case 0x00000100: {
42369                                // 0xf3b20300
42370                                if ((instr & 0x00000040) == 0x00000000) {
42371                                  DataType dt =
42372                                      Dt_size_16_Decode((instr >> 18) & 0x3);
42373                                  if (dt.Is(kDataTypeValueInvalid)) {
42374                                    UnallocatedA32(instr);
42375                                    return;
42376                                  }
42377                                  if (((instr >> 12) & 1) != 0) {
42378                                    UnallocatedA32(instr);
42379                                    return;
42380                                  }
42381                                  unsigned rd = ExtractQRegister(instr, 22, 12);
42382                                  unsigned rm = ExtractDRegister(instr, 5, 0);
42383                                  uint32_t imm = dt.GetSize();
42384                                  // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length)
42385                                  vshll(al,
42386                                        dt,
42387                                        QRegister(rd),
42388                                        DRegister(rm),
42389                                        imm);
42390                                } else {
42391                                  UnallocatedA32(instr);
42392                                }
42393                                break;
42394                              }
42395                              case 0x00000180: {
42396                                // 0xf3b20380
42397                                switch (instr & 0x000c0040) {
42398                                  case 0x00080000: {
42399                                    // 0xf3ba0380
42400                                    UnimplementedA32("SHA1SU1", instr);
42401                                    break;
42402                                  }
42403                                  case 0x00080040: {
42404                                    // 0xf3ba03c0
42405                                    UnimplementedA32("SHA256SU0", instr);
42406                                    break;
42407                                  }
42408                                  default:
42409                                    UnallocatedA32(instr);
42410                                    break;
42411                                }
42412                                break;
42413                              }
42414                              case 0x00000400: {
42415                                // 0xf3b20600
42416                                if ((instr & 0x000c0040) == 0x00040000) {
42417                                  unsigned rd = ExtractDRegister(instr, 22, 12);
42418                                  if ((instr & 1) != 0) {
42419                                    UnallocatedA32(instr);
42420                                    return;
42421                                  }
42422                                  unsigned rm = ExtractQRegister(instr, 5, 0);
42423                                  // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1
42424                                  vcvt(al,
42425                                       F16,
42426                                       F32,
42427                                       DRegister(rd),
42428                                       QRegister(rm));
42429                                } else {
42430                                  UnallocatedA32(instr);
42431                                }
42432                                break;
42433                              }
42434                              case 0x00000480: {
42435                                // 0xf3b20680
42436                                switch (instr & 0x000c0040) {
42437                                  case 0x00080000: {
42438                                    // 0xf3ba0680
42439                                    unsigned rd =
42440                                        ExtractDRegister(instr, 22, 12);
42441                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42442                                    // VRINTM{<q>}.F32.F32 <Dd>, <Dm> ; A1
42443                                    vrintm(F32,
42444                                           F32,
42445                                           DRegister(rd),
42446                                           DRegister(rm));
42447                                    break;
42448                                  }
42449                                  case 0x00080040: {
42450                                    // 0xf3ba06c0
42451                                    if (((instr >> 12) & 1) != 0) {
42452                                      UnallocatedA32(instr);
42453                                      return;
42454                                    }
42455                                    unsigned rd =
42456                                        ExtractQRegister(instr, 22, 12);
42457                                    if ((instr & 1) != 0) {
42458                                      UnallocatedA32(instr);
42459                                      return;
42460                                    }
42461                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42462                                    // VRINTM{<q>}.F32.F32 <Qd>, <Qm> ; A1
42463                                    vrintm(F32,
42464                                           F32,
42465                                           QRegister(rd),
42466                                           QRegister(rm));
42467                                    break;
42468                                  }
42469                                  default:
42470                                    UnallocatedA32(instr);
42471                                    break;
42472                                }
42473                                break;
42474                              }
42475                              case 0x00000500: {
42476                                // 0xf3b20700
42477                                if ((instr & 0x000c0040) == 0x00040000) {
42478                                  if (((instr >> 12) & 1) != 0) {
42479                                    UnallocatedA32(instr);
42480                                    return;
42481                                  }
42482                                  unsigned rd = ExtractQRegister(instr, 22, 12);
42483                                  unsigned rm = ExtractDRegister(instr, 5, 0);
42484                                  // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1
42485                                  vcvt(al,
42486                                       F32,
42487                                       F16,
42488                                       QRegister(rd),
42489                                       DRegister(rm));
42490                                } else {
42491                                  UnallocatedA32(instr);
42492                                }
42493                                break;
42494                              }
42495                              case 0x00000580: {
42496                                // 0xf3b20780
42497                                switch (instr & 0x000c0040) {
42498                                  case 0x00080000: {
42499                                    // 0xf3ba0780
42500                                    unsigned rd =
42501                                        ExtractDRegister(instr, 22, 12);
42502                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42503                                    // VRINTP{<q>}.F32.F32 <Dd>, <Dm> ; A1
42504                                    vrintp(F32,
42505                                           F32,
42506                                           DRegister(rd),
42507                                           DRegister(rm));
42508                                    break;
42509                                  }
42510                                  case 0x00080040: {
42511                                    // 0xf3ba07c0
42512                                    if (((instr >> 12) & 1) != 0) {
42513                                      UnallocatedA32(instr);
42514                                      return;
42515                                    }
42516                                    unsigned rd =
42517                                        ExtractQRegister(instr, 22, 12);
42518                                    if ((instr & 1) != 0) {
42519                                      UnallocatedA32(instr);
42520                                      return;
42521                                    }
42522                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42523                                    // VRINTP{<q>}.F32.F32 <Qd>, <Qm> ; A1
42524                                    vrintp(F32,
42525                                           F32,
42526                                           QRegister(rd),
42527                                           QRegister(rm));
42528                                    break;
42529                                  }
42530                                  default:
42531                                    UnallocatedA32(instr);
42532                                    break;
42533                                }
42534                                break;
42535                              }
42536                            }
42537                            break;
42538                          }
42539                          case 0x00030000: {
42540                            // 0xf3b30000
42541                            switch (instr & 0x00000440) {
42542                              case 0x00000000: {
42543                                // 0xf3b30000
42544                                switch (instr & 0x000c0100) {
42545                                  case 0x00080000: {
42546                                    // 0xf3bb0000
42547                                    DataType dt =
42548                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42549                                    if (dt.Is(kDataTypeValueInvalid)) {
42550                                      UnallocatedA32(instr);
42551                                      return;
42552                                    }
42553                                    unsigned rd =
42554                                        ExtractDRegister(instr, 22, 12);
42555                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42556                                    // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42557                                    vcvta(dt,
42558                                          F32,
42559                                          DRegister(rd),
42560                                          DRegister(rm));
42561                                    break;
42562                                  }
42563                                  case 0x00080100: {
42564                                    // 0xf3bb0100
42565                                    DataType dt =
42566                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42567                                    if (dt.Is(kDataTypeValueInvalid)) {
42568                                      UnallocatedA32(instr);
42569                                      return;
42570                                    }
42571                                    unsigned rd =
42572                                        ExtractDRegister(instr, 22, 12);
42573                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42574                                    // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42575                                    vcvtn(dt,
42576                                          F32,
42577                                          DRegister(rd),
42578                                          DRegister(rm));
42579                                    break;
42580                                  }
42581                                  default:
42582                                    UnallocatedA32(instr);
42583                                    break;
42584                                }
42585                                break;
42586                              }
42587                              case 0x00000040: {
42588                                // 0xf3b30040
42589                                switch (instr & 0x000c0100) {
42590                                  case 0x00080000: {
42591                                    // 0xf3bb0040
42592                                    DataType dt =
42593                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42594                                    if (dt.Is(kDataTypeValueInvalid)) {
42595                                      UnallocatedA32(instr);
42596                                      return;
42597                                    }
42598                                    if (((instr >> 12) & 1) != 0) {
42599                                      UnallocatedA32(instr);
42600                                      return;
42601                                    }
42602                                    unsigned rd =
42603                                        ExtractQRegister(instr, 22, 12);
42604                                    if ((instr & 1) != 0) {
42605                                      UnallocatedA32(instr);
42606                                      return;
42607                                    }
42608                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42609                                    // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42610                                    vcvta(dt,
42611                                          F32,
42612                                          QRegister(rd),
42613                                          QRegister(rm));
42614                                    break;
42615                                  }
42616                                  case 0x00080100: {
42617                                    // 0xf3bb0140
42618                                    DataType dt =
42619                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42620                                    if (dt.Is(kDataTypeValueInvalid)) {
42621                                      UnallocatedA32(instr);
42622                                      return;
42623                                    }
42624                                    if (((instr >> 12) & 1) != 0) {
42625                                      UnallocatedA32(instr);
42626                                      return;
42627                                    }
42628                                    unsigned rd =
42629                                        ExtractQRegister(instr, 22, 12);
42630                                    if ((instr & 1) != 0) {
42631                                      UnallocatedA32(instr);
42632                                      return;
42633                                    }
42634                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42635                                    // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42636                                    vcvtn(dt,
42637                                          F32,
42638                                          QRegister(rd),
42639                                          QRegister(rm));
42640                                    break;
42641                                  }
42642                                  default:
42643                                    UnallocatedA32(instr);
42644                                    break;
42645                                }
42646                                break;
42647                              }
42648                              case 0x00000400: {
42649                                // 0xf3b30400
42650                                switch (instr & 0x00000080) {
42651                                  case 0x00000000: {
42652                                    // 0xf3b30400
42653                                    DataType dt = Dt_F_size_4_Decode(
42654                                        ((instr >> 18) & 0x3) |
42655                                        ((instr >> 6) & 0x4));
42656                                    if (dt.Is(kDataTypeValueInvalid)) {
42657                                      UnallocatedA32(instr);
42658                                      return;
42659                                    }
42660                                    unsigned rd =
42661                                        ExtractDRegister(instr, 22, 12);
42662                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42663                                    // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42664                                    vrecpe(al,
42665                                           dt,
42666                                           DRegister(rd),
42667                                           DRegister(rm));
42668                                    break;
42669                                  }
42670                                  case 0x00000080: {
42671                                    // 0xf3b30480
42672                                    DataType dt = Dt_F_size_4_Decode(
42673                                        ((instr >> 18) & 0x3) |
42674                                        ((instr >> 6) & 0x4));
42675                                    if (dt.Is(kDataTypeValueInvalid)) {
42676                                      UnallocatedA32(instr);
42677                                      return;
42678                                    }
42679                                    unsigned rd =
42680                                        ExtractDRegister(instr, 22, 12);
42681                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42682                                    // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42683                                    vrsqrte(al,
42684                                            dt,
42685                                            DRegister(rd),
42686                                            DRegister(rm));
42687                                    break;
42688                                  }
42689                                }
42690                                break;
42691                              }
42692                              case 0x00000440: {
42693                                // 0xf3b30440
42694                                switch (instr & 0x00000080) {
42695                                  case 0x00000000: {
42696                                    // 0xf3b30440
42697                                    DataType dt = Dt_F_size_4_Decode(
42698                                        ((instr >> 18) & 0x3) |
42699                                        ((instr >> 6) & 0x4));
42700                                    if (dt.Is(kDataTypeValueInvalid)) {
42701                                      UnallocatedA32(instr);
42702                                      return;
42703                                    }
42704                                    if (((instr >> 12) & 1) != 0) {
42705                                      UnallocatedA32(instr);
42706                                      return;
42707                                    }
42708                                    unsigned rd =
42709                                        ExtractQRegister(instr, 22, 12);
42710                                    if ((instr & 1) != 0) {
42711                                      UnallocatedA32(instr);
42712                                      return;
42713                                    }
42714                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42715                                    // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42716                                    vrecpe(al,
42717                                           dt,
42718                                           QRegister(rd),
42719                                           QRegister(rm));
42720                                    break;
42721                                  }
42722                                  case 0x00000080: {
42723                                    // 0xf3b304c0
42724                                    DataType dt = Dt_F_size_4_Decode(
42725                                        ((instr >> 18) & 0x3) |
42726                                        ((instr >> 6) & 0x4));
42727                                    if (dt.Is(kDataTypeValueInvalid)) {
42728                                      UnallocatedA32(instr);
42729                                      return;
42730                                    }
42731                                    if (((instr >> 12) & 1) != 0) {
42732                                      UnallocatedA32(instr);
42733                                      return;
42734                                    }
42735                                    unsigned rd =
42736                                        ExtractQRegister(instr, 22, 12);
42737                                    if ((instr & 1) != 0) {
42738                                      UnallocatedA32(instr);
42739                                      return;
42740                                    }
42741                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42742                                    // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42743                                    vrsqrte(al,
42744                                            dt,
42745                                            QRegister(rd),
42746                                            QRegister(rm));
42747                                    break;
42748                                  }
42749                                }
42750                                break;
42751                              }
42752                            }
42753                            break;
42754                          }
42755                          case 0x00030200: {
42756                            // 0xf3b30200
42757                            switch (instr & 0x000c0440) {
42758                              case 0x00080000: {
42759                                // 0xf3bb0200
42760                                switch (instr & 0x00000100) {
42761                                  case 0x00000000: {
42762                                    // 0xf3bb0200
42763                                    DataType dt =
42764                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42765                                    if (dt.Is(kDataTypeValueInvalid)) {
42766                                      UnallocatedA32(instr);
42767                                      return;
42768                                    }
42769                                    unsigned rd =
42770                                        ExtractDRegister(instr, 22, 12);
42771                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42772                                    // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42773                                    vcvtp(dt,
42774                                          F32,
42775                                          DRegister(rd),
42776                                          DRegister(rm));
42777                                    break;
42778                                  }
42779                                  case 0x00000100: {
42780                                    // 0xf3bb0300
42781                                    DataType dt =
42782                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42783                                    if (dt.Is(kDataTypeValueInvalid)) {
42784                                      UnallocatedA32(instr);
42785                                      return;
42786                                    }
42787                                    unsigned rd =
42788                                        ExtractDRegister(instr, 22, 12);
42789                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42790                                    // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42791                                    vcvtm(dt,
42792                                          F32,
42793                                          DRegister(rd),
42794                                          DRegister(rm));
42795                                    break;
42796                                  }
42797                                }
42798                                break;
42799                              }
42800                              case 0x00080040: {
42801                                // 0xf3bb0240
42802                                switch (instr & 0x00000100) {
42803                                  case 0x00000000: {
42804                                    // 0xf3bb0240
42805                                    DataType dt =
42806                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42807                                    if (dt.Is(kDataTypeValueInvalid)) {
42808                                      UnallocatedA32(instr);
42809                                      return;
42810                                    }
42811                                    if (((instr >> 12) & 1) != 0) {
42812                                      UnallocatedA32(instr);
42813                                      return;
42814                                    }
42815                                    unsigned rd =
42816                                        ExtractQRegister(instr, 22, 12);
42817                                    if ((instr & 1) != 0) {
42818                                      UnallocatedA32(instr);
42819                                      return;
42820                                    }
42821                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42822                                    // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42823                                    vcvtp(dt,
42824                                          F32,
42825                                          QRegister(rd),
42826                                          QRegister(rm));
42827                                    break;
42828                                  }
42829                                  case 0x00000100: {
42830                                    // 0xf3bb0340
42831                                    DataType dt =
42832                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42833                                    if (dt.Is(kDataTypeValueInvalid)) {
42834                                      UnallocatedA32(instr);
42835                                      return;
42836                                    }
42837                                    if (((instr >> 12) & 1) != 0) {
42838                                      UnallocatedA32(instr);
42839                                      return;
42840                                    }
42841                                    unsigned rd =
42842                                        ExtractQRegister(instr, 22, 12);
42843                                    if ((instr & 1) != 0) {
42844                                      UnallocatedA32(instr);
42845                                      return;
42846                                    }
42847                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42848                                    // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42849                                    vcvtm(dt,
42850                                          F32,
42851                                          QRegister(rd),
42852                                          QRegister(rm));
42853                                    break;
42854                                  }
42855                                }
42856                                break;
42857                              }
42858                              case 0x00080400: {
42859                                // 0xf3bb0600
42860                                DataType dt1 =
42861                                    Dt_op_1_Decode1((instr >> 7) & 0x3);
42862                                if (dt1.Is(kDataTypeValueInvalid)) {
42863                                  UnallocatedA32(instr);
42864                                  return;
42865                                }
42866                                DataType dt2 =
42867                                    Dt_op_1_Decode2((instr >> 7) & 0x3);
42868                                if (dt2.Is(kDataTypeValueInvalid)) {
42869                                  UnallocatedA32(instr);
42870                                  return;
42871                                }
42872                                unsigned rd = ExtractDRegister(instr, 22, 12);
42873                                unsigned rm = ExtractDRegister(instr, 5, 0);
42874                                // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1
42875                                vcvt(al,
42876                                     dt1,
42877                                     dt2,
42878                                     DRegister(rd),
42879                                     DRegister(rm));
42880                                break;
42881                              }
42882                              case 0x00080440: {
42883                                // 0xf3bb0640
42884                                DataType dt1 =
42885                                    Dt_op_1_Decode1((instr >> 7) & 0x3);
42886                                if (dt1.Is(kDataTypeValueInvalid)) {
42887                                  UnallocatedA32(instr);
42888                                  return;
42889                                }
42890                                DataType dt2 =
42891                                    Dt_op_1_Decode2((instr >> 7) & 0x3);
42892                                if (dt2.Is(kDataTypeValueInvalid)) {
42893                                  UnallocatedA32(instr);
42894                                  return;
42895                                }
42896                                if (((instr >> 12) & 1) != 0) {
42897                                  UnallocatedA32(instr);
42898                                  return;
42899                                }
42900                                unsigned rd = ExtractQRegister(instr, 22, 12);
42901                                if ((instr & 1) != 0) {
42902                                  UnallocatedA32(instr);
42903                                  return;
42904                                }
42905                                unsigned rm = ExtractQRegister(instr, 5, 0);
42906                                // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1
42907                                vcvt(al,
42908                                     dt1,
42909                                     dt2,
42910                                     QRegister(rd),
42911                                     QRegister(rm));
42912                                break;
42913                              }
42914                              default:
42915                                UnallocatedA32(instr);
42916                                break;
42917                            }
42918                            break;
42919                          }
42920                        }
42921                        break;
42922                      }
42923                      case 0x00000800: {
42924                        // 0xf3b00800
42925                        switch (instr & 0x00000440) {
42926                          case 0x00000000: {
42927                            // 0xf3b00800
42928                            unsigned rd = ExtractDRegister(instr, 22, 12);
42929                            unsigned first = ExtractDRegister(instr, 7, 16);
42930                            unsigned length;
42931                            SpacingType spacing = kSingle;
42932                            switch ((instr >> 8) & 0x3) {
42933                              default:
42934                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
42935                              case 0x0:
42936                                length = 1;
42937                                break;
42938                              case 0x1:
42939                                length = 2;
42940                                break;
42941                              case 0x2:
42942                                length = 3;
42943                                break;
42944                              case 0x3:
42945                                length = 4;
42946                                break;
42947                            }
42948                            unsigned last = first + length - 1;
42949                            TransferType transfer = kMultipleLanes;
42950                            unsigned rm = ExtractDRegister(instr, 5, 0);
42951                            // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
42952                            vtbl(al,
42953                                 Untyped8,
42954                                 DRegister(rd),
42955                                 NeonRegisterList(DRegister(first),
42956                                                  DRegister(last),
42957                                                  spacing,
42958                                                  transfer),
42959                                 DRegister(rm));
42960                            break;
42961                          }
42962                          case 0x00000040: {
42963                            // 0xf3b00840
42964                            unsigned rd = ExtractDRegister(instr, 22, 12);
42965                            unsigned first = ExtractDRegister(instr, 7, 16);
42966                            unsigned length;
42967                            SpacingType spacing = kSingle;
42968                            switch ((instr >> 8) & 0x3) {
42969                              default:
42970                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
42971                              case 0x0:
42972                                length = 1;
42973                                break;
42974                              case 0x1:
42975                                length = 2;
42976                                break;
42977                              case 0x2:
42978                                length = 3;
42979                                break;
42980                              case 0x3:
42981                                length = 4;
42982                                break;
42983                            }
42984                            unsigned last = first + length - 1;
42985                            TransferType transfer = kMultipleLanes;
42986                            unsigned rm = ExtractDRegister(instr, 5, 0);
42987                            // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
42988                            vtbx(al,
42989                                 Untyped8,
42990                                 DRegister(rd),
42991                                 NeonRegisterList(DRegister(first),
42992                                                  DRegister(last),
42993                                                  spacing,
42994                                                  transfer),
42995                                 DRegister(rm));
42996                            break;
42997                          }
42998                          case 0x00000400: {
42999                            // 0xf3b00c00
43000                            if ((instr & 0x00000380) == 0x00000000) {
43001                              unsigned lane;
43002                              DataType dt =
43003                                  Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
43004                              if (dt.Is(kDataTypeValueInvalid)) {
43005                                UnallocatedA32(instr);
43006                                return;
43007                              }
43008                              unsigned rd = ExtractDRegister(instr, 22, 12);
43009                              unsigned rm = ExtractDRegister(instr, 5, 0);
43010                              // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1
43011                              vdup(al,
43012                                   dt,
43013                                   DRegister(rd),
43014                                   DRegisterLane(rm, lane));
43015                            } else {
43016                              UnallocatedA32(instr);
43017                            }
43018                            break;
43019                          }
43020                          case 0x00000440: {
43021                            // 0xf3b00c40
43022                            if ((instr & 0x00000380) == 0x00000000) {
43023                              unsigned lane;
43024                              DataType dt =
43025                                  Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
43026                              if (dt.Is(kDataTypeValueInvalid)) {
43027                                UnallocatedA32(instr);
43028                                return;
43029                              }
43030                              if (((instr >> 12) & 1) != 0) {
43031                                UnallocatedA32(instr);
43032                                return;
43033                              }
43034                              unsigned rd = ExtractQRegister(instr, 22, 12);
43035                              unsigned rm = ExtractDRegister(instr, 5, 0);
43036                              // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1
43037                              vdup(al,
43038                                   dt,
43039                                   QRegister(rd),
43040                                   DRegisterLane(rm, lane));
43041                            } else {
43042                              UnallocatedA32(instr);
43043                            }
43044                            break;
43045                          }
43046                        }
43047                        break;
43048                      }
43049                    }
43050                    break;
43051                  }
43052                }
43053                break;
43054              }
43055              default: {
43056                switch (instr & 0x00000c40) {
43057                  case 0x00000000: {
43058                    // 0xf2800000
43059                    switch (instr & 0x00000300) {
43060                      case 0x00000000: {
43061                        // 0xf2800000
43062                        if (((instr & 0x300000) == 0x300000)) {
43063                          UnallocatedA32(instr);
43064                          return;
43065                        }
43066                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43067                                                         ((instr >> 22) & 0x4));
43068                        if (dt.Is(kDataTypeValueInvalid)) {
43069                          UnallocatedA32(instr);
43070                          return;
43071                        }
43072                        if (((instr >> 12) & 1) != 0) {
43073                          UnallocatedA32(instr);
43074                          return;
43075                        }
43076                        unsigned rd = ExtractQRegister(instr, 22, 12);
43077                        unsigned rn = ExtractDRegister(instr, 7, 16);
43078                        unsigned rm = ExtractDRegister(instr, 5, 0);
43079                        // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43080                        vaddl(al,
43081                              dt,
43082                              QRegister(rd),
43083                              DRegister(rn),
43084                              DRegister(rm));
43085                        break;
43086                      }
43087                      case 0x00000100: {
43088                        // 0xf2800100
43089                        if (((instr & 0x300000) == 0x300000)) {
43090                          UnallocatedA32(instr);
43091                          return;
43092                        }
43093                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43094                                                         ((instr >> 22) & 0x4));
43095                        if (dt.Is(kDataTypeValueInvalid)) {
43096                          UnallocatedA32(instr);
43097                          return;
43098                        }
43099                        if (((instr >> 12) & 1) != 0) {
43100                          UnallocatedA32(instr);
43101                          return;
43102                        }
43103                        unsigned rd = ExtractQRegister(instr, 22, 12);
43104                        if (((instr >> 16) & 1) != 0) {
43105                          UnallocatedA32(instr);
43106                          return;
43107                        }
43108                        unsigned rn = ExtractQRegister(instr, 7, 16);
43109                        unsigned rm = ExtractDRegister(instr, 5, 0);
43110                        // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
43111                        vaddw(al,
43112                              dt,
43113                              QRegister(rd),
43114                              QRegister(rn),
43115                              DRegister(rm));
43116                        break;
43117                      }
43118                      case 0x00000200: {
43119                        // 0xf2800200
43120                        if (((instr & 0x300000) == 0x300000)) {
43121                          UnallocatedA32(instr);
43122                          return;
43123                        }
43124                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43125                                                         ((instr >> 22) & 0x4));
43126                        if (dt.Is(kDataTypeValueInvalid)) {
43127                          UnallocatedA32(instr);
43128                          return;
43129                        }
43130                        if (((instr >> 12) & 1) != 0) {
43131                          UnallocatedA32(instr);
43132                          return;
43133                        }
43134                        unsigned rd = ExtractQRegister(instr, 22, 12);
43135                        unsigned rn = ExtractDRegister(instr, 7, 16);
43136                        unsigned rm = ExtractDRegister(instr, 5, 0);
43137                        // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43138                        vsubl(al,
43139                              dt,
43140                              QRegister(rd),
43141                              DRegister(rn),
43142                              DRegister(rm));
43143                        break;
43144                      }
43145                      case 0x00000300: {
43146                        // 0xf2800300
43147                        if (((instr & 0x300000) == 0x300000)) {
43148                          UnallocatedA32(instr);
43149                          return;
43150                        }
43151                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43152                                                         ((instr >> 22) & 0x4));
43153                        if (dt.Is(kDataTypeValueInvalid)) {
43154                          UnallocatedA32(instr);
43155                          return;
43156                        }
43157                        if (((instr >> 12) & 1) != 0) {
43158                          UnallocatedA32(instr);
43159                          return;
43160                        }
43161                        unsigned rd = ExtractQRegister(instr, 22, 12);
43162                        if (((instr >> 16) & 1) != 0) {
43163                          UnallocatedA32(instr);
43164                          return;
43165                        }
43166                        unsigned rn = ExtractQRegister(instr, 7, 16);
43167                        unsigned rm = ExtractDRegister(instr, 5, 0);
43168                        // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
43169                        vsubw(al,
43170                              dt,
43171                              QRegister(rd),
43172                              QRegister(rn),
43173                              DRegister(rm));
43174                        break;
43175                      }
43176                    }
43177                    break;
43178                  }
43179                  case 0x00000040: {
43180                    // 0xf2800040
43181                    switch (instr & 0x00000200) {
43182                      case 0x00000000: {
43183                        // 0xf2800040
43184                        switch (instr & 0x01000000) {
43185                          case 0x00000000: {
43186                            // 0xf2800040
43187                            if (((instr & 0x300000) == 0x300000)) {
43188                              UnallocatedA32(instr);
43189                              return;
43190                            }
43191                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43192                                                           (instr >> 8) & 0x1);
43193                            if (dt.Is(kDataTypeValueInvalid)) {
43194                              UnallocatedA32(instr);
43195                              return;
43196                            }
43197                            unsigned rd = ExtractDRegister(instr, 22, 12);
43198                            unsigned rn = ExtractDRegister(instr, 7, 16);
43199                            int lane;
43200                            unsigned rm =
43201                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43202                            // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43203                            vmla(al,
43204                                 dt,
43205                                 DRegister(rd),
43206                                 DRegister(rn),
43207                                 DRegisterLane(rm, lane));
43208                            break;
43209                          }
43210                          case 0x01000000: {
43211                            // 0xf3800040
43212                            if (((instr & 0x300000) == 0x300000)) {
43213                              UnallocatedA32(instr);
43214                              return;
43215                            }
43216                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43217                                                           (instr >> 8) & 0x1);
43218                            if (dt.Is(kDataTypeValueInvalid)) {
43219                              UnallocatedA32(instr);
43220                              return;
43221                            }
43222                            if (((instr >> 12) & 1) != 0) {
43223                              UnallocatedA32(instr);
43224                              return;
43225                            }
43226                            unsigned rd = ExtractQRegister(instr, 22, 12);
43227                            if (((instr >> 16) & 1) != 0) {
43228                              UnallocatedA32(instr);
43229                              return;
43230                            }
43231                            unsigned rn = ExtractQRegister(instr, 7, 16);
43232                            int lane;
43233                            unsigned rm =
43234                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43235                            // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43236                            vmla(al,
43237                                 dt,
43238                                 QRegister(rd),
43239                                 QRegister(rn),
43240                                 DRegisterLane(rm, lane));
43241                            break;
43242                          }
43243                        }
43244                        break;
43245                      }
43246                      case 0x00000200: {
43247                        // 0xf2800240
43248                        switch (instr & 0x00000100) {
43249                          case 0x00000000: {
43250                            // 0xf2800240
43251                            if (((instr & 0x300000) == 0x300000)) {
43252                              UnallocatedA32(instr);
43253                              return;
43254                            }
43255                            DataType dt =
43256                                Dt_size_11_Decode((instr >> 20) & 0x3,
43257                                                  (instr >> 24) & 0x1);
43258                            if (dt.Is(kDataTypeValueInvalid)) {
43259                              UnallocatedA32(instr);
43260                              return;
43261                            }
43262                            if (((instr >> 12) & 1) != 0) {
43263                              UnallocatedA32(instr);
43264                              return;
43265                            }
43266                            unsigned rd = ExtractQRegister(instr, 22, 12);
43267                            unsigned rn = ExtractDRegister(instr, 7, 16);
43268                            int lane;
43269                            unsigned rm =
43270                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43271                            // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43272                            vmlal(al,
43273                                  dt,
43274                                  QRegister(rd),
43275                                  DRegister(rn),
43276                                  DRegisterLane(rm, lane));
43277                            break;
43278                          }
43279                          case 0x00000100: {
43280                            // 0xf2800340
43281                            if ((instr & 0x01000000) == 0x00000000) {
43282                              if (((instr & 0x300000) == 0x300000)) {
43283                                UnallocatedA32(instr);
43284                                return;
43285                              }
43286                              DataType dt =
43287                                  Dt_size_13_Decode((instr >> 20) & 0x3);
43288                              if (dt.Is(kDataTypeValueInvalid)) {
43289                                UnallocatedA32(instr);
43290                                return;
43291                              }
43292                              if (((instr >> 12) & 1) != 0) {
43293                                UnallocatedA32(instr);
43294                                return;
43295                              }
43296                              unsigned rd = ExtractQRegister(instr, 22, 12);
43297                              unsigned rn = ExtractDRegister(instr, 7, 16);
43298                              uint32_t mvm =
43299                                  (instr & 0xf) | ((instr >> 1) & 0x10);
43300                              uint32_t shift = 4;
43301                              if (dt.Is(S16)) {
43302                                shift = 3;
43303                              }
43304                              uint32_t vm = mvm & ((1 << shift) - 1);
43305                              uint32_t index = mvm >> shift;
43306                              // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
43307                              vqdmlal(al,
43308                                      dt,
43309                                      QRegister(rd),
43310                                      DRegister(rn),
43311                                      DRegister(vm),
43312                                      index);
43313                            } else {
43314                              UnallocatedA32(instr);
43315                            }
43316                            break;
43317                          }
43318                        }
43319                        break;
43320                      }
43321                    }
43322                    break;
43323                  }
43324                  case 0x00000400: {
43325                    // 0xf2800400
43326                    switch (instr & 0x00000300) {
43327                      case 0x00000000: {
43328                        // 0xf2800400
43329                        switch (instr & 0x01000000) {
43330                          case 0x00000000: {
43331                            // 0xf2800400
43332                            if (((instr & 0x300000) == 0x300000)) {
43333                              UnallocatedA32(instr);
43334                              return;
43335                            }
43336                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
43337                            if (dt.Is(kDataTypeValueInvalid)) {
43338                              UnallocatedA32(instr);
43339                              return;
43340                            }
43341                            unsigned rd = ExtractDRegister(instr, 22, 12);
43342                            if (((instr >> 16) & 1) != 0) {
43343                              UnallocatedA32(instr);
43344                              return;
43345                            }
43346                            unsigned rn = ExtractQRegister(instr, 7, 16);
43347                            if ((instr & 1) != 0) {
43348                              UnallocatedA32(instr);
43349                              return;
43350                            }
43351                            unsigned rm = ExtractQRegister(instr, 5, 0);
43352                            // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43353                            vaddhn(al,
43354                                   dt,
43355                                   DRegister(rd),
43356                                   QRegister(rn),
43357                                   QRegister(rm));
43358                            break;
43359                          }
43360                          case 0x01000000: {
43361                            // 0xf3800400
43362                            if (((instr & 0x300000) == 0x300000)) {
43363                              UnallocatedA32(instr);
43364                              return;
43365                            }
43366                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
43367                            if (dt.Is(kDataTypeValueInvalid)) {
43368                              UnallocatedA32(instr);
43369                              return;
43370                            }
43371                            unsigned rd = ExtractDRegister(instr, 22, 12);
43372                            if (((instr >> 16) & 1) != 0) {
43373                              UnallocatedA32(instr);
43374                              return;
43375                            }
43376                            unsigned rn = ExtractQRegister(instr, 7, 16);
43377                            if ((instr & 1) != 0) {
43378                              UnallocatedA32(instr);
43379                              return;
43380                            }
43381                            unsigned rm = ExtractQRegister(instr, 5, 0);
43382                            // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43383                            vraddhn(al,
43384                                    dt,
43385                                    DRegister(rd),
43386                                    QRegister(rn),
43387                                    QRegister(rm));
43388                            break;
43389                          }
43390                        }
43391                        break;
43392                      }
43393                      case 0x00000100: {
43394                        // 0xf2800500
43395                        if (((instr & 0x300000) == 0x300000)) {
43396                          UnallocatedA32(instr);
43397                          return;
43398                        }
43399                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43400                                                         ((instr >> 22) & 0x4));
43401                        if (dt.Is(kDataTypeValueInvalid)) {
43402                          UnallocatedA32(instr);
43403                          return;
43404                        }
43405                        if (((instr >> 12) & 1) != 0) {
43406                          UnallocatedA32(instr);
43407                          return;
43408                        }
43409                        unsigned rd = ExtractQRegister(instr, 22, 12);
43410                        unsigned rn = ExtractDRegister(instr, 7, 16);
43411                        unsigned rm = ExtractDRegister(instr, 5, 0);
43412                        // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43413                        vabal(al,
43414                              dt,
43415                              QRegister(rd),
43416                              DRegister(rn),
43417                              DRegister(rm));
43418                        break;
43419                      }
43420                      case 0x00000200: {
43421                        // 0xf2800600
43422                        switch (instr & 0x01000000) {
43423                          case 0x00000000: {
43424                            // 0xf2800600
43425                            if (((instr & 0x300000) == 0x300000)) {
43426                              UnallocatedA32(instr);
43427                              return;
43428                            }
43429                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
43430                            if (dt.Is(kDataTypeValueInvalid)) {
43431                              UnallocatedA32(instr);
43432                              return;
43433                            }
43434                            unsigned rd = ExtractDRegister(instr, 22, 12);
43435                            if (((instr >> 16) & 1) != 0) {
43436                              UnallocatedA32(instr);
43437                              return;
43438                            }
43439                            unsigned rn = ExtractQRegister(instr, 7, 16);
43440                            if ((instr & 1) != 0) {
43441                              UnallocatedA32(instr);
43442                              return;
43443                            }
43444                            unsigned rm = ExtractQRegister(instr, 5, 0);
43445                            // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43446                            vsubhn(al,
43447                                   dt,
43448                                   DRegister(rd),
43449                                   QRegister(rn),
43450                                   QRegister(rm));
43451                            break;
43452                          }
43453                          case 0x01000000: {
43454                            // 0xf3800600
43455                            if (((instr & 0x300000) == 0x300000)) {
43456                              UnallocatedA32(instr);
43457                              return;
43458                            }
43459                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
43460                            if (dt.Is(kDataTypeValueInvalid)) {
43461                              UnallocatedA32(instr);
43462                              return;
43463                            }
43464                            unsigned rd = ExtractDRegister(instr, 22, 12);
43465                            if (((instr >> 16) & 1) != 0) {
43466                              UnallocatedA32(instr);
43467                              return;
43468                            }
43469                            unsigned rn = ExtractQRegister(instr, 7, 16);
43470                            if ((instr & 1) != 0) {
43471                              UnallocatedA32(instr);
43472                              return;
43473                            }
43474                            unsigned rm = ExtractQRegister(instr, 5, 0);
43475                            // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43476                            vrsubhn(al,
43477                                    dt,
43478                                    DRegister(rd),
43479                                    QRegister(rn),
43480                                    QRegister(rm));
43481                            break;
43482                          }
43483                        }
43484                        break;
43485                      }
43486                      case 0x00000300: {
43487                        // 0xf2800700
43488                        if (((instr & 0x300000) == 0x300000)) {
43489                          UnallocatedA32(instr);
43490                          return;
43491                        }
43492                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43493                                                         ((instr >> 22) & 0x4));
43494                        if (dt.Is(kDataTypeValueInvalid)) {
43495                          UnallocatedA32(instr);
43496                          return;
43497                        }
43498                        if (((instr >> 12) & 1) != 0) {
43499                          UnallocatedA32(instr);
43500                          return;
43501                        }
43502                        unsigned rd = ExtractQRegister(instr, 22, 12);
43503                        unsigned rn = ExtractDRegister(instr, 7, 16);
43504                        unsigned rm = ExtractDRegister(instr, 5, 0);
43505                        // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43506                        vabdl(al,
43507                              dt,
43508                              QRegister(rd),
43509                              DRegister(rn),
43510                              DRegister(rm));
43511                        break;
43512                      }
43513                    }
43514                    break;
43515                  }
43516                  case 0x00000440: {
43517                    // 0xf2800440
43518                    switch (instr & 0x00000200) {
43519                      case 0x00000000: {
43520                        // 0xf2800440
43521                        switch (instr & 0x01000000) {
43522                          case 0x00000000: {
43523                            // 0xf2800440
43524                            if (((instr & 0x300000) == 0x300000)) {
43525                              UnallocatedA32(instr);
43526                              return;
43527                            }
43528                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43529                                                           (instr >> 8) & 0x1);
43530                            if (dt.Is(kDataTypeValueInvalid)) {
43531                              UnallocatedA32(instr);
43532                              return;
43533                            }
43534                            unsigned rd = ExtractDRegister(instr, 22, 12);
43535                            unsigned rn = ExtractDRegister(instr, 7, 16);
43536                            int lane;
43537                            unsigned rm =
43538                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43539                            // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43540                            vmls(al,
43541                                 dt,
43542                                 DRegister(rd),
43543                                 DRegister(rn),
43544                                 DRegisterLane(rm, lane));
43545                            break;
43546                          }
43547                          case 0x01000000: {
43548                            // 0xf3800440
43549                            if (((instr & 0x300000) == 0x300000)) {
43550                              UnallocatedA32(instr);
43551                              return;
43552                            }
43553                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43554                                                           (instr >> 8) & 0x1);
43555                            if (dt.Is(kDataTypeValueInvalid)) {
43556                              UnallocatedA32(instr);
43557                              return;
43558                            }
43559                            if (((instr >> 12) & 1) != 0) {
43560                              UnallocatedA32(instr);
43561                              return;
43562                            }
43563                            unsigned rd = ExtractQRegister(instr, 22, 12);
43564                            if (((instr >> 16) & 1) != 0) {
43565                              UnallocatedA32(instr);
43566                              return;
43567                            }
43568                            unsigned rn = ExtractQRegister(instr, 7, 16);
43569                            int lane;
43570                            unsigned rm =
43571                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43572                            // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43573                            vmls(al,
43574                                 dt,
43575                                 QRegister(rd),
43576                                 QRegister(rn),
43577                                 DRegisterLane(rm, lane));
43578                            break;
43579                          }
43580                        }
43581                        break;
43582                      }
43583                      case 0x00000200: {
43584                        // 0xf2800640
43585                        switch (instr & 0x00000100) {
43586                          case 0x00000000: {
43587                            // 0xf2800640
43588                            if (((instr & 0x300000) == 0x300000)) {
43589                              UnallocatedA32(instr);
43590                              return;
43591                            }
43592                            DataType dt =
43593                                Dt_size_11_Decode((instr >> 20) & 0x3,
43594                                                  (instr >> 24) & 0x1);
43595                            if (dt.Is(kDataTypeValueInvalid)) {
43596                              UnallocatedA32(instr);
43597                              return;
43598                            }
43599                            if (((instr >> 12) & 1) != 0) {
43600                              UnallocatedA32(instr);
43601                              return;
43602                            }
43603                            unsigned rd = ExtractQRegister(instr, 22, 12);
43604                            unsigned rn = ExtractDRegister(instr, 7, 16);
43605                            int lane;
43606                            unsigned rm =
43607                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43608                            // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43609                            vmlsl(al,
43610                                  dt,
43611                                  QRegister(rd),
43612                                  DRegister(rn),
43613                                  DRegisterLane(rm, lane));
43614                            break;
43615                          }
43616                          case 0x00000100: {
43617                            // 0xf2800740
43618                            if ((instr & 0x01000000) == 0x00000000) {
43619                              if (((instr & 0x300000) == 0x300000)) {
43620                                UnallocatedA32(instr);
43621                                return;
43622                              }
43623                              DataType dt =
43624                                  Dt_size_13_Decode((instr >> 20) & 0x3);
43625                              if (dt.Is(kDataTypeValueInvalid)) {
43626                                UnallocatedA32(instr);
43627                                return;
43628                              }
43629                              if (((instr >> 12) & 1) != 0) {
43630                                UnallocatedA32(instr);
43631                                return;
43632                              }
43633                              unsigned rd = ExtractQRegister(instr, 22, 12);
43634                              unsigned rn = ExtractDRegister(instr, 7, 16);
43635                              uint32_t mvm =
43636                                  (instr & 0xf) | ((instr >> 1) & 0x10);
43637                              uint32_t shift = 4;
43638                              if (dt.Is(S16)) {
43639                                shift = 3;
43640                              }
43641                              uint32_t vm = mvm & ((1 << shift) - 1);
43642                              uint32_t index = mvm >> shift;
43643                              // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
43644                              vqdmlsl(al,
43645                                      dt,
43646                                      QRegister(rd),
43647                                      DRegister(rn),
43648                                      DRegister(vm),
43649                                      index);
43650                            } else {
43651                              UnallocatedA32(instr);
43652                            }
43653                            break;
43654                          }
43655                        }
43656                        break;
43657                      }
43658                    }
43659                    break;
43660                  }
43661                  case 0x00000800: {
43662                    // 0xf2800800
43663                    switch (instr & 0x00000300) {
43664                      case 0x00000000: {
43665                        // 0xf2800800
43666                        if (((instr & 0x300000) == 0x300000)) {
43667                          UnallocatedA32(instr);
43668                          return;
43669                        }
43670                        DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
43671                                                        (instr >> 24) & 0x1);
43672                        if (dt.Is(kDataTypeValueInvalid)) {
43673                          UnallocatedA32(instr);
43674                          return;
43675                        }
43676                        if (((instr >> 12) & 1) != 0) {
43677                          UnallocatedA32(instr);
43678                          return;
43679                        }
43680                        unsigned rd = ExtractQRegister(instr, 22, 12);
43681                        unsigned rn = ExtractDRegister(instr, 7, 16);
43682                        unsigned rm = ExtractDRegister(instr, 5, 0);
43683                        // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
43684                        vmlal(al,
43685                              dt,
43686                              QRegister(rd),
43687                              DRegister(rn),
43688                              DRegister(rm));
43689                        break;
43690                      }
43691                      case 0x00000100: {
43692                        // 0xf2800900
43693                        if ((instr & 0x01000000) == 0x00000000) {
43694                          if (((instr & 0x300000) == 0x300000)) {
43695                            UnallocatedA32(instr);
43696                            return;
43697                          }
43698                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43699                          if (dt.Is(kDataTypeValueInvalid)) {
43700                            UnallocatedA32(instr);
43701                            return;
43702                          }
43703                          if (((instr >> 12) & 1) != 0) {
43704                            UnallocatedA32(instr);
43705                            return;
43706                          }
43707                          unsigned rd = ExtractQRegister(instr, 22, 12);
43708                          unsigned rn = ExtractDRegister(instr, 7, 16);
43709                          unsigned rm = ExtractDRegister(instr, 5, 0);
43710                          // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43711                          vqdmlal(al,
43712                                  dt,
43713                                  QRegister(rd),
43714                                  DRegister(rn),
43715                                  DRegister(rm));
43716                        } else {
43717                          UnallocatedA32(instr);
43718                        }
43719                        break;
43720                      }
43721                      case 0x00000200: {
43722                        // 0xf2800a00
43723                        if (((instr & 0x300000) == 0x300000)) {
43724                          UnallocatedA32(instr);
43725                          return;
43726                        }
43727                        DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
43728                                                        (instr >> 24) & 0x1);
43729                        if (dt.Is(kDataTypeValueInvalid)) {
43730                          UnallocatedA32(instr);
43731                          return;
43732                        }
43733                        if (((instr >> 12) & 1) != 0) {
43734                          UnallocatedA32(instr);
43735                          return;
43736                        }
43737                        unsigned rd = ExtractQRegister(instr, 22, 12);
43738                        unsigned rn = ExtractDRegister(instr, 7, 16);
43739                        unsigned rm = ExtractDRegister(instr, 5, 0);
43740                        // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
43741                        vmlsl(al,
43742                              dt,
43743                              QRegister(rd),
43744                              DRegister(rn),
43745                              DRegister(rm));
43746                        break;
43747                      }
43748                      case 0x00000300: {
43749                        // 0xf2800b00
43750                        if ((instr & 0x01000000) == 0x00000000) {
43751                          if (((instr & 0x300000) == 0x300000)) {
43752                            UnallocatedA32(instr);
43753                            return;
43754                          }
43755                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43756                          if (dt.Is(kDataTypeValueInvalid)) {
43757                            UnallocatedA32(instr);
43758                            return;
43759                          }
43760                          if (((instr >> 12) & 1) != 0) {
43761                            UnallocatedA32(instr);
43762                            return;
43763                          }
43764                          unsigned rd = ExtractQRegister(instr, 22, 12);
43765                          unsigned rn = ExtractDRegister(instr, 7, 16);
43766                          unsigned rm = ExtractDRegister(instr, 5, 0);
43767                          // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43768                          vqdmlsl(al,
43769                                  dt,
43770                                  QRegister(rd),
43771                                  DRegister(rn),
43772                                  DRegister(rm));
43773                        } else {
43774                          UnallocatedA32(instr);
43775                        }
43776                        break;
43777                      }
43778                    }
43779                    break;
43780                  }
43781                  case 0x00000840: {
43782                    // 0xf2800840
43783                    switch (instr & 0x00000200) {
43784                      case 0x00000000: {
43785                        // 0xf2800840
43786                        switch (instr & 0x01000000) {
43787                          case 0x00000000: {
43788                            // 0xf2800840
43789                            if (((instr & 0x300000) == 0x300000)) {
43790                              UnallocatedA32(instr);
43791                              return;
43792                            }
43793                            DataType dt = Dt_F_size_3_Decode(
43794                                ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
43795                            if (dt.Is(kDataTypeValueInvalid)) {
43796                              UnallocatedA32(instr);
43797                              return;
43798                            }
43799                            unsigned rd = ExtractDRegister(instr, 22, 12);
43800                            unsigned rn = ExtractDRegister(instr, 7, 16);
43801                            uint32_t mvm =
43802                                (instr & 0xf) | ((instr >> 1) & 0x10);
43803                            uint32_t shift = 4;
43804                            if (dt.Is(I16)) {
43805                              shift = 3;
43806                            }
43807                            uint32_t vm = mvm & ((1 << shift) - 1);
43808                            uint32_t index = mvm >> shift;
43809                            // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43810                            vmul(al,
43811                                 dt,
43812                                 DRegister(rd),
43813                                 DRegister(rn),
43814                                 DRegister(vm),
43815                                 index);
43816                            break;
43817                          }
43818                          case 0x01000000: {
43819                            // 0xf3800840
43820                            if (((instr & 0x300000) == 0x300000)) {
43821                              UnallocatedA32(instr);
43822                              return;
43823                            }
43824                            DataType dt = Dt_F_size_3_Decode(
43825                                ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
43826                            if (dt.Is(kDataTypeValueInvalid)) {
43827                              UnallocatedA32(instr);
43828                              return;
43829                            }
43830                            if (((instr >> 12) & 1) != 0) {
43831                              UnallocatedA32(instr);
43832                              return;
43833                            }
43834                            unsigned rd = ExtractQRegister(instr, 22, 12);
43835                            if (((instr >> 16) & 1) != 0) {
43836                              UnallocatedA32(instr);
43837                              return;
43838                            }
43839                            unsigned rn = ExtractQRegister(instr, 7, 16);
43840                            uint32_t mvm =
43841                                (instr & 0xf) | ((instr >> 1) & 0x10);
43842                            uint32_t shift = 4;
43843                            if (dt.Is(I16)) {
43844                              shift = 3;
43845                            }
43846                            uint32_t vm = mvm & ((1 << shift) - 1);
43847                            uint32_t index = mvm >> shift;
43848                            // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43849                            vmul(al,
43850                                 dt,
43851                                 QRegister(rd),
43852                                 QRegister(rn),
43853                                 DRegister(vm),
43854                                 index);
43855                            break;
43856                          }
43857                        }
43858                        break;
43859                      }
43860                      case 0x00000200: {
43861                        // 0xf2800a40
43862                        switch (instr & 0x00000100) {
43863                          case 0x00000000: {
43864                            // 0xf2800a40
43865                            if (((instr & 0x300000) == 0x300000)) {
43866                              UnallocatedA32(instr);
43867                              return;
43868                            }
43869                            DataType dt = Dt_U_size_2_Decode(
43870                                ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4));
43871                            if (dt.Is(kDataTypeValueInvalid)) {
43872                              UnallocatedA32(instr);
43873                              return;
43874                            }
43875                            if (((instr >> 12) & 1) != 0) {
43876                              UnallocatedA32(instr);
43877                              return;
43878                            }
43879                            unsigned rd = ExtractQRegister(instr, 22, 12);
43880                            unsigned rn = ExtractDRegister(instr, 7, 16);
43881                            uint32_t mvm =
43882                                (instr & 0xf) | ((instr >> 1) & 0x10);
43883                            uint32_t shift = 4;
43884                            if (dt.Is(S16) || dt.Is(U16)) {
43885                              shift = 3;
43886                            }
43887                            uint32_t vm = mvm & ((1 << shift) - 1);
43888                            uint32_t index = mvm >> shift;
43889                            // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43890                            vmull(al,
43891                                  dt,
43892                                  QRegister(rd),
43893                                  DRegister(rn),
43894                                  DRegister(vm),
43895                                  index);
43896                            break;
43897                          }
43898                          case 0x00000100: {
43899                            // 0xf2800b40
43900                            if ((instr & 0x01000000) == 0x00000000) {
43901                              if (((instr & 0x300000) == 0x300000)) {
43902                                UnallocatedA32(instr);
43903                                return;
43904                              }
43905                              DataType dt =
43906                                  Dt_size_13_Decode((instr >> 20) & 0x3);
43907                              if (dt.Is(kDataTypeValueInvalid)) {
43908                                UnallocatedA32(instr);
43909                                return;
43910                              }
43911                              if (((instr >> 12) & 1) != 0) {
43912                                UnallocatedA32(instr);
43913                                return;
43914                              }
43915                              unsigned rd = ExtractQRegister(instr, 22, 12);
43916                              unsigned rn = ExtractDRegister(instr, 7, 16);
43917                              int lane;
43918                              unsigned rm = ExtractDRegisterAndLane(instr,
43919                                                                    dt,
43920                                                                    5,
43921                                                                    0,
43922                                                                    &lane);
43923                              // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2
43924                              vqdmull(al,
43925                                      dt,
43926                                      QRegister(rd),
43927                                      DRegister(rn),
43928                                      DRegisterLane(rm, lane));
43929                            } else {
43930                              UnallocatedA32(instr);
43931                            }
43932                            break;
43933                          }
43934                        }
43935                        break;
43936                      }
43937                    }
43938                    break;
43939                  }
43940                  case 0x00000c00: {
43941                    // 0xf2800c00
43942                    switch (instr & 0x00000100) {
43943                      case 0x00000000: {
43944                        // 0xf2800c00
43945                        if (((instr & 0x300000) == 0x300000)) {
43946                          UnallocatedA32(instr);
43947                          return;
43948                        }
43949                        DataType dt = Dt_op_U_size_1_Decode(
43950                            ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) |
43951                            ((instr >> 6) & 0x8));
43952                        if (dt.Is(kDataTypeValueInvalid)) {
43953                          UnallocatedA32(instr);
43954                          return;
43955                        }
43956                        if (((instr >> 12) & 1) != 0) {
43957                          UnallocatedA32(instr);
43958                          return;
43959                        }
43960                        unsigned rd = ExtractQRegister(instr, 22, 12);
43961                        unsigned rn = ExtractDRegister(instr, 7, 16);
43962                        unsigned rm = ExtractDRegister(instr, 5, 0);
43963                        // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43964                        vmull(al,
43965                              dt,
43966                              QRegister(rd),
43967                              DRegister(rn),
43968                              DRegister(rm));
43969                        break;
43970                      }
43971                      case 0x00000100: {
43972                        // 0xf2800d00
43973                        if ((instr & 0x01000200) == 0x00000000) {
43974                          if (((instr & 0x300000) == 0x300000)) {
43975                            UnallocatedA32(instr);
43976                            return;
43977                          }
43978                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43979                          if (dt.Is(kDataTypeValueInvalid)) {
43980                            UnallocatedA32(instr);
43981                            return;
43982                          }
43983                          if (((instr >> 12) & 1) != 0) {
43984                            UnallocatedA32(instr);
43985                            return;
43986                          }
43987                          unsigned rd = ExtractQRegister(instr, 22, 12);
43988                          unsigned rn = ExtractDRegister(instr, 7, 16);
43989                          unsigned rm = ExtractDRegister(instr, 5, 0);
43990                          // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43991                          vqdmull(al,
43992                                  dt,
43993                                  QRegister(rd),
43994                                  DRegister(rn),
43995                                  DRegister(rm));
43996                        } else {
43997                          UnallocatedA32(instr);
43998                        }
43999                        break;
44000                      }
44001                    }
44002                    break;
44003                  }
44004                  case 0x00000c40: {
44005                    // 0xf2800c40
44006                    switch (instr & 0x01000300) {
44007                      case 0x00000000: {
44008                        // 0xf2800c40
44009                        if (((instr & 0x300000) == 0x300000)) {
44010                          UnallocatedA32(instr);
44011                          return;
44012                        }
44013                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
44014                        if (dt.Is(kDataTypeValueInvalid)) {
44015                          UnallocatedA32(instr);
44016                          return;
44017                        }
44018                        unsigned rd = ExtractDRegister(instr, 22, 12);
44019                        unsigned rn = ExtractDRegister(instr, 7, 16);
44020                        int lane;
44021                        unsigned rm =
44022                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
44023                        // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
44024                        vqdmulh(al,
44025                                dt,
44026                                DRegister(rd),
44027                                DRegister(rn),
44028                                DRegisterLane(rm, lane));
44029                        break;
44030                      }
44031                      case 0x00000100: {
44032                        // 0xf2800d40
44033                        if (((instr & 0x300000) == 0x300000)) {
44034                          UnallocatedA32(instr);
44035                          return;
44036                        }
44037                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
44038                        if (dt.Is(kDataTypeValueInvalid)) {
44039                          UnallocatedA32(instr);
44040                          return;
44041                        }
44042                        unsigned rd = ExtractDRegister(instr, 22, 12);
44043                        unsigned rn = ExtractDRegister(instr, 7, 16);
44044                        int lane;
44045                        unsigned rm =
44046                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
44047                        // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
44048                        vqrdmulh(al,
44049                                 dt,
44050                                 DRegister(rd),
44051                                 DRegister(rn),
44052                                 DRegisterLane(rm, lane));
44053                        break;
44054                      }
44055                      case 0x01000000: {
44056                        // 0xf3800c40
44057                        if (((instr & 0x300000) == 0x300000)) {
44058                          UnallocatedA32(instr);
44059                          return;
44060                        }
44061                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
44062                        if (dt.Is(kDataTypeValueInvalid)) {
44063                          UnallocatedA32(instr);
44064                          return;
44065                        }
44066                        if (((instr >> 12) & 1) != 0) {
44067                          UnallocatedA32(instr);
44068                          return;
44069                        }
44070                        unsigned rd = ExtractQRegister(instr, 22, 12);
44071                        if (((instr >> 16) & 1) != 0) {
44072                          UnallocatedA32(instr);
44073                          return;
44074                        }
44075                        unsigned rn = ExtractQRegister(instr, 7, 16);
44076                        int lane;
44077                        unsigned rm =
44078                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
44079                        // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
44080                        vqdmulh(al,
44081                                dt,
44082                                QRegister(rd),
44083                                QRegister(rn),
44084                                DRegisterLane(rm, lane));
44085                        break;
44086                      }
44087                      case 0x01000100: {
44088                        // 0xf3800d40
44089                        if (((instr & 0x300000) == 0x300000)) {
44090                          UnallocatedA32(instr);
44091                          return;
44092                        }
44093                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
44094                        if (dt.Is(kDataTypeValueInvalid)) {
44095                          UnallocatedA32(instr);
44096                          return;
44097                        }
44098                        if (((instr >> 12) & 1) != 0) {
44099                          UnallocatedA32(instr);
44100                          return;
44101                        }
44102                        unsigned rd = ExtractQRegister(instr, 22, 12);
44103                        if (((instr >> 16) & 1) != 0) {
44104                          UnallocatedA32(instr);
44105                          return;
44106                        }
44107                        unsigned rn = ExtractQRegister(instr, 7, 16);
44108                        int lane;
44109                        unsigned rm =
44110                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
44111                        // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
44112                        vqrdmulh(al,
44113                                 dt,
44114                                 QRegister(rd),
44115                                 QRegister(rn),
44116                                 DRegisterLane(rm, lane));
44117                        break;
44118                      }
44119                      default:
44120                        UnallocatedA32(instr);
44121                        break;
44122                    }
44123                    break;
44124                  }
44125                }
44126                break;
44127              }
44128            }
44129            break;
44130          }
44131          case 0x00800010: {
44132            // 0xf2800010
44133            switch (instr & 0x00000040) {
44134              case 0x00000000: {
44135                // 0xf2800010
44136                switch (instr & 0x00000c00) {
44137                  case 0x00000000: {
44138                    // 0xf2800010
44139                    switch (instr & 0x00380080) {
44140                      case 0x00000000: {
44141                        // 0xf2800010
44142                        switch (instr & 0x00000100) {
44143                          case 0x00000000: {
44144                            // 0xf2800010
44145                            switch (instr & 0x00000200) {
44146                              default: {
44147                                switch (instr & 0x00000020) {
44148                                  case 0x00000020: {
44149                                    // 0xf2800030
44150                                    if (((instr & 0xd00) == 0x100) ||
44151                                        ((instr & 0xd00) == 0x500) ||
44152                                        ((instr & 0xd00) == 0x900) ||
44153                                        ((instr & 0xe00) == 0xe00)) {
44154                                      UnallocatedA32(instr);
44155                                      return;
44156                                    }
44157                                    unsigned cmode = (instr >> 8) & 0xf;
44158                                    DataType dt =
44159                                        ImmediateVmvn::DecodeDt(cmode);
44160                                    if (dt.Is(kDataTypeValueInvalid)) {
44161                                      UnallocatedA32(instr);
44162                                      return;
44163                                    }
44164                                    unsigned rd =
44165                                        ExtractDRegister(instr, 22, 12);
44166                                    DOperand imm =
44167                                        ImmediateVmvn::DecodeImmediate(
44168                                            cmode,
44169                                            (instr & 0xf) |
44170                                                ((instr >> 12) & 0x70) |
44171                                                ((instr >> 17) & 0x80));
44172                                    // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44173                                    vmvn(al, dt, DRegister(rd), imm);
44174                                    break;
44175                                  }
44176                                  default: {
44177                                    if (((instr & 0x920) == 0x100) ||
44178                                        ((instr & 0x520) == 0x100) ||
44179                                        ((instr & 0x820) == 0x20) ||
44180                                        ((instr & 0x420) == 0x20) ||
44181                                        ((instr & 0x220) == 0x20) ||
44182                                        ((instr & 0x120) == 0x120)) {
44183                                      UnallocatedA32(instr);
44184                                      return;
44185                                    }
44186                                    unsigned cmode = ((instr >> 8) & 0xf) |
44187                                                     ((instr >> 1) & 0x10);
44188                                    DataType dt =
44189                                        ImmediateVmov::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                                        ImmediateVmov::DecodeImmediate(
44198                                            cmode,
44199                                            (instr & 0xf) |
44200                                                ((instr >> 12) & 0x70) |
44201                                                ((instr >> 17) & 0x80));
44202                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44203                                    vmov(al, dt, DRegister(rd), imm);
44204                                    break;
44205                                  }
44206                                }
44207                                break;
44208                              }
44209                            }
44210                            break;
44211                          }
44212                          case 0x00000100: {
44213                            // 0xf2800110
44214                            switch (instr & 0x00000020) {
44215                              case 0x00000000: {
44216                                // 0xf2800110
44217                                if (((instr & 0x100) == 0x0) ||
44218                                    ((instr & 0xc00) == 0xc00)) {
44219                                  UnallocatedA32(instr);
44220                                  return;
44221                                }
44222                                unsigned cmode = (instr >> 8) & 0xf;
44223                                DataType dt = ImmediateVorr::DecodeDt(cmode);
44224                                if (dt.Is(kDataTypeValueInvalid)) {
44225                                  UnallocatedA32(instr);
44226                                  return;
44227                                }
44228                                unsigned rd = ExtractDRegister(instr, 22, 12);
44229                                DOperand imm = ImmediateVorr::DecodeImmediate(
44230                                    cmode,
44231                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
44232                                        ((instr >> 17) & 0x80));
44233                                // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44234                                vorr(al, dt, DRegister(rd), DRegister(rd), imm);
44235                                break;
44236                              }
44237                              case 0x00000020: {
44238                                // 0xf2800130
44239                                if (((instr & 0x100) == 0x0) ||
44240                                    ((instr & 0xc00) == 0xc00)) {
44241                                  UnallocatedA32(instr);
44242                                  return;
44243                                }
44244                                unsigned cmode = (instr >> 8) & 0xf;
44245                                DataType dt = ImmediateVbic::DecodeDt(cmode);
44246                                if (dt.Is(kDataTypeValueInvalid)) {
44247                                  UnallocatedA32(instr);
44248                                  return;
44249                                }
44250                                unsigned rd = ExtractDRegister(instr, 22, 12);
44251                                DOperand imm = ImmediateVbic::DecodeImmediate(
44252                                    cmode,
44253                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
44254                                        ((instr >> 17) & 0x80));
44255                                // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44256                                vbic(al, dt, DRegister(rd), DRegister(rd), imm);
44257                                break;
44258                              }
44259                            }
44260                            break;
44261                          }
44262                        }
44263                        break;
44264                      }
44265                      default: {
44266                        switch (instr & 0x00000300) {
44267                          case 0x00000000: {
44268                            // 0xf2800010
44269                            if (((instr & 0x380080) == 0x0)) {
44270                              UnallocatedA32(instr);
44271                              return;
44272                            }
44273                            DataType dt =
44274                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44275                                                       ((instr >> 4) & 0x8),
44276                                                   (instr >> 24) & 0x1);
44277                            if (dt.Is(kDataTypeValueInvalid)) {
44278                              UnallocatedA32(instr);
44279                              return;
44280                            }
44281                            unsigned rd = ExtractDRegister(instr, 22, 12);
44282                            unsigned rm = ExtractDRegister(instr, 5, 0);
44283                            uint32_t imm6 = (instr >> 16) & 0x3f;
44284                            uint32_t imm =
44285                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44286                                imm6;
44287                            // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44288                            vshr(al, dt, DRegister(rd), DRegister(rm), imm);
44289                            break;
44290                          }
44291                          case 0x00000100: {
44292                            // 0xf2800110
44293                            if (((instr & 0x380080) == 0x0)) {
44294                              UnallocatedA32(instr);
44295                              return;
44296                            }
44297                            DataType dt =
44298                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44299                                                       ((instr >> 4) & 0x8),
44300                                                   (instr >> 24) & 0x1);
44301                            if (dt.Is(kDataTypeValueInvalid)) {
44302                              UnallocatedA32(instr);
44303                              return;
44304                            }
44305                            unsigned rd = ExtractDRegister(instr, 22, 12);
44306                            unsigned rm = ExtractDRegister(instr, 5, 0);
44307                            uint32_t imm6 = (instr >> 16) & 0x3f;
44308                            uint32_t imm =
44309                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44310                                imm6;
44311                            // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44312                            vsra(al, dt, DRegister(rd), DRegister(rm), imm);
44313                            break;
44314                          }
44315                          case 0x00000200: {
44316                            // 0xf2800210
44317                            if (((instr & 0x380080) == 0x0)) {
44318                              UnallocatedA32(instr);
44319                              return;
44320                            }
44321                            DataType dt =
44322                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44323                                                       ((instr >> 4) & 0x8),
44324                                                   (instr >> 24) & 0x1);
44325                            if (dt.Is(kDataTypeValueInvalid)) {
44326                              UnallocatedA32(instr);
44327                              return;
44328                            }
44329                            unsigned rd = ExtractDRegister(instr, 22, 12);
44330                            unsigned rm = ExtractDRegister(instr, 5, 0);
44331                            uint32_t imm6 = (instr >> 16) & 0x3f;
44332                            uint32_t imm =
44333                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44334                                imm6;
44335                            // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44336                            vrshr(al, dt, DRegister(rd), DRegister(rm), imm);
44337                            break;
44338                          }
44339                          case 0x00000300: {
44340                            // 0xf2800310
44341                            if (((instr & 0x380080) == 0x0)) {
44342                              UnallocatedA32(instr);
44343                              return;
44344                            }
44345                            DataType dt =
44346                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44347                                                       ((instr >> 4) & 0x8),
44348                                                   (instr >> 24) & 0x1);
44349                            if (dt.Is(kDataTypeValueInvalid)) {
44350                              UnallocatedA32(instr);
44351                              return;
44352                            }
44353                            unsigned rd = ExtractDRegister(instr, 22, 12);
44354                            unsigned rm = ExtractDRegister(instr, 5, 0);
44355                            uint32_t imm6 = (instr >> 16) & 0x3f;
44356                            uint32_t imm =
44357                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44358                                imm6;
44359                            // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44360                            vrsra(al, dt, DRegister(rd), DRegister(rm), imm);
44361                            break;
44362                          }
44363                        }
44364                        break;
44365                      }
44366                    }
44367                    break;
44368                  }
44369                  case 0x00000400: {
44370                    // 0xf2800410
44371                    switch (instr & 0x00380080) {
44372                      case 0x00000000: {
44373                        // 0xf2800410
44374                        switch (instr & 0x00000100) {
44375                          case 0x00000000: {
44376                            // 0xf2800410
44377                            switch (instr & 0x00000200) {
44378                              default: {
44379                                switch (instr & 0x00000020) {
44380                                  case 0x00000020: {
44381                                    // 0xf2800430
44382                                    if (((instr & 0xd00) == 0x100) ||
44383                                        ((instr & 0xd00) == 0x500) ||
44384                                        ((instr & 0xd00) == 0x900) ||
44385                                        ((instr & 0xe00) == 0xe00)) {
44386                                      UnallocatedA32(instr);
44387                                      return;
44388                                    }
44389                                    unsigned cmode = (instr >> 8) & 0xf;
44390                                    DataType dt =
44391                                        ImmediateVmvn::DecodeDt(cmode);
44392                                    if (dt.Is(kDataTypeValueInvalid)) {
44393                                      UnallocatedA32(instr);
44394                                      return;
44395                                    }
44396                                    unsigned rd =
44397                                        ExtractDRegister(instr, 22, 12);
44398                                    DOperand imm =
44399                                        ImmediateVmvn::DecodeImmediate(
44400                                            cmode,
44401                                            (instr & 0xf) |
44402                                                ((instr >> 12) & 0x70) |
44403                                                ((instr >> 17) & 0x80));
44404                                    // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44405                                    vmvn(al, dt, DRegister(rd), imm);
44406                                    break;
44407                                  }
44408                                  default: {
44409                                    if (((instr & 0x920) == 0x100) ||
44410                                        ((instr & 0x520) == 0x100) ||
44411                                        ((instr & 0x820) == 0x20) ||
44412                                        ((instr & 0x420) == 0x20) ||
44413                                        ((instr & 0x220) == 0x20) ||
44414                                        ((instr & 0x120) == 0x120)) {
44415                                      UnallocatedA32(instr);
44416                                      return;
44417                                    }
44418                                    unsigned cmode = ((instr >> 8) & 0xf) |
44419                                                     ((instr >> 1) & 0x10);
44420                                    DataType dt =
44421                                        ImmediateVmov::DecodeDt(cmode);
44422                                    if (dt.Is(kDataTypeValueInvalid)) {
44423                                      UnallocatedA32(instr);
44424                                      return;
44425                                    }
44426                                    unsigned rd =
44427                                        ExtractDRegister(instr, 22, 12);
44428                                    DOperand imm =
44429                                        ImmediateVmov::DecodeImmediate(
44430                                            cmode,
44431                                            (instr & 0xf) |
44432                                                ((instr >> 12) & 0x70) |
44433                                                ((instr >> 17) & 0x80));
44434                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44435                                    vmov(al, dt, DRegister(rd), imm);
44436                                    break;
44437                                  }
44438                                }
44439                                break;
44440                              }
44441                            }
44442                            break;
44443                          }
44444                          case 0x00000100: {
44445                            // 0xf2800510
44446                            switch (instr & 0x00000020) {
44447                              case 0x00000000: {
44448                                // 0xf2800510
44449                                if (((instr & 0x100) == 0x0) ||
44450                                    ((instr & 0xc00) == 0xc00)) {
44451                                  UnallocatedA32(instr);
44452                                  return;
44453                                }
44454                                unsigned cmode = (instr >> 8) & 0xf;
44455                                DataType dt = ImmediateVorr::DecodeDt(cmode);
44456                                if (dt.Is(kDataTypeValueInvalid)) {
44457                                  UnallocatedA32(instr);
44458                                  return;
44459                                }
44460                                unsigned rd = ExtractDRegister(instr, 22, 12);
44461                                DOperand imm = ImmediateVorr::DecodeImmediate(
44462                                    cmode,
44463                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
44464                                        ((instr >> 17) & 0x80));
44465                                // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44466                                vorr(al, dt, DRegister(rd), DRegister(rd), imm);
44467                                break;
44468                              }
44469                              case 0x00000020: {
44470                                // 0xf2800530
44471                                if (((instr & 0x100) == 0x0) ||
44472                                    ((instr & 0xc00) == 0xc00)) {
44473                                  UnallocatedA32(instr);
44474                                  return;
44475                                }
44476                                unsigned cmode = (instr >> 8) & 0xf;
44477                                DataType dt = ImmediateVbic::DecodeDt(cmode);
44478                                if (dt.Is(kDataTypeValueInvalid)) {
44479                                  UnallocatedA32(instr);
44480                                  return;
44481                                }
44482                                unsigned rd = ExtractDRegister(instr, 22, 12);
44483                                DOperand imm = ImmediateVbic::DecodeImmediate(
44484                                    cmode,
44485                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
44486                                        ((instr >> 17) & 0x80));
44487                                // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44488                                vbic(al, dt, DRegister(rd), DRegister(rd), imm);
44489                                break;
44490                              }
44491                            }
44492                            break;
44493                          }
44494                        }
44495                        break;
44496                      }
44497                      default: {
44498                        switch (instr & 0x00000300) {
44499                          case 0x00000000: {
44500                            // 0xf2800410
44501                            if ((instr & 0x01000000) == 0x01000000) {
44502                              if (((instr & 0x380080) == 0x0)) {
44503                                UnallocatedA32(instr);
44504                                return;
44505                              }
44506                              DataType dt = Dt_L_imm6_4_Decode(
44507                                  ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
44508                              if (dt.Is(kDataTypeValueInvalid)) {
44509                                UnallocatedA32(instr);
44510                                return;
44511                              }
44512                              unsigned rd = ExtractDRegister(instr, 22, 12);
44513                              unsigned rm = ExtractDRegister(instr, 5, 0);
44514                              uint32_t imm6 = (instr >> 16) & 0x3f;
44515                              uint32_t imm =
44516                                  (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44517                                  imm6;
44518                              // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
44519                              vsri(al, dt, DRegister(rd), DRegister(rm), imm);
44520                            } else {
44521                              UnallocatedA32(instr);
44522                            }
44523                            break;
44524                          }
44525                          case 0x00000100: {
44526                            // 0xf2800510
44527                            switch (instr & 0x01000000) {
44528                              case 0x00000000: {
44529                                // 0xf2800510
44530                                if (((instr & 0x380080) == 0x0)) {
44531                                  UnallocatedA32(instr);
44532                                  return;
44533                                }
44534                                DataType dt =
44535                                    Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
44536                                                       ((instr >> 4) & 0x8));
44537                                if (dt.Is(kDataTypeValueInvalid)) {
44538                                  UnallocatedA32(instr);
44539                                  return;
44540                                }
44541                                unsigned rd = ExtractDRegister(instr, 22, 12);
44542                                unsigned rm = ExtractDRegister(instr, 5, 0);
44543                                uint32_t imm6 = (instr >> 16) & 0x3f;
44544                                uint32_t imm =
44545                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44546                                // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44547                                vshl(al, dt, DRegister(rd), DRegister(rm), imm);
44548                                break;
44549                              }
44550                              case 0x01000000: {
44551                                // 0xf3800510
44552                                if (((instr & 0x380080) == 0x0)) {
44553                                  UnallocatedA32(instr);
44554                                  return;
44555                                }
44556                                DataType dt =
44557                                    Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
44558                                                       ((instr >> 4) & 0x8));
44559                                if (dt.Is(kDataTypeValueInvalid)) {
44560                                  UnallocatedA32(instr);
44561                                  return;
44562                                }
44563                                unsigned rd = ExtractDRegister(instr, 22, 12);
44564                                unsigned rm = ExtractDRegister(instr, 5, 0);
44565                                uint32_t imm6 = (instr >> 16) & 0x3f;
44566                                uint32_t imm =
44567                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44568                                // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
44569                                vsli(al, dt, DRegister(rd), DRegister(rm), imm);
44570                                break;
44571                              }
44572                            }
44573                            break;
44574                          }
44575                          case 0x00000200: {
44576                            // 0xf2800610
44577                            if (((instr & 0x380080) == 0x0)) {
44578                              UnallocatedA32(instr);
44579                              return;
44580                            }
44581                            DataType dt =
44582                                Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
44583                                                       ((instr >> 4) & 0x8),
44584                                                   (instr >> 24) & 0x1);
44585                            if (dt.Is(kDataTypeValueInvalid)) {
44586                              UnallocatedA32(instr);
44587                              return;
44588                            }
44589                            unsigned rd = ExtractDRegister(instr, 22, 12);
44590                            unsigned rm = ExtractDRegister(instr, 5, 0);
44591                            uint32_t imm6 = (instr >> 16) & 0x3f;
44592                            uint32_t imm =
44593                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44594                            // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44595                            vqshlu(al, dt, DRegister(rd), DRegister(rm), imm);
44596                            break;
44597                          }
44598                          case 0x00000300: {
44599                            // 0xf2800710
44600                            if (((instr & 0x380080) == 0x0)) {
44601                              UnallocatedA32(instr);
44602                              return;
44603                            }
44604                            DataType dt =
44605                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44606                                                       ((instr >> 4) & 0x8),
44607                                                   (instr >> 24) & 0x1);
44608                            if (dt.Is(kDataTypeValueInvalid)) {
44609                              UnallocatedA32(instr);
44610                              return;
44611                            }
44612                            unsigned rd = ExtractDRegister(instr, 22, 12);
44613                            unsigned rm = ExtractDRegister(instr, 5, 0);
44614                            uint32_t imm6 = (instr >> 16) & 0x3f;
44615                            uint32_t imm =
44616                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44617                            // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44618                            vqshl(al, dt, DRegister(rd), DRegister(rm), imm);
44619                            break;
44620                          }
44621                        }
44622                        break;
44623                      }
44624                    }
44625                    break;
44626                  }
44627                  case 0x00000800: {
44628                    // 0xf2800810
44629                    switch (instr & 0x00000080) {
44630                      case 0x00000000: {
44631                        // 0xf2800810
44632                        switch (instr & 0x00380000) {
44633                          case 0x00000000: {
44634                            // 0xf2800810
44635                            switch (instr & 0x00000100) {
44636                              case 0x00000000: {
44637                                // 0xf2800810
44638                                switch (instr & 0x00000200) {
44639                                  default: {
44640                                    switch (instr & 0x00000020) {
44641                                      case 0x00000020: {
44642                                        // 0xf2800830
44643                                        if (((instr & 0xd00) == 0x100) ||
44644                                            ((instr & 0xd00) == 0x500) ||
44645                                            ((instr & 0xd00) == 0x900) ||
44646                                            ((instr & 0xe00) == 0xe00)) {
44647                                          UnallocatedA32(instr);
44648                                          return;
44649                                        }
44650                                        unsigned cmode = (instr >> 8) & 0xf;
44651                                        DataType dt =
44652                                            ImmediateVmvn::DecodeDt(cmode);
44653                                        if (dt.Is(kDataTypeValueInvalid)) {
44654                                          UnallocatedA32(instr);
44655                                          return;
44656                                        }
44657                                        unsigned rd =
44658                                            ExtractDRegister(instr, 22, 12);
44659                                        DOperand imm =
44660                                            ImmediateVmvn::DecodeImmediate(
44661                                                cmode,
44662                                                (instr & 0xf) |
44663                                                    ((instr >> 12) & 0x70) |
44664                                                    ((instr >> 17) & 0x80));
44665                                        // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44666                                        vmvn(al, dt, DRegister(rd), imm);
44667                                        break;
44668                                      }
44669                                      default: {
44670                                        if (((instr & 0x920) == 0x100) ||
44671                                            ((instr & 0x520) == 0x100) ||
44672                                            ((instr & 0x820) == 0x20) ||
44673                                            ((instr & 0x420) == 0x20) ||
44674                                            ((instr & 0x220) == 0x20) ||
44675                                            ((instr & 0x120) == 0x120)) {
44676                                          UnallocatedA32(instr);
44677                                          return;
44678                                        }
44679                                        unsigned cmode = ((instr >> 8) & 0xf) |
44680                                                         ((instr >> 1) & 0x10);
44681                                        DataType dt =
44682                                            ImmediateVmov::DecodeDt(cmode);
44683                                        if (dt.Is(kDataTypeValueInvalid)) {
44684                                          UnallocatedA32(instr);
44685                                          return;
44686                                        }
44687                                        unsigned rd =
44688                                            ExtractDRegister(instr, 22, 12);
44689                                        DOperand imm =
44690                                            ImmediateVmov::DecodeImmediate(
44691                                                cmode,
44692                                                (instr & 0xf) |
44693                                                    ((instr >> 12) & 0x70) |
44694                                                    ((instr >> 17) & 0x80));
44695                                        // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44696                                        vmov(al, dt, DRegister(rd), imm);
44697                                        break;
44698                                      }
44699                                    }
44700                                    break;
44701                                  }
44702                                }
44703                                break;
44704                              }
44705                              case 0x00000100: {
44706                                // 0xf2800910
44707                                switch (instr & 0x00000020) {
44708                                  case 0x00000000: {
44709                                    // 0xf2800910
44710                                    if (((instr & 0x100) == 0x0) ||
44711                                        ((instr & 0xc00) == 0xc00)) {
44712                                      UnallocatedA32(instr);
44713                                      return;
44714                                    }
44715                                    unsigned cmode = (instr >> 8) & 0xf;
44716                                    DataType dt =
44717                                        ImmediateVorr::DecodeDt(cmode);
44718                                    if (dt.Is(kDataTypeValueInvalid)) {
44719                                      UnallocatedA32(instr);
44720                                      return;
44721                                    }
44722                                    unsigned rd =
44723                                        ExtractDRegister(instr, 22, 12);
44724                                    DOperand imm =
44725                                        ImmediateVorr::DecodeImmediate(
44726                                            cmode,
44727                                            (instr & 0xf) |
44728                                                ((instr >> 12) & 0x70) |
44729                                                ((instr >> 17) & 0x80));
44730                                    // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44731                                    vorr(al,
44732                                         dt,
44733                                         DRegister(rd),
44734                                         DRegister(rd),
44735                                         imm);
44736                                    break;
44737                                  }
44738                                  case 0x00000020: {
44739                                    // 0xf2800930
44740                                    if (((instr & 0x100) == 0x0) ||
44741                                        ((instr & 0xc00) == 0xc00)) {
44742                                      UnallocatedA32(instr);
44743                                      return;
44744                                    }
44745                                    unsigned cmode = (instr >> 8) & 0xf;
44746                                    DataType dt =
44747                                        ImmediateVbic::DecodeDt(cmode);
44748                                    if (dt.Is(kDataTypeValueInvalid)) {
44749                                      UnallocatedA32(instr);
44750                                      return;
44751                                    }
44752                                    unsigned rd =
44753                                        ExtractDRegister(instr, 22, 12);
44754                                    DOperand imm =
44755                                        ImmediateVbic::DecodeImmediate(
44756                                            cmode,
44757                                            (instr & 0xf) |
44758                                                ((instr >> 12) & 0x70) |
44759                                                ((instr >> 17) & 0x80));
44760                                    // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44761                                    vbic(al,
44762                                         dt,
44763                                         DRegister(rd),
44764                                         DRegister(rd),
44765                                         imm);
44766                                    break;
44767                                  }
44768                                }
44769                                break;
44770                              }
44771                            }
44772                            break;
44773                          }
44774                          case 0x00180000: {
44775                            // 0xf2980810
44776                            switch (instr & 0x00000300) {
44777                              case 0x00000000: {
44778                                // 0xf2980810
44779                                switch (instr & 0x01000000) {
44780                                  case 0x00000000: {
44781                                    // 0xf2980810
44782                                    if (((instr & 0x380000) == 0x0)) {
44783                                      UnallocatedA32(instr);
44784                                      return;
44785                                    }
44786                                    DataType dt =
44787                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
44788                                    if (dt.Is(kDataTypeValueInvalid)) {
44789                                      UnallocatedA32(instr);
44790                                      return;
44791                                    }
44792                                    unsigned rd =
44793                                        ExtractDRegister(instr, 22, 12);
44794                                    if ((instr & 1) != 0) {
44795                                      UnallocatedA32(instr);
44796                                      return;
44797                                    }
44798                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44799                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44800                                    uint32_t imm = dt.GetSize() - imm6;
44801                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44802                                    vshrn(al,
44803                                          dt,
44804                                          DRegister(rd),
44805                                          QRegister(rm),
44806                                          imm);
44807                                    break;
44808                                  }
44809                                  case 0x01000000: {
44810                                    // 0xf3980810
44811                                    if (((instr & 0x380000) == 0x0)) {
44812                                      UnallocatedA32(instr);
44813                                      return;
44814                                    }
44815                                    DataType dt =
44816                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
44817                                                         (instr >> 24) & 0x1);
44818                                    if (dt.Is(kDataTypeValueInvalid)) {
44819                                      UnallocatedA32(instr);
44820                                      return;
44821                                    }
44822                                    unsigned rd =
44823                                        ExtractDRegister(instr, 22, 12);
44824                                    if ((instr & 1) != 0) {
44825                                      UnallocatedA32(instr);
44826                                      return;
44827                                    }
44828                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44829                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44830                                    uint32_t imm = dt.GetSize() - imm6;
44831                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44832                                    vqshrun(al,
44833                                            dt,
44834                                            DRegister(rd),
44835                                            QRegister(rm),
44836                                            imm);
44837                                    break;
44838                                  }
44839                                }
44840                                break;
44841                              }
44842                              case 0x00000100: {
44843                                // 0xf2980910
44844                                if (((instr & 0x380000) == 0x0)) {
44845                                  UnallocatedA32(instr);
44846                                  return;
44847                                }
44848                                DataType dt =
44849                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
44850                                                     (instr >> 24) & 0x1);
44851                                if (dt.Is(kDataTypeValueInvalid)) {
44852                                  UnallocatedA32(instr);
44853                                  return;
44854                                }
44855                                unsigned rd = ExtractDRegister(instr, 22, 12);
44856                                if ((instr & 1) != 0) {
44857                                  UnallocatedA32(instr);
44858                                  return;
44859                                }
44860                                unsigned rm = ExtractQRegister(instr, 5, 0);
44861                                uint32_t imm6 = (instr >> 16) & 0x3f;
44862                                uint32_t imm = dt.GetSize() - imm6;
44863                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44864                                vqshrn(al,
44865                                       dt,
44866                                       DRegister(rd),
44867                                       QRegister(rm),
44868                                       imm);
44869                                break;
44870                              }
44871                              case 0x00000200: {
44872                                // 0xf2980a10
44873                                if (((instr & 0x380000) == 0x0) ||
44874                                    ((instr & 0x3f0000) == 0x80000) ||
44875                                    ((instr & 0x3f0000) == 0x100000) ||
44876                                    ((instr & 0x3f0000) == 0x200000)) {
44877                                  UnallocatedA32(instr);
44878                                  return;
44879                                }
44880                                DataType dt =
44881                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
44882                                                     (instr >> 24) & 0x1);
44883                                if (dt.Is(kDataTypeValueInvalid)) {
44884                                  UnallocatedA32(instr);
44885                                  return;
44886                                }
44887                                if (((instr >> 12) & 1) != 0) {
44888                                  UnallocatedA32(instr);
44889                                  return;
44890                                }
44891                                unsigned rd = ExtractQRegister(instr, 22, 12);
44892                                unsigned rm = ExtractDRegister(instr, 5, 0);
44893                                uint32_t imm6 = (instr >> 16) & 0x3f;
44894                                uint32_t imm = imm6 - dt.GetSize();
44895                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44896                                vshll(al,
44897                                      dt,
44898                                      QRegister(rd),
44899                                      DRegister(rm),
44900                                      imm);
44901                                break;
44902                              }
44903                              default:
44904                                UnallocatedA32(instr);
44905                                break;
44906                            }
44907                            break;
44908                          }
44909                          case 0x00280000: {
44910                            // 0xf2a80810
44911                            switch (instr & 0x00000300) {
44912                              case 0x00000000: {
44913                                // 0xf2a80810
44914                                switch (instr & 0x01000000) {
44915                                  case 0x00000000: {
44916                                    // 0xf2a80810
44917                                    if (((instr & 0x380000) == 0x0)) {
44918                                      UnallocatedA32(instr);
44919                                      return;
44920                                    }
44921                                    DataType dt =
44922                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
44923                                    if (dt.Is(kDataTypeValueInvalid)) {
44924                                      UnallocatedA32(instr);
44925                                      return;
44926                                    }
44927                                    unsigned rd =
44928                                        ExtractDRegister(instr, 22, 12);
44929                                    if ((instr & 1) != 0) {
44930                                      UnallocatedA32(instr);
44931                                      return;
44932                                    }
44933                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44934                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44935                                    uint32_t imm = dt.GetSize() - imm6;
44936                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44937                                    vshrn(al,
44938                                          dt,
44939                                          DRegister(rd),
44940                                          QRegister(rm),
44941                                          imm);
44942                                    break;
44943                                  }
44944                                  case 0x01000000: {
44945                                    // 0xf3a80810
44946                                    if (((instr & 0x380000) == 0x0)) {
44947                                      UnallocatedA32(instr);
44948                                      return;
44949                                    }
44950                                    DataType dt =
44951                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
44952                                                         (instr >> 24) & 0x1);
44953                                    if (dt.Is(kDataTypeValueInvalid)) {
44954                                      UnallocatedA32(instr);
44955                                      return;
44956                                    }
44957                                    unsigned rd =
44958                                        ExtractDRegister(instr, 22, 12);
44959                                    if ((instr & 1) != 0) {
44960                                      UnallocatedA32(instr);
44961                                      return;
44962                                    }
44963                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44964                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44965                                    uint32_t imm = dt.GetSize() - imm6;
44966                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44967                                    vqshrun(al,
44968                                            dt,
44969                                            DRegister(rd),
44970                                            QRegister(rm),
44971                                            imm);
44972                                    break;
44973                                  }
44974                                }
44975                                break;
44976                              }
44977                              case 0x00000100: {
44978                                // 0xf2a80910
44979                                if (((instr & 0x380000) == 0x0)) {
44980                                  UnallocatedA32(instr);
44981                                  return;
44982                                }
44983                                DataType dt =
44984                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
44985                                                     (instr >> 24) & 0x1);
44986                                if (dt.Is(kDataTypeValueInvalid)) {
44987                                  UnallocatedA32(instr);
44988                                  return;
44989                                }
44990                                unsigned rd = ExtractDRegister(instr, 22, 12);
44991                                if ((instr & 1) != 0) {
44992                                  UnallocatedA32(instr);
44993                                  return;
44994                                }
44995                                unsigned rm = ExtractQRegister(instr, 5, 0);
44996                                uint32_t imm6 = (instr >> 16) & 0x3f;
44997                                uint32_t imm = dt.GetSize() - imm6;
44998                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44999                                vqshrn(al,
45000                                       dt,
45001                                       DRegister(rd),
45002                                       QRegister(rm),
45003                                       imm);
45004                                break;
45005                              }
45006                              case 0x00000200: {
45007                                // 0xf2a80a10
45008                                if (((instr & 0x380000) == 0x0) ||
45009                                    ((instr & 0x3f0000) == 0x80000) ||
45010                                    ((instr & 0x3f0000) == 0x100000) ||
45011                                    ((instr & 0x3f0000) == 0x200000)) {
45012                                  UnallocatedA32(instr);
45013                                  return;
45014                                }
45015                                DataType dt =
45016                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
45017                                                     (instr >> 24) & 0x1);
45018                                if (dt.Is(kDataTypeValueInvalid)) {
45019                                  UnallocatedA32(instr);
45020                                  return;
45021                                }
45022                                if (((instr >> 12) & 1) != 0) {
45023                                  UnallocatedA32(instr);
45024                                  return;
45025                                }
45026                                unsigned rd = ExtractQRegister(instr, 22, 12);
45027                                unsigned rm = ExtractDRegister(instr, 5, 0);
45028                                uint32_t imm6 = (instr >> 16) & 0x3f;
45029                                uint32_t imm = imm6 - dt.GetSize();
45030                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45031                                vshll(al,
45032                                      dt,
45033                                      QRegister(rd),
45034                                      DRegister(rm),
45035                                      imm);
45036                                break;
45037                              }
45038                              default:
45039                                UnallocatedA32(instr);
45040                                break;
45041                            }
45042                            break;
45043                          }
45044                          case 0x00300000: {
45045                            // 0xf2b00810
45046                            switch (instr & 0x00000300) {
45047                              case 0x00000000: {
45048                                // 0xf2b00810
45049                                switch (instr & 0x01000000) {
45050                                  case 0x00000000: {
45051                                    // 0xf2b00810
45052                                    if (((instr & 0x380000) == 0x0)) {
45053                                      UnallocatedA32(instr);
45054                                      return;
45055                                    }
45056                                    DataType dt =
45057                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
45058                                    if (dt.Is(kDataTypeValueInvalid)) {
45059                                      UnallocatedA32(instr);
45060                                      return;
45061                                    }
45062                                    unsigned rd =
45063                                        ExtractDRegister(instr, 22, 12);
45064                                    if ((instr & 1) != 0) {
45065                                      UnallocatedA32(instr);
45066                                      return;
45067                                    }
45068                                    unsigned rm = ExtractQRegister(instr, 5, 0);
45069                                    uint32_t imm6 = (instr >> 16) & 0x3f;
45070                                    uint32_t imm = dt.GetSize() - imm6;
45071                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45072                                    vshrn(al,
45073                                          dt,
45074                                          DRegister(rd),
45075                                          QRegister(rm),
45076                                          imm);
45077                                    break;
45078                                  }
45079                                  case 0x01000000: {
45080                                    // 0xf3b00810
45081                                    if (((instr & 0x380000) == 0x0)) {
45082                                      UnallocatedA32(instr);
45083                                      return;
45084                                    }
45085                                    DataType dt =
45086                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
45087                                                         (instr >> 24) & 0x1);
45088                                    if (dt.Is(kDataTypeValueInvalid)) {
45089                                      UnallocatedA32(instr);
45090                                      return;
45091                                    }
45092                                    unsigned rd =
45093                                        ExtractDRegister(instr, 22, 12);
45094                                    if ((instr & 1) != 0) {
45095                                      UnallocatedA32(instr);
45096                                      return;
45097                                    }
45098                                    unsigned rm = ExtractQRegister(instr, 5, 0);
45099                                    uint32_t imm6 = (instr >> 16) & 0x3f;
45100                                    uint32_t imm = dt.GetSize() - imm6;
45101                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45102                                    vqshrun(al,
45103                                            dt,
45104                                            DRegister(rd),
45105                                            QRegister(rm),
45106                                            imm);
45107                                    break;
45108                                  }
45109                                }
45110                                break;
45111                              }
45112                              case 0x00000100: {
45113                                // 0xf2b00910
45114                                if (((instr & 0x380000) == 0x0)) {
45115                                  UnallocatedA32(instr);
45116                                  return;
45117                                }
45118                                DataType dt =
45119                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
45120                                                     (instr >> 24) & 0x1);
45121                                if (dt.Is(kDataTypeValueInvalid)) {
45122                                  UnallocatedA32(instr);
45123                                  return;
45124                                }
45125                                unsigned rd = ExtractDRegister(instr, 22, 12);
45126                                if ((instr & 1) != 0) {
45127                                  UnallocatedA32(instr);
45128                                  return;
45129                                }
45130                                unsigned rm = ExtractQRegister(instr, 5, 0);
45131                                uint32_t imm6 = (instr >> 16) & 0x3f;
45132                                uint32_t imm = dt.GetSize() - imm6;
45133                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45134                                vqshrn(al,
45135                                       dt,
45136                                       DRegister(rd),
45137                                       QRegister(rm),
45138                                       imm);
45139                                break;
45140                              }
45141                              case 0x00000200: {
45142                                // 0xf2b00a10
45143                                if (((instr & 0x380000) == 0x0) ||
45144                                    ((instr & 0x3f0000) == 0x80000) ||
45145                                    ((instr & 0x3f0000) == 0x100000) ||
45146                                    ((instr & 0x3f0000) == 0x200000)) {
45147                                  UnallocatedA32(instr);
45148                                  return;
45149                                }
45150                                DataType dt =
45151                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
45152                                                     (instr >> 24) & 0x1);
45153                                if (dt.Is(kDataTypeValueInvalid)) {
45154                                  UnallocatedA32(instr);
45155                                  return;
45156                                }
45157                                if (((instr >> 12) & 1) != 0) {
45158                                  UnallocatedA32(instr);
45159                                  return;
45160                                }
45161                                unsigned rd = ExtractQRegister(instr, 22, 12);
45162                                unsigned rm = ExtractDRegister(instr, 5, 0);
45163                                uint32_t imm6 = (instr >> 16) & 0x3f;
45164                                uint32_t imm = imm6 - dt.GetSize();
45165                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45166                                vshll(al,
45167                                      dt,
45168                                      QRegister(rd),
45169                                      DRegister(rm),
45170                                      imm);
45171                                break;
45172                              }
45173                              default:
45174                                UnallocatedA32(instr);
45175                                break;
45176                            }
45177                            break;
45178                          }
45179                          case 0x00380000: {
45180                            // 0xf2b80810
45181                            switch (instr & 0x00000300) {
45182                              case 0x00000000: {
45183                                // 0xf2b80810
45184                                switch (instr & 0x01000000) {
45185                                  case 0x00000000: {
45186                                    // 0xf2b80810
45187                                    if (((instr & 0x380000) == 0x0)) {
45188                                      UnallocatedA32(instr);
45189                                      return;
45190                                    }
45191                                    DataType dt =
45192                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
45193                                    if (dt.Is(kDataTypeValueInvalid)) {
45194                                      UnallocatedA32(instr);
45195                                      return;
45196                                    }
45197                                    unsigned rd =
45198                                        ExtractDRegister(instr, 22, 12);
45199                                    if ((instr & 1) != 0) {
45200                                      UnallocatedA32(instr);
45201                                      return;
45202                                    }
45203                                    unsigned rm = ExtractQRegister(instr, 5, 0);
45204                                    uint32_t imm6 = (instr >> 16) & 0x3f;
45205                                    uint32_t imm = dt.GetSize() - imm6;
45206                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45207                                    vshrn(al,
45208                                          dt,
45209                                          DRegister(rd),
45210                                          QRegister(rm),
45211                                          imm);
45212                                    break;
45213                                  }
45214                                  case 0x01000000: {
45215                                    // 0xf3b80810
45216                                    if (((instr & 0x380000) == 0x0)) {
45217                                      UnallocatedA32(instr);
45218                                      return;
45219                                    }
45220                                    DataType dt =
45221                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
45222                                                         (instr >> 24) & 0x1);
45223                                    if (dt.Is(kDataTypeValueInvalid)) {
45224                                      UnallocatedA32(instr);
45225                                      return;
45226                                    }
45227                                    unsigned rd =
45228                                        ExtractDRegister(instr, 22, 12);
45229                                    if ((instr & 1) != 0) {
45230                                      UnallocatedA32(instr);
45231                                      return;
45232                                    }
45233                                    unsigned rm = ExtractQRegister(instr, 5, 0);
45234                                    uint32_t imm6 = (instr >> 16) & 0x3f;
45235                                    uint32_t imm = dt.GetSize() - imm6;
45236                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45237                                    vqshrun(al,
45238                                            dt,
45239                                            DRegister(rd),
45240                                            QRegister(rm),
45241                                            imm);
45242                                    break;
45243                                  }
45244                                }
45245                                break;
45246                              }
45247                              case 0x00000100: {
45248                                // 0xf2b80910
45249                                if (((instr & 0x380000) == 0x0)) {
45250                                  UnallocatedA32(instr);
45251                                  return;
45252                                }
45253                                DataType dt =
45254                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
45255                                                     (instr >> 24) & 0x1);
45256                                if (dt.Is(kDataTypeValueInvalid)) {
45257                                  UnallocatedA32(instr);
45258                                  return;
45259                                }
45260                                unsigned rd = ExtractDRegister(instr, 22, 12);
45261                                if ((instr & 1) != 0) {
45262                                  UnallocatedA32(instr);
45263                                  return;
45264                                }
45265                                unsigned rm = ExtractQRegister(instr, 5, 0);
45266                                uint32_t imm6 = (instr >> 16) & 0x3f;
45267                                uint32_t imm = dt.GetSize() - imm6;
45268                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45269                                vqshrn(al,
45270                                       dt,
45271                                       DRegister(rd),
45272                                       QRegister(rm),
45273                                       imm);
45274                                break;
45275                              }
45276                              case 0x00000200: {
45277                                // 0xf2b80a10
45278                                if (((instr & 0x380000) == 0x0) ||
45279                                    ((instr & 0x3f0000) == 0x80000) ||
45280                                    ((instr & 0x3f0000) == 0x100000) ||
45281                                    ((instr & 0x3f0000) == 0x200000)) {
45282                                  UnallocatedA32(instr);
45283                                  return;
45284                                }
45285                                DataType dt =
45286                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
45287                                                     (instr >> 24) & 0x1);
45288                                if (dt.Is(kDataTypeValueInvalid)) {
45289                                  UnallocatedA32(instr);
45290                                  return;
45291                                }
45292                                if (((instr >> 12) & 1) != 0) {
45293                                  UnallocatedA32(instr);
45294                                  return;
45295                                }
45296                                unsigned rd = ExtractQRegister(instr, 22, 12);
45297                                unsigned rm = ExtractDRegister(instr, 5, 0);
45298                                uint32_t imm6 = (instr >> 16) & 0x3f;
45299                                uint32_t imm = imm6 - dt.GetSize();
45300                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45301                                vshll(al,
45302                                      dt,
45303                                      QRegister(rd),
45304                                      DRegister(rm),
45305                                      imm);
45306                                break;
45307                              }
45308                              default:
45309                                UnallocatedA32(instr);
45310                                break;
45311                            }
45312                            break;
45313                          }
45314                          default: {
45315                            switch (instr & 0x00000300) {
45316                              case 0x00000000: {
45317                                // 0xf2800810
45318                                switch (instr & 0x01000000) {
45319                                  case 0x00000000: {
45320                                    // 0xf2800810
45321                                    if (((instr & 0x380000) == 0x0)) {
45322                                      UnallocatedA32(instr);
45323                                      return;
45324                                    }
45325                                    DataType dt =
45326                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
45327                                    if (dt.Is(kDataTypeValueInvalid)) {
45328                                      UnallocatedA32(instr);
45329                                      return;
45330                                    }
45331                                    unsigned rd =
45332                                        ExtractDRegister(instr, 22, 12);
45333                                    if ((instr & 1) != 0) {
45334                                      UnallocatedA32(instr);
45335                                      return;
45336                                    }
45337                                    unsigned rm = ExtractQRegister(instr, 5, 0);
45338                                    uint32_t imm6 = (instr >> 16) & 0x3f;
45339                                    uint32_t imm = dt.GetSize() - imm6;
45340                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45341                                    vshrn(al,
45342                                          dt,
45343                                          DRegister(rd),
45344                                          QRegister(rm),
45345                                          imm);
45346                                    break;
45347                                  }
45348                                  case 0x01000000: {
45349                                    // 0xf3800810
45350                                    if (((instr & 0x380000) == 0x0)) {
45351                                      UnallocatedA32(instr);
45352                                      return;
45353                                    }
45354                                    DataType dt =
45355                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
45356                                                         (instr >> 24) & 0x1);
45357                                    if (dt.Is(kDataTypeValueInvalid)) {
45358                                      UnallocatedA32(instr);
45359                                      return;
45360                                    }
45361                                    unsigned rd =
45362                                        ExtractDRegister(instr, 22, 12);
45363                                    if ((instr & 1) != 0) {
45364                                      UnallocatedA32(instr);
45365                                      return;
45366                                    }
45367                                    unsigned rm = ExtractQRegister(instr, 5, 0);
45368                                    uint32_t imm6 = (instr >> 16) & 0x3f;
45369                                    uint32_t imm = dt.GetSize() - imm6;
45370                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45371                                    vqshrun(al,
45372                                            dt,
45373                                            DRegister(rd),
45374                                            QRegister(rm),
45375                                            imm);
45376                                    break;
45377                                  }
45378                                }
45379                                break;
45380                              }
45381                              case 0x00000100: {
45382                                // 0xf2800910
45383                                if (((instr & 0x380000) == 0x0)) {
45384                                  UnallocatedA32(instr);
45385                                  return;
45386                                }
45387                                DataType dt =
45388                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
45389                                                     (instr >> 24) & 0x1);
45390                                if (dt.Is(kDataTypeValueInvalid)) {
45391                                  UnallocatedA32(instr);
45392                                  return;
45393                                }
45394                                unsigned rd = ExtractDRegister(instr, 22, 12);
45395                                if ((instr & 1) != 0) {
45396                                  UnallocatedA32(instr);
45397                                  return;
45398                                }
45399                                unsigned rm = ExtractQRegister(instr, 5, 0);
45400                                uint32_t imm6 = (instr >> 16) & 0x3f;
45401                                uint32_t imm = dt.GetSize() - imm6;
45402                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45403                                vqshrn(al,
45404                                       dt,
45405                                       DRegister(rd),
45406                                       QRegister(rm),
45407                                       imm);
45408                                break;
45409                              }
45410                              case 0x00000200: {
45411                                // 0xf2800a10
45412                                switch (instr & 0x00070000) {
45413                                  case 0x00000000: {
45414                                    // 0xf2800a10
45415                                    switch (instr & 0x003f0000) {
45416                                      case 0x00080000: {
45417                                        // 0xf2880a10
45418                                        if (((instr & 0x380000) == 0x0) ||
45419                                            ((instr & 0x380000) == 0x180000) ||
45420                                            ((instr & 0x380000) == 0x280000) ||
45421                                            ((instr & 0x380000) == 0x300000) ||
45422                                            ((instr & 0x380000) == 0x380000)) {
45423                                          UnallocatedA32(instr);
45424                                          return;
45425                                        }
45426                                        DataType dt = Dt_U_imm3H_1_Decode(
45427                                            ((instr >> 19) & 0x7) |
45428                                            ((instr >> 21) & 0x8));
45429                                        if (dt.Is(kDataTypeValueInvalid)) {
45430                                          UnallocatedA32(instr);
45431                                          return;
45432                                        }
45433                                        if (((instr >> 12) & 1) != 0) {
45434                                          UnallocatedA32(instr);
45435                                          return;
45436                                        }
45437                                        unsigned rd =
45438                                            ExtractQRegister(instr, 22, 12);
45439                                        unsigned rm =
45440                                            ExtractDRegister(instr, 5, 0);
45441                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
45442                                        vmovl(al,
45443                                              dt,
45444                                              QRegister(rd),
45445                                              DRegister(rm));
45446                                        break;
45447                                      }
45448                                      case 0x00090000: {
45449                                        // 0xf2890a10
45450                                        if (((instr & 0x380000) == 0x0) ||
45451                                            ((instr & 0x3f0000) == 0x80000) ||
45452                                            ((instr & 0x3f0000) == 0x100000) ||
45453                                            ((instr & 0x3f0000) == 0x200000)) {
45454                                          UnallocatedA32(instr);
45455                                          return;
45456                                        }
45457                                        DataType dt =
45458                                            Dt_imm6_4_Decode((instr >> 19) &
45459                                                                 0x7,
45460                                                             (instr >> 24) &
45461                                                                 0x1);
45462                                        if (dt.Is(kDataTypeValueInvalid)) {
45463                                          UnallocatedA32(instr);
45464                                          return;
45465                                        }
45466                                        if (((instr >> 12) & 1) != 0) {
45467                                          UnallocatedA32(instr);
45468                                          return;
45469                                        }
45470                                        unsigned rd =
45471                                            ExtractQRegister(instr, 22, 12);
45472                                        unsigned rm =
45473                                            ExtractDRegister(instr, 5, 0);
45474                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45475                                        uint32_t imm = imm6 - dt.GetSize();
45476                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45477                                        vshll(al,
45478                                              dt,
45479                                              QRegister(rd),
45480                                              DRegister(rm),
45481                                              imm);
45482                                        break;
45483                                      }
45484                                      case 0x000a0000: {
45485                                        // 0xf28a0a10
45486                                        if (((instr & 0x380000) == 0x0) ||
45487                                            ((instr & 0x3f0000) == 0x80000) ||
45488                                            ((instr & 0x3f0000) == 0x100000) ||
45489                                            ((instr & 0x3f0000) == 0x200000)) {
45490                                          UnallocatedA32(instr);
45491                                          return;
45492                                        }
45493                                        DataType dt =
45494                                            Dt_imm6_4_Decode((instr >> 19) &
45495                                                                 0x7,
45496                                                             (instr >> 24) &
45497                                                                 0x1);
45498                                        if (dt.Is(kDataTypeValueInvalid)) {
45499                                          UnallocatedA32(instr);
45500                                          return;
45501                                        }
45502                                        if (((instr >> 12) & 1) != 0) {
45503                                          UnallocatedA32(instr);
45504                                          return;
45505                                        }
45506                                        unsigned rd =
45507                                            ExtractQRegister(instr, 22, 12);
45508                                        unsigned rm =
45509                                            ExtractDRegister(instr, 5, 0);
45510                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45511                                        uint32_t imm = imm6 - dt.GetSize();
45512                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45513                                        vshll(al,
45514                                              dt,
45515                                              QRegister(rd),
45516                                              DRegister(rm),
45517                                              imm);
45518                                        break;
45519                                      }
45520                                      case 0x000b0000: {
45521                                        // 0xf28b0a10
45522                                        if (((instr & 0x380000) == 0x0) ||
45523                                            ((instr & 0x3f0000) == 0x80000) ||
45524                                            ((instr & 0x3f0000) == 0x100000) ||
45525                                            ((instr & 0x3f0000) == 0x200000)) {
45526                                          UnallocatedA32(instr);
45527                                          return;
45528                                        }
45529                                        DataType dt =
45530                                            Dt_imm6_4_Decode((instr >> 19) &
45531                                                                 0x7,
45532                                                             (instr >> 24) &
45533                                                                 0x1);
45534                                        if (dt.Is(kDataTypeValueInvalid)) {
45535                                          UnallocatedA32(instr);
45536                                          return;
45537                                        }
45538                                        if (((instr >> 12) & 1) != 0) {
45539                                          UnallocatedA32(instr);
45540                                          return;
45541                                        }
45542                                        unsigned rd =
45543                                            ExtractQRegister(instr, 22, 12);
45544                                        unsigned rm =
45545                                            ExtractDRegister(instr, 5, 0);
45546                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45547                                        uint32_t imm = imm6 - dt.GetSize();
45548                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45549                                        vshll(al,
45550                                              dt,
45551                                              QRegister(rd),
45552                                              DRegister(rm),
45553                                              imm);
45554                                        break;
45555                                      }
45556                                      case 0x000c0000: {
45557                                        // 0xf28c0a10
45558                                        if (((instr & 0x380000) == 0x0) ||
45559                                            ((instr & 0x3f0000) == 0x80000) ||
45560                                            ((instr & 0x3f0000) == 0x100000) ||
45561                                            ((instr & 0x3f0000) == 0x200000)) {
45562                                          UnallocatedA32(instr);
45563                                          return;
45564                                        }
45565                                        DataType dt =
45566                                            Dt_imm6_4_Decode((instr >> 19) &
45567                                                                 0x7,
45568                                                             (instr >> 24) &
45569                                                                 0x1);
45570                                        if (dt.Is(kDataTypeValueInvalid)) {
45571                                          UnallocatedA32(instr);
45572                                          return;
45573                                        }
45574                                        if (((instr >> 12) & 1) != 0) {
45575                                          UnallocatedA32(instr);
45576                                          return;
45577                                        }
45578                                        unsigned rd =
45579                                            ExtractQRegister(instr, 22, 12);
45580                                        unsigned rm =
45581                                            ExtractDRegister(instr, 5, 0);
45582                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45583                                        uint32_t imm = imm6 - dt.GetSize();
45584                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45585                                        vshll(al,
45586                                              dt,
45587                                              QRegister(rd),
45588                                              DRegister(rm),
45589                                              imm);
45590                                        break;
45591                                      }
45592                                      case 0x000d0000: {
45593                                        // 0xf28d0a10
45594                                        if (((instr & 0x380000) == 0x0) ||
45595                                            ((instr & 0x3f0000) == 0x80000) ||
45596                                            ((instr & 0x3f0000) == 0x100000) ||
45597                                            ((instr & 0x3f0000) == 0x200000)) {
45598                                          UnallocatedA32(instr);
45599                                          return;
45600                                        }
45601                                        DataType dt =
45602                                            Dt_imm6_4_Decode((instr >> 19) &
45603                                                                 0x7,
45604                                                             (instr >> 24) &
45605                                                                 0x1);
45606                                        if (dt.Is(kDataTypeValueInvalid)) {
45607                                          UnallocatedA32(instr);
45608                                          return;
45609                                        }
45610                                        if (((instr >> 12) & 1) != 0) {
45611                                          UnallocatedA32(instr);
45612                                          return;
45613                                        }
45614                                        unsigned rd =
45615                                            ExtractQRegister(instr, 22, 12);
45616                                        unsigned rm =
45617                                            ExtractDRegister(instr, 5, 0);
45618                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45619                                        uint32_t imm = imm6 - dt.GetSize();
45620                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45621                                        vshll(al,
45622                                              dt,
45623                                              QRegister(rd),
45624                                              DRegister(rm),
45625                                              imm);
45626                                        break;
45627                                      }
45628                                      case 0x000e0000: {
45629                                        // 0xf28e0a10
45630                                        if (((instr & 0x380000) == 0x0) ||
45631                                            ((instr & 0x3f0000) == 0x80000) ||
45632                                            ((instr & 0x3f0000) == 0x100000) ||
45633                                            ((instr & 0x3f0000) == 0x200000)) {
45634                                          UnallocatedA32(instr);
45635                                          return;
45636                                        }
45637                                        DataType dt =
45638                                            Dt_imm6_4_Decode((instr >> 19) &
45639                                                                 0x7,
45640                                                             (instr >> 24) &
45641                                                                 0x1);
45642                                        if (dt.Is(kDataTypeValueInvalid)) {
45643                                          UnallocatedA32(instr);
45644                                          return;
45645                                        }
45646                                        if (((instr >> 12) & 1) != 0) {
45647                                          UnallocatedA32(instr);
45648                                          return;
45649                                        }
45650                                        unsigned rd =
45651                                            ExtractQRegister(instr, 22, 12);
45652                                        unsigned rm =
45653                                            ExtractDRegister(instr, 5, 0);
45654                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45655                                        uint32_t imm = imm6 - dt.GetSize();
45656                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45657                                        vshll(al,
45658                                              dt,
45659                                              QRegister(rd),
45660                                              DRegister(rm),
45661                                              imm);
45662                                        break;
45663                                      }
45664                                      case 0x000f0000: {
45665                                        // 0xf28f0a10
45666                                        if (((instr & 0x380000) == 0x0) ||
45667                                            ((instr & 0x3f0000) == 0x80000) ||
45668                                            ((instr & 0x3f0000) == 0x100000) ||
45669                                            ((instr & 0x3f0000) == 0x200000)) {
45670                                          UnallocatedA32(instr);
45671                                          return;
45672                                        }
45673                                        DataType dt =
45674                                            Dt_imm6_4_Decode((instr >> 19) &
45675                                                                 0x7,
45676                                                             (instr >> 24) &
45677                                                                 0x1);
45678                                        if (dt.Is(kDataTypeValueInvalid)) {
45679                                          UnallocatedA32(instr);
45680                                          return;
45681                                        }
45682                                        if (((instr >> 12) & 1) != 0) {
45683                                          UnallocatedA32(instr);
45684                                          return;
45685                                        }
45686                                        unsigned rd =
45687                                            ExtractQRegister(instr, 22, 12);
45688                                        unsigned rm =
45689                                            ExtractDRegister(instr, 5, 0);
45690                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45691                                        uint32_t imm = imm6 - dt.GetSize();
45692                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45693                                        vshll(al,
45694                                              dt,
45695                                              QRegister(rd),
45696                                              DRegister(rm),
45697                                              imm);
45698                                        break;
45699                                      }
45700                                      case 0x00100000: {
45701                                        // 0xf2900a10
45702                                        if (((instr & 0x380000) == 0x0) ||
45703                                            ((instr & 0x380000) == 0x180000) ||
45704                                            ((instr & 0x380000) == 0x280000) ||
45705                                            ((instr & 0x380000) == 0x300000) ||
45706                                            ((instr & 0x380000) == 0x380000)) {
45707                                          UnallocatedA32(instr);
45708                                          return;
45709                                        }
45710                                        DataType dt = Dt_U_imm3H_1_Decode(
45711                                            ((instr >> 19) & 0x7) |
45712                                            ((instr >> 21) & 0x8));
45713                                        if (dt.Is(kDataTypeValueInvalid)) {
45714                                          UnallocatedA32(instr);
45715                                          return;
45716                                        }
45717                                        if (((instr >> 12) & 1) != 0) {
45718                                          UnallocatedA32(instr);
45719                                          return;
45720                                        }
45721                                        unsigned rd =
45722                                            ExtractQRegister(instr, 22, 12);
45723                                        unsigned rm =
45724                                            ExtractDRegister(instr, 5, 0);
45725                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
45726                                        vmovl(al,
45727                                              dt,
45728                                              QRegister(rd),
45729                                              DRegister(rm));
45730                                        break;
45731                                      }
45732                                      case 0x00110000: {
45733                                        // 0xf2910a10
45734                                        if (((instr & 0x380000) == 0x0) ||
45735                                            ((instr & 0x3f0000) == 0x80000) ||
45736                                            ((instr & 0x3f0000) == 0x100000) ||
45737                                            ((instr & 0x3f0000) == 0x200000)) {
45738                                          UnallocatedA32(instr);
45739                                          return;
45740                                        }
45741                                        DataType dt =
45742                                            Dt_imm6_4_Decode((instr >> 19) &
45743                                                                 0x7,
45744                                                             (instr >> 24) &
45745                                                                 0x1);
45746                                        if (dt.Is(kDataTypeValueInvalid)) {
45747                                          UnallocatedA32(instr);
45748                                          return;
45749                                        }
45750                                        if (((instr >> 12) & 1) != 0) {
45751                                          UnallocatedA32(instr);
45752                                          return;
45753                                        }
45754                                        unsigned rd =
45755                                            ExtractQRegister(instr, 22, 12);
45756                                        unsigned rm =
45757                                            ExtractDRegister(instr, 5, 0);
45758                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45759                                        uint32_t imm = imm6 - dt.GetSize();
45760                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45761                                        vshll(al,
45762                                              dt,
45763                                              QRegister(rd),
45764                                              DRegister(rm),
45765                                              imm);
45766                                        break;
45767                                      }
45768                                      case 0x00120000: {
45769                                        // 0xf2920a10
45770                                        if (((instr & 0x380000) == 0x0) ||
45771                                            ((instr & 0x3f0000) == 0x80000) ||
45772                                            ((instr & 0x3f0000) == 0x100000) ||
45773                                            ((instr & 0x3f0000) == 0x200000)) {
45774                                          UnallocatedA32(instr);
45775                                          return;
45776                                        }
45777                                        DataType dt =
45778                                            Dt_imm6_4_Decode((instr >> 19) &
45779                                                                 0x7,
45780                                                             (instr >> 24) &
45781                                                                 0x1);
45782                                        if (dt.Is(kDataTypeValueInvalid)) {
45783                                          UnallocatedA32(instr);
45784                                          return;
45785                                        }
45786                                        if (((instr >> 12) & 1) != 0) {
45787                                          UnallocatedA32(instr);
45788                                          return;
45789                                        }
45790                                        unsigned rd =
45791                                            ExtractQRegister(instr, 22, 12);
45792                                        unsigned rm =
45793                                            ExtractDRegister(instr, 5, 0);
45794                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45795                                        uint32_t imm = imm6 - dt.GetSize();
45796                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45797                                        vshll(al,
45798                                              dt,
45799                                              QRegister(rd),
45800                                              DRegister(rm),
45801                                              imm);
45802                                        break;
45803                                      }
45804                                      case 0x00130000: {
45805                                        // 0xf2930a10
45806                                        if (((instr & 0x380000) == 0x0) ||
45807                                            ((instr & 0x3f0000) == 0x80000) ||
45808                                            ((instr & 0x3f0000) == 0x100000) ||
45809                                            ((instr & 0x3f0000) == 0x200000)) {
45810                                          UnallocatedA32(instr);
45811                                          return;
45812                                        }
45813                                        DataType dt =
45814                                            Dt_imm6_4_Decode((instr >> 19) &
45815                                                                 0x7,
45816                                                             (instr >> 24) &
45817                                                                 0x1);
45818                                        if (dt.Is(kDataTypeValueInvalid)) {
45819                                          UnallocatedA32(instr);
45820                                          return;
45821                                        }
45822                                        if (((instr >> 12) & 1) != 0) {
45823                                          UnallocatedA32(instr);
45824                                          return;
45825                                        }
45826                                        unsigned rd =
45827                                            ExtractQRegister(instr, 22, 12);
45828                                        unsigned rm =
45829                                            ExtractDRegister(instr, 5, 0);
45830                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45831                                        uint32_t imm = imm6 - dt.GetSize();
45832                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45833                                        vshll(al,
45834                                              dt,
45835                                              QRegister(rd),
45836                                              DRegister(rm),
45837                                              imm);
45838                                        break;
45839                                      }
45840                                      case 0x00140000: {
45841                                        // 0xf2940a10
45842                                        if (((instr & 0x380000) == 0x0) ||
45843                                            ((instr & 0x3f0000) == 0x80000) ||
45844                                            ((instr & 0x3f0000) == 0x100000) ||
45845                                            ((instr & 0x3f0000) == 0x200000)) {
45846                                          UnallocatedA32(instr);
45847                                          return;
45848                                        }
45849                                        DataType dt =
45850                                            Dt_imm6_4_Decode((instr >> 19) &
45851                                                                 0x7,
45852                                                             (instr >> 24) &
45853                                                                 0x1);
45854                                        if (dt.Is(kDataTypeValueInvalid)) {
45855                                          UnallocatedA32(instr);
45856                                          return;
45857                                        }
45858                                        if (((instr >> 12) & 1) != 0) {
45859                                          UnallocatedA32(instr);
45860                                          return;
45861                                        }
45862                                        unsigned rd =
45863                                            ExtractQRegister(instr, 22, 12);
45864                                        unsigned rm =
45865                                            ExtractDRegister(instr, 5, 0);
45866                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45867                                        uint32_t imm = imm6 - dt.GetSize();
45868                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45869                                        vshll(al,
45870                                              dt,
45871                                              QRegister(rd),
45872                                              DRegister(rm),
45873                                              imm);
45874                                        break;
45875                                      }
45876                                      case 0x00150000: {
45877                                        // 0xf2950a10
45878                                        if (((instr & 0x380000) == 0x0) ||
45879                                            ((instr & 0x3f0000) == 0x80000) ||
45880                                            ((instr & 0x3f0000) == 0x100000) ||
45881                                            ((instr & 0x3f0000) == 0x200000)) {
45882                                          UnallocatedA32(instr);
45883                                          return;
45884                                        }
45885                                        DataType dt =
45886                                            Dt_imm6_4_Decode((instr >> 19) &
45887                                                                 0x7,
45888                                                             (instr >> 24) &
45889                                                                 0x1);
45890                                        if (dt.Is(kDataTypeValueInvalid)) {
45891                                          UnallocatedA32(instr);
45892                                          return;
45893                                        }
45894                                        if (((instr >> 12) & 1) != 0) {
45895                                          UnallocatedA32(instr);
45896                                          return;
45897                                        }
45898                                        unsigned rd =
45899                                            ExtractQRegister(instr, 22, 12);
45900                                        unsigned rm =
45901                                            ExtractDRegister(instr, 5, 0);
45902                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45903                                        uint32_t imm = imm6 - dt.GetSize();
45904                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45905                                        vshll(al,
45906                                              dt,
45907                                              QRegister(rd),
45908                                              DRegister(rm),
45909                                              imm);
45910                                        break;
45911                                      }
45912                                      case 0x00160000: {
45913                                        // 0xf2960a10
45914                                        if (((instr & 0x380000) == 0x0) ||
45915                                            ((instr & 0x3f0000) == 0x80000) ||
45916                                            ((instr & 0x3f0000) == 0x100000) ||
45917                                            ((instr & 0x3f0000) == 0x200000)) {
45918                                          UnallocatedA32(instr);
45919                                          return;
45920                                        }
45921                                        DataType dt =
45922                                            Dt_imm6_4_Decode((instr >> 19) &
45923                                                                 0x7,
45924                                                             (instr >> 24) &
45925                                                                 0x1);
45926                                        if (dt.Is(kDataTypeValueInvalid)) {
45927                                          UnallocatedA32(instr);
45928                                          return;
45929                                        }
45930                                        if (((instr >> 12) & 1) != 0) {
45931                                          UnallocatedA32(instr);
45932                                          return;
45933                                        }
45934                                        unsigned rd =
45935                                            ExtractQRegister(instr, 22, 12);
45936                                        unsigned rm =
45937                                            ExtractDRegister(instr, 5, 0);
45938                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45939                                        uint32_t imm = imm6 - dt.GetSize();
45940                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45941                                        vshll(al,
45942                                              dt,
45943                                              QRegister(rd),
45944                                              DRegister(rm),
45945                                              imm);
45946                                        break;
45947                                      }
45948                                      case 0x00170000: {
45949                                        // 0xf2970a10
45950                                        if (((instr & 0x380000) == 0x0) ||
45951                                            ((instr & 0x3f0000) == 0x80000) ||
45952                                            ((instr & 0x3f0000) == 0x100000) ||
45953                                            ((instr & 0x3f0000) == 0x200000)) {
45954                                          UnallocatedA32(instr);
45955                                          return;
45956                                        }
45957                                        DataType dt =
45958                                            Dt_imm6_4_Decode((instr >> 19) &
45959                                                                 0x7,
45960                                                             (instr >> 24) &
45961                                                                 0x1);
45962                                        if (dt.Is(kDataTypeValueInvalid)) {
45963                                          UnallocatedA32(instr);
45964                                          return;
45965                                        }
45966                                        if (((instr >> 12) & 1) != 0) {
45967                                          UnallocatedA32(instr);
45968                                          return;
45969                                        }
45970                                        unsigned rd =
45971                                            ExtractQRegister(instr, 22, 12);
45972                                        unsigned rm =
45973                                            ExtractDRegister(instr, 5, 0);
45974                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45975                                        uint32_t imm = imm6 - dt.GetSize();
45976                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45977                                        vshll(al,
45978                                              dt,
45979                                              QRegister(rd),
45980                                              DRegister(rm),
45981                                              imm);
45982                                        break;
45983                                      }
45984                                      case 0x00180000: {
45985                                        // 0xf2980a10
45986                                        if (((instr & 0x380000) == 0x0) ||
45987                                            ((instr & 0x3f0000) == 0x80000) ||
45988                                            ((instr & 0x3f0000) == 0x100000) ||
45989                                            ((instr & 0x3f0000) == 0x200000)) {
45990                                          UnallocatedA32(instr);
45991                                          return;
45992                                        }
45993                                        DataType dt =
45994                                            Dt_imm6_4_Decode((instr >> 19) &
45995                                                                 0x7,
45996                                                             (instr >> 24) &
45997                                                                 0x1);
45998                                        if (dt.Is(kDataTypeValueInvalid)) {
45999                                          UnallocatedA32(instr);
46000                                          return;
46001                                        }
46002                                        if (((instr >> 12) & 1) != 0) {
46003                                          UnallocatedA32(instr);
46004                                          return;
46005                                        }
46006                                        unsigned rd =
46007                                            ExtractQRegister(instr, 22, 12);
46008                                        unsigned rm =
46009                                            ExtractDRegister(instr, 5, 0);
46010                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46011                                        uint32_t imm = imm6 - dt.GetSize();
46012                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46013                                        vshll(al,
46014                                              dt,
46015                                              QRegister(rd),
46016                                              DRegister(rm),
46017                                              imm);
46018                                        break;
46019                                      }
46020                                      case 0x00190000: {
46021                                        // 0xf2990a10
46022                                        if (((instr & 0x380000) == 0x0) ||
46023                                            ((instr & 0x3f0000) == 0x80000) ||
46024                                            ((instr & 0x3f0000) == 0x100000) ||
46025                                            ((instr & 0x3f0000) == 0x200000)) {
46026                                          UnallocatedA32(instr);
46027                                          return;
46028                                        }
46029                                        DataType dt =
46030                                            Dt_imm6_4_Decode((instr >> 19) &
46031                                                                 0x7,
46032                                                             (instr >> 24) &
46033                                                                 0x1);
46034                                        if (dt.Is(kDataTypeValueInvalid)) {
46035                                          UnallocatedA32(instr);
46036                                          return;
46037                                        }
46038                                        if (((instr >> 12) & 1) != 0) {
46039                                          UnallocatedA32(instr);
46040                                          return;
46041                                        }
46042                                        unsigned rd =
46043                                            ExtractQRegister(instr, 22, 12);
46044                                        unsigned rm =
46045                                            ExtractDRegister(instr, 5, 0);
46046                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46047                                        uint32_t imm = imm6 - dt.GetSize();
46048                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46049                                        vshll(al,
46050                                              dt,
46051                                              QRegister(rd),
46052                                              DRegister(rm),
46053                                              imm);
46054                                        break;
46055                                      }
46056                                      case 0x001a0000: {
46057                                        // 0xf29a0a10
46058                                        if (((instr & 0x380000) == 0x0) ||
46059                                            ((instr & 0x3f0000) == 0x80000) ||
46060                                            ((instr & 0x3f0000) == 0x100000) ||
46061                                            ((instr & 0x3f0000) == 0x200000)) {
46062                                          UnallocatedA32(instr);
46063                                          return;
46064                                        }
46065                                        DataType dt =
46066                                            Dt_imm6_4_Decode((instr >> 19) &
46067                                                                 0x7,
46068                                                             (instr >> 24) &
46069                                                                 0x1);
46070                                        if (dt.Is(kDataTypeValueInvalid)) {
46071                                          UnallocatedA32(instr);
46072                                          return;
46073                                        }
46074                                        if (((instr >> 12) & 1) != 0) {
46075                                          UnallocatedA32(instr);
46076                                          return;
46077                                        }
46078                                        unsigned rd =
46079                                            ExtractQRegister(instr, 22, 12);
46080                                        unsigned rm =
46081                                            ExtractDRegister(instr, 5, 0);
46082                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46083                                        uint32_t imm = imm6 - dt.GetSize();
46084                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46085                                        vshll(al,
46086                                              dt,
46087                                              QRegister(rd),
46088                                              DRegister(rm),
46089                                              imm);
46090                                        break;
46091                                      }
46092                                      case 0x001b0000: {
46093                                        // 0xf29b0a10
46094                                        if (((instr & 0x380000) == 0x0) ||
46095                                            ((instr & 0x3f0000) == 0x80000) ||
46096                                            ((instr & 0x3f0000) == 0x100000) ||
46097                                            ((instr & 0x3f0000) == 0x200000)) {
46098                                          UnallocatedA32(instr);
46099                                          return;
46100                                        }
46101                                        DataType dt =
46102                                            Dt_imm6_4_Decode((instr >> 19) &
46103                                                                 0x7,
46104                                                             (instr >> 24) &
46105                                                                 0x1);
46106                                        if (dt.Is(kDataTypeValueInvalid)) {
46107                                          UnallocatedA32(instr);
46108                                          return;
46109                                        }
46110                                        if (((instr >> 12) & 1) != 0) {
46111                                          UnallocatedA32(instr);
46112                                          return;
46113                                        }
46114                                        unsigned rd =
46115                                            ExtractQRegister(instr, 22, 12);
46116                                        unsigned rm =
46117                                            ExtractDRegister(instr, 5, 0);
46118                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46119                                        uint32_t imm = imm6 - dt.GetSize();
46120                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46121                                        vshll(al,
46122                                              dt,
46123                                              QRegister(rd),
46124                                              DRegister(rm),
46125                                              imm);
46126                                        break;
46127                                      }
46128                                      case 0x001c0000: {
46129                                        // 0xf29c0a10
46130                                        if (((instr & 0x380000) == 0x0) ||
46131                                            ((instr & 0x3f0000) == 0x80000) ||
46132                                            ((instr & 0x3f0000) == 0x100000) ||
46133                                            ((instr & 0x3f0000) == 0x200000)) {
46134                                          UnallocatedA32(instr);
46135                                          return;
46136                                        }
46137                                        DataType dt =
46138                                            Dt_imm6_4_Decode((instr >> 19) &
46139                                                                 0x7,
46140                                                             (instr >> 24) &
46141                                                                 0x1);
46142                                        if (dt.Is(kDataTypeValueInvalid)) {
46143                                          UnallocatedA32(instr);
46144                                          return;
46145                                        }
46146                                        if (((instr >> 12) & 1) != 0) {
46147                                          UnallocatedA32(instr);
46148                                          return;
46149                                        }
46150                                        unsigned rd =
46151                                            ExtractQRegister(instr, 22, 12);
46152                                        unsigned rm =
46153                                            ExtractDRegister(instr, 5, 0);
46154                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46155                                        uint32_t imm = imm6 - dt.GetSize();
46156                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46157                                        vshll(al,
46158                                              dt,
46159                                              QRegister(rd),
46160                                              DRegister(rm),
46161                                              imm);
46162                                        break;
46163                                      }
46164                                      case 0x001d0000: {
46165                                        // 0xf29d0a10
46166                                        if (((instr & 0x380000) == 0x0) ||
46167                                            ((instr & 0x3f0000) == 0x80000) ||
46168                                            ((instr & 0x3f0000) == 0x100000) ||
46169                                            ((instr & 0x3f0000) == 0x200000)) {
46170                                          UnallocatedA32(instr);
46171                                          return;
46172                                        }
46173                                        DataType dt =
46174                                            Dt_imm6_4_Decode((instr >> 19) &
46175                                                                 0x7,
46176                                                             (instr >> 24) &
46177                                                                 0x1);
46178                                        if (dt.Is(kDataTypeValueInvalid)) {
46179                                          UnallocatedA32(instr);
46180                                          return;
46181                                        }
46182                                        if (((instr >> 12) & 1) != 0) {
46183                                          UnallocatedA32(instr);
46184                                          return;
46185                                        }
46186                                        unsigned rd =
46187                                            ExtractQRegister(instr, 22, 12);
46188                                        unsigned rm =
46189                                            ExtractDRegister(instr, 5, 0);
46190                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46191                                        uint32_t imm = imm6 - dt.GetSize();
46192                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46193                                        vshll(al,
46194                                              dt,
46195                                              QRegister(rd),
46196                                              DRegister(rm),
46197                                              imm);
46198                                        break;
46199                                      }
46200                                      case 0x001e0000: {
46201                                        // 0xf29e0a10
46202                                        if (((instr & 0x380000) == 0x0) ||
46203                                            ((instr & 0x3f0000) == 0x80000) ||
46204                                            ((instr & 0x3f0000) == 0x100000) ||
46205                                            ((instr & 0x3f0000) == 0x200000)) {
46206                                          UnallocatedA32(instr);
46207                                          return;
46208                                        }
46209                                        DataType dt =
46210                                            Dt_imm6_4_Decode((instr >> 19) &
46211                                                                 0x7,
46212                                                             (instr >> 24) &
46213                                                                 0x1);
46214                                        if (dt.Is(kDataTypeValueInvalid)) {
46215                                          UnallocatedA32(instr);
46216                                          return;
46217                                        }
46218                                        if (((instr >> 12) & 1) != 0) {
46219                                          UnallocatedA32(instr);
46220                                          return;
46221                                        }
46222                                        unsigned rd =
46223                                            ExtractQRegister(instr, 22, 12);
46224                                        unsigned rm =
46225                                            ExtractDRegister(instr, 5, 0);
46226                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46227                                        uint32_t imm = imm6 - dt.GetSize();
46228                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46229                                        vshll(al,
46230                                              dt,
46231                                              QRegister(rd),
46232                                              DRegister(rm),
46233                                              imm);
46234                                        break;
46235                                      }
46236                                      case 0x001f0000: {
46237                                        // 0xf29f0a10
46238                                        if (((instr & 0x380000) == 0x0) ||
46239                                            ((instr & 0x3f0000) == 0x80000) ||
46240                                            ((instr & 0x3f0000) == 0x100000) ||
46241                                            ((instr & 0x3f0000) == 0x200000)) {
46242                                          UnallocatedA32(instr);
46243                                          return;
46244                                        }
46245                                        DataType dt =
46246                                            Dt_imm6_4_Decode((instr >> 19) &
46247                                                                 0x7,
46248                                                             (instr >> 24) &
46249                                                                 0x1);
46250                                        if (dt.Is(kDataTypeValueInvalid)) {
46251                                          UnallocatedA32(instr);
46252                                          return;
46253                                        }
46254                                        if (((instr >> 12) & 1) != 0) {
46255                                          UnallocatedA32(instr);
46256                                          return;
46257                                        }
46258                                        unsigned rd =
46259                                            ExtractQRegister(instr, 22, 12);
46260                                        unsigned rm =
46261                                            ExtractDRegister(instr, 5, 0);
46262                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46263                                        uint32_t imm = imm6 - dt.GetSize();
46264                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46265                                        vshll(al,
46266                                              dt,
46267                                              QRegister(rd),
46268                                              DRegister(rm),
46269                                              imm);
46270                                        break;
46271                                      }
46272                                      case 0x00200000: {
46273                                        // 0xf2a00a10
46274                                        if (((instr & 0x380000) == 0x0) ||
46275                                            ((instr & 0x380000) == 0x180000) ||
46276                                            ((instr & 0x380000) == 0x280000) ||
46277                                            ((instr & 0x380000) == 0x300000) ||
46278                                            ((instr & 0x380000) == 0x380000)) {
46279                                          UnallocatedA32(instr);
46280                                          return;
46281                                        }
46282                                        DataType dt = Dt_U_imm3H_1_Decode(
46283                                            ((instr >> 19) & 0x7) |
46284                                            ((instr >> 21) & 0x8));
46285                                        if (dt.Is(kDataTypeValueInvalid)) {
46286                                          UnallocatedA32(instr);
46287                                          return;
46288                                        }
46289                                        if (((instr >> 12) & 1) != 0) {
46290                                          UnallocatedA32(instr);
46291                                          return;
46292                                        }
46293                                        unsigned rd =
46294                                            ExtractQRegister(instr, 22, 12);
46295                                        unsigned rm =
46296                                            ExtractDRegister(instr, 5, 0);
46297                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
46298                                        vmovl(al,
46299                                              dt,
46300                                              QRegister(rd),
46301                                              DRegister(rm));
46302                                        break;
46303                                      }
46304                                      case 0x00210000: {
46305                                        // 0xf2a10a10
46306                                        if (((instr & 0x380000) == 0x0) ||
46307                                            ((instr & 0x3f0000) == 0x80000) ||
46308                                            ((instr & 0x3f0000) == 0x100000) ||
46309                                            ((instr & 0x3f0000) == 0x200000)) {
46310                                          UnallocatedA32(instr);
46311                                          return;
46312                                        }
46313                                        DataType dt =
46314                                            Dt_imm6_4_Decode((instr >> 19) &
46315                                                                 0x7,
46316                                                             (instr >> 24) &
46317                                                                 0x1);
46318                                        if (dt.Is(kDataTypeValueInvalid)) {
46319                                          UnallocatedA32(instr);
46320                                          return;
46321                                        }
46322                                        if (((instr >> 12) & 1) != 0) {
46323                                          UnallocatedA32(instr);
46324                                          return;
46325                                        }
46326                                        unsigned rd =
46327                                            ExtractQRegister(instr, 22, 12);
46328                                        unsigned rm =
46329                                            ExtractDRegister(instr, 5, 0);
46330                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46331                                        uint32_t imm = imm6 - dt.GetSize();
46332                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46333                                        vshll(al,
46334                                              dt,
46335                                              QRegister(rd),
46336                                              DRegister(rm),
46337                                              imm);
46338                                        break;
46339                                      }
46340                                      case 0x00220000: {
46341                                        // 0xf2a20a10
46342                                        if (((instr & 0x380000) == 0x0) ||
46343                                            ((instr & 0x3f0000) == 0x80000) ||
46344                                            ((instr & 0x3f0000) == 0x100000) ||
46345                                            ((instr & 0x3f0000) == 0x200000)) {
46346                                          UnallocatedA32(instr);
46347                                          return;
46348                                        }
46349                                        DataType dt =
46350                                            Dt_imm6_4_Decode((instr >> 19) &
46351                                                                 0x7,
46352                                                             (instr >> 24) &
46353                                                                 0x1);
46354                                        if (dt.Is(kDataTypeValueInvalid)) {
46355                                          UnallocatedA32(instr);
46356                                          return;
46357                                        }
46358                                        if (((instr >> 12) & 1) != 0) {
46359                                          UnallocatedA32(instr);
46360                                          return;
46361                                        }
46362                                        unsigned rd =
46363                                            ExtractQRegister(instr, 22, 12);
46364                                        unsigned rm =
46365                                            ExtractDRegister(instr, 5, 0);
46366                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46367                                        uint32_t imm = imm6 - dt.GetSize();
46368                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46369                                        vshll(al,
46370                                              dt,
46371                                              QRegister(rd),
46372                                              DRegister(rm),
46373                                              imm);
46374                                        break;
46375                                      }
46376                                      case 0x00230000: {
46377                                        // 0xf2a30a10
46378                                        if (((instr & 0x380000) == 0x0) ||
46379                                            ((instr & 0x3f0000) == 0x80000) ||
46380                                            ((instr & 0x3f0000) == 0x100000) ||
46381                                            ((instr & 0x3f0000) == 0x200000)) {
46382                                          UnallocatedA32(instr);
46383                                          return;
46384                                        }
46385                                        DataType dt =
46386                                            Dt_imm6_4_Decode((instr >> 19) &
46387                                                                 0x7,
46388                                                             (instr >> 24) &
46389                                                                 0x1);
46390                                        if (dt.Is(kDataTypeValueInvalid)) {
46391                                          UnallocatedA32(instr);
46392                                          return;
46393                                        }
46394                                        if (((instr >> 12) & 1) != 0) {
46395                                          UnallocatedA32(instr);
46396                                          return;
46397                                        }
46398                                        unsigned rd =
46399                                            ExtractQRegister(instr, 22, 12);
46400                                        unsigned rm =
46401                                            ExtractDRegister(instr, 5, 0);
46402                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46403                                        uint32_t imm = imm6 - dt.GetSize();
46404                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46405                                        vshll(al,
46406                                              dt,
46407                                              QRegister(rd),
46408                                              DRegister(rm),
46409                                              imm);
46410                                        break;
46411                                      }
46412                                      case 0x00240000: {
46413                                        // 0xf2a40a10
46414                                        if (((instr & 0x380000) == 0x0) ||
46415                                            ((instr & 0x3f0000) == 0x80000) ||
46416                                            ((instr & 0x3f0000) == 0x100000) ||
46417                                            ((instr & 0x3f0000) == 0x200000)) {
46418                                          UnallocatedA32(instr);
46419                                          return;
46420                                        }
46421                                        DataType dt =
46422                                            Dt_imm6_4_Decode((instr >> 19) &
46423                                                                 0x7,
46424                                                             (instr >> 24) &
46425                                                                 0x1);
46426                                        if (dt.Is(kDataTypeValueInvalid)) {
46427                                          UnallocatedA32(instr);
46428                                          return;
46429                                        }
46430                                        if (((instr >> 12) & 1) != 0) {
46431                                          UnallocatedA32(instr);
46432                                          return;
46433                                        }
46434                                        unsigned rd =
46435                                            ExtractQRegister(instr, 22, 12);
46436                                        unsigned rm =
46437                                            ExtractDRegister(instr, 5, 0);
46438                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46439                                        uint32_t imm = imm6 - dt.GetSize();
46440                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46441                                        vshll(al,
46442                                              dt,
46443                                              QRegister(rd),
46444                                              DRegister(rm),
46445                                              imm);
46446                                        break;
46447                                      }
46448                                      case 0x00250000: {
46449                                        // 0xf2a50a10
46450                                        if (((instr & 0x380000) == 0x0) ||
46451                                            ((instr & 0x3f0000) == 0x80000) ||
46452                                            ((instr & 0x3f0000) == 0x100000) ||
46453                                            ((instr & 0x3f0000) == 0x200000)) {
46454                                          UnallocatedA32(instr);
46455                                          return;
46456                                        }
46457                                        DataType dt =
46458                                            Dt_imm6_4_Decode((instr >> 19) &
46459                                                                 0x7,
46460                                                             (instr >> 24) &
46461                                                                 0x1);
46462                                        if (dt.Is(kDataTypeValueInvalid)) {
46463                                          UnallocatedA32(instr);
46464                                          return;
46465                                        }
46466                                        if (((instr >> 12) & 1) != 0) {
46467                                          UnallocatedA32(instr);
46468                                          return;
46469                                        }
46470                                        unsigned rd =
46471                                            ExtractQRegister(instr, 22, 12);
46472                                        unsigned rm =
46473                                            ExtractDRegister(instr, 5, 0);
46474                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46475                                        uint32_t imm = imm6 - dt.GetSize();
46476                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46477                                        vshll(al,
46478                                              dt,
46479                                              QRegister(rd),
46480                                              DRegister(rm),
46481                                              imm);
46482                                        break;
46483                                      }
46484                                      case 0x00260000: {
46485                                        // 0xf2a60a10
46486                                        if (((instr & 0x380000) == 0x0) ||
46487                                            ((instr & 0x3f0000) == 0x80000) ||
46488                                            ((instr & 0x3f0000) == 0x100000) ||
46489                                            ((instr & 0x3f0000) == 0x200000)) {
46490                                          UnallocatedA32(instr);
46491                                          return;
46492                                        }
46493                                        DataType dt =
46494                                            Dt_imm6_4_Decode((instr >> 19) &
46495                                                                 0x7,
46496                                                             (instr >> 24) &
46497                                                                 0x1);
46498                                        if (dt.Is(kDataTypeValueInvalid)) {
46499                                          UnallocatedA32(instr);
46500                                          return;
46501                                        }
46502                                        if (((instr >> 12) & 1) != 0) {
46503                                          UnallocatedA32(instr);
46504                                          return;
46505                                        }
46506                                        unsigned rd =
46507                                            ExtractQRegister(instr, 22, 12);
46508                                        unsigned rm =
46509                                            ExtractDRegister(instr, 5, 0);
46510                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46511                                        uint32_t imm = imm6 - dt.GetSize();
46512                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46513                                        vshll(al,
46514                                              dt,
46515                                              QRegister(rd),
46516                                              DRegister(rm),
46517                                              imm);
46518                                        break;
46519                                      }
46520                                      case 0x00270000: {
46521                                        // 0xf2a70a10
46522                                        if (((instr & 0x380000) == 0x0) ||
46523                                            ((instr & 0x3f0000) == 0x80000) ||
46524                                            ((instr & 0x3f0000) == 0x100000) ||
46525                                            ((instr & 0x3f0000) == 0x200000)) {
46526                                          UnallocatedA32(instr);
46527                                          return;
46528                                        }
46529                                        DataType dt =
46530                                            Dt_imm6_4_Decode((instr >> 19) &
46531                                                                 0x7,
46532                                                             (instr >> 24) &
46533                                                                 0x1);
46534                                        if (dt.Is(kDataTypeValueInvalid)) {
46535                                          UnallocatedA32(instr);
46536                                          return;
46537                                        }
46538                                        if (((instr >> 12) & 1) != 0) {
46539                                          UnallocatedA32(instr);
46540                                          return;
46541                                        }
46542                                        unsigned rd =
46543                                            ExtractQRegister(instr, 22, 12);
46544                                        unsigned rm =
46545                                            ExtractDRegister(instr, 5, 0);
46546                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46547                                        uint32_t imm = imm6 - dt.GetSize();
46548                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46549                                        vshll(al,
46550                                              dt,
46551                                              QRegister(rd),
46552                                              DRegister(rm),
46553                                              imm);
46554                                        break;
46555                                      }
46556                                      case 0x00280000: {
46557                                        // 0xf2a80a10
46558                                        if (((instr & 0x380000) == 0x0) ||
46559                                            ((instr & 0x3f0000) == 0x80000) ||
46560                                            ((instr & 0x3f0000) == 0x100000) ||
46561                                            ((instr & 0x3f0000) == 0x200000)) {
46562                                          UnallocatedA32(instr);
46563                                          return;
46564                                        }
46565                                        DataType dt =
46566                                            Dt_imm6_4_Decode((instr >> 19) &
46567                                                                 0x7,
46568                                                             (instr >> 24) &
46569                                                                 0x1);
46570                                        if (dt.Is(kDataTypeValueInvalid)) {
46571                                          UnallocatedA32(instr);
46572                                          return;
46573                                        }
46574                                        if (((instr >> 12) & 1) != 0) {
46575                                          UnallocatedA32(instr);
46576                                          return;
46577                                        }
46578                                        unsigned rd =
46579                                            ExtractQRegister(instr, 22, 12);
46580                                        unsigned rm =
46581                                            ExtractDRegister(instr, 5, 0);
46582                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46583                                        uint32_t imm = imm6 - dt.GetSize();
46584                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46585                                        vshll(al,
46586                                              dt,
46587                                              QRegister(rd),
46588                                              DRegister(rm),
46589                                              imm);
46590                                        break;
46591                                      }
46592                                      case 0x00290000: {
46593                                        // 0xf2a90a10
46594                                        if (((instr & 0x380000) == 0x0) ||
46595                                            ((instr & 0x3f0000) == 0x80000) ||
46596                                            ((instr & 0x3f0000) == 0x100000) ||
46597                                            ((instr & 0x3f0000) == 0x200000)) {
46598                                          UnallocatedA32(instr);
46599                                          return;
46600                                        }
46601                                        DataType dt =
46602                                            Dt_imm6_4_Decode((instr >> 19) &
46603                                                                 0x7,
46604                                                             (instr >> 24) &
46605                                                                 0x1);
46606                                        if (dt.Is(kDataTypeValueInvalid)) {
46607                                          UnallocatedA32(instr);
46608                                          return;
46609                                        }
46610                                        if (((instr >> 12) & 1) != 0) {
46611                                          UnallocatedA32(instr);
46612                                          return;
46613                                        }
46614                                        unsigned rd =
46615                                            ExtractQRegister(instr, 22, 12);
46616                                        unsigned rm =
46617                                            ExtractDRegister(instr, 5, 0);
46618                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46619                                        uint32_t imm = imm6 - dt.GetSize();
46620                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46621                                        vshll(al,
46622                                              dt,
46623                                              QRegister(rd),
46624                                              DRegister(rm),
46625                                              imm);
46626                                        break;
46627                                      }
46628                                      case 0x002a0000: {
46629                                        // 0xf2aa0a10
46630                                        if (((instr & 0x380000) == 0x0) ||
46631                                            ((instr & 0x3f0000) == 0x80000) ||
46632                                            ((instr & 0x3f0000) == 0x100000) ||
46633                                            ((instr & 0x3f0000) == 0x200000)) {
46634                                          UnallocatedA32(instr);
46635                                          return;
46636                                        }
46637                                        DataType dt =
46638                                            Dt_imm6_4_Decode((instr >> 19) &
46639                                                                 0x7,
46640                                                             (instr >> 24) &
46641                                                                 0x1);
46642                                        if (dt.Is(kDataTypeValueInvalid)) {
46643                                          UnallocatedA32(instr);
46644                                          return;
46645                                        }
46646                                        if (((instr >> 12) & 1) != 0) {
46647                                          UnallocatedA32(instr);
46648                                          return;
46649                                        }
46650                                        unsigned rd =
46651                                            ExtractQRegister(instr, 22, 12);
46652                                        unsigned rm =
46653                                            ExtractDRegister(instr, 5, 0);
46654                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46655                                        uint32_t imm = imm6 - dt.GetSize();
46656                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46657                                        vshll(al,
46658                                              dt,
46659                                              QRegister(rd),
46660                                              DRegister(rm),
46661                                              imm);
46662                                        break;
46663                                      }
46664                                      case 0x002b0000: {
46665                                        // 0xf2ab0a10
46666                                        if (((instr & 0x380000) == 0x0) ||
46667                                            ((instr & 0x3f0000) == 0x80000) ||
46668                                            ((instr & 0x3f0000) == 0x100000) ||
46669                                            ((instr & 0x3f0000) == 0x200000)) {
46670                                          UnallocatedA32(instr);
46671                                          return;
46672                                        }
46673                                        DataType dt =
46674                                            Dt_imm6_4_Decode((instr >> 19) &
46675                                                                 0x7,
46676                                                             (instr >> 24) &
46677                                                                 0x1);
46678                                        if (dt.Is(kDataTypeValueInvalid)) {
46679                                          UnallocatedA32(instr);
46680                                          return;
46681                                        }
46682                                        if (((instr >> 12) & 1) != 0) {
46683                                          UnallocatedA32(instr);
46684                                          return;
46685                                        }
46686                                        unsigned rd =
46687                                            ExtractQRegister(instr, 22, 12);
46688                                        unsigned rm =
46689                                            ExtractDRegister(instr, 5, 0);
46690                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46691                                        uint32_t imm = imm6 - dt.GetSize();
46692                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46693                                        vshll(al,
46694                                              dt,
46695                                              QRegister(rd),
46696                                              DRegister(rm),
46697                                              imm);
46698                                        break;
46699                                      }
46700                                      case 0x002c0000: {
46701                                        // 0xf2ac0a10
46702                                        if (((instr & 0x380000) == 0x0) ||
46703                                            ((instr & 0x3f0000) == 0x80000) ||
46704                                            ((instr & 0x3f0000) == 0x100000) ||
46705                                            ((instr & 0x3f0000) == 0x200000)) {
46706                                          UnallocatedA32(instr);
46707                                          return;
46708                                        }
46709                                        DataType dt =
46710                                            Dt_imm6_4_Decode((instr >> 19) &
46711                                                                 0x7,
46712                                                             (instr >> 24) &
46713                                                                 0x1);
46714                                        if (dt.Is(kDataTypeValueInvalid)) {
46715                                          UnallocatedA32(instr);
46716                                          return;
46717                                        }
46718                                        if (((instr >> 12) & 1) != 0) {
46719                                          UnallocatedA32(instr);
46720                                          return;
46721                                        }
46722                                        unsigned rd =
46723                                            ExtractQRegister(instr, 22, 12);
46724                                        unsigned rm =
46725                                            ExtractDRegister(instr, 5, 0);
46726                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46727                                        uint32_t imm = imm6 - dt.GetSize();
46728                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46729                                        vshll(al,
46730                                              dt,
46731                                              QRegister(rd),
46732                                              DRegister(rm),
46733                                              imm);
46734                                        break;
46735                                      }
46736                                      case 0x002d0000: {
46737                                        // 0xf2ad0a10
46738                                        if (((instr & 0x380000) == 0x0) ||
46739                                            ((instr & 0x3f0000) == 0x80000) ||
46740                                            ((instr & 0x3f0000) == 0x100000) ||
46741                                            ((instr & 0x3f0000) == 0x200000)) {
46742                                          UnallocatedA32(instr);
46743                                          return;
46744                                        }
46745                                        DataType dt =
46746                                            Dt_imm6_4_Decode((instr >> 19) &
46747                                                                 0x7,
46748                                                             (instr >> 24) &
46749                                                                 0x1);
46750                                        if (dt.Is(kDataTypeValueInvalid)) {
46751                                          UnallocatedA32(instr);
46752                                          return;
46753                                        }
46754                                        if (((instr >> 12) & 1) != 0) {
46755                                          UnallocatedA32(instr);
46756                                          return;
46757                                        }
46758                                        unsigned rd =
46759                                            ExtractQRegister(instr, 22, 12);
46760                                        unsigned rm =
46761                                            ExtractDRegister(instr, 5, 0);
46762                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46763                                        uint32_t imm = imm6 - dt.GetSize();
46764                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46765                                        vshll(al,
46766                                              dt,
46767                                              QRegister(rd),
46768                                              DRegister(rm),
46769                                              imm);
46770                                        break;
46771                                      }
46772                                      case 0x002e0000: {
46773                                        // 0xf2ae0a10
46774                                        if (((instr & 0x380000) == 0x0) ||
46775                                            ((instr & 0x3f0000) == 0x80000) ||
46776                                            ((instr & 0x3f0000) == 0x100000) ||
46777                                            ((instr & 0x3f0000) == 0x200000)) {
46778                                          UnallocatedA32(instr);
46779                                          return;
46780                                        }
46781                                        DataType dt =
46782                                            Dt_imm6_4_Decode((instr >> 19) &
46783                                                                 0x7,
46784                                                             (instr >> 24) &
46785                                                                 0x1);
46786                                        if (dt.Is(kDataTypeValueInvalid)) {
46787                                          UnallocatedA32(instr);
46788                                          return;
46789                                        }
46790                                        if (((instr >> 12) & 1) != 0) {
46791                                          UnallocatedA32(instr);
46792                                          return;
46793                                        }
46794                                        unsigned rd =
46795                                            ExtractQRegister(instr, 22, 12);
46796                                        unsigned rm =
46797                                            ExtractDRegister(instr, 5, 0);
46798                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46799                                        uint32_t imm = imm6 - dt.GetSize();
46800                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46801                                        vshll(al,
46802                                              dt,
46803                                              QRegister(rd),
46804                                              DRegister(rm),
46805                                              imm);
46806                                        break;
46807                                      }
46808                                      case 0x002f0000: {
46809                                        // 0xf2af0a10
46810                                        if (((instr & 0x380000) == 0x0) ||
46811                                            ((instr & 0x3f0000) == 0x80000) ||
46812                                            ((instr & 0x3f0000) == 0x100000) ||
46813                                            ((instr & 0x3f0000) == 0x200000)) {
46814                                          UnallocatedA32(instr);
46815                                          return;
46816                                        }
46817                                        DataType dt =
46818                                            Dt_imm6_4_Decode((instr >> 19) &
46819                                                                 0x7,
46820                                                             (instr >> 24) &
46821                                                                 0x1);
46822                                        if (dt.Is(kDataTypeValueInvalid)) {
46823                                          UnallocatedA32(instr);
46824                                          return;
46825                                        }
46826                                        if (((instr >> 12) & 1) != 0) {
46827                                          UnallocatedA32(instr);
46828                                          return;
46829                                        }
46830                                        unsigned rd =
46831                                            ExtractQRegister(instr, 22, 12);
46832                                        unsigned rm =
46833                                            ExtractDRegister(instr, 5, 0);
46834                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46835                                        uint32_t imm = imm6 - dt.GetSize();
46836                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46837                                        vshll(al,
46838                                              dt,
46839                                              QRegister(rd),
46840                                              DRegister(rm),
46841                                              imm);
46842                                        break;
46843                                      }
46844                                      case 0x00300000: {
46845                                        // 0xf2b00a10
46846                                        if (((instr & 0x380000) == 0x0) ||
46847                                            ((instr & 0x3f0000) == 0x80000) ||
46848                                            ((instr & 0x3f0000) == 0x100000) ||
46849                                            ((instr & 0x3f0000) == 0x200000)) {
46850                                          UnallocatedA32(instr);
46851                                          return;
46852                                        }
46853                                        DataType dt =
46854                                            Dt_imm6_4_Decode((instr >> 19) &
46855                                                                 0x7,
46856                                                             (instr >> 24) &
46857                                                                 0x1);
46858                                        if (dt.Is(kDataTypeValueInvalid)) {
46859                                          UnallocatedA32(instr);
46860                                          return;
46861                                        }
46862                                        if (((instr >> 12) & 1) != 0) {
46863                                          UnallocatedA32(instr);
46864                                          return;
46865                                        }
46866                                        unsigned rd =
46867                                            ExtractQRegister(instr, 22, 12);
46868                                        unsigned rm =
46869                                            ExtractDRegister(instr, 5, 0);
46870                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46871                                        uint32_t imm = imm6 - dt.GetSize();
46872                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46873                                        vshll(al,
46874                                              dt,
46875                                              QRegister(rd),
46876                                              DRegister(rm),
46877                                              imm);
46878                                        break;
46879                                      }
46880                                      case 0x00310000: {
46881                                        // 0xf2b10a10
46882                                        if (((instr & 0x380000) == 0x0) ||
46883                                            ((instr & 0x3f0000) == 0x80000) ||
46884                                            ((instr & 0x3f0000) == 0x100000) ||
46885                                            ((instr & 0x3f0000) == 0x200000)) {
46886                                          UnallocatedA32(instr);
46887                                          return;
46888                                        }
46889                                        DataType dt =
46890                                            Dt_imm6_4_Decode((instr >> 19) &
46891                                                                 0x7,
46892                                                             (instr >> 24) &
46893                                                                 0x1);
46894                                        if (dt.Is(kDataTypeValueInvalid)) {
46895                                          UnallocatedA32(instr);
46896                                          return;
46897                                        }
46898                                        if (((instr >> 12) & 1) != 0) {
46899                                          UnallocatedA32(instr);
46900                                          return;
46901                                        }
46902                                        unsigned rd =
46903                                            ExtractQRegister(instr, 22, 12);
46904                                        unsigned rm =
46905                                            ExtractDRegister(instr, 5, 0);
46906                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46907                                        uint32_t imm = imm6 - dt.GetSize();
46908                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46909                                        vshll(al,
46910                                              dt,
46911                                              QRegister(rd),
46912                                              DRegister(rm),
46913                                              imm);
46914                                        break;
46915                                      }
46916                                      case 0x00320000: {
46917                                        // 0xf2b20a10
46918                                        if (((instr & 0x380000) == 0x0) ||
46919                                            ((instr & 0x3f0000) == 0x80000) ||
46920                                            ((instr & 0x3f0000) == 0x100000) ||
46921                                            ((instr & 0x3f0000) == 0x200000)) {
46922                                          UnallocatedA32(instr);
46923                                          return;
46924                                        }
46925                                        DataType dt =
46926                                            Dt_imm6_4_Decode((instr >> 19) &
46927                                                                 0x7,
46928                                                             (instr >> 24) &
46929                                                                 0x1);
46930                                        if (dt.Is(kDataTypeValueInvalid)) {
46931                                          UnallocatedA32(instr);
46932                                          return;
46933                                        }
46934                                        if (((instr >> 12) & 1) != 0) {
46935                                          UnallocatedA32(instr);
46936                                          return;
46937                                        }
46938                                        unsigned rd =
46939                                            ExtractQRegister(instr, 22, 12);
46940                                        unsigned rm =
46941                                            ExtractDRegister(instr, 5, 0);
46942                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46943                                        uint32_t imm = imm6 - dt.GetSize();
46944                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46945                                        vshll(al,
46946                                              dt,
46947                                              QRegister(rd),
46948                                              DRegister(rm),
46949                                              imm);
46950                                        break;
46951                                      }
46952                                      case 0x00330000: {
46953                                        // 0xf2b30a10
46954                                        if (((instr & 0x380000) == 0x0) ||
46955                                            ((instr & 0x3f0000) == 0x80000) ||
46956                                            ((instr & 0x3f0000) == 0x100000) ||
46957                                            ((instr & 0x3f0000) == 0x200000)) {
46958                                          UnallocatedA32(instr);
46959                                          return;
46960                                        }
46961                                        DataType dt =
46962                                            Dt_imm6_4_Decode((instr >> 19) &
46963                                                                 0x7,
46964                                                             (instr >> 24) &
46965                                                                 0x1);
46966                                        if (dt.Is(kDataTypeValueInvalid)) {
46967                                          UnallocatedA32(instr);
46968                                          return;
46969                                        }
46970                                        if (((instr >> 12) & 1) != 0) {
46971                                          UnallocatedA32(instr);
46972                                          return;
46973                                        }
46974                                        unsigned rd =
46975                                            ExtractQRegister(instr, 22, 12);
46976                                        unsigned rm =
46977                                            ExtractDRegister(instr, 5, 0);
46978                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46979                                        uint32_t imm = imm6 - dt.GetSize();
46980                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46981                                        vshll(al,
46982                                              dt,
46983                                              QRegister(rd),
46984                                              DRegister(rm),
46985                                              imm);
46986                                        break;
46987                                      }
46988                                      case 0x00340000: {
46989                                        // 0xf2b40a10
46990                                        if (((instr & 0x380000) == 0x0) ||
46991                                            ((instr & 0x3f0000) == 0x80000) ||
46992                                            ((instr & 0x3f0000) == 0x100000) ||
46993                                            ((instr & 0x3f0000) == 0x200000)) {
46994                                          UnallocatedA32(instr);
46995                                          return;
46996                                        }
46997                                        DataType dt =
46998                                            Dt_imm6_4_Decode((instr >> 19) &
46999                                                                 0x7,
47000                                                             (instr >> 24) &
47001                                                                 0x1);
47002                                        if (dt.Is(kDataTypeValueInvalid)) {
47003                                          UnallocatedA32(instr);
47004                                          return;
47005                                        }
47006                                        if (((instr >> 12) & 1) != 0) {
47007                                          UnallocatedA32(instr);
47008                                          return;
47009                                        }
47010                                        unsigned rd =
47011                                            ExtractQRegister(instr, 22, 12);
47012                                        unsigned rm =
47013                                            ExtractDRegister(instr, 5, 0);
47014                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47015                                        uint32_t imm = imm6 - dt.GetSize();
47016                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47017                                        vshll(al,
47018                                              dt,
47019                                              QRegister(rd),
47020                                              DRegister(rm),
47021                                              imm);
47022                                        break;
47023                                      }
47024                                      case 0x00350000: {
47025                                        // 0xf2b50a10
47026                                        if (((instr & 0x380000) == 0x0) ||
47027                                            ((instr & 0x3f0000) == 0x80000) ||
47028                                            ((instr & 0x3f0000) == 0x100000) ||
47029                                            ((instr & 0x3f0000) == 0x200000)) {
47030                                          UnallocatedA32(instr);
47031                                          return;
47032                                        }
47033                                        DataType dt =
47034                                            Dt_imm6_4_Decode((instr >> 19) &
47035                                                                 0x7,
47036                                                             (instr >> 24) &
47037                                                                 0x1);
47038                                        if (dt.Is(kDataTypeValueInvalid)) {
47039                                          UnallocatedA32(instr);
47040                                          return;
47041                                        }
47042                                        if (((instr >> 12) & 1) != 0) {
47043                                          UnallocatedA32(instr);
47044                                          return;
47045                                        }
47046                                        unsigned rd =
47047                                            ExtractQRegister(instr, 22, 12);
47048                                        unsigned rm =
47049                                            ExtractDRegister(instr, 5, 0);
47050                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47051                                        uint32_t imm = imm6 - dt.GetSize();
47052                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47053                                        vshll(al,
47054                                              dt,
47055                                              QRegister(rd),
47056                                              DRegister(rm),
47057                                              imm);
47058                                        break;
47059                                      }
47060                                      case 0x00360000: {
47061                                        // 0xf2b60a10
47062                                        if (((instr & 0x380000) == 0x0) ||
47063                                            ((instr & 0x3f0000) == 0x80000) ||
47064                                            ((instr & 0x3f0000) == 0x100000) ||
47065                                            ((instr & 0x3f0000) == 0x200000)) {
47066                                          UnallocatedA32(instr);
47067                                          return;
47068                                        }
47069                                        DataType dt =
47070                                            Dt_imm6_4_Decode((instr >> 19) &
47071                                                                 0x7,
47072                                                             (instr >> 24) &
47073                                                                 0x1);
47074                                        if (dt.Is(kDataTypeValueInvalid)) {
47075                                          UnallocatedA32(instr);
47076                                          return;
47077                                        }
47078                                        if (((instr >> 12) & 1) != 0) {
47079                                          UnallocatedA32(instr);
47080                                          return;
47081                                        }
47082                                        unsigned rd =
47083                                            ExtractQRegister(instr, 22, 12);
47084                                        unsigned rm =
47085                                            ExtractDRegister(instr, 5, 0);
47086                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47087                                        uint32_t imm = imm6 - dt.GetSize();
47088                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47089                                        vshll(al,
47090                                              dt,
47091                                              QRegister(rd),
47092                                              DRegister(rm),
47093                                              imm);
47094                                        break;
47095                                      }
47096                                      case 0x00370000: {
47097                                        // 0xf2b70a10
47098                                        if (((instr & 0x380000) == 0x0) ||
47099                                            ((instr & 0x3f0000) == 0x80000) ||
47100                                            ((instr & 0x3f0000) == 0x100000) ||
47101                                            ((instr & 0x3f0000) == 0x200000)) {
47102                                          UnallocatedA32(instr);
47103                                          return;
47104                                        }
47105                                        DataType dt =
47106                                            Dt_imm6_4_Decode((instr >> 19) &
47107                                                                 0x7,
47108                                                             (instr >> 24) &
47109                                                                 0x1);
47110                                        if (dt.Is(kDataTypeValueInvalid)) {
47111                                          UnallocatedA32(instr);
47112                                          return;
47113                                        }
47114                                        if (((instr >> 12) & 1) != 0) {
47115                                          UnallocatedA32(instr);
47116                                          return;
47117                                        }
47118                                        unsigned rd =
47119                                            ExtractQRegister(instr, 22, 12);
47120                                        unsigned rm =
47121                                            ExtractDRegister(instr, 5, 0);
47122                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47123                                        uint32_t imm = imm6 - dt.GetSize();
47124                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47125                                        vshll(al,
47126                                              dt,
47127                                              QRegister(rd),
47128                                              DRegister(rm),
47129                                              imm);
47130                                        break;
47131                                      }
47132                                      case 0x00380000: {
47133                                        // 0xf2b80a10
47134                                        if (((instr & 0x380000) == 0x0) ||
47135                                            ((instr & 0x3f0000) == 0x80000) ||
47136                                            ((instr & 0x3f0000) == 0x100000) ||
47137                                            ((instr & 0x3f0000) == 0x200000)) {
47138                                          UnallocatedA32(instr);
47139                                          return;
47140                                        }
47141                                        DataType dt =
47142                                            Dt_imm6_4_Decode((instr >> 19) &
47143                                                                 0x7,
47144                                                             (instr >> 24) &
47145                                                                 0x1);
47146                                        if (dt.Is(kDataTypeValueInvalid)) {
47147                                          UnallocatedA32(instr);
47148                                          return;
47149                                        }
47150                                        if (((instr >> 12) & 1) != 0) {
47151                                          UnallocatedA32(instr);
47152                                          return;
47153                                        }
47154                                        unsigned rd =
47155                                            ExtractQRegister(instr, 22, 12);
47156                                        unsigned rm =
47157                                            ExtractDRegister(instr, 5, 0);
47158                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47159                                        uint32_t imm = imm6 - dt.GetSize();
47160                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47161                                        vshll(al,
47162                                              dt,
47163                                              QRegister(rd),
47164                                              DRegister(rm),
47165                                              imm);
47166                                        break;
47167                                      }
47168                                      case 0x00390000: {
47169                                        // 0xf2b90a10
47170                                        if (((instr & 0x380000) == 0x0) ||
47171                                            ((instr & 0x3f0000) == 0x80000) ||
47172                                            ((instr & 0x3f0000) == 0x100000) ||
47173                                            ((instr & 0x3f0000) == 0x200000)) {
47174                                          UnallocatedA32(instr);
47175                                          return;
47176                                        }
47177                                        DataType dt =
47178                                            Dt_imm6_4_Decode((instr >> 19) &
47179                                                                 0x7,
47180                                                             (instr >> 24) &
47181                                                                 0x1);
47182                                        if (dt.Is(kDataTypeValueInvalid)) {
47183                                          UnallocatedA32(instr);
47184                                          return;
47185                                        }
47186                                        if (((instr >> 12) & 1) != 0) {
47187                                          UnallocatedA32(instr);
47188                                          return;
47189                                        }
47190                                        unsigned rd =
47191                                            ExtractQRegister(instr, 22, 12);
47192                                        unsigned rm =
47193                                            ExtractDRegister(instr, 5, 0);
47194                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47195                                        uint32_t imm = imm6 - dt.GetSize();
47196                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47197                                        vshll(al,
47198                                              dt,
47199                                              QRegister(rd),
47200                                              DRegister(rm),
47201                                              imm);
47202                                        break;
47203                                      }
47204                                      case 0x003a0000: {
47205                                        // 0xf2ba0a10
47206                                        if (((instr & 0x380000) == 0x0) ||
47207                                            ((instr & 0x3f0000) == 0x80000) ||
47208                                            ((instr & 0x3f0000) == 0x100000) ||
47209                                            ((instr & 0x3f0000) == 0x200000)) {
47210                                          UnallocatedA32(instr);
47211                                          return;
47212                                        }
47213                                        DataType dt =
47214                                            Dt_imm6_4_Decode((instr >> 19) &
47215                                                                 0x7,
47216                                                             (instr >> 24) &
47217                                                                 0x1);
47218                                        if (dt.Is(kDataTypeValueInvalid)) {
47219                                          UnallocatedA32(instr);
47220                                          return;
47221                                        }
47222                                        if (((instr >> 12) & 1) != 0) {
47223                                          UnallocatedA32(instr);
47224                                          return;
47225                                        }
47226                                        unsigned rd =
47227                                            ExtractQRegister(instr, 22, 12);
47228                                        unsigned rm =
47229                                            ExtractDRegister(instr, 5, 0);
47230                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47231                                        uint32_t imm = imm6 - dt.GetSize();
47232                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47233                                        vshll(al,
47234                                              dt,
47235                                              QRegister(rd),
47236                                              DRegister(rm),
47237                                              imm);
47238                                        break;
47239                                      }
47240                                      case 0x003b0000: {
47241                                        // 0xf2bb0a10
47242                                        if (((instr & 0x380000) == 0x0) ||
47243                                            ((instr & 0x3f0000) == 0x80000) ||
47244                                            ((instr & 0x3f0000) == 0x100000) ||
47245                                            ((instr & 0x3f0000) == 0x200000)) {
47246                                          UnallocatedA32(instr);
47247                                          return;
47248                                        }
47249                                        DataType dt =
47250                                            Dt_imm6_4_Decode((instr >> 19) &
47251                                                                 0x7,
47252                                                             (instr >> 24) &
47253                                                                 0x1);
47254                                        if (dt.Is(kDataTypeValueInvalid)) {
47255                                          UnallocatedA32(instr);
47256                                          return;
47257                                        }
47258                                        if (((instr >> 12) & 1) != 0) {
47259                                          UnallocatedA32(instr);
47260                                          return;
47261                                        }
47262                                        unsigned rd =
47263                                            ExtractQRegister(instr, 22, 12);
47264                                        unsigned rm =
47265                                            ExtractDRegister(instr, 5, 0);
47266                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47267                                        uint32_t imm = imm6 - dt.GetSize();
47268                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47269                                        vshll(al,
47270                                              dt,
47271                                              QRegister(rd),
47272                                              DRegister(rm),
47273                                              imm);
47274                                        break;
47275                                      }
47276                                      case 0x003c0000: {
47277                                        // 0xf2bc0a10
47278                                        if (((instr & 0x380000) == 0x0) ||
47279                                            ((instr & 0x3f0000) == 0x80000) ||
47280                                            ((instr & 0x3f0000) == 0x100000) ||
47281                                            ((instr & 0x3f0000) == 0x200000)) {
47282                                          UnallocatedA32(instr);
47283                                          return;
47284                                        }
47285                                        DataType dt =
47286                                            Dt_imm6_4_Decode((instr >> 19) &
47287                                                                 0x7,
47288                                                             (instr >> 24) &
47289                                                                 0x1);
47290                                        if (dt.Is(kDataTypeValueInvalid)) {
47291                                          UnallocatedA32(instr);
47292                                          return;
47293                                        }
47294                                        if (((instr >> 12) & 1) != 0) {
47295                                          UnallocatedA32(instr);
47296                                          return;
47297                                        }
47298                                        unsigned rd =
47299                                            ExtractQRegister(instr, 22, 12);
47300                                        unsigned rm =
47301                                            ExtractDRegister(instr, 5, 0);
47302                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47303                                        uint32_t imm = imm6 - dt.GetSize();
47304                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47305                                        vshll(al,
47306                                              dt,
47307                                              QRegister(rd),
47308                                              DRegister(rm),
47309                                              imm);
47310                                        break;
47311                                      }
47312                                      case 0x003d0000: {
47313                                        // 0xf2bd0a10
47314                                        if (((instr & 0x380000) == 0x0) ||
47315                                            ((instr & 0x3f0000) == 0x80000) ||
47316                                            ((instr & 0x3f0000) == 0x100000) ||
47317                                            ((instr & 0x3f0000) == 0x200000)) {
47318                                          UnallocatedA32(instr);
47319                                          return;
47320                                        }
47321                                        DataType dt =
47322                                            Dt_imm6_4_Decode((instr >> 19) &
47323                                                                 0x7,
47324                                                             (instr >> 24) &
47325                                                                 0x1);
47326                                        if (dt.Is(kDataTypeValueInvalid)) {
47327                                          UnallocatedA32(instr);
47328                                          return;
47329                                        }
47330                                        if (((instr >> 12) & 1) != 0) {
47331                                          UnallocatedA32(instr);
47332                                          return;
47333                                        }
47334                                        unsigned rd =
47335                                            ExtractQRegister(instr, 22, 12);
47336                                        unsigned rm =
47337                                            ExtractDRegister(instr, 5, 0);
47338                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47339                                        uint32_t imm = imm6 - dt.GetSize();
47340                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47341                                        vshll(al,
47342                                              dt,
47343                                              QRegister(rd),
47344                                              DRegister(rm),
47345                                              imm);
47346                                        break;
47347                                      }
47348                                      case 0x003e0000: {
47349                                        // 0xf2be0a10
47350                                        if (((instr & 0x380000) == 0x0) ||
47351                                            ((instr & 0x3f0000) == 0x80000) ||
47352                                            ((instr & 0x3f0000) == 0x100000) ||
47353                                            ((instr & 0x3f0000) == 0x200000)) {
47354                                          UnallocatedA32(instr);
47355                                          return;
47356                                        }
47357                                        DataType dt =
47358                                            Dt_imm6_4_Decode((instr >> 19) &
47359                                                                 0x7,
47360                                                             (instr >> 24) &
47361                                                                 0x1);
47362                                        if (dt.Is(kDataTypeValueInvalid)) {
47363                                          UnallocatedA32(instr);
47364                                          return;
47365                                        }
47366                                        if (((instr >> 12) & 1) != 0) {
47367                                          UnallocatedA32(instr);
47368                                          return;
47369                                        }
47370                                        unsigned rd =
47371                                            ExtractQRegister(instr, 22, 12);
47372                                        unsigned rm =
47373                                            ExtractDRegister(instr, 5, 0);
47374                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47375                                        uint32_t imm = imm6 - dt.GetSize();
47376                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47377                                        vshll(al,
47378                                              dt,
47379                                              QRegister(rd),
47380                                              DRegister(rm),
47381                                              imm);
47382                                        break;
47383                                      }
47384                                      case 0x003f0000: {
47385                                        // 0xf2bf0a10
47386                                        if (((instr & 0x380000) == 0x0) ||
47387                                            ((instr & 0x3f0000) == 0x80000) ||
47388                                            ((instr & 0x3f0000) == 0x100000) ||
47389                                            ((instr & 0x3f0000) == 0x200000)) {
47390                                          UnallocatedA32(instr);
47391                                          return;
47392                                        }
47393                                        DataType dt =
47394                                            Dt_imm6_4_Decode((instr >> 19) &
47395                                                                 0x7,
47396                                                             (instr >> 24) &
47397                                                                 0x1);
47398                                        if (dt.Is(kDataTypeValueInvalid)) {
47399                                          UnallocatedA32(instr);
47400                                          return;
47401                                        }
47402                                        if (((instr >> 12) & 1) != 0) {
47403                                          UnallocatedA32(instr);
47404                                          return;
47405                                        }
47406                                        unsigned rd =
47407                                            ExtractQRegister(instr, 22, 12);
47408                                        unsigned rm =
47409                                            ExtractDRegister(instr, 5, 0);
47410                                        uint32_t imm6 = (instr >> 16) & 0x3f;
47411                                        uint32_t imm = imm6 - dt.GetSize();
47412                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47413                                        vshll(al,
47414                                              dt,
47415                                              QRegister(rd),
47416                                              DRegister(rm),
47417                                              imm);
47418                                        break;
47419                                      }
47420                                      default:
47421                                        UnallocatedA32(instr);
47422                                        break;
47423                                    }
47424                                    break;
47425                                  }
47426                                  default: {
47427                                    if (((instr & 0x380000) == 0x0) ||
47428                                        ((instr & 0x3f0000) == 0x80000) ||
47429                                        ((instr & 0x3f0000) == 0x100000) ||
47430                                        ((instr & 0x3f0000) == 0x200000)) {
47431                                      UnallocatedA32(instr);
47432                                      return;
47433                                    }
47434                                    DataType dt =
47435                                        Dt_imm6_4_Decode((instr >> 19) & 0x7,
47436                                                         (instr >> 24) & 0x1);
47437                                    if (dt.Is(kDataTypeValueInvalid)) {
47438                                      UnallocatedA32(instr);
47439                                      return;
47440                                    }
47441                                    if (((instr >> 12) & 1) != 0) {
47442                                      UnallocatedA32(instr);
47443                                      return;
47444                                    }
47445                                    unsigned rd =
47446                                        ExtractQRegister(instr, 22, 12);
47447                                    unsigned rm = ExtractDRegister(instr, 5, 0);
47448                                    uint32_t imm6 = (instr >> 16) & 0x3f;
47449                                    uint32_t imm = imm6 - dt.GetSize();
47450                                    // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47451                                    vshll(al,
47452                                          dt,
47453                                          QRegister(rd),
47454                                          DRegister(rm),
47455                                          imm);
47456                                    break;
47457                                  }
47458                                }
47459                                break;
47460                              }
47461                              default:
47462                                UnallocatedA32(instr);
47463                                break;
47464                            }
47465                            break;
47466                          }
47467                        }
47468                        break;
47469                      }
47470                      default:
47471                        UnallocatedA32(instr);
47472                        break;
47473                    }
47474                    break;
47475                  }
47476                  case 0x00000c00: {
47477                    // 0xf2800c10
47478                    switch (instr & 0x00000080) {
47479                      case 0x00000000: {
47480                        // 0xf2800c10
47481                        switch (instr & 0x00200000) {
47482                          case 0x00000000: {
47483                            // 0xf2800c10
47484                            switch (instr & 0x00180000) {
47485                              case 0x00000000: {
47486                                // 0xf2800c10
47487                                switch (instr & 0x00000300) {
47488                                  case 0x00000200: {
47489                                    // 0xf2800e10
47490                                    if (((instr & 0x920) == 0x100) ||
47491                                        ((instr & 0x520) == 0x100) ||
47492                                        ((instr & 0x820) == 0x20) ||
47493                                        ((instr & 0x420) == 0x20) ||
47494                                        ((instr & 0x220) == 0x20) ||
47495                                        ((instr & 0x120) == 0x120)) {
47496                                      UnallocatedA32(instr);
47497                                      return;
47498                                    }
47499                                    unsigned cmode = ((instr >> 8) & 0xf) |
47500                                                     ((instr >> 1) & 0x10);
47501                                    DataType dt =
47502                                        ImmediateVmov::DecodeDt(cmode);
47503                                    if (dt.Is(kDataTypeValueInvalid)) {
47504                                      UnallocatedA32(instr);
47505                                      return;
47506                                    }
47507                                    unsigned rd =
47508                                        ExtractDRegister(instr, 22, 12);
47509                                    DOperand imm =
47510                                        ImmediateVmov::DecodeImmediate(
47511                                            cmode,
47512                                            (instr & 0xf) |
47513                                                ((instr >> 12) & 0x70) |
47514                                                ((instr >> 17) & 0x80));
47515                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47516                                    vmov(al, dt, DRegister(rd), imm);
47517                                    break;
47518                                  }
47519                                  case 0x00000300: {
47520                                    // 0xf2800f10
47521                                    if (((instr & 0x920) == 0x100) ||
47522                                        ((instr & 0x520) == 0x100) ||
47523                                        ((instr & 0x820) == 0x20) ||
47524                                        ((instr & 0x420) == 0x20) ||
47525                                        ((instr & 0x220) == 0x20) ||
47526                                        ((instr & 0x120) == 0x120)) {
47527                                      UnallocatedA32(instr);
47528                                      return;
47529                                    }
47530                                    unsigned cmode = ((instr >> 8) & 0xf) |
47531                                                     ((instr >> 1) & 0x10);
47532                                    DataType dt =
47533                                        ImmediateVmov::DecodeDt(cmode);
47534                                    if (dt.Is(kDataTypeValueInvalid)) {
47535                                      UnallocatedA32(instr);
47536                                      return;
47537                                    }
47538                                    unsigned rd =
47539                                        ExtractDRegister(instr, 22, 12);
47540                                    DOperand imm =
47541                                        ImmediateVmov::DecodeImmediate(
47542                                            cmode,
47543                                            (instr & 0xf) |
47544                                                ((instr >> 12) & 0x70) |
47545                                                ((instr >> 17) & 0x80));
47546                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47547                                    vmov(al, dt, DRegister(rd), imm);
47548                                    break;
47549                                  }
47550                                  default: {
47551                                    switch (instr & 0x00000020) {
47552                                      case 0x00000020: {
47553                                        // 0xf2800c30
47554                                        switch (instr & 0x00000f20) {
47555                                          case 0x00000000: {
47556                                            // 0xf2800c10
47557                                            if (((instr & 0x920) == 0x100) ||
47558                                                ((instr & 0x520) == 0x100) ||
47559                                                ((instr & 0x820) == 0x20) ||
47560                                                ((instr & 0x420) == 0x20) ||
47561                                                ((instr & 0x220) == 0x20) ||
47562                                                ((instr & 0x120) == 0x120)) {
47563                                              UnallocatedA32(instr);
47564                                              return;
47565                                            }
47566                                            unsigned cmode =
47567                                                ((instr >> 8) & 0xf) |
47568                                                ((instr >> 1) & 0x10);
47569                                            DataType dt =
47570                                                ImmediateVmov::DecodeDt(cmode);
47571                                            if (dt.Is(kDataTypeValueInvalid)) {
47572                                              UnallocatedA32(instr);
47573                                              return;
47574                                            }
47575                                            unsigned rd =
47576                                                ExtractDRegister(instr, 22, 12);
47577                                            DOperand imm =
47578                                                ImmediateVmov::DecodeImmediate(
47579                                                    cmode,
47580                                                    (instr & 0xf) |
47581                                                        ((instr >> 12) & 0x70) |
47582                                                        ((instr >> 17) & 0x80));
47583                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47584                                            vmov(al, dt, DRegister(rd), imm);
47585                                            break;
47586                                          }
47587                                          case 0x00000020: {
47588                                            // 0xf2800c30
47589                                            if (((instr & 0xd00) == 0x100) ||
47590                                                ((instr & 0xd00) == 0x500) ||
47591                                                ((instr & 0xd00) == 0x900) ||
47592                                                ((instr & 0xe00) == 0xe00)) {
47593                                              UnallocatedA32(instr);
47594                                              return;
47595                                            }
47596                                            unsigned cmode = (instr >> 8) & 0xf;
47597                                            DataType dt =
47598                                                ImmediateVmvn::DecodeDt(cmode);
47599                                            if (dt.Is(kDataTypeValueInvalid)) {
47600                                              UnallocatedA32(instr);
47601                                              return;
47602                                            }
47603                                            unsigned rd =
47604                                                ExtractDRegister(instr, 22, 12);
47605                                            DOperand imm =
47606                                                ImmediateVmvn::DecodeImmediate(
47607                                                    cmode,
47608                                                    (instr & 0xf) |
47609                                                        ((instr >> 12) & 0x70) |
47610                                                        ((instr >> 17) & 0x80));
47611                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47612                                            vmvn(al, dt, DRegister(rd), imm);
47613                                            break;
47614                                          }
47615                                          case 0x00000200: {
47616                                            // 0xf2800e10
47617                                            if (((instr & 0x920) == 0x100) ||
47618                                                ((instr & 0x520) == 0x100) ||
47619                                                ((instr & 0x820) == 0x20) ||
47620                                                ((instr & 0x420) == 0x20) ||
47621                                                ((instr & 0x220) == 0x20) ||
47622                                                ((instr & 0x120) == 0x120)) {
47623                                              UnallocatedA32(instr);
47624                                              return;
47625                                            }
47626                                            unsigned cmode =
47627                                                ((instr >> 8) & 0xf) |
47628                                                ((instr >> 1) & 0x10);
47629                                            DataType dt =
47630                                                ImmediateVmov::DecodeDt(cmode);
47631                                            if (dt.Is(kDataTypeValueInvalid)) {
47632                                              UnallocatedA32(instr);
47633                                              return;
47634                                            }
47635                                            unsigned rd =
47636                                                ExtractDRegister(instr, 22, 12);
47637                                            DOperand imm =
47638                                                ImmediateVmov::DecodeImmediate(
47639                                                    cmode,
47640                                                    (instr & 0xf) |
47641                                                        ((instr >> 12) & 0x70) |
47642                                                        ((instr >> 17) & 0x80));
47643                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47644                                            vmov(al, dt, DRegister(rd), imm);
47645                                            break;
47646                                          }
47647                                          case 0x00000220: {
47648                                            // 0xf2800e30
47649                                            if (((instr & 0xd00) == 0x100) ||
47650                                                ((instr & 0xd00) == 0x500) ||
47651                                                ((instr & 0xd00) == 0x900) ||
47652                                                ((instr & 0xe00) == 0xe00)) {
47653                                              UnallocatedA32(instr);
47654                                              return;
47655                                            }
47656                                            unsigned cmode = (instr >> 8) & 0xf;
47657                                            DataType dt =
47658                                                ImmediateVmvn::DecodeDt(cmode);
47659                                            if (dt.Is(kDataTypeValueInvalid)) {
47660                                              UnallocatedA32(instr);
47661                                              return;
47662                                            }
47663                                            unsigned rd =
47664                                                ExtractDRegister(instr, 22, 12);
47665                                            DOperand imm =
47666                                                ImmediateVmvn::DecodeImmediate(
47667                                                    cmode,
47668                                                    (instr & 0xf) |
47669                                                        ((instr >> 12) & 0x70) |
47670                                                        ((instr >> 17) & 0x80));
47671                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47672                                            vmvn(al, dt, DRegister(rd), imm);
47673                                            break;
47674                                          }
47675                                          case 0x00000400: {
47676                                            // 0xf2800c10
47677                                            if (((instr & 0x920) == 0x100) ||
47678                                                ((instr & 0x520) == 0x100) ||
47679                                                ((instr & 0x820) == 0x20) ||
47680                                                ((instr & 0x420) == 0x20) ||
47681                                                ((instr & 0x220) == 0x20) ||
47682                                                ((instr & 0x120) == 0x120)) {
47683                                              UnallocatedA32(instr);
47684                                              return;
47685                                            }
47686                                            unsigned cmode =
47687                                                ((instr >> 8) & 0xf) |
47688                                                ((instr >> 1) & 0x10);
47689                                            DataType dt =
47690                                                ImmediateVmov::DecodeDt(cmode);
47691                                            if (dt.Is(kDataTypeValueInvalid)) {
47692                                              UnallocatedA32(instr);
47693                                              return;
47694                                            }
47695                                            unsigned rd =
47696                                                ExtractDRegister(instr, 22, 12);
47697                                            DOperand imm =
47698                                                ImmediateVmov::DecodeImmediate(
47699                                                    cmode,
47700                                                    (instr & 0xf) |
47701                                                        ((instr >> 12) & 0x70) |
47702                                                        ((instr >> 17) & 0x80));
47703                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47704                                            vmov(al, dt, DRegister(rd), imm);
47705                                            break;
47706                                          }
47707                                          case 0x00000420: {
47708                                            // 0xf2800c30
47709                                            if (((instr & 0xd00) == 0x100) ||
47710                                                ((instr & 0xd00) == 0x500) ||
47711                                                ((instr & 0xd00) == 0x900) ||
47712                                                ((instr & 0xe00) == 0xe00)) {
47713                                              UnallocatedA32(instr);
47714                                              return;
47715                                            }
47716                                            unsigned cmode = (instr >> 8) & 0xf;
47717                                            DataType dt =
47718                                                ImmediateVmvn::DecodeDt(cmode);
47719                                            if (dt.Is(kDataTypeValueInvalid)) {
47720                                              UnallocatedA32(instr);
47721                                              return;
47722                                            }
47723                                            unsigned rd =
47724                                                ExtractDRegister(instr, 22, 12);
47725                                            DOperand imm =
47726                                                ImmediateVmvn::DecodeImmediate(
47727                                                    cmode,
47728                                                    (instr & 0xf) |
47729                                                        ((instr >> 12) & 0x70) |
47730                                                        ((instr >> 17) & 0x80));
47731                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47732                                            vmvn(al, dt, DRegister(rd), imm);
47733                                            break;
47734                                          }
47735                                          case 0x00000600: {
47736                                            // 0xf2800e10
47737                                            if (((instr & 0x920) == 0x100) ||
47738                                                ((instr & 0x520) == 0x100) ||
47739                                                ((instr & 0x820) == 0x20) ||
47740                                                ((instr & 0x420) == 0x20) ||
47741                                                ((instr & 0x220) == 0x20) ||
47742                                                ((instr & 0x120) == 0x120)) {
47743                                              UnallocatedA32(instr);
47744                                              return;
47745                                            }
47746                                            unsigned cmode =
47747                                                ((instr >> 8) & 0xf) |
47748                                                ((instr >> 1) & 0x10);
47749                                            DataType dt =
47750                                                ImmediateVmov::DecodeDt(cmode);
47751                                            if (dt.Is(kDataTypeValueInvalid)) {
47752                                              UnallocatedA32(instr);
47753                                              return;
47754                                            }
47755                                            unsigned rd =
47756                                                ExtractDRegister(instr, 22, 12);
47757                                            DOperand imm =
47758                                                ImmediateVmov::DecodeImmediate(
47759                                                    cmode,
47760                                                    (instr & 0xf) |
47761                                                        ((instr >> 12) & 0x70) |
47762                                                        ((instr >> 17) & 0x80));
47763                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47764                                            vmov(al, dt, DRegister(rd), imm);
47765                                            break;
47766                                          }
47767                                          case 0x00000620: {
47768                                            // 0xf2800e30
47769                                            if (((instr & 0xd00) == 0x100) ||
47770                                                ((instr & 0xd00) == 0x500) ||
47771                                                ((instr & 0xd00) == 0x900) ||
47772                                                ((instr & 0xe00) == 0xe00)) {
47773                                              UnallocatedA32(instr);
47774                                              return;
47775                                            }
47776                                            unsigned cmode = (instr >> 8) & 0xf;
47777                                            DataType dt =
47778                                                ImmediateVmvn::DecodeDt(cmode);
47779                                            if (dt.Is(kDataTypeValueInvalid)) {
47780                                              UnallocatedA32(instr);
47781                                              return;
47782                                            }
47783                                            unsigned rd =
47784                                                ExtractDRegister(instr, 22, 12);
47785                                            DOperand imm =
47786                                                ImmediateVmvn::DecodeImmediate(
47787                                                    cmode,
47788                                                    (instr & 0xf) |
47789                                                        ((instr >> 12) & 0x70) |
47790                                                        ((instr >> 17) & 0x80));
47791                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47792                                            vmvn(al, dt, DRegister(rd), imm);
47793                                            break;
47794                                          }
47795                                          case 0x00000800: {
47796                                            // 0xf2800c10
47797                                            if (((instr & 0x920) == 0x100) ||
47798                                                ((instr & 0x520) == 0x100) ||
47799                                                ((instr & 0x820) == 0x20) ||
47800                                                ((instr & 0x420) == 0x20) ||
47801                                                ((instr & 0x220) == 0x20) ||
47802                                                ((instr & 0x120) == 0x120)) {
47803                                              UnallocatedA32(instr);
47804                                              return;
47805                                            }
47806                                            unsigned cmode =
47807                                                ((instr >> 8) & 0xf) |
47808                                                ((instr >> 1) & 0x10);
47809                                            DataType dt =
47810                                                ImmediateVmov::DecodeDt(cmode);
47811                                            if (dt.Is(kDataTypeValueInvalid)) {
47812                                              UnallocatedA32(instr);
47813                                              return;
47814                                            }
47815                                            unsigned rd =
47816                                                ExtractDRegister(instr, 22, 12);
47817                                            DOperand imm =
47818                                                ImmediateVmov::DecodeImmediate(
47819                                                    cmode,
47820                                                    (instr & 0xf) |
47821                                                        ((instr >> 12) & 0x70) |
47822                                                        ((instr >> 17) & 0x80));
47823                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47824                                            vmov(al, dt, DRegister(rd), imm);
47825                                            break;
47826                                          }
47827                                          case 0x00000820: {
47828                                            // 0xf2800c30
47829                                            if (((instr & 0xd00) == 0x100) ||
47830                                                ((instr & 0xd00) == 0x500) ||
47831                                                ((instr & 0xd00) == 0x900) ||
47832                                                ((instr & 0xe00) == 0xe00)) {
47833                                              UnallocatedA32(instr);
47834                                              return;
47835                                            }
47836                                            unsigned cmode = (instr >> 8) & 0xf;
47837                                            DataType dt =
47838                                                ImmediateVmvn::DecodeDt(cmode);
47839                                            if (dt.Is(kDataTypeValueInvalid)) {
47840                                              UnallocatedA32(instr);
47841                                              return;
47842                                            }
47843                                            unsigned rd =
47844                                                ExtractDRegister(instr, 22, 12);
47845                                            DOperand imm =
47846                                                ImmediateVmvn::DecodeImmediate(
47847                                                    cmode,
47848                                                    (instr & 0xf) |
47849                                                        ((instr >> 12) & 0x70) |
47850                                                        ((instr >> 17) & 0x80));
47851                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47852                                            vmvn(al, dt, DRegister(rd), imm);
47853                                            break;
47854                                          }
47855                                          case 0x00000a00: {
47856                                            // 0xf2800e10
47857                                            if (((instr & 0x920) == 0x100) ||
47858                                                ((instr & 0x520) == 0x100) ||
47859                                                ((instr & 0x820) == 0x20) ||
47860                                                ((instr & 0x420) == 0x20) ||
47861                                                ((instr & 0x220) == 0x20) ||
47862                                                ((instr & 0x120) == 0x120)) {
47863                                              UnallocatedA32(instr);
47864                                              return;
47865                                            }
47866                                            unsigned cmode =
47867                                                ((instr >> 8) & 0xf) |
47868                                                ((instr >> 1) & 0x10);
47869                                            DataType dt =
47870                                                ImmediateVmov::DecodeDt(cmode);
47871                                            if (dt.Is(kDataTypeValueInvalid)) {
47872                                              UnallocatedA32(instr);
47873                                              return;
47874                                            }
47875                                            unsigned rd =
47876                                                ExtractDRegister(instr, 22, 12);
47877                                            DOperand imm =
47878                                                ImmediateVmov::DecodeImmediate(
47879                                                    cmode,
47880                                                    (instr & 0xf) |
47881                                                        ((instr >> 12) & 0x70) |
47882                                                        ((instr >> 17) & 0x80));
47883                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47884                                            vmov(al, dt, DRegister(rd), imm);
47885                                            break;
47886                                          }
47887                                          case 0x00000a20: {
47888                                            // 0xf2800e30
47889                                            if (((instr & 0xd00) == 0x100) ||
47890                                                ((instr & 0xd00) == 0x500) ||
47891                                                ((instr & 0xd00) == 0x900) ||
47892                                                ((instr & 0xe00) == 0xe00)) {
47893                                              UnallocatedA32(instr);
47894                                              return;
47895                                            }
47896                                            unsigned cmode = (instr >> 8) & 0xf;
47897                                            DataType dt =
47898                                                ImmediateVmvn::DecodeDt(cmode);
47899                                            if (dt.Is(kDataTypeValueInvalid)) {
47900                                              UnallocatedA32(instr);
47901                                              return;
47902                                            }
47903                                            unsigned rd =
47904                                                ExtractDRegister(instr, 22, 12);
47905                                            DOperand imm =
47906                                                ImmediateVmvn::DecodeImmediate(
47907                                                    cmode,
47908                                                    (instr & 0xf) |
47909                                                        ((instr >> 12) & 0x70) |
47910                                                        ((instr >> 17) & 0x80));
47911                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47912                                            vmvn(al, dt, DRegister(rd), imm);
47913                                            break;
47914                                          }
47915                                          case 0x00000c00: {
47916                                            // 0xf2800c10
47917                                            if (((instr & 0x920) == 0x100) ||
47918                                                ((instr & 0x520) == 0x100) ||
47919                                                ((instr & 0x820) == 0x20) ||
47920                                                ((instr & 0x420) == 0x20) ||
47921                                                ((instr & 0x220) == 0x20) ||
47922                                                ((instr & 0x120) == 0x120)) {
47923                                              UnallocatedA32(instr);
47924                                              return;
47925                                            }
47926                                            unsigned cmode =
47927                                                ((instr >> 8) & 0xf) |
47928                                                ((instr >> 1) & 0x10);
47929                                            DataType dt =
47930                                                ImmediateVmov::DecodeDt(cmode);
47931                                            if (dt.Is(kDataTypeValueInvalid)) {
47932                                              UnallocatedA32(instr);
47933                                              return;
47934                                            }
47935                                            unsigned rd =
47936                                                ExtractDRegister(instr, 22, 12);
47937                                            DOperand imm =
47938                                                ImmediateVmov::DecodeImmediate(
47939                                                    cmode,
47940                                                    (instr & 0xf) |
47941                                                        ((instr >> 12) & 0x70) |
47942                                                        ((instr >> 17) & 0x80));
47943                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47944                                            vmov(al, dt, DRegister(rd), imm);
47945                                            break;
47946                                          }
47947                                          case 0x00000c20: {
47948                                            // 0xf2800c30
47949                                            if (((instr & 0xd00) == 0x100) ||
47950                                                ((instr & 0xd00) == 0x500) ||
47951                                                ((instr & 0xd00) == 0x900) ||
47952                                                ((instr & 0xe00) == 0xe00)) {
47953                                              UnallocatedA32(instr);
47954                                              return;
47955                                            }
47956                                            unsigned cmode = (instr >> 8) & 0xf;
47957                                            DataType dt =
47958                                                ImmediateVmvn::DecodeDt(cmode);
47959                                            if (dt.Is(kDataTypeValueInvalid)) {
47960                                              UnallocatedA32(instr);
47961                                              return;
47962                                            }
47963                                            unsigned rd =
47964                                                ExtractDRegister(instr, 22, 12);
47965                                            DOperand imm =
47966                                                ImmediateVmvn::DecodeImmediate(
47967                                                    cmode,
47968                                                    (instr & 0xf) |
47969                                                        ((instr >> 12) & 0x70) |
47970                                                        ((instr >> 17) & 0x80));
47971                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47972                                            vmvn(al, dt, DRegister(rd), imm);
47973                                            break;
47974                                          }
47975                                          case 0x00000d00: {
47976                                            // 0xf2800d10
47977                                            if (((instr & 0x920) == 0x100) ||
47978                                                ((instr & 0x520) == 0x100) ||
47979                                                ((instr & 0x820) == 0x20) ||
47980                                                ((instr & 0x420) == 0x20) ||
47981                                                ((instr & 0x220) == 0x20) ||
47982                                                ((instr & 0x120) == 0x120)) {
47983                                              UnallocatedA32(instr);
47984                                              return;
47985                                            }
47986                                            unsigned cmode =
47987                                                ((instr >> 8) & 0xf) |
47988                                                ((instr >> 1) & 0x10);
47989                                            DataType dt =
47990                                                ImmediateVmov::DecodeDt(cmode);
47991                                            if (dt.Is(kDataTypeValueInvalid)) {
47992                                              UnallocatedA32(instr);
47993                                              return;
47994                                            }
47995                                            unsigned rd =
47996                                                ExtractDRegister(instr, 22, 12);
47997                                            DOperand imm =
47998                                                ImmediateVmov::DecodeImmediate(
47999                                                    cmode,
48000                                                    (instr & 0xf) |
48001                                                        ((instr >> 12) & 0x70) |
48002                                                        ((instr >> 17) & 0x80));
48003                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48004                                            vmov(al, dt, DRegister(rd), imm);
48005                                            break;
48006                                          }
48007                                          case 0x00000d20: {
48008                                            // 0xf2800d30
48009                                            if (((instr & 0xd00) == 0x100) ||
48010                                                ((instr & 0xd00) == 0x500) ||
48011                                                ((instr & 0xd00) == 0x900) ||
48012                                                ((instr & 0xe00) == 0xe00)) {
48013                                              UnallocatedA32(instr);
48014                                              return;
48015                                            }
48016                                            unsigned cmode = (instr >> 8) & 0xf;
48017                                            DataType dt =
48018                                                ImmediateVmvn::DecodeDt(cmode);
48019                                            if (dt.Is(kDataTypeValueInvalid)) {
48020                                              UnallocatedA32(instr);
48021                                              return;
48022                                            }
48023                                            unsigned rd =
48024                                                ExtractDRegister(instr, 22, 12);
48025                                            DOperand imm =
48026                                                ImmediateVmvn::DecodeImmediate(
48027                                                    cmode,
48028                                                    (instr & 0xf) |
48029                                                        ((instr >> 12) & 0x70) |
48030                                                        ((instr >> 17) & 0x80));
48031                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48032                                            vmvn(al, dt, DRegister(rd), imm);
48033                                            break;
48034                                          }
48035                                          case 0x00000e00: {
48036                                            // 0xf2800e10
48037                                            if (((instr & 0x920) == 0x100) ||
48038                                                ((instr & 0x520) == 0x100) ||
48039                                                ((instr & 0x820) == 0x20) ||
48040                                                ((instr & 0x420) == 0x20) ||
48041                                                ((instr & 0x220) == 0x20) ||
48042                                                ((instr & 0x120) == 0x120)) {
48043                                              UnallocatedA32(instr);
48044                                              return;
48045                                            }
48046                                            unsigned cmode =
48047                                                ((instr >> 8) & 0xf) |
48048                                                ((instr >> 1) & 0x10);
48049                                            DataType dt =
48050                                                ImmediateVmov::DecodeDt(cmode);
48051                                            if (dt.Is(kDataTypeValueInvalid)) {
48052                                              UnallocatedA32(instr);
48053                                              return;
48054                                            }
48055                                            unsigned rd =
48056                                                ExtractDRegister(instr, 22, 12);
48057                                            DOperand imm =
48058                                                ImmediateVmov::DecodeImmediate(
48059                                                    cmode,
48060                                                    (instr & 0xf) |
48061                                                        ((instr >> 12) & 0x70) |
48062                                                        ((instr >> 17) & 0x80));
48063                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48064                                            vmov(al, dt, DRegister(rd), imm);
48065                                            break;
48066                                          }
48067                                          case 0x00000e20: {
48068                                            // 0xf2800e30
48069                                            if (((instr & 0x920) == 0x100) ||
48070                                                ((instr & 0x520) == 0x100) ||
48071                                                ((instr & 0x820) == 0x20) ||
48072                                                ((instr & 0x420) == 0x20) ||
48073                                                ((instr & 0x220) == 0x20) ||
48074                                                ((instr & 0x120) == 0x120)) {
48075                                              UnallocatedA32(instr);
48076                                              return;
48077                                            }
48078                                            unsigned cmode =
48079                                                ((instr >> 8) & 0xf) |
48080                                                ((instr >> 1) & 0x10);
48081                                            DataType dt =
48082                                                ImmediateVmov::DecodeDt(cmode);
48083                                            if (dt.Is(kDataTypeValueInvalid)) {
48084                                              UnallocatedA32(instr);
48085                                              return;
48086                                            }
48087                                            unsigned rd =
48088                                                ExtractDRegister(instr, 22, 12);
48089                                            DOperand imm =
48090                                                ImmediateVmov::DecodeImmediate(
48091                                                    cmode,
48092                                                    (instr & 0xf) |
48093                                                        ((instr >> 12) & 0x70) |
48094                                                        ((instr >> 17) & 0x80));
48095                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48096                                            vmov(al, dt, DRegister(rd), imm);
48097                                            break;
48098                                          }
48099                                          case 0x00000f00: {
48100                                            // 0xf2800f10
48101                                            if (((instr & 0x920) == 0x100) ||
48102                                                ((instr & 0x520) == 0x100) ||
48103                                                ((instr & 0x820) == 0x20) ||
48104                                                ((instr & 0x420) == 0x20) ||
48105                                                ((instr & 0x220) == 0x20) ||
48106                                                ((instr & 0x120) == 0x120)) {
48107                                              UnallocatedA32(instr);
48108                                              return;
48109                                            }
48110                                            unsigned cmode =
48111                                                ((instr >> 8) & 0xf) |
48112                                                ((instr >> 1) & 0x10);
48113                                            DataType dt =
48114                                                ImmediateVmov::DecodeDt(cmode);
48115                                            if (dt.Is(kDataTypeValueInvalid)) {
48116                                              UnallocatedA32(instr);
48117                                              return;
48118                                            }
48119                                            unsigned rd =
48120                                                ExtractDRegister(instr, 22, 12);
48121                                            DOperand imm =
48122                                                ImmediateVmov::DecodeImmediate(
48123                                                    cmode,
48124                                                    (instr & 0xf) |
48125                                                        ((instr >> 12) & 0x70) |
48126                                                        ((instr >> 17) & 0x80));
48127                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48128                                            vmov(al, dt, DRegister(rd), imm);
48129                                            break;
48130                                          }
48131                                          default:
48132                                            UnallocatedA32(instr);
48133                                            break;
48134                                        }
48135                                        break;
48136                                      }
48137                                      default: {
48138                                        if (((instr & 0x920) == 0x100) ||
48139                                            ((instr & 0x520) == 0x100) ||
48140                                            ((instr & 0x820) == 0x20) ||
48141                                            ((instr & 0x420) == 0x20) ||
48142                                            ((instr & 0x220) == 0x20) ||
48143                                            ((instr & 0x120) == 0x120)) {
48144                                          UnallocatedA32(instr);
48145                                          return;
48146                                        }
48147                                        unsigned cmode = ((instr >> 8) & 0xf) |
48148                                                         ((instr >> 1) & 0x10);
48149                                        DataType dt =
48150                                            ImmediateVmov::DecodeDt(cmode);
48151                                        if (dt.Is(kDataTypeValueInvalid)) {
48152                                          UnallocatedA32(instr);
48153                                          return;
48154                                        }
48155                                        unsigned rd =
48156                                            ExtractDRegister(instr, 22, 12);
48157                                        DOperand imm =
48158                                            ImmediateVmov::DecodeImmediate(
48159                                                cmode,
48160                                                (instr & 0xf) |
48161                                                    ((instr >> 12) & 0x70) |
48162                                                    ((instr >> 17) & 0x80));
48163                                        // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
48164                                        vmov(al, dt, DRegister(rd), imm);
48165                                        break;
48166                                      }
48167                                    }
48168                                    break;
48169                                  }
48170                                }
48171                                break;
48172                              }
48173                              default:
48174                                UnallocatedA32(instr);
48175                                break;
48176                            }
48177                            break;
48178                          }
48179                          default: {
48180                            if ((instr & 0x00000200) == 0x00000200) {
48181                              if (((instr & 0x200000) == 0x0)) {
48182                                UnallocatedA32(instr);
48183                                return;
48184                              }
48185                              DataType dt1 = Dt_op_U_1_Decode1(
48186                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
48187                              if (dt1.Is(kDataTypeValueInvalid)) {
48188                                UnallocatedA32(instr);
48189                                return;
48190                              }
48191                              DataType dt2 = Dt_op_U_1_Decode2(
48192                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
48193                              if (dt2.Is(kDataTypeValueInvalid)) {
48194                                UnallocatedA32(instr);
48195                                return;
48196                              }
48197                              unsigned rd = ExtractDRegister(instr, 22, 12);
48198                              unsigned rm = ExtractDRegister(instr, 5, 0);
48199                              uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
48200                              // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
48201                              vcvt(al,
48202                                   dt1,
48203                                   dt2,
48204                                   DRegister(rd),
48205                                   DRegister(rm),
48206                                   fbits);
48207                            } else {
48208                              UnallocatedA32(instr);
48209                            }
48210                            break;
48211                          }
48212                        }
48213                        break;
48214                      }
48215                      default:
48216                        UnallocatedA32(instr);
48217                        break;
48218                    }
48219                    break;
48220                  }
48221                }
48222                break;
48223              }
48224              case 0x00000040: {
48225                // 0xf2800050
48226                switch (instr & 0x00000c00) {
48227                  case 0x00000000: {
48228                    // 0xf2800050
48229                    switch (instr & 0x00380080) {
48230                      case 0x00000000: {
48231                        // 0xf2800050
48232                        switch (instr & 0x00000100) {
48233                          case 0x00000000: {
48234                            // 0xf2800050
48235                            switch (instr & 0x00000200) {
48236                              default: {
48237                                switch (instr & 0x00000020) {
48238                                  case 0x00000020: {
48239                                    // 0xf2800070
48240                                    if (((instr & 0xd00) == 0x100) ||
48241                                        ((instr & 0xd00) == 0x500) ||
48242                                        ((instr & 0xd00) == 0x900) ||
48243                                        ((instr & 0xe00) == 0xe00)) {
48244                                      UnallocatedA32(instr);
48245                                      return;
48246                                    }
48247                                    unsigned cmode = (instr >> 8) & 0xf;
48248                                    DataType dt =
48249                                        ImmediateVmvn::DecodeDt(cmode);
48250                                    if (dt.Is(kDataTypeValueInvalid)) {
48251                                      UnallocatedA32(instr);
48252                                      return;
48253                                    }
48254                                    if (((instr >> 12) & 1) != 0) {
48255                                      UnallocatedA32(instr);
48256                                      return;
48257                                    }
48258                                    unsigned rd =
48259                                        ExtractQRegister(instr, 22, 12);
48260                                    QOperand imm =
48261                                        ImmediateVmvn::DecodeImmediate(
48262                                            cmode,
48263                                            (instr & 0xf) |
48264                                                ((instr >> 12) & 0x70) |
48265                                                ((instr >> 17) & 0x80));
48266                                    // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48267                                    vmvn(al, dt, QRegister(rd), imm);
48268                                    break;
48269                                  }
48270                                  default: {
48271                                    if (((instr & 0x920) == 0x100) ||
48272                                        ((instr & 0x520) == 0x100) ||
48273                                        ((instr & 0x820) == 0x20) ||
48274                                        ((instr & 0x420) == 0x20) ||
48275                                        ((instr & 0x220) == 0x20) ||
48276                                        ((instr & 0x120) == 0x120)) {
48277                                      UnallocatedA32(instr);
48278                                      return;
48279                                    }
48280                                    unsigned cmode = ((instr >> 8) & 0xf) |
48281                                                     ((instr >> 1) & 0x10);
48282                                    DataType dt =
48283                                        ImmediateVmov::DecodeDt(cmode);
48284                                    if (dt.Is(kDataTypeValueInvalid)) {
48285                                      UnallocatedA32(instr);
48286                                      return;
48287                                    }
48288                                    if (((instr >> 12) & 1) != 0) {
48289                                      UnallocatedA32(instr);
48290                                      return;
48291                                    }
48292                                    unsigned rd =
48293                                        ExtractQRegister(instr, 22, 12);
48294                                    QOperand imm =
48295                                        ImmediateVmov::DecodeImmediate(
48296                                            cmode,
48297                                            (instr & 0xf) |
48298                                                ((instr >> 12) & 0x70) |
48299                                                ((instr >> 17) & 0x80));
48300                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48301                                    vmov(al, dt, QRegister(rd), imm);
48302                                    break;
48303                                  }
48304                                }
48305                                break;
48306                              }
48307                            }
48308                            break;
48309                          }
48310                          case 0x00000100: {
48311                            // 0xf2800150
48312                            switch (instr & 0x00000020) {
48313                              case 0x00000000: {
48314                                // 0xf2800150
48315                                if (((instr & 0x100) == 0x0) ||
48316                                    ((instr & 0xc00) == 0xc00)) {
48317                                  UnallocatedA32(instr);
48318                                  return;
48319                                }
48320                                unsigned cmode = (instr >> 8) & 0xf;
48321                                DataType dt = ImmediateVorr::DecodeDt(cmode);
48322                                if (dt.Is(kDataTypeValueInvalid)) {
48323                                  UnallocatedA32(instr);
48324                                  return;
48325                                }
48326                                if (((instr >> 12) & 1) != 0) {
48327                                  UnallocatedA32(instr);
48328                                  return;
48329                                }
48330                                unsigned rd = ExtractQRegister(instr, 22, 12);
48331                                QOperand imm = ImmediateVorr::DecodeImmediate(
48332                                    cmode,
48333                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
48334                                        ((instr >> 17) & 0x80));
48335                                // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48336                                vorr(al, dt, QRegister(rd), QRegister(rd), imm);
48337                                break;
48338                              }
48339                              case 0x00000020: {
48340                                // 0xf2800170
48341                                if (((instr & 0x100) == 0x0) ||
48342                                    ((instr & 0xc00) == 0xc00)) {
48343                                  UnallocatedA32(instr);
48344                                  return;
48345                                }
48346                                unsigned cmode = (instr >> 8) & 0xf;
48347                                DataType dt = ImmediateVbic::DecodeDt(cmode);
48348                                if (dt.Is(kDataTypeValueInvalid)) {
48349                                  UnallocatedA32(instr);
48350                                  return;
48351                                }
48352                                if (((instr >> 12) & 1) != 0) {
48353                                  UnallocatedA32(instr);
48354                                  return;
48355                                }
48356                                unsigned rd = ExtractQRegister(instr, 22, 12);
48357                                QOperand imm = ImmediateVbic::DecodeImmediate(
48358                                    cmode,
48359                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
48360                                        ((instr >> 17) & 0x80));
48361                                // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48362                                vbic(al, dt, QRegister(rd), QRegister(rd), imm);
48363                                break;
48364                              }
48365                            }
48366                            break;
48367                          }
48368                        }
48369                        break;
48370                      }
48371                      default: {
48372                        switch (instr & 0x00000300) {
48373                          case 0x00000000: {
48374                            // 0xf2800050
48375                            if (((instr & 0x380080) == 0x0)) {
48376                              UnallocatedA32(instr);
48377                              return;
48378                            }
48379                            DataType dt =
48380                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48381                                                       ((instr >> 4) & 0x8),
48382                                                   (instr >> 24) & 0x1);
48383                            if (dt.Is(kDataTypeValueInvalid)) {
48384                              UnallocatedA32(instr);
48385                              return;
48386                            }
48387                            if (((instr >> 12) & 1) != 0) {
48388                              UnallocatedA32(instr);
48389                              return;
48390                            }
48391                            unsigned rd = ExtractQRegister(instr, 22, 12);
48392                            if ((instr & 1) != 0) {
48393                              UnallocatedA32(instr);
48394                              return;
48395                            }
48396                            unsigned rm = ExtractQRegister(instr, 5, 0);
48397                            uint32_t imm6 = (instr >> 16) & 0x3f;
48398                            uint32_t imm =
48399                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48400                                imm6;
48401                            // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48402                            vshr(al, dt, QRegister(rd), QRegister(rm), imm);
48403                            break;
48404                          }
48405                          case 0x00000100: {
48406                            // 0xf2800150
48407                            if (((instr & 0x380080) == 0x0)) {
48408                              UnallocatedA32(instr);
48409                              return;
48410                            }
48411                            DataType dt =
48412                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48413                                                       ((instr >> 4) & 0x8),
48414                                                   (instr >> 24) & 0x1);
48415                            if (dt.Is(kDataTypeValueInvalid)) {
48416                              UnallocatedA32(instr);
48417                              return;
48418                            }
48419                            if (((instr >> 12) & 1) != 0) {
48420                              UnallocatedA32(instr);
48421                              return;
48422                            }
48423                            unsigned rd = ExtractQRegister(instr, 22, 12);
48424                            if ((instr & 1) != 0) {
48425                              UnallocatedA32(instr);
48426                              return;
48427                            }
48428                            unsigned rm = ExtractQRegister(instr, 5, 0);
48429                            uint32_t imm6 = (instr >> 16) & 0x3f;
48430                            uint32_t imm =
48431                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48432                                imm6;
48433                            // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48434                            vsra(al, dt, QRegister(rd), QRegister(rm), imm);
48435                            break;
48436                          }
48437                          case 0x00000200: {
48438                            // 0xf2800250
48439                            if (((instr & 0x380080) == 0x0)) {
48440                              UnallocatedA32(instr);
48441                              return;
48442                            }
48443                            DataType dt =
48444                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48445                                                       ((instr >> 4) & 0x8),
48446                                                   (instr >> 24) & 0x1);
48447                            if (dt.Is(kDataTypeValueInvalid)) {
48448                              UnallocatedA32(instr);
48449                              return;
48450                            }
48451                            if (((instr >> 12) & 1) != 0) {
48452                              UnallocatedA32(instr);
48453                              return;
48454                            }
48455                            unsigned rd = ExtractQRegister(instr, 22, 12);
48456                            if ((instr & 1) != 0) {
48457                              UnallocatedA32(instr);
48458                              return;
48459                            }
48460                            unsigned rm = ExtractQRegister(instr, 5, 0);
48461                            uint32_t imm6 = (instr >> 16) & 0x3f;
48462                            uint32_t imm =
48463                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48464                                imm6;
48465                            // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48466                            vrshr(al, dt, QRegister(rd), QRegister(rm), imm);
48467                            break;
48468                          }
48469                          case 0x00000300: {
48470                            // 0xf2800350
48471                            if (((instr & 0x380080) == 0x0)) {
48472                              UnallocatedA32(instr);
48473                              return;
48474                            }
48475                            DataType dt =
48476                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48477                                                       ((instr >> 4) & 0x8),
48478                                                   (instr >> 24) & 0x1);
48479                            if (dt.Is(kDataTypeValueInvalid)) {
48480                              UnallocatedA32(instr);
48481                              return;
48482                            }
48483                            if (((instr >> 12) & 1) != 0) {
48484                              UnallocatedA32(instr);
48485                              return;
48486                            }
48487                            unsigned rd = ExtractQRegister(instr, 22, 12);
48488                            if ((instr & 1) != 0) {
48489                              UnallocatedA32(instr);
48490                              return;
48491                            }
48492                            unsigned rm = ExtractQRegister(instr, 5, 0);
48493                            uint32_t imm6 = (instr >> 16) & 0x3f;
48494                            uint32_t imm =
48495                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48496                                imm6;
48497                            // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48498                            vrsra(al, dt, QRegister(rd), QRegister(rm), imm);
48499                            break;
48500                          }
48501                        }
48502                        break;
48503                      }
48504                    }
48505                    break;
48506                  }
48507                  case 0x00000400: {
48508                    // 0xf2800450
48509                    switch (instr & 0x00380080) {
48510                      case 0x00000000: {
48511                        // 0xf2800450
48512                        switch (instr & 0x00000100) {
48513                          case 0x00000000: {
48514                            // 0xf2800450
48515                            switch (instr & 0x00000200) {
48516                              default: {
48517                                switch (instr & 0x00000020) {
48518                                  case 0x00000020: {
48519                                    // 0xf2800470
48520                                    if (((instr & 0xd00) == 0x100) ||
48521                                        ((instr & 0xd00) == 0x500) ||
48522                                        ((instr & 0xd00) == 0x900) ||
48523                                        ((instr & 0xe00) == 0xe00)) {
48524                                      UnallocatedA32(instr);
48525                                      return;
48526                                    }
48527                                    unsigned cmode = (instr >> 8) & 0xf;
48528                                    DataType dt =
48529                                        ImmediateVmvn::DecodeDt(cmode);
48530                                    if (dt.Is(kDataTypeValueInvalid)) {
48531                                      UnallocatedA32(instr);
48532                                      return;
48533                                    }
48534                                    if (((instr >> 12) & 1) != 0) {
48535                                      UnallocatedA32(instr);
48536                                      return;
48537                                    }
48538                                    unsigned rd =
48539                                        ExtractQRegister(instr, 22, 12);
48540                                    QOperand imm =
48541                                        ImmediateVmvn::DecodeImmediate(
48542                                            cmode,
48543                                            (instr & 0xf) |
48544                                                ((instr >> 12) & 0x70) |
48545                                                ((instr >> 17) & 0x80));
48546                                    // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48547                                    vmvn(al, dt, QRegister(rd), imm);
48548                                    break;
48549                                  }
48550                                  default: {
48551                                    if (((instr & 0x920) == 0x100) ||
48552                                        ((instr & 0x520) == 0x100) ||
48553                                        ((instr & 0x820) == 0x20) ||
48554                                        ((instr & 0x420) == 0x20) ||
48555                                        ((instr & 0x220) == 0x20) ||
48556                                        ((instr & 0x120) == 0x120)) {
48557                                      UnallocatedA32(instr);
48558                                      return;
48559                                    }
48560                                    unsigned cmode = ((instr >> 8) & 0xf) |
48561                                                     ((instr >> 1) & 0x10);
48562                                    DataType dt =
48563                                        ImmediateVmov::DecodeDt(cmode);
48564                                    if (dt.Is(kDataTypeValueInvalid)) {
48565                                      UnallocatedA32(instr);
48566                                      return;
48567                                    }
48568                                    if (((instr >> 12) & 1) != 0) {
48569                                      UnallocatedA32(instr);
48570                                      return;
48571                                    }
48572                                    unsigned rd =
48573                                        ExtractQRegister(instr, 22, 12);
48574                                    QOperand imm =
48575                                        ImmediateVmov::DecodeImmediate(
48576                                            cmode,
48577                                            (instr & 0xf) |
48578                                                ((instr >> 12) & 0x70) |
48579                                                ((instr >> 17) & 0x80));
48580                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48581                                    vmov(al, dt, QRegister(rd), imm);
48582                                    break;
48583                                  }
48584                                }
48585                                break;
48586                              }
48587                            }
48588                            break;
48589                          }
48590                          case 0x00000100: {
48591                            // 0xf2800550
48592                            switch (instr & 0x00000020) {
48593                              case 0x00000000: {
48594                                // 0xf2800550
48595                                if (((instr & 0x100) == 0x0) ||
48596                                    ((instr & 0xc00) == 0xc00)) {
48597                                  UnallocatedA32(instr);
48598                                  return;
48599                                }
48600                                unsigned cmode = (instr >> 8) & 0xf;
48601                                DataType dt = ImmediateVorr::DecodeDt(cmode);
48602                                if (dt.Is(kDataTypeValueInvalid)) {
48603                                  UnallocatedA32(instr);
48604                                  return;
48605                                }
48606                                if (((instr >> 12) & 1) != 0) {
48607                                  UnallocatedA32(instr);
48608                                  return;
48609                                }
48610                                unsigned rd = ExtractQRegister(instr, 22, 12);
48611                                QOperand imm = ImmediateVorr::DecodeImmediate(
48612                                    cmode,
48613                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
48614                                        ((instr >> 17) & 0x80));
48615                                // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48616                                vorr(al, dt, QRegister(rd), QRegister(rd), imm);
48617                                break;
48618                              }
48619                              case 0x00000020: {
48620                                // 0xf2800570
48621                                if (((instr & 0x100) == 0x0) ||
48622                                    ((instr & 0xc00) == 0xc00)) {
48623                                  UnallocatedA32(instr);
48624                                  return;
48625                                }
48626                                unsigned cmode = (instr >> 8) & 0xf;
48627                                DataType dt = ImmediateVbic::DecodeDt(cmode);
48628                                if (dt.Is(kDataTypeValueInvalid)) {
48629                                  UnallocatedA32(instr);
48630                                  return;
48631                                }
48632                                if (((instr >> 12) & 1) != 0) {
48633                                  UnallocatedA32(instr);
48634                                  return;
48635                                }
48636                                unsigned rd = ExtractQRegister(instr, 22, 12);
48637                                QOperand imm = ImmediateVbic::DecodeImmediate(
48638                                    cmode,
48639                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
48640                                        ((instr >> 17) & 0x80));
48641                                // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48642                                vbic(al, dt, QRegister(rd), QRegister(rd), imm);
48643                                break;
48644                              }
48645                            }
48646                            break;
48647                          }
48648                        }
48649                        break;
48650                      }
48651                      default: {
48652                        switch (instr & 0x00000300) {
48653                          case 0x00000000: {
48654                            // 0xf2800450
48655                            if ((instr & 0x01000000) == 0x01000000) {
48656                              if (((instr & 0x380080) == 0x0)) {
48657                                UnallocatedA32(instr);
48658                                return;
48659                              }
48660                              DataType dt = Dt_L_imm6_4_Decode(
48661                                  ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
48662                              if (dt.Is(kDataTypeValueInvalid)) {
48663                                UnallocatedA32(instr);
48664                                return;
48665                              }
48666                              if (((instr >> 12) & 1) != 0) {
48667                                UnallocatedA32(instr);
48668                                return;
48669                              }
48670                              unsigned rd = ExtractQRegister(instr, 22, 12);
48671                              if ((instr & 1) != 0) {
48672                                UnallocatedA32(instr);
48673                                return;
48674                              }
48675                              unsigned rm = ExtractQRegister(instr, 5, 0);
48676                              uint32_t imm6 = (instr >> 16) & 0x3f;
48677                              uint32_t imm =
48678                                  (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48679                                  imm6;
48680                              // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
48681                              vsri(al, dt, QRegister(rd), QRegister(rm), imm);
48682                            } else {
48683                              UnallocatedA32(instr);
48684                            }
48685                            break;
48686                          }
48687                          case 0x00000100: {
48688                            // 0xf2800550
48689                            switch (instr & 0x01000000) {
48690                              case 0x00000000: {
48691                                // 0xf2800550
48692                                if (((instr & 0x380080) == 0x0)) {
48693                                  UnallocatedA32(instr);
48694                                  return;
48695                                }
48696                                DataType dt =
48697                                    Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
48698                                                       ((instr >> 4) & 0x8));
48699                                if (dt.Is(kDataTypeValueInvalid)) {
48700                                  UnallocatedA32(instr);
48701                                  return;
48702                                }
48703                                if (((instr >> 12) & 1) != 0) {
48704                                  UnallocatedA32(instr);
48705                                  return;
48706                                }
48707                                unsigned rd = ExtractQRegister(instr, 22, 12);
48708                                if ((instr & 1) != 0) {
48709                                  UnallocatedA32(instr);
48710                                  return;
48711                                }
48712                                unsigned rm = ExtractQRegister(instr, 5, 0);
48713                                uint32_t imm6 = (instr >> 16) & 0x3f;
48714                                uint32_t imm =
48715                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48716                                // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48717                                vshl(al, dt, QRegister(rd), QRegister(rm), imm);
48718                                break;
48719                              }
48720                              case 0x01000000: {
48721                                // 0xf3800550
48722                                if (((instr & 0x380080) == 0x0)) {
48723                                  UnallocatedA32(instr);
48724                                  return;
48725                                }
48726                                DataType dt =
48727                                    Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
48728                                                       ((instr >> 4) & 0x8));
48729                                if (dt.Is(kDataTypeValueInvalid)) {
48730                                  UnallocatedA32(instr);
48731                                  return;
48732                                }
48733                                if (((instr >> 12) & 1) != 0) {
48734                                  UnallocatedA32(instr);
48735                                  return;
48736                                }
48737                                unsigned rd = ExtractQRegister(instr, 22, 12);
48738                                if ((instr & 1) != 0) {
48739                                  UnallocatedA32(instr);
48740                                  return;
48741                                }
48742                                unsigned rm = ExtractQRegister(instr, 5, 0);
48743                                uint32_t imm6 = (instr >> 16) & 0x3f;
48744                                uint32_t imm =
48745                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48746                                // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
48747                                vsli(al, dt, QRegister(rd), QRegister(rm), imm);
48748                                break;
48749                              }
48750                            }
48751                            break;
48752                          }
48753                          case 0x00000200: {
48754                            // 0xf2800650
48755                            if (((instr & 0x380080) == 0x0)) {
48756                              UnallocatedA32(instr);
48757                              return;
48758                            }
48759                            DataType dt =
48760                                Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
48761                                                       ((instr >> 4) & 0x8),
48762                                                   (instr >> 24) & 0x1);
48763                            if (dt.Is(kDataTypeValueInvalid)) {
48764                              UnallocatedA32(instr);
48765                              return;
48766                            }
48767                            if (((instr >> 12) & 1) != 0) {
48768                              UnallocatedA32(instr);
48769                              return;
48770                            }
48771                            unsigned rd = ExtractQRegister(instr, 22, 12);
48772                            if ((instr & 1) != 0) {
48773                              UnallocatedA32(instr);
48774                              return;
48775                            }
48776                            unsigned rm = ExtractQRegister(instr, 5, 0);
48777                            uint32_t imm6 = (instr >> 16) & 0x3f;
48778                            uint32_t imm =
48779                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48780                            // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48781                            vqshlu(al, dt, QRegister(rd), QRegister(rm), imm);
48782                            break;
48783                          }
48784                          case 0x00000300: {
48785                            // 0xf2800750
48786                            if (((instr & 0x380080) == 0x0)) {
48787                              UnallocatedA32(instr);
48788                              return;
48789                            }
48790                            DataType dt =
48791                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48792                                                       ((instr >> 4) & 0x8),
48793                                                   (instr >> 24) & 0x1);
48794                            if (dt.Is(kDataTypeValueInvalid)) {
48795                              UnallocatedA32(instr);
48796                              return;
48797                            }
48798                            if (((instr >> 12) & 1) != 0) {
48799                              UnallocatedA32(instr);
48800                              return;
48801                            }
48802                            unsigned rd = ExtractQRegister(instr, 22, 12);
48803                            if ((instr & 1) != 0) {
48804                              UnallocatedA32(instr);
48805                              return;
48806                            }
48807                            unsigned rm = ExtractQRegister(instr, 5, 0);
48808                            uint32_t imm6 = (instr >> 16) & 0x3f;
48809                            uint32_t imm =
48810                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48811                            // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48812                            vqshl(al, dt, QRegister(rd), QRegister(rm), imm);
48813                            break;
48814                          }
48815                        }
48816                        break;
48817                      }
48818                    }
48819                    break;
48820                  }
48821                  case 0x00000800: {
48822                    // 0xf2800850
48823                    switch (instr & 0x00000080) {
48824                      case 0x00000000: {
48825                        // 0xf2800850
48826                        switch (instr & 0x00380000) {
48827                          case 0x00000000: {
48828                            // 0xf2800850
48829                            switch (instr & 0x00000100) {
48830                              case 0x00000000: {
48831                                // 0xf2800850
48832                                switch (instr & 0x00000200) {
48833                                  default: {
48834                                    switch (instr & 0x00000020) {
48835                                      case 0x00000020: {
48836                                        // 0xf2800870
48837                                        if (((instr & 0xd00) == 0x100) ||
48838                                            ((instr & 0xd00) == 0x500) ||
48839                                            ((instr & 0xd00) == 0x900) ||
48840                                            ((instr & 0xe00) == 0xe00)) {
48841                                          UnallocatedA32(instr);
48842                                          return;
48843                                        }
48844                                        unsigned cmode = (instr >> 8) & 0xf;
48845                                        DataType dt =
48846                                            ImmediateVmvn::DecodeDt(cmode);
48847                                        if (dt.Is(kDataTypeValueInvalid)) {
48848                                          UnallocatedA32(instr);
48849                                          return;
48850                                        }
48851                                        if (((instr >> 12) & 1) != 0) {
48852                                          UnallocatedA32(instr);
48853                                          return;
48854                                        }
48855                                        unsigned rd =
48856                                            ExtractQRegister(instr, 22, 12);
48857                                        QOperand imm =
48858                                            ImmediateVmvn::DecodeImmediate(
48859                                                cmode,
48860                                                (instr & 0xf) |
48861                                                    ((instr >> 12) & 0x70) |
48862                                                    ((instr >> 17) & 0x80));
48863                                        // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48864                                        vmvn(al, dt, QRegister(rd), imm);
48865                                        break;
48866                                      }
48867                                      default: {
48868                                        if (((instr & 0x920) == 0x100) ||
48869                                            ((instr & 0x520) == 0x100) ||
48870                                            ((instr & 0x820) == 0x20) ||
48871                                            ((instr & 0x420) == 0x20) ||
48872                                            ((instr & 0x220) == 0x20) ||
48873                                            ((instr & 0x120) == 0x120)) {
48874                                          UnallocatedA32(instr);
48875                                          return;
48876                                        }
48877                                        unsigned cmode = ((instr >> 8) & 0xf) |
48878                                                         ((instr >> 1) & 0x10);
48879                                        DataType dt =
48880                                            ImmediateVmov::DecodeDt(cmode);
48881                                        if (dt.Is(kDataTypeValueInvalid)) {
48882                                          UnallocatedA32(instr);
48883                                          return;
48884                                        }
48885                                        if (((instr >> 12) & 1) != 0) {
48886                                          UnallocatedA32(instr);
48887                                          return;
48888                                        }
48889                                        unsigned rd =
48890                                            ExtractQRegister(instr, 22, 12);
48891                                        QOperand imm =
48892                                            ImmediateVmov::DecodeImmediate(
48893                                                cmode,
48894                                                (instr & 0xf) |
48895                                                    ((instr >> 12) & 0x70) |
48896                                                    ((instr >> 17) & 0x80));
48897                                        // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48898                                        vmov(al, dt, QRegister(rd), imm);
48899                                        break;
48900                                      }
48901                                    }
48902                                    break;
48903                                  }
48904                                }
48905                                break;
48906                              }
48907                              case 0x00000100: {
48908                                // 0xf2800950
48909                                switch (instr & 0x00000020) {
48910                                  case 0x00000000: {
48911                                    // 0xf2800950
48912                                    if (((instr & 0x100) == 0x0) ||
48913                                        ((instr & 0xc00) == 0xc00)) {
48914                                      UnallocatedA32(instr);
48915                                      return;
48916                                    }
48917                                    unsigned cmode = (instr >> 8) & 0xf;
48918                                    DataType dt =
48919                                        ImmediateVorr::DecodeDt(cmode);
48920                                    if (dt.Is(kDataTypeValueInvalid)) {
48921                                      UnallocatedA32(instr);
48922                                      return;
48923                                    }
48924                                    if (((instr >> 12) & 1) != 0) {
48925                                      UnallocatedA32(instr);
48926                                      return;
48927                                    }
48928                                    unsigned rd =
48929                                        ExtractQRegister(instr, 22, 12);
48930                                    QOperand imm =
48931                                        ImmediateVorr::DecodeImmediate(
48932                                            cmode,
48933                                            (instr & 0xf) |
48934                                                ((instr >> 12) & 0x70) |
48935                                                ((instr >> 17) & 0x80));
48936                                    // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48937                                    vorr(al,
48938                                         dt,
48939                                         QRegister(rd),
48940                                         QRegister(rd),
48941                                         imm);
48942                                    break;
48943                                  }
48944                                  case 0x00000020: {
48945                                    // 0xf2800970
48946                                    if (((instr & 0x100) == 0x0) ||
48947                                        ((instr & 0xc00) == 0xc00)) {
48948                                      UnallocatedA32(instr);
48949                                      return;
48950                                    }
48951                                    unsigned cmode = (instr >> 8) & 0xf;
48952                                    DataType dt =
48953                                        ImmediateVbic::DecodeDt(cmode);
48954                                    if (dt.Is(kDataTypeValueInvalid)) {
48955                                      UnallocatedA32(instr);
48956                                      return;
48957                                    }
48958                                    if (((instr >> 12) & 1) != 0) {
48959                                      UnallocatedA32(instr);
48960                                      return;
48961                                    }
48962                                    unsigned rd =
48963                                        ExtractQRegister(instr, 22, 12);
48964                                    QOperand imm =
48965                                        ImmediateVbic::DecodeImmediate(
48966                                            cmode,
48967                                            (instr & 0xf) |
48968                                                ((instr >> 12) & 0x70) |
48969                                                ((instr >> 17) & 0x80));
48970                                    // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48971                                    vbic(al,
48972                                         dt,
48973                                         QRegister(rd),
48974                                         QRegister(rd),
48975                                         imm);
48976                                    break;
48977                                  }
48978                                }
48979                                break;
48980                              }
48981                            }
48982                            break;
48983                          }
48984                          default: {
48985                            switch (instr & 0x00000300) {
48986                              case 0x00000000: {
48987                                // 0xf2800850
48988                                switch (instr & 0x01000000) {
48989                                  case 0x00000000: {
48990                                    // 0xf2800850
48991                                    if (((instr & 0x380000) == 0x0)) {
48992                                      UnallocatedA32(instr);
48993                                      return;
48994                                    }
48995                                    DataType dt =
48996                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
48997                                    if (dt.Is(kDataTypeValueInvalid)) {
48998                                      UnallocatedA32(instr);
48999                                      return;
49000                                    }
49001                                    unsigned rd =
49002                                        ExtractDRegister(instr, 22, 12);
49003                                    if ((instr & 1) != 0) {
49004                                      UnallocatedA32(instr);
49005                                      return;
49006                                    }
49007                                    unsigned rm = ExtractQRegister(instr, 5, 0);
49008                                    uint32_t imm6 = (instr >> 16) & 0x3f;
49009                                    uint32_t imm = dt.GetSize() - imm6;
49010                                    // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
49011                                    vrshrn(al,
49012                                           dt,
49013                                           DRegister(rd),
49014                                           QRegister(rm),
49015                                           imm);
49016                                    break;
49017                                  }
49018                                  case 0x01000000: {
49019                                    // 0xf3800850
49020                                    if (((instr & 0x380000) == 0x0)) {
49021                                      UnallocatedA32(instr);
49022                                      return;
49023                                    }
49024                                    DataType dt =
49025                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
49026                                                         (instr >> 24) & 0x1);
49027                                    if (dt.Is(kDataTypeValueInvalid)) {
49028                                      UnallocatedA32(instr);
49029                                      return;
49030                                    }
49031                                    unsigned rd =
49032                                        ExtractDRegister(instr, 22, 12);
49033                                    if ((instr & 1) != 0) {
49034                                      UnallocatedA32(instr);
49035                                      return;
49036                                    }
49037                                    unsigned rm = ExtractQRegister(instr, 5, 0);
49038                                    uint32_t imm6 = (instr >> 16) & 0x3f;
49039                                    uint32_t imm = dt.GetSize() - imm6;
49040                                    // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
49041                                    vqrshrun(al,
49042                                             dt,
49043                                             DRegister(rd),
49044                                             QRegister(rm),
49045                                             imm);
49046                                    break;
49047                                  }
49048                                }
49049                                break;
49050                              }
49051                              case 0x00000100: {
49052                                // 0xf2800950
49053                                if (((instr & 0x380000) == 0x0)) {
49054                                  UnallocatedA32(instr);
49055                                  return;
49056                                }
49057                                DataType dt =
49058                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
49059                                                     (instr >> 24) & 0x1);
49060                                if (dt.Is(kDataTypeValueInvalid)) {
49061                                  UnallocatedA32(instr);
49062                                  return;
49063                                }
49064                                unsigned rd = ExtractDRegister(instr, 22, 12);
49065                                if ((instr & 1) != 0) {
49066                                  UnallocatedA32(instr);
49067                                  return;
49068                                }
49069                                unsigned rm = ExtractQRegister(instr, 5, 0);
49070                                uint32_t imm6 = (instr >> 16) & 0x3f;
49071                                uint32_t imm = dt.GetSize() - imm6;
49072                                // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
49073                                vqrshrn(al,
49074                                        dt,
49075                                        DRegister(rd),
49076                                        QRegister(rm),
49077                                        imm);
49078                                break;
49079                              }
49080                              default:
49081                                UnallocatedA32(instr);
49082                                break;
49083                            }
49084                            break;
49085                          }
49086                        }
49087                        break;
49088                      }
49089                      default:
49090                        UnallocatedA32(instr);
49091                        break;
49092                    }
49093                    break;
49094                  }
49095                  case 0x00000c00: {
49096                    // 0xf2800c50
49097                    switch (instr & 0x00000080) {
49098                      case 0x00000000: {
49099                        // 0xf2800c50
49100                        switch (instr & 0x00200000) {
49101                          case 0x00000000: {
49102                            // 0xf2800c50
49103                            switch (instr & 0x00180000) {
49104                              case 0x00000000: {
49105                                // 0xf2800c50
49106                                switch (instr & 0x00000300) {
49107                                  case 0x00000200: {
49108                                    // 0xf2800e50
49109                                    if (((instr & 0x920) == 0x100) ||
49110                                        ((instr & 0x520) == 0x100) ||
49111                                        ((instr & 0x820) == 0x20) ||
49112                                        ((instr & 0x420) == 0x20) ||
49113                                        ((instr & 0x220) == 0x20) ||
49114                                        ((instr & 0x120) == 0x120)) {
49115                                      UnallocatedA32(instr);
49116                                      return;
49117                                    }
49118                                    unsigned cmode = ((instr >> 8) & 0xf) |
49119                                                     ((instr >> 1) & 0x10);
49120                                    DataType dt =
49121                                        ImmediateVmov::DecodeDt(cmode);
49122                                    if (dt.Is(kDataTypeValueInvalid)) {
49123                                      UnallocatedA32(instr);
49124                                      return;
49125                                    }
49126                                    if (((instr >> 12) & 1) != 0) {
49127                                      UnallocatedA32(instr);
49128                                      return;
49129                                    }
49130                                    unsigned rd =
49131                                        ExtractQRegister(instr, 22, 12);
49132                                    QOperand imm =
49133                                        ImmediateVmov::DecodeImmediate(
49134                                            cmode,
49135                                            (instr & 0xf) |
49136                                                ((instr >> 12) & 0x70) |
49137                                                ((instr >> 17) & 0x80));
49138                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
49139                                    vmov(al, dt, QRegister(rd), imm);
49140                                    break;
49141                                  }
49142                                  case 0x00000300: {
49143                                    // 0xf2800f50
49144                                    if (((instr & 0x920) == 0x100) ||
49145                                        ((instr & 0x520) == 0x100) ||
49146                                        ((instr & 0x820) == 0x20) ||
49147                                        ((instr & 0x420) == 0x20) ||
49148                                        ((instr & 0x220) == 0x20) ||
49149                                        ((instr & 0x120) == 0x120)) {
49150                                      UnallocatedA32(instr);
49151                                      return;
49152                                    }
49153                                    unsigned cmode = ((instr >> 8) & 0xf) |
49154                                                     ((instr >> 1) & 0x10);
49155                                    DataType dt =
49156                                        ImmediateVmov::DecodeDt(cmode);
49157                                    if (dt.Is(kDataTypeValueInvalid)) {
49158                                      UnallocatedA32(instr);
49159                                      return;
49160                                    }
49161                                    if (((instr >> 12) & 1) != 0) {
49162                                      UnallocatedA32(instr);
49163                                      return;
49164                                    }
49165                                    unsigned rd =
49166                                        ExtractQRegister(instr, 22, 12);
49167                                    QOperand imm =
49168                                        ImmediateVmov::DecodeImmediate(
49169                                            cmode,
49170                                            (instr & 0xf) |
49171                                                ((instr >> 12) & 0x70) |
49172                                                ((instr >> 17) & 0x80));
49173                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
49174                                    vmov(al, dt, QRegister(rd), imm);
49175                                    break;
49176                                  }
49177                                  default: {
49178                                    switch (instr & 0x00000020) {
49179                                      case 0x00000020: {
49180                                        // 0xf2800c70
49181                                        switch (instr & 0x00000f20) {
49182                                          case 0x00000000: {
49183                                            // 0xf2800c50
49184                                            if (((instr & 0x920) == 0x100) ||
49185                                                ((instr & 0x520) == 0x100) ||
49186                                                ((instr & 0x820) == 0x20) ||
49187                                                ((instr & 0x420) == 0x20) ||
49188                                                ((instr & 0x220) == 0x20) ||
49189                                                ((instr & 0x120) == 0x120)) {
49190                                              UnallocatedA32(instr);
49191                                              return;
49192                                            }
49193                                            unsigned cmode =
49194                                                ((instr >> 8) & 0xf) |
49195                                                ((instr >> 1) & 0x10);
49196                                            DataType dt =
49197                                                ImmediateVmov::DecodeDt(cmode);
49198                                            if (dt.Is(kDataTypeValueInvalid)) {
49199                                              UnallocatedA32(instr);
49200                                              return;
49201                                            }
49202                                            if (((instr >> 12) & 1) != 0) {
49203                                              UnallocatedA32(instr);
49204                                              return;
49205                                            }
49206                                            unsigned rd =
49207                                                ExtractQRegister(instr, 22, 12);
49208                                            QOperand imm =
49209                                                ImmediateVmov::DecodeImmediate(
49210                                                    cmode,
49211                                                    (instr & 0xf) |
49212                                                        ((instr >> 12) & 0x70) |
49213                                                        ((instr >> 17) & 0x80));
49214                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49215                                            vmov(al, dt, QRegister(rd), imm);
49216                                            break;
49217                                          }
49218                                          case 0x00000020: {
49219                                            // 0xf2800c70
49220                                            if (((instr & 0xd00) == 0x100) ||
49221                                                ((instr & 0xd00) == 0x500) ||
49222                                                ((instr & 0xd00) == 0x900) ||
49223                                                ((instr & 0xe00) == 0xe00)) {
49224                                              UnallocatedA32(instr);
49225                                              return;
49226                                            }
49227                                            unsigned cmode = (instr >> 8) & 0xf;
49228                                            DataType dt =
49229                                                ImmediateVmvn::DecodeDt(cmode);
49230                                            if (dt.Is(kDataTypeValueInvalid)) {
49231                                              UnallocatedA32(instr);
49232                                              return;
49233                                            }
49234                                            if (((instr >> 12) & 1) != 0) {
49235                                              UnallocatedA32(instr);
49236                                              return;
49237                                            }
49238                                            unsigned rd =
49239                                                ExtractQRegister(instr, 22, 12);
49240                                            QOperand imm =
49241                                                ImmediateVmvn::DecodeImmediate(
49242                                                    cmode,
49243                                                    (instr & 0xf) |
49244                                                        ((instr >> 12) & 0x70) |
49245                                                        ((instr >> 17) & 0x80));
49246                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49247                                            vmvn(al, dt, QRegister(rd), imm);
49248                                            break;
49249                                          }
49250                                          case 0x00000200: {
49251                                            // 0xf2800e50
49252                                            if (((instr & 0x920) == 0x100) ||
49253                                                ((instr & 0x520) == 0x100) ||
49254                                                ((instr & 0x820) == 0x20) ||
49255                                                ((instr & 0x420) == 0x20) ||
49256                                                ((instr & 0x220) == 0x20) ||
49257                                                ((instr & 0x120) == 0x120)) {
49258                                              UnallocatedA32(instr);
49259                                              return;
49260                                            }
49261                                            unsigned cmode =
49262                                                ((instr >> 8) & 0xf) |
49263                                                ((instr >> 1) & 0x10);
49264                                            DataType dt =
49265                                                ImmediateVmov::DecodeDt(cmode);
49266                                            if (dt.Is(kDataTypeValueInvalid)) {
49267                                              UnallocatedA32(instr);
49268                                              return;
49269                                            }
49270                                            if (((instr >> 12) & 1) != 0) {
49271                                              UnallocatedA32(instr);
49272                                              return;
49273                                            }
49274                                            unsigned rd =
49275                                                ExtractQRegister(instr, 22, 12);
49276                                            QOperand imm =
49277                                                ImmediateVmov::DecodeImmediate(
49278                                                    cmode,
49279                                                    (instr & 0xf) |
49280                                                        ((instr >> 12) & 0x70) |
49281                                                        ((instr >> 17) & 0x80));
49282                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49283                                            vmov(al, dt, QRegister(rd), imm);
49284                                            break;
49285                                          }
49286                                          case 0x00000220: {
49287                                            // 0xf2800e70
49288                                            if (((instr & 0xd00) == 0x100) ||
49289                                                ((instr & 0xd00) == 0x500) ||
49290                                                ((instr & 0xd00) == 0x900) ||
49291                                                ((instr & 0xe00) == 0xe00)) {
49292                                              UnallocatedA32(instr);
49293                                              return;
49294                                            }
49295                                            unsigned cmode = (instr >> 8) & 0xf;
49296                                            DataType dt =
49297                                                ImmediateVmvn::DecodeDt(cmode);
49298                                            if (dt.Is(kDataTypeValueInvalid)) {
49299                                              UnallocatedA32(instr);
49300                                              return;
49301                                            }
49302                                            if (((instr >> 12) & 1) != 0) {
49303                                              UnallocatedA32(instr);
49304                                              return;
49305                                            }
49306                                            unsigned rd =
49307                                                ExtractQRegister(instr, 22, 12);
49308                                            QOperand imm =
49309                                                ImmediateVmvn::DecodeImmediate(
49310                                                    cmode,
49311                                                    (instr & 0xf) |
49312                                                        ((instr >> 12) & 0x70) |
49313                                                        ((instr >> 17) & 0x80));
49314                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49315                                            vmvn(al, dt, QRegister(rd), imm);
49316                                            break;
49317                                          }
49318                                          case 0x00000400: {
49319                                            // 0xf2800c50
49320                                            if (((instr & 0x920) == 0x100) ||
49321                                                ((instr & 0x520) == 0x100) ||
49322                                                ((instr & 0x820) == 0x20) ||
49323                                                ((instr & 0x420) == 0x20) ||
49324                                                ((instr & 0x220) == 0x20) ||
49325                                                ((instr & 0x120) == 0x120)) {
49326                                              UnallocatedA32(instr);
49327                                              return;
49328                                            }
49329                                            unsigned cmode =
49330                                                ((instr >> 8) & 0xf) |
49331                                                ((instr >> 1) & 0x10);
49332                                            DataType dt =
49333                                                ImmediateVmov::DecodeDt(cmode);
49334                                            if (dt.Is(kDataTypeValueInvalid)) {
49335                                              UnallocatedA32(instr);
49336                                              return;
49337                                            }
49338                                            if (((instr >> 12) & 1) != 0) {
49339                                              UnallocatedA32(instr);
49340                                              return;
49341                                            }
49342                                            unsigned rd =
49343                                                ExtractQRegister(instr, 22, 12);
49344                                            QOperand imm =
49345                                                ImmediateVmov::DecodeImmediate(
49346                                                    cmode,
49347                                                    (instr & 0xf) |
49348                                                        ((instr >> 12) & 0x70) |
49349                                                        ((instr >> 17) & 0x80));
49350                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49351                                            vmov(al, dt, QRegister(rd), imm);
49352                                            break;
49353                                          }
49354                                          case 0x00000420: {
49355                                            // 0xf2800c70
49356                                            if (((instr & 0xd00) == 0x100) ||
49357                                                ((instr & 0xd00) == 0x500) ||
49358                                                ((instr & 0xd00) == 0x900) ||
49359                                                ((instr & 0xe00) == 0xe00)) {
49360                                              UnallocatedA32(instr);
49361                                              return;
49362                                            }
49363                                            unsigned cmode = (instr >> 8) & 0xf;
49364                                            DataType dt =
49365                                                ImmediateVmvn::DecodeDt(cmode);
49366                                            if (dt.Is(kDataTypeValueInvalid)) {
49367                                              UnallocatedA32(instr);
49368                                              return;
49369                                            }
49370                                            if (((instr >> 12) & 1) != 0) {
49371                                              UnallocatedA32(instr);
49372                                              return;
49373                                            }
49374                                            unsigned rd =
49375                                                ExtractQRegister(instr, 22, 12);
49376                                            QOperand imm =
49377                                                ImmediateVmvn::DecodeImmediate(
49378                                                    cmode,
49379                                                    (instr & 0xf) |
49380                                                        ((instr >> 12) & 0x70) |
49381                                                        ((instr >> 17) & 0x80));
49382                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49383                                            vmvn(al, dt, QRegister(rd), imm);
49384                                            break;
49385                                          }
49386                                          case 0x00000600: {
49387                                            // 0xf2800e50
49388                                            if (((instr & 0x920) == 0x100) ||
49389                                                ((instr & 0x520) == 0x100) ||
49390                                                ((instr & 0x820) == 0x20) ||
49391                                                ((instr & 0x420) == 0x20) ||
49392                                                ((instr & 0x220) == 0x20) ||
49393                                                ((instr & 0x120) == 0x120)) {
49394                                              UnallocatedA32(instr);
49395                                              return;
49396                                            }
49397                                            unsigned cmode =
49398                                                ((instr >> 8) & 0xf) |
49399                                                ((instr >> 1) & 0x10);
49400                                            DataType dt =
49401                                                ImmediateVmov::DecodeDt(cmode);
49402                                            if (dt.Is(kDataTypeValueInvalid)) {
49403                                              UnallocatedA32(instr);
49404                                              return;
49405                                            }
49406                                            if (((instr >> 12) & 1) != 0) {
49407                                              UnallocatedA32(instr);
49408                                              return;
49409                                            }
49410                                            unsigned rd =
49411                                                ExtractQRegister(instr, 22, 12);
49412                                            QOperand imm =
49413                                                ImmediateVmov::DecodeImmediate(
49414                                                    cmode,
49415                                                    (instr & 0xf) |
49416                                                        ((instr >> 12) & 0x70) |
49417                                                        ((instr >> 17) & 0x80));
49418                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49419                                            vmov(al, dt, QRegister(rd), imm);
49420                                            break;
49421                                          }
49422                                          case 0x00000620: {
49423                                            // 0xf2800e70
49424                                            if (((instr & 0xd00) == 0x100) ||
49425                                                ((instr & 0xd00) == 0x500) ||
49426                                                ((instr & 0xd00) == 0x900) ||
49427                                                ((instr & 0xe00) == 0xe00)) {
49428                                              UnallocatedA32(instr);
49429                                              return;
49430                                            }
49431                                            unsigned cmode = (instr >> 8) & 0xf;
49432                                            DataType dt =
49433                                                ImmediateVmvn::DecodeDt(cmode);
49434                                            if (dt.Is(kDataTypeValueInvalid)) {
49435                                              UnallocatedA32(instr);
49436                                              return;
49437                                            }
49438                                            if (((instr >> 12) & 1) != 0) {
49439                                              UnallocatedA32(instr);
49440                                              return;
49441                                            }
49442                                            unsigned rd =
49443                                                ExtractQRegister(instr, 22, 12);
49444                                            QOperand imm =
49445                                                ImmediateVmvn::DecodeImmediate(
49446                                                    cmode,
49447                                                    (instr & 0xf) |
49448                                                        ((instr >> 12) & 0x70) |
49449                                                        ((instr >> 17) & 0x80));
49450                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49451                                            vmvn(al, dt, QRegister(rd), imm);
49452                                            break;
49453                                          }
49454                                          case 0x00000800: {
49455                                            // 0xf2800c50
49456                                            if (((instr & 0x920) == 0x100) ||
49457                                                ((instr & 0x520) == 0x100) ||
49458                                                ((instr & 0x820) == 0x20) ||
49459                                                ((instr & 0x420) == 0x20) ||
49460                                                ((instr & 0x220) == 0x20) ||
49461                                                ((instr & 0x120) == 0x120)) {
49462                                              UnallocatedA32(instr);
49463                                              return;
49464                                            }
49465                                            unsigned cmode =
49466                                                ((instr >> 8) & 0xf) |
49467                                                ((instr >> 1) & 0x10);
49468                                            DataType dt =
49469                                                ImmediateVmov::DecodeDt(cmode);
49470                                            if (dt.Is(kDataTypeValueInvalid)) {
49471                                              UnallocatedA32(instr);
49472                                              return;
49473                                            }
49474                                            if (((instr >> 12) & 1) != 0) {
49475                                              UnallocatedA32(instr);
49476                                              return;
49477                                            }
49478                                            unsigned rd =
49479                                                ExtractQRegister(instr, 22, 12);
49480                                            QOperand imm =
49481                                                ImmediateVmov::DecodeImmediate(
49482                                                    cmode,
49483                                                    (instr & 0xf) |
49484                                                        ((instr >> 12) & 0x70) |
49485                                                        ((instr >> 17) & 0x80));
49486                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49487                                            vmov(al, dt, QRegister(rd), imm);
49488                                            break;
49489                                          }
49490                                          case 0x00000820: {
49491                                            // 0xf2800c70
49492                                            if (((instr & 0xd00) == 0x100) ||
49493                                                ((instr & 0xd00) == 0x500) ||
49494                                                ((instr & 0xd00) == 0x900) ||
49495                                                ((instr & 0xe00) == 0xe00)) {
49496                                              UnallocatedA32(instr);
49497                                              return;
49498                                            }
49499                                            unsigned cmode = (instr >> 8) & 0xf;
49500                                            DataType dt =
49501                                                ImmediateVmvn::DecodeDt(cmode);
49502                                            if (dt.Is(kDataTypeValueInvalid)) {
49503                                              UnallocatedA32(instr);
49504                                              return;
49505                                            }
49506                                            if (((instr >> 12) & 1) != 0) {
49507                                              UnallocatedA32(instr);
49508                                              return;
49509                                            }
49510                                            unsigned rd =
49511                                                ExtractQRegister(instr, 22, 12);
49512                                            QOperand imm =
49513                                                ImmediateVmvn::DecodeImmediate(
49514                                                    cmode,
49515                                                    (instr & 0xf) |
49516                                                        ((instr >> 12) & 0x70) |
49517                                                        ((instr >> 17) & 0x80));
49518                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49519                                            vmvn(al, dt, QRegister(rd), imm);
49520                                            break;
49521                                          }
49522                                          case 0x00000a00: {
49523                                            // 0xf2800e50
49524                                            if (((instr & 0x920) == 0x100) ||
49525                                                ((instr & 0x520) == 0x100) ||
49526                                                ((instr & 0x820) == 0x20) ||
49527                                                ((instr & 0x420) == 0x20) ||
49528                                                ((instr & 0x220) == 0x20) ||
49529                                                ((instr & 0x120) == 0x120)) {
49530                                              UnallocatedA32(instr);
49531                                              return;
49532                                            }
49533                                            unsigned cmode =
49534                                                ((instr >> 8) & 0xf) |
49535                                                ((instr >> 1) & 0x10);
49536                                            DataType dt =
49537                                                ImmediateVmov::DecodeDt(cmode);
49538                                            if (dt.Is(kDataTypeValueInvalid)) {
49539                                              UnallocatedA32(instr);
49540                                              return;
49541                                            }
49542                                            if (((instr >> 12) & 1) != 0) {
49543                                              UnallocatedA32(instr);
49544                                              return;
49545                                            }
49546                                            unsigned rd =
49547                                                ExtractQRegister(instr, 22, 12);
49548                                            QOperand imm =
49549                                                ImmediateVmov::DecodeImmediate(
49550                                                    cmode,
49551                                                    (instr & 0xf) |
49552                                                        ((instr >> 12) & 0x70) |
49553                                                        ((instr >> 17) & 0x80));
49554                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49555                                            vmov(al, dt, QRegister(rd), imm);
49556                                            break;
49557                                          }
49558                                          case 0x00000a20: {
49559                                            // 0xf2800e70
49560                                            if (((instr & 0xd00) == 0x100) ||
49561                                                ((instr & 0xd00) == 0x500) ||
49562                                                ((instr & 0xd00) == 0x900) ||
49563                                                ((instr & 0xe00) == 0xe00)) {
49564                                              UnallocatedA32(instr);
49565                                              return;
49566                                            }
49567                                            unsigned cmode = (instr >> 8) & 0xf;
49568                                            DataType dt =
49569                                                ImmediateVmvn::DecodeDt(cmode);
49570                                            if (dt.Is(kDataTypeValueInvalid)) {
49571                                              UnallocatedA32(instr);
49572                                              return;
49573                                            }
49574                                            if (((instr >> 12) & 1) != 0) {
49575                                              UnallocatedA32(instr);
49576                                              return;
49577                                            }
49578                                            unsigned rd =
49579                                                ExtractQRegister(instr, 22, 12);
49580                                            QOperand imm =
49581                                                ImmediateVmvn::DecodeImmediate(
49582                                                    cmode,
49583                                                    (instr & 0xf) |
49584                                                        ((instr >> 12) & 0x70) |
49585                                                        ((instr >> 17) & 0x80));
49586                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49587                                            vmvn(al, dt, QRegister(rd), imm);
49588                                            break;
49589                                          }
49590                                          case 0x00000c00: {
49591                                            // 0xf2800c50
49592                                            if (((instr & 0x920) == 0x100) ||
49593                                                ((instr & 0x520) == 0x100) ||
49594                                                ((instr & 0x820) == 0x20) ||
49595                                                ((instr & 0x420) == 0x20) ||
49596                                                ((instr & 0x220) == 0x20) ||
49597                                                ((instr & 0x120) == 0x120)) {
49598                                              UnallocatedA32(instr);
49599                                              return;
49600                                            }
49601                                            unsigned cmode =
49602                                                ((instr >> 8) & 0xf) |
49603                                                ((instr >> 1) & 0x10);
49604                                            DataType dt =
49605                                                ImmediateVmov::DecodeDt(cmode);
49606                                            if (dt.Is(kDataTypeValueInvalid)) {
49607                                              UnallocatedA32(instr);
49608                                              return;
49609                                            }
49610                                            if (((instr >> 12) & 1) != 0) {
49611                                              UnallocatedA32(instr);
49612                                              return;
49613                                            }
49614                                            unsigned rd =
49615                                                ExtractQRegister(instr, 22, 12);
49616                                            QOperand imm =
49617                                                ImmediateVmov::DecodeImmediate(
49618                                                    cmode,
49619                                                    (instr & 0xf) |
49620                                                        ((instr >> 12) & 0x70) |
49621                                                        ((instr >> 17) & 0x80));
49622                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49623                                            vmov(al, dt, QRegister(rd), imm);
49624                                            break;
49625                                          }
49626                                          case 0x00000c20: {
49627                                            // 0xf2800c70
49628                                            if (((instr & 0xd00) == 0x100) ||
49629                                                ((instr & 0xd00) == 0x500) ||
49630                                                ((instr & 0xd00) == 0x900) ||
49631                                                ((instr & 0xe00) == 0xe00)) {
49632                                              UnallocatedA32(instr);
49633                                              return;
49634                                            }
49635                                            unsigned cmode = (instr >> 8) & 0xf;
49636                                            DataType dt =
49637                                                ImmediateVmvn::DecodeDt(cmode);
49638                                            if (dt.Is(kDataTypeValueInvalid)) {
49639                                              UnallocatedA32(instr);
49640                                              return;
49641                                            }
49642                                            if (((instr >> 12) & 1) != 0) {
49643                                              UnallocatedA32(instr);
49644                                              return;
49645                                            }
49646                                            unsigned rd =
49647                                                ExtractQRegister(instr, 22, 12);
49648                                            QOperand imm =
49649                                                ImmediateVmvn::DecodeImmediate(
49650                                                    cmode,
49651                                                    (instr & 0xf) |
49652                                                        ((instr >> 12) & 0x70) |
49653                                                        ((instr >> 17) & 0x80));
49654                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49655                                            vmvn(al, dt, QRegister(rd), imm);
49656                                            break;
49657                                          }
49658                                          case 0x00000d00: {
49659                                            // 0xf2800d50
49660                                            if (((instr & 0x920) == 0x100) ||
49661                                                ((instr & 0x520) == 0x100) ||
49662                                                ((instr & 0x820) == 0x20) ||
49663                                                ((instr & 0x420) == 0x20) ||
49664                                                ((instr & 0x220) == 0x20) ||
49665                                                ((instr & 0x120) == 0x120)) {
49666                                              UnallocatedA32(instr);
49667                                              return;
49668                                            }
49669                                            unsigned cmode =
49670                                                ((instr >> 8) & 0xf) |
49671                                                ((instr >> 1) & 0x10);
49672                                            DataType dt =
49673                                                ImmediateVmov::DecodeDt(cmode);
49674                                            if (dt.Is(kDataTypeValueInvalid)) {
49675                                              UnallocatedA32(instr);
49676                                              return;
49677                                            }
49678                                            if (((instr >> 12) & 1) != 0) {
49679                                              UnallocatedA32(instr);
49680                                              return;
49681                                            }
49682                                            unsigned rd =
49683                                                ExtractQRegister(instr, 22, 12);
49684                                            QOperand imm =
49685                                                ImmediateVmov::DecodeImmediate(
49686                                                    cmode,
49687                                                    (instr & 0xf) |
49688                                                        ((instr >> 12) & 0x70) |
49689                                                        ((instr >> 17) & 0x80));
49690                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49691                                            vmov(al, dt, QRegister(rd), imm);
49692                                            break;
49693                                          }
49694                                          case 0x00000d20: {
49695                                            // 0xf2800d70
49696                                            if (((instr & 0xd00) == 0x100) ||
49697                                                ((instr & 0xd00) == 0x500) ||
49698                                                ((instr & 0xd00) == 0x900) ||
49699                                                ((instr & 0xe00) == 0xe00)) {
49700                                              UnallocatedA32(instr);
49701                                              return;
49702                                            }
49703                                            unsigned cmode = (instr >> 8) & 0xf;
49704                                            DataType dt =
49705                                                ImmediateVmvn::DecodeDt(cmode);
49706                                            if (dt.Is(kDataTypeValueInvalid)) {
49707                                              UnallocatedA32(instr);
49708                                              return;
49709                                            }
49710                                            if (((instr >> 12) & 1) != 0) {
49711                                              UnallocatedA32(instr);
49712                                              return;
49713                                            }
49714                                            unsigned rd =
49715                                                ExtractQRegister(instr, 22, 12);
49716                                            QOperand imm =
49717                                                ImmediateVmvn::DecodeImmediate(
49718                                                    cmode,
49719                                                    (instr & 0xf) |
49720                                                        ((instr >> 12) & 0x70) |
49721                                                        ((instr >> 17) & 0x80));
49722                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49723                                            vmvn(al, dt, QRegister(rd), imm);
49724                                            break;
49725                                          }
49726                                          case 0x00000e00: {
49727                                            // 0xf2800e50
49728                                            if (((instr & 0x920) == 0x100) ||
49729                                                ((instr & 0x520) == 0x100) ||
49730                                                ((instr & 0x820) == 0x20) ||
49731                                                ((instr & 0x420) == 0x20) ||
49732                                                ((instr & 0x220) == 0x20) ||
49733                                                ((instr & 0x120) == 0x120)) {
49734                                              UnallocatedA32(instr);
49735                                              return;
49736                                            }
49737                                            unsigned cmode =
49738                                                ((instr >> 8) & 0xf) |
49739                                                ((instr >> 1) & 0x10);
49740                                            DataType dt =
49741                                                ImmediateVmov::DecodeDt(cmode);
49742                                            if (dt.Is(kDataTypeValueInvalid)) {
49743                                              UnallocatedA32(instr);
49744                                              return;
49745                                            }
49746                                            if (((instr >> 12) & 1) != 0) {
49747                                              UnallocatedA32(instr);
49748                                              return;
49749                                            }
49750                                            unsigned rd =
49751                                                ExtractQRegister(instr, 22, 12);
49752                                            QOperand imm =
49753                                                ImmediateVmov::DecodeImmediate(
49754                                                    cmode,
49755                                                    (instr & 0xf) |
49756                                                        ((instr >> 12) & 0x70) |
49757                                                        ((instr >> 17) & 0x80));
49758                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49759                                            vmov(al, dt, QRegister(rd), imm);
49760                                            break;
49761                                          }
49762                                          case 0x00000e20: {
49763                                            // 0xf2800e70
49764                                            if (((instr & 0x920) == 0x100) ||
49765                                                ((instr & 0x520) == 0x100) ||
49766                                                ((instr & 0x820) == 0x20) ||
49767                                                ((instr & 0x420) == 0x20) ||
49768                                                ((instr & 0x220) == 0x20) ||
49769                                                ((instr & 0x120) == 0x120)) {
49770                                              UnallocatedA32(instr);
49771                                              return;
49772                                            }
49773                                            unsigned cmode =
49774                                                ((instr >> 8) & 0xf) |
49775                                                ((instr >> 1) & 0x10);
49776                                            DataType dt =
49777                                                ImmediateVmov::DecodeDt(cmode);
49778                                            if (dt.Is(kDataTypeValueInvalid)) {
49779                                              UnallocatedA32(instr);
49780                                              return;
49781                                            }
49782                                            if (((instr >> 12) & 1) != 0) {
49783                                              UnallocatedA32(instr);
49784                                              return;
49785                                            }
49786                                            unsigned rd =
49787                                                ExtractQRegister(instr, 22, 12);
49788                                            QOperand imm =
49789                                                ImmediateVmov::DecodeImmediate(
49790                                                    cmode,
49791                                                    (instr & 0xf) |
49792                                                        ((instr >> 12) & 0x70) |
49793                                                        ((instr >> 17) & 0x80));
49794                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49795                                            vmov(al, dt, QRegister(rd), imm);
49796                                            break;
49797                                          }
49798                                          case 0x00000f00: {
49799                                            // 0xf2800f50
49800                                            if (((instr & 0x920) == 0x100) ||
49801                                                ((instr & 0x520) == 0x100) ||
49802                                                ((instr & 0x820) == 0x20) ||
49803                                                ((instr & 0x420) == 0x20) ||
49804                                                ((instr & 0x220) == 0x20) ||
49805                                                ((instr & 0x120) == 0x120)) {
49806                                              UnallocatedA32(instr);
49807                                              return;
49808                                            }
49809                                            unsigned cmode =
49810                                                ((instr >> 8) & 0xf) |
49811                                                ((instr >> 1) & 0x10);
49812                                            DataType dt =
49813                                                ImmediateVmov::DecodeDt(cmode);
49814                                            if (dt.Is(kDataTypeValueInvalid)) {
49815                                              UnallocatedA32(instr);
49816                                              return;
49817                                            }
49818                                            if (((instr >> 12) & 1) != 0) {
49819                                              UnallocatedA32(instr);
49820                                              return;
49821                                            }
49822                                            unsigned rd =
49823                                                ExtractQRegister(instr, 22, 12);
49824                                            QOperand imm =
49825                                                ImmediateVmov::DecodeImmediate(
49826                                                    cmode,
49827                                                    (instr & 0xf) |
49828                                                        ((instr >> 12) & 0x70) |
49829                                                        ((instr >> 17) & 0x80));
49830                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49831                                            vmov(al, dt, QRegister(rd), imm);
49832                                            break;
49833                                          }
49834                                          default:
49835                                            UnallocatedA32(instr);
49836                                            break;
49837                                        }
49838                                        break;
49839                                      }
49840                                      default: {
49841                                        if (((instr & 0x920) == 0x100) ||
49842                                            ((instr & 0x520) == 0x100) ||
49843                                            ((instr & 0x820) == 0x20) ||
49844                                            ((instr & 0x420) == 0x20) ||
49845                                            ((instr & 0x220) == 0x20) ||
49846                                            ((instr & 0x120) == 0x120)) {
49847                                          UnallocatedA32(instr);
49848                                          return;
49849                                        }
49850                                        unsigned cmode = ((instr >> 8) & 0xf) |
49851                                                         ((instr >> 1) & 0x10);
49852                                        DataType dt =
49853                                            ImmediateVmov::DecodeDt(cmode);
49854                                        if (dt.Is(kDataTypeValueInvalid)) {
49855                                          UnallocatedA32(instr);
49856                                          return;
49857                                        }
49858                                        if (((instr >> 12) & 1) != 0) {
49859                                          UnallocatedA32(instr);
49860                                          return;
49861                                        }
49862                                        unsigned rd =
49863                                            ExtractQRegister(instr, 22, 12);
49864                                        QOperand imm =
49865                                            ImmediateVmov::DecodeImmediate(
49866                                                cmode,
49867                                                (instr & 0xf) |
49868                                                    ((instr >> 12) & 0x70) |
49869                                                    ((instr >> 17) & 0x80));
49870                                        // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
49871                                        vmov(al, dt, QRegister(rd), imm);
49872                                        break;
49873                                      }
49874                                    }
49875                                    break;
49876                                  }
49877                                }
49878                                break;
49879                              }
49880                              default:
49881                                UnallocatedA32(instr);
49882                                break;
49883                            }
49884                            break;
49885                          }
49886                          default: {
49887                            if ((instr & 0x00000200) == 0x00000200) {
49888                              if (((instr & 0x200000) == 0x0)) {
49889                                UnallocatedA32(instr);
49890                                return;
49891                              }
49892                              DataType dt1 = Dt_op_U_1_Decode1(
49893                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
49894                              if (dt1.Is(kDataTypeValueInvalid)) {
49895                                UnallocatedA32(instr);
49896                                return;
49897                              }
49898                              DataType dt2 = Dt_op_U_1_Decode2(
49899                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
49900                              if (dt2.Is(kDataTypeValueInvalid)) {
49901                                UnallocatedA32(instr);
49902                                return;
49903                              }
49904                              if (((instr >> 12) & 1) != 0) {
49905                                UnallocatedA32(instr);
49906                                return;
49907                              }
49908                              unsigned rd = ExtractQRegister(instr, 22, 12);
49909                              if ((instr & 1) != 0) {
49910                                UnallocatedA32(instr);
49911                                return;
49912                              }
49913                              unsigned rm = ExtractQRegister(instr, 5, 0);
49914                              uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
49915                              // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
49916                              vcvt(al,
49917                                   dt1,
49918                                   dt2,
49919                                   QRegister(rd),
49920                                   QRegister(rm),
49921                                   fbits);
49922                            } else {
49923                              UnallocatedA32(instr);
49924                            }
49925                            break;
49926                          }
49927                        }
49928                        break;
49929                      }
49930                      default:
49931                        UnallocatedA32(instr);
49932                        break;
49933                    }
49934                    break;
49935                  }
49936                }
49937                break;
49938              }
49939            }
49940            break;
49941          }
49942        }
49943        break;
49944      }
49945      case 0x04000000: {
49946        // 0xf4000000
49947        switch (instr & 0x01300000) {
49948          case 0x00000000: {
49949            // 0xf4000000
49950            switch (instr & 0x00800000) {
49951              case 0x00000000: {
49952                // 0xf4000000
49953                switch (instr & 0x0000000d) {
49954                  case 0x0000000d: {
49955                    // 0xf400000d
49956                    switch (instr & 0x00000002) {
49957                      case 0x00000000: {
49958                        // 0xf400000d
49959                        switch (instr & 0x00000f00) {
49960                          case 0x00000000: {
49961                            // 0xf400000d
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_4_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 0x0:
49981                                length = 4;
49982                                spacing = kSingle;
49983                                break;
49984                              case 0x1:
49985                                length = 4;
49986                                spacing = kDouble;
49987                                break;
49988                            }
49989                            unsigned last =
49990                                first +
49991                                (length - 1) * (spacing == kSingle ? 1 : 2);
49992                            TransferType transfer = kMultipleLanes;
49993                            unsigned rn = (instr >> 16) & 0xf;
49994                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49995                            vst4(al,
49996                                 dt,
49997                                 NeonRegisterList(DRegister(first),
49998                                                  DRegister(last),
49999                                                  spacing,
50000                                                  transfer),
50001                                 AlignedMemOperand(Register(rn),
50002                                                   align,
50003                                                   PostIndex));
50004                            break;
50005                          }
50006                          case 0x00000100: {
50007                            // 0xf400010d
50008                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50009                            if (dt.Is(kDataTypeValueInvalid)) {
50010                              UnallocatedA32(instr);
50011                              return;
50012                            }
50013                            Alignment align =
50014                                Align_align_4_Decode((instr >> 4) & 0x3);
50015                            if (dt.Is(kDataTypeValueInvalid) ||
50016                                align.Is(kBadAlignment)) {
50017                              UnallocatedA32(instr);
50018                              return;
50019                            }
50020                            unsigned first = ExtractDRegister(instr, 22, 12);
50021                            unsigned length;
50022                            SpacingType spacing;
50023                            switch ((instr >> 8) & 0xf) {
50024                              default:
50025                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50026                              case 0x0:
50027                                length = 4;
50028                                spacing = kSingle;
50029                                break;
50030                              case 0x1:
50031                                length = 4;
50032                                spacing = kDouble;
50033                                break;
50034                            }
50035                            unsigned last =
50036                                first +
50037                                (length - 1) * (spacing == kSingle ? 1 : 2);
50038                            TransferType transfer = kMultipleLanes;
50039                            unsigned rn = (instr >> 16) & 0xf;
50040                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50041                            vst4(al,
50042                                 dt,
50043                                 NeonRegisterList(DRegister(first),
50044                                                  DRegister(last),
50045                                                  spacing,
50046                                                  transfer),
50047                                 AlignedMemOperand(Register(rn),
50048                                                   align,
50049                                                   PostIndex));
50050                            break;
50051                          }
50052                          case 0x00000200: {
50053                            // 0xf400020d
50054                            if (((instr & 0xe20) == 0x620) ||
50055                                ((instr & 0xf30) == 0xa30)) {
50056                              UnallocatedA32(instr);
50057                              return;
50058                            }
50059                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50060                            if (dt.Is(kDataTypeValueInvalid)) {
50061                              UnallocatedA32(instr);
50062                              return;
50063                            }
50064                            Alignment align =
50065                                Align_align_5_Decode((instr >> 4) & 0x3);
50066                            if (dt.Is(kDataTypeValueInvalid) ||
50067                                align.Is(kBadAlignment)) {
50068                              UnallocatedA32(instr);
50069                              return;
50070                            }
50071                            unsigned first = ExtractDRegister(instr, 22, 12);
50072                            unsigned length;
50073                            SpacingType spacing = kSingle;
50074                            switch ((instr >> 8) & 0xf) {
50075                              default:
50076                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50077                              case 0x7:
50078                                length = 1;
50079                                break;
50080                              case 0xa:
50081                                length = 2;
50082                                break;
50083                              case 0x6:
50084                                length = 3;
50085                                break;
50086                              case 0x2:
50087                                length = 4;
50088                                break;
50089                            }
50090                            unsigned last = first + length - 1;
50091                            TransferType transfer = kMultipleLanes;
50092                            unsigned rn = (instr >> 16) & 0xf;
50093                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50094                            vst1(al,
50095                                 dt,
50096                                 NeonRegisterList(DRegister(first),
50097                                                  DRegister(last),
50098                                                  spacing,
50099                                                  transfer),
50100                                 AlignedMemOperand(Register(rn),
50101                                                   align,
50102                                                   PostIndex));
50103                            break;
50104                          }
50105                          case 0x00000300: {
50106                            // 0xf400030d
50107                            if (((instr & 0xe30) == 0x830)) {
50108                              UnallocatedA32(instr);
50109                              return;
50110                            }
50111                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50112                            if (dt.Is(kDataTypeValueInvalid)) {
50113                              UnallocatedA32(instr);
50114                              return;
50115                            }
50116                            Alignment align =
50117                                Align_align_2_Decode((instr >> 4) & 0x3);
50118                            if (dt.Is(kDataTypeValueInvalid) ||
50119                                align.Is(kBadAlignment)) {
50120                              UnallocatedA32(instr);
50121                              return;
50122                            }
50123                            unsigned first = ExtractDRegister(instr, 22, 12);
50124                            unsigned length;
50125                            SpacingType spacing;
50126                            switch ((instr >> 8) & 0xf) {
50127                              default:
50128                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50129                              case 0x8:
50130                                length = 2;
50131                                spacing = kSingle;
50132                                break;
50133                              case 0x9:
50134                                length = 2;
50135                                spacing = kDouble;
50136                                break;
50137                              case 0x3:
50138                                length = 4;
50139                                spacing = kSingle;
50140                                break;
50141                            }
50142                            unsigned last =
50143                                first +
50144                                (length - 1) * (spacing == kSingle ? 1 : 2);
50145                            TransferType transfer = kMultipleLanes;
50146                            unsigned rn = (instr >> 16) & 0xf;
50147                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50148                            vst2(al,
50149                                 dt,
50150                                 NeonRegisterList(DRegister(first),
50151                                                  DRegister(last),
50152                                                  spacing,
50153                                                  transfer),
50154                                 AlignedMemOperand(Register(rn),
50155                                                   align,
50156                                                   PostIndex));
50157                            break;
50158                          }
50159                          case 0x00000400: {
50160                            // 0xf400040d
50161                            if (((instr & 0x20) == 0x20)) {
50162                              UnallocatedA32(instr);
50163                              return;
50164                            }
50165                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50166                            if (dt.Is(kDataTypeValueInvalid)) {
50167                              UnallocatedA32(instr);
50168                              return;
50169                            }
50170                            Alignment align =
50171                                Align_align_3_Decode((instr >> 4) & 0x3);
50172                            if (dt.Is(kDataTypeValueInvalid) ||
50173                                align.Is(kBadAlignment)) {
50174                              UnallocatedA32(instr);
50175                              return;
50176                            }
50177                            unsigned first = ExtractDRegister(instr, 22, 12);
50178                            unsigned length;
50179                            SpacingType spacing;
50180                            switch ((instr >> 8) & 0xf) {
50181                              default:
50182                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50183                              case 0x4:
50184                                length = 3;
50185                                spacing = kSingle;
50186                                break;
50187                              case 0x5:
50188                                length = 3;
50189                                spacing = kDouble;
50190                                break;
50191                            }
50192                            unsigned last =
50193                                first +
50194                                (length - 1) * (spacing == kSingle ? 1 : 2);
50195                            TransferType transfer = kMultipleLanes;
50196                            unsigned rn = (instr >> 16) & 0xf;
50197                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50198                            vst3(al,
50199                                 dt,
50200                                 NeonRegisterList(DRegister(first),
50201                                                  DRegister(last),
50202                                                  spacing,
50203                                                  transfer),
50204                                 AlignedMemOperand(Register(rn),
50205                                                   align,
50206                                                   PostIndex));
50207                            break;
50208                          }
50209                          case 0x00000500: {
50210                            // 0xf400050d
50211                            if (((instr & 0x20) == 0x20)) {
50212                              UnallocatedA32(instr);
50213                              return;
50214                            }
50215                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50216                            if (dt.Is(kDataTypeValueInvalid)) {
50217                              UnallocatedA32(instr);
50218                              return;
50219                            }
50220                            Alignment align =
50221                                Align_align_3_Decode((instr >> 4) & 0x3);
50222                            if (dt.Is(kDataTypeValueInvalid) ||
50223                                align.Is(kBadAlignment)) {
50224                              UnallocatedA32(instr);
50225                              return;
50226                            }
50227                            unsigned first = ExtractDRegister(instr, 22, 12);
50228                            unsigned length;
50229                            SpacingType spacing;
50230                            switch ((instr >> 8) & 0xf) {
50231                              default:
50232                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50233                              case 0x4:
50234                                length = 3;
50235                                spacing = kSingle;
50236                                break;
50237                              case 0x5:
50238                                length = 3;
50239                                spacing = kDouble;
50240                                break;
50241                            }
50242                            unsigned last =
50243                                first +
50244                                (length - 1) * (spacing == kSingle ? 1 : 2);
50245                            TransferType transfer = kMultipleLanes;
50246                            unsigned rn = (instr >> 16) & 0xf;
50247                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50248                            vst3(al,
50249                                 dt,
50250                                 NeonRegisterList(DRegister(first),
50251                                                  DRegister(last),
50252                                                  spacing,
50253                                                  transfer),
50254                                 AlignedMemOperand(Register(rn),
50255                                                   align,
50256                                                   PostIndex));
50257                            break;
50258                          }
50259                          case 0x00000600: {
50260                            // 0xf400060d
50261                            if (((instr & 0xe20) == 0x620) ||
50262                                ((instr & 0xf30) == 0xa30)) {
50263                              UnallocatedA32(instr);
50264                              return;
50265                            }
50266                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50267                            if (dt.Is(kDataTypeValueInvalid)) {
50268                              UnallocatedA32(instr);
50269                              return;
50270                            }
50271                            Alignment align =
50272                                Align_align_5_Decode((instr >> 4) & 0x3);
50273                            if (dt.Is(kDataTypeValueInvalid) ||
50274                                align.Is(kBadAlignment)) {
50275                              UnallocatedA32(instr);
50276                              return;
50277                            }
50278                            unsigned first = ExtractDRegister(instr, 22, 12);
50279                            unsigned length;
50280                            SpacingType spacing = kSingle;
50281                            switch ((instr >> 8) & 0xf) {
50282                              default:
50283                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50284                              case 0x7:
50285                                length = 1;
50286                                break;
50287                              case 0xa:
50288                                length = 2;
50289                                break;
50290                              case 0x6:
50291                                length = 3;
50292                                break;
50293                              case 0x2:
50294                                length = 4;
50295                                break;
50296                            }
50297                            unsigned last = first + length - 1;
50298                            TransferType transfer = kMultipleLanes;
50299                            unsigned rn = (instr >> 16) & 0xf;
50300                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50301                            vst1(al,
50302                                 dt,
50303                                 NeonRegisterList(DRegister(first),
50304                                                  DRegister(last),
50305                                                  spacing,
50306                                                  transfer),
50307                                 AlignedMemOperand(Register(rn),
50308                                                   align,
50309                                                   PostIndex));
50310                            break;
50311                          }
50312                          case 0x00000700: {
50313                            // 0xf400070d
50314                            if (((instr & 0xe20) == 0x620) ||
50315                                ((instr & 0xf30) == 0xa30)) {
50316                              UnallocatedA32(instr);
50317                              return;
50318                            }
50319                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50320                            if (dt.Is(kDataTypeValueInvalid)) {
50321                              UnallocatedA32(instr);
50322                              return;
50323                            }
50324                            Alignment align =
50325                                Align_align_5_Decode((instr >> 4) & 0x3);
50326                            if (dt.Is(kDataTypeValueInvalid) ||
50327                                align.Is(kBadAlignment)) {
50328                              UnallocatedA32(instr);
50329                              return;
50330                            }
50331                            unsigned first = ExtractDRegister(instr, 22, 12);
50332                            unsigned length;
50333                            SpacingType spacing = kSingle;
50334                            switch ((instr >> 8) & 0xf) {
50335                              default:
50336                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50337                              case 0x7:
50338                                length = 1;
50339                                break;
50340                              case 0xa:
50341                                length = 2;
50342                                break;
50343                              case 0x6:
50344                                length = 3;
50345                                break;
50346                              case 0x2:
50347                                length = 4;
50348                                break;
50349                            }
50350                            unsigned last = first + length - 1;
50351                            TransferType transfer = kMultipleLanes;
50352                            unsigned rn = (instr >> 16) & 0xf;
50353                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50354                            vst1(al,
50355                                 dt,
50356                                 NeonRegisterList(DRegister(first),
50357                                                  DRegister(last),
50358                                                  spacing,
50359                                                  transfer),
50360                                 AlignedMemOperand(Register(rn),
50361                                                   align,
50362                                                   PostIndex));
50363                            break;
50364                          }
50365                          case 0x00000800: {
50366                            // 0xf400080d
50367                            if (((instr & 0xe30) == 0x830)) {
50368                              UnallocatedA32(instr);
50369                              return;
50370                            }
50371                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50372                            if (dt.Is(kDataTypeValueInvalid)) {
50373                              UnallocatedA32(instr);
50374                              return;
50375                            }
50376                            Alignment align =
50377                                Align_align_2_Decode((instr >> 4) & 0x3);
50378                            if (dt.Is(kDataTypeValueInvalid) ||
50379                                align.Is(kBadAlignment)) {
50380                              UnallocatedA32(instr);
50381                              return;
50382                            }
50383                            unsigned first = ExtractDRegister(instr, 22, 12);
50384                            unsigned length;
50385                            SpacingType spacing;
50386                            switch ((instr >> 8) & 0xf) {
50387                              default:
50388                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50389                              case 0x8:
50390                                length = 2;
50391                                spacing = kSingle;
50392                                break;
50393                              case 0x9:
50394                                length = 2;
50395                                spacing = kDouble;
50396                                break;
50397                              case 0x3:
50398                                length = 4;
50399                                spacing = kSingle;
50400                                break;
50401                            }
50402                            unsigned last =
50403                                first +
50404                                (length - 1) * (spacing == kSingle ? 1 : 2);
50405                            TransferType transfer = kMultipleLanes;
50406                            unsigned rn = (instr >> 16) & 0xf;
50407                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50408                            vst2(al,
50409                                 dt,
50410                                 NeonRegisterList(DRegister(first),
50411                                                  DRegister(last),
50412                                                  spacing,
50413                                                  transfer),
50414                                 AlignedMemOperand(Register(rn),
50415                                                   align,
50416                                                   PostIndex));
50417                            break;
50418                          }
50419                          case 0x00000900: {
50420                            // 0xf400090d
50421                            if (((instr & 0xe30) == 0x830)) {
50422                              UnallocatedA32(instr);
50423                              return;
50424                            }
50425                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50426                            if (dt.Is(kDataTypeValueInvalid)) {
50427                              UnallocatedA32(instr);
50428                              return;
50429                            }
50430                            Alignment align =
50431                                Align_align_2_Decode((instr >> 4) & 0x3);
50432                            if (dt.Is(kDataTypeValueInvalid) ||
50433                                align.Is(kBadAlignment)) {
50434                              UnallocatedA32(instr);
50435                              return;
50436                            }
50437                            unsigned first = ExtractDRegister(instr, 22, 12);
50438                            unsigned length;
50439                            SpacingType spacing;
50440                            switch ((instr >> 8) & 0xf) {
50441                              default:
50442                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50443                              case 0x8:
50444                                length = 2;
50445                                spacing = kSingle;
50446                                break;
50447                              case 0x9:
50448                                length = 2;
50449                                spacing = kDouble;
50450                                break;
50451                              case 0x3:
50452                                length = 4;
50453                                spacing = kSingle;
50454                                break;
50455                            }
50456                            unsigned last =
50457                                first +
50458                                (length - 1) * (spacing == kSingle ? 1 : 2);
50459                            TransferType transfer = kMultipleLanes;
50460                            unsigned rn = (instr >> 16) & 0xf;
50461                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50462                            vst2(al,
50463                                 dt,
50464                                 NeonRegisterList(DRegister(first),
50465                                                  DRegister(last),
50466                                                  spacing,
50467                                                  transfer),
50468                                 AlignedMemOperand(Register(rn),
50469                                                   align,
50470                                                   PostIndex));
50471                            break;
50472                          }
50473                          case 0x00000a00: {
50474                            // 0xf4000a0d
50475                            if (((instr & 0xe20) == 0x620) ||
50476                                ((instr & 0xf30) == 0xa30)) {
50477                              UnallocatedA32(instr);
50478                              return;
50479                            }
50480                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50481                            if (dt.Is(kDataTypeValueInvalid)) {
50482                              UnallocatedA32(instr);
50483                              return;
50484                            }
50485                            Alignment align =
50486                                Align_align_5_Decode((instr >> 4) & 0x3);
50487                            if (dt.Is(kDataTypeValueInvalid) ||
50488                                align.Is(kBadAlignment)) {
50489                              UnallocatedA32(instr);
50490                              return;
50491                            }
50492                            unsigned first = ExtractDRegister(instr, 22, 12);
50493                            unsigned length;
50494                            SpacingType spacing = kSingle;
50495                            switch ((instr >> 8) & 0xf) {
50496                              default:
50497                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50498                              case 0x7:
50499                                length = 1;
50500                                break;
50501                              case 0xa:
50502                                length = 2;
50503                                break;
50504                              case 0x6:
50505                                length = 3;
50506                                break;
50507                              case 0x2:
50508                                length = 4;
50509                                break;
50510                            }
50511                            unsigned last = first + length - 1;
50512                            TransferType transfer = kMultipleLanes;
50513                            unsigned rn = (instr >> 16) & 0xf;
50514                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50515                            vst1(al,
50516                                 dt,
50517                                 NeonRegisterList(DRegister(first),
50518                                                  DRegister(last),
50519                                                  spacing,
50520                                                  transfer),
50521                                 AlignedMemOperand(Register(rn),
50522                                                   align,
50523                                                   PostIndex));
50524                            break;
50525                          }
50526                          default:
50527                            UnallocatedA32(instr);
50528                            break;
50529                        }
50530                        break;
50531                      }
50532                      case 0x00000002: {
50533                        // 0xf400000f
50534                        switch (instr & 0x00000f00) {
50535                          case 0x00000000: {
50536                            // 0xf400000d
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_4_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 0x0:
50556                                length = 4;
50557                                spacing = kSingle;
50558                                break;
50559                              case 0x1:
50560                                length = 4;
50561                                spacing = kDouble;
50562                                break;
50563                            }
50564                            unsigned last =
50565                                first +
50566                                (length - 1) * (spacing == kSingle ? 1 : 2);
50567                            TransferType transfer = kMultipleLanes;
50568                            unsigned rn = (instr >> 16) & 0xf;
50569                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50570                            vst4(al,
50571                                 dt,
50572                                 NeonRegisterList(DRegister(first),
50573                                                  DRegister(last),
50574                                                  spacing,
50575                                                  transfer),
50576                                 AlignedMemOperand(Register(rn),
50577                                                   align,
50578                                                   Offset));
50579                            break;
50580                          }
50581                          case 0x00000100: {
50582                            // 0xf400010d
50583                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50584                            if (dt.Is(kDataTypeValueInvalid)) {
50585                              UnallocatedA32(instr);
50586                              return;
50587                            }
50588                            Alignment align =
50589                                Align_align_4_Decode((instr >> 4) & 0x3);
50590                            if (dt.Is(kDataTypeValueInvalid) ||
50591                                align.Is(kBadAlignment)) {
50592                              UnallocatedA32(instr);
50593                              return;
50594                            }
50595                            unsigned first = ExtractDRegister(instr, 22, 12);
50596                            unsigned length;
50597                            SpacingType spacing;
50598                            switch ((instr >> 8) & 0xf) {
50599                              default:
50600                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50601                              case 0x0:
50602                                length = 4;
50603                                spacing = kSingle;
50604                                break;
50605                              case 0x1:
50606                                length = 4;
50607                                spacing = kDouble;
50608                                break;
50609                            }
50610                            unsigned last =
50611                                first +
50612                                (length - 1) * (spacing == kSingle ? 1 : 2);
50613                            TransferType transfer = kMultipleLanes;
50614                            unsigned rn = (instr >> 16) & 0xf;
50615                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50616                            vst4(al,
50617                                 dt,
50618                                 NeonRegisterList(DRegister(first),
50619                                                  DRegister(last),
50620                                                  spacing,
50621                                                  transfer),
50622                                 AlignedMemOperand(Register(rn),
50623                                                   align,
50624                                                   Offset));
50625                            break;
50626                          }
50627                          case 0x00000200: {
50628                            // 0xf400020d
50629                            if (((instr & 0xe20) == 0x620) ||
50630                                ((instr & 0xf30) == 0xa30)) {
50631                              UnallocatedA32(instr);
50632                              return;
50633                            }
50634                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50635                            if (dt.Is(kDataTypeValueInvalid)) {
50636                              UnallocatedA32(instr);
50637                              return;
50638                            }
50639                            Alignment align =
50640                                Align_align_5_Decode((instr >> 4) & 0x3);
50641                            if (dt.Is(kDataTypeValueInvalid) ||
50642                                align.Is(kBadAlignment)) {
50643                              UnallocatedA32(instr);
50644                              return;
50645                            }
50646                            unsigned first = ExtractDRegister(instr, 22, 12);
50647                            unsigned length;
50648                            SpacingType spacing = kSingle;
50649                            switch ((instr >> 8) & 0xf) {
50650                              default:
50651                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50652                              case 0x7:
50653                                length = 1;
50654                                break;
50655                              case 0xa:
50656                                length = 2;
50657                                break;
50658                              case 0x6:
50659                                length = 3;
50660                                break;
50661                              case 0x2:
50662                                length = 4;
50663                                break;
50664                            }
50665                            unsigned last = first + length - 1;
50666                            TransferType transfer = kMultipleLanes;
50667                            unsigned rn = (instr >> 16) & 0xf;
50668                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50669                            vst1(al,
50670                                 dt,
50671                                 NeonRegisterList(DRegister(first),
50672                                                  DRegister(last),
50673                                                  spacing,
50674                                                  transfer),
50675                                 AlignedMemOperand(Register(rn),
50676                                                   align,
50677                                                   Offset));
50678                            break;
50679                          }
50680                          case 0x00000300: {
50681                            // 0xf400030d
50682                            if (((instr & 0xe30) == 0x830)) {
50683                              UnallocatedA32(instr);
50684                              return;
50685                            }
50686                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50687                            if (dt.Is(kDataTypeValueInvalid)) {
50688                              UnallocatedA32(instr);
50689                              return;
50690                            }
50691                            Alignment align =
50692                                Align_align_2_Decode((instr >> 4) & 0x3);
50693                            if (dt.Is(kDataTypeValueInvalid) ||
50694                                align.Is(kBadAlignment)) {
50695                              UnallocatedA32(instr);
50696                              return;
50697                            }
50698                            unsigned first = ExtractDRegister(instr, 22, 12);
50699                            unsigned length;
50700                            SpacingType spacing;
50701                            switch ((instr >> 8) & 0xf) {
50702                              default:
50703                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50704                              case 0x8:
50705                                length = 2;
50706                                spacing = kSingle;
50707                                break;
50708                              case 0x9:
50709                                length = 2;
50710                                spacing = kDouble;
50711                                break;
50712                              case 0x3:
50713                                length = 4;
50714                                spacing = kSingle;
50715                                break;
50716                            }
50717                            unsigned last =
50718                                first +
50719                                (length - 1) * (spacing == kSingle ? 1 : 2);
50720                            TransferType transfer = kMultipleLanes;
50721                            unsigned rn = (instr >> 16) & 0xf;
50722                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50723                            vst2(al,
50724                                 dt,
50725                                 NeonRegisterList(DRegister(first),
50726                                                  DRegister(last),
50727                                                  spacing,
50728                                                  transfer),
50729                                 AlignedMemOperand(Register(rn),
50730                                                   align,
50731                                                   Offset));
50732                            break;
50733                          }
50734                          case 0x00000400: {
50735                            // 0xf400040d
50736                            if (((instr & 0x20) == 0x20)) {
50737                              UnallocatedA32(instr);
50738                              return;
50739                            }
50740                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50741                            if (dt.Is(kDataTypeValueInvalid)) {
50742                              UnallocatedA32(instr);
50743                              return;
50744                            }
50745                            Alignment align =
50746                                Align_align_3_Decode((instr >> 4) & 0x3);
50747                            if (dt.Is(kDataTypeValueInvalid) ||
50748                                align.Is(kBadAlignment)) {
50749                              UnallocatedA32(instr);
50750                              return;
50751                            }
50752                            unsigned first = ExtractDRegister(instr, 22, 12);
50753                            unsigned length;
50754                            SpacingType spacing;
50755                            switch ((instr >> 8) & 0xf) {
50756                              default:
50757                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50758                              case 0x4:
50759                                length = 3;
50760                                spacing = kSingle;
50761                                break;
50762                              case 0x5:
50763                                length = 3;
50764                                spacing = kDouble;
50765                                break;
50766                            }
50767                            unsigned last =
50768                                first +
50769                                (length - 1) * (spacing == kSingle ? 1 : 2);
50770                            TransferType transfer = kMultipleLanes;
50771                            unsigned rn = (instr >> 16) & 0xf;
50772                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50773                            vst3(al,
50774                                 dt,
50775                                 NeonRegisterList(DRegister(first),
50776                                                  DRegister(last),
50777                                                  spacing,
50778                                                  transfer),
50779                                 AlignedMemOperand(Register(rn),
50780                                                   align,
50781                                                   Offset));
50782                            break;
50783                          }
50784                          case 0x00000500: {
50785                            // 0xf400050d
50786                            if (((instr & 0x20) == 0x20)) {
50787                              UnallocatedA32(instr);
50788                              return;
50789                            }
50790                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50791                            if (dt.Is(kDataTypeValueInvalid)) {
50792                              UnallocatedA32(instr);
50793                              return;
50794                            }
50795                            Alignment align =
50796                                Align_align_3_Decode((instr >> 4) & 0x3);
50797                            if (dt.Is(kDataTypeValueInvalid) ||
50798                                align.Is(kBadAlignment)) {
50799                              UnallocatedA32(instr);
50800                              return;
50801                            }
50802                            unsigned first = ExtractDRegister(instr, 22, 12);
50803                            unsigned length;
50804                            SpacingType spacing;
50805                            switch ((instr >> 8) & 0xf) {
50806                              default:
50807                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50808                              case 0x4:
50809                                length = 3;
50810                                spacing = kSingle;
50811                                break;
50812                              case 0x5:
50813                                length = 3;
50814                                spacing = kDouble;
50815                                break;
50816                            }
50817                            unsigned last =
50818                                first +
50819                                (length - 1) * (spacing == kSingle ? 1 : 2);
50820                            TransferType transfer = kMultipleLanes;
50821                            unsigned rn = (instr >> 16) & 0xf;
50822                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50823                            vst3(al,
50824                                 dt,
50825                                 NeonRegisterList(DRegister(first),
50826                                                  DRegister(last),
50827                                                  spacing,
50828                                                  transfer),
50829                                 AlignedMemOperand(Register(rn),
50830                                                   align,
50831                                                   Offset));
50832                            break;
50833                          }
50834                          case 0x00000600: {
50835                            // 0xf400060d
50836                            if (((instr & 0xe20) == 0x620) ||
50837                                ((instr & 0xf30) == 0xa30)) {
50838                              UnallocatedA32(instr);
50839                              return;
50840                            }
50841                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50842                            if (dt.Is(kDataTypeValueInvalid)) {
50843                              UnallocatedA32(instr);
50844                              return;
50845                            }
50846                            Alignment align =
50847                                Align_align_5_Decode((instr >> 4) & 0x3);
50848                            if (dt.Is(kDataTypeValueInvalid) ||
50849                                align.Is(kBadAlignment)) {
50850                              UnallocatedA32(instr);
50851                              return;
50852                            }
50853                            unsigned first = ExtractDRegister(instr, 22, 12);
50854                            unsigned length;
50855                            SpacingType spacing = kSingle;
50856                            switch ((instr >> 8) & 0xf) {
50857                              default:
50858                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50859                              case 0x7:
50860                                length = 1;
50861                                break;
50862                              case 0xa:
50863                                length = 2;
50864                                break;
50865                              case 0x6:
50866                                length = 3;
50867                                break;
50868                              case 0x2:
50869                                length = 4;
50870                                break;
50871                            }
50872                            unsigned last = first + length - 1;
50873                            TransferType transfer = kMultipleLanes;
50874                            unsigned rn = (instr >> 16) & 0xf;
50875                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50876                            vst1(al,
50877                                 dt,
50878                                 NeonRegisterList(DRegister(first),
50879                                                  DRegister(last),
50880                                                  spacing,
50881                                                  transfer),
50882                                 AlignedMemOperand(Register(rn),
50883                                                   align,
50884                                                   Offset));
50885                            break;
50886                          }
50887                          case 0x00000700: {
50888                            // 0xf400070d
50889                            if (((instr & 0xe20) == 0x620) ||
50890                                ((instr & 0xf30) == 0xa30)) {
50891                              UnallocatedA32(instr);
50892                              return;
50893                            }
50894                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50895                            if (dt.Is(kDataTypeValueInvalid)) {
50896                              UnallocatedA32(instr);
50897                              return;
50898                            }
50899                            Alignment align =
50900                                Align_align_5_Decode((instr >> 4) & 0x3);
50901                            if (dt.Is(kDataTypeValueInvalid) ||
50902                                align.Is(kBadAlignment)) {
50903                              UnallocatedA32(instr);
50904                              return;
50905                            }
50906                            unsigned first = ExtractDRegister(instr, 22, 12);
50907                            unsigned length;
50908                            SpacingType spacing = kSingle;
50909                            switch ((instr >> 8) & 0xf) {
50910                              default:
50911                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50912                              case 0x7:
50913                                length = 1;
50914                                break;
50915                              case 0xa:
50916                                length = 2;
50917                                break;
50918                              case 0x6:
50919                                length = 3;
50920                                break;
50921                              case 0x2:
50922                                length = 4;
50923                                break;
50924                            }
50925                            unsigned last = first + length - 1;
50926                            TransferType transfer = kMultipleLanes;
50927                            unsigned rn = (instr >> 16) & 0xf;
50928                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50929                            vst1(al,
50930                                 dt,
50931                                 NeonRegisterList(DRegister(first),
50932                                                  DRegister(last),
50933                                                  spacing,
50934                                                  transfer),
50935                                 AlignedMemOperand(Register(rn),
50936                                                   align,
50937                                                   Offset));
50938                            break;
50939                          }
50940                          case 0x00000800: {
50941                            // 0xf400080d
50942                            if (((instr & 0xe30) == 0x830)) {
50943                              UnallocatedA32(instr);
50944                              return;
50945                            }
50946                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50947                            if (dt.Is(kDataTypeValueInvalid)) {
50948                              UnallocatedA32(instr);
50949                              return;
50950                            }
50951                            Alignment align =
50952                                Align_align_2_Decode((instr >> 4) & 0x3);
50953                            if (dt.Is(kDataTypeValueInvalid) ||
50954                                align.Is(kBadAlignment)) {
50955                              UnallocatedA32(instr);
50956                              return;
50957                            }
50958                            unsigned first = ExtractDRegister(instr, 22, 12);
50959                            unsigned length;
50960                            SpacingType spacing;
50961                            switch ((instr >> 8) & 0xf) {
50962                              default:
50963                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50964                              case 0x8:
50965                                length = 2;
50966                                spacing = kSingle;
50967                                break;
50968                              case 0x9:
50969                                length = 2;
50970                                spacing = kDouble;
50971                                break;
50972                              case 0x3:
50973                                length = 4;
50974                                spacing = kSingle;
50975                                break;
50976                            }
50977                            unsigned last =
50978                                first +
50979                                (length - 1) * (spacing == kSingle ? 1 : 2);
50980                            TransferType transfer = kMultipleLanes;
50981                            unsigned rn = (instr >> 16) & 0xf;
50982                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50983                            vst2(al,
50984                                 dt,
50985                                 NeonRegisterList(DRegister(first),
50986                                                  DRegister(last),
50987                                                  spacing,
50988                                                  transfer),
50989                                 AlignedMemOperand(Register(rn),
50990                                                   align,
50991                                                   Offset));
50992                            break;
50993                          }
50994                          case 0x00000900: {
50995                            // 0xf400090d
50996                            if (((instr & 0xe30) == 0x830)) {
50997                              UnallocatedA32(instr);
50998                              return;
50999                            }
51000                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51001                            if (dt.Is(kDataTypeValueInvalid)) {
51002                              UnallocatedA32(instr);
51003                              return;
51004                            }
51005                            Alignment align =
51006                                Align_align_2_Decode((instr >> 4) & 0x3);
51007                            if (dt.Is(kDataTypeValueInvalid) ||
51008                                align.Is(kBadAlignment)) {
51009                              UnallocatedA32(instr);
51010                              return;
51011                            }
51012                            unsigned first = ExtractDRegister(instr, 22, 12);
51013                            unsigned length;
51014                            SpacingType spacing;
51015                            switch ((instr >> 8) & 0xf) {
51016                              default:
51017                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
51018                              case 0x8:
51019                                length = 2;
51020                                spacing = kSingle;
51021                                break;
51022                              case 0x9:
51023                                length = 2;
51024                                spacing = kDouble;
51025                                break;
51026                              case 0x3:
51027                                length = 4;
51028                                spacing = kSingle;
51029                                break;
51030                            }
51031                            unsigned last =
51032                                first +
51033                                (length - 1) * (spacing == kSingle ? 1 : 2);
51034                            TransferType transfer = kMultipleLanes;
51035                            unsigned rn = (instr >> 16) & 0xf;
51036                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
51037                            vst2(al,
51038                                 dt,
51039                                 NeonRegisterList(DRegister(first),
51040                                                  DRegister(last),
51041                                                  spacing,
51042                                                  transfer),
51043                                 AlignedMemOperand(Register(rn),
51044                                                   align,
51045                                                   Offset));
51046                            break;
51047                          }
51048                          case 0x00000a00: {
51049                            // 0xf4000a0d
51050                            if (((instr & 0xe20) == 0x620) ||
51051                                ((instr & 0xf30) == 0xa30)) {
51052                              UnallocatedA32(instr);
51053                              return;
51054                            }
51055                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51056                            if (dt.Is(kDataTypeValueInvalid)) {
51057                              UnallocatedA32(instr);
51058                              return;
51059                            }
51060                            Alignment align =
51061                                Align_align_5_Decode((instr >> 4) & 0x3);
51062                            if (dt.Is(kDataTypeValueInvalid) ||
51063                                align.Is(kBadAlignment)) {
51064                              UnallocatedA32(instr);
51065                              return;
51066                            }
51067                            unsigned first = ExtractDRegister(instr, 22, 12);
51068                            unsigned length;
51069                            SpacingType spacing = kSingle;
51070                            switch ((instr >> 8) & 0xf) {
51071                              default:
51072                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
51073                              case 0x7:
51074                                length = 1;
51075                                break;
51076                              case 0xa:
51077                                length = 2;
51078                                break;
51079                              case 0x6:
51080                                length = 3;
51081                                break;
51082                              case 0x2:
51083                                length = 4;
51084                                break;
51085                            }
51086                            unsigned last = first + length - 1;
51087                            TransferType transfer = kMultipleLanes;
51088                            unsigned rn = (instr >> 16) & 0xf;
51089                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
51090                            vst1(al,
51091                                 dt,
51092                                 NeonRegisterList(DRegister(first),
51093                                                  DRegister(last),
51094                                                  spacing,
51095                                                  transfer),
51096                                 AlignedMemOperand(Register(rn),
51097                                                   align,
51098                                                   Offset));
51099                            break;
51100                          }
51101                          default:
51102                            UnallocatedA32(instr);
51103                            break;
51104                        }
51105                        break;
51106                      }
51107                    }
51108                    break;
51109                  }
51110                  default: {
51111                    switch (instr & 0x00000f00) {
51112                      case 0x00000000: {
51113                        // 0xf4000000
51114                        if (((instr & 0xd) == 0xd)) {
51115                          UnallocatedA32(instr);
51116                          return;
51117                        }
51118                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51119                        if (dt.Is(kDataTypeValueInvalid)) {
51120                          UnallocatedA32(instr);
51121                          return;
51122                        }
51123                        Alignment align =
51124                            Align_align_4_Decode((instr >> 4) & 0x3);
51125                        if (dt.Is(kDataTypeValueInvalid) ||
51126                            align.Is(kBadAlignment)) {
51127                          UnallocatedA32(instr);
51128                          return;
51129                        }
51130                        unsigned first = ExtractDRegister(instr, 22, 12);
51131                        unsigned length;
51132                        SpacingType spacing;
51133                        switch ((instr >> 8) & 0xf) {
51134                          default:
51135                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51136                          case 0x0:
51137                            length = 4;
51138                            spacing = kSingle;
51139                            break;
51140                          case 0x1:
51141                            length = 4;
51142                            spacing = kDouble;
51143                            break;
51144                        }
51145                        unsigned last =
51146                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51147                        TransferType transfer = kMultipleLanes;
51148                        unsigned rn = (instr >> 16) & 0xf;
51149                        unsigned rm = instr & 0xf;
51150                        // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51151                        vst4(al,
51152                             dt,
51153                             NeonRegisterList(DRegister(first),
51154                                              DRegister(last),
51155                                              spacing,
51156                                              transfer),
51157                             AlignedMemOperand(Register(rn),
51158                                               align,
51159                                               Register(rm),
51160                                               PostIndex));
51161                        break;
51162                      }
51163                      case 0x00000100: {
51164                        // 0xf4000100
51165                        if (((instr & 0xd) == 0xd)) {
51166                          UnallocatedA32(instr);
51167                          return;
51168                        }
51169                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51170                        if (dt.Is(kDataTypeValueInvalid)) {
51171                          UnallocatedA32(instr);
51172                          return;
51173                        }
51174                        Alignment align =
51175                            Align_align_4_Decode((instr >> 4) & 0x3);
51176                        if (dt.Is(kDataTypeValueInvalid) ||
51177                            align.Is(kBadAlignment)) {
51178                          UnallocatedA32(instr);
51179                          return;
51180                        }
51181                        unsigned first = ExtractDRegister(instr, 22, 12);
51182                        unsigned length;
51183                        SpacingType spacing;
51184                        switch ((instr >> 8) & 0xf) {
51185                          default:
51186                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51187                          case 0x0:
51188                            length = 4;
51189                            spacing = kSingle;
51190                            break;
51191                          case 0x1:
51192                            length = 4;
51193                            spacing = kDouble;
51194                            break;
51195                        }
51196                        unsigned last =
51197                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51198                        TransferType transfer = kMultipleLanes;
51199                        unsigned rn = (instr >> 16) & 0xf;
51200                        unsigned rm = instr & 0xf;
51201                        // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51202                        vst4(al,
51203                             dt,
51204                             NeonRegisterList(DRegister(first),
51205                                              DRegister(last),
51206                                              spacing,
51207                                              transfer),
51208                             AlignedMemOperand(Register(rn),
51209                                               align,
51210                                               Register(rm),
51211                                               PostIndex));
51212                        break;
51213                      }
51214                      case 0x00000200: {
51215                        // 0xf4000200
51216                        if (((instr & 0xd) == 0xd) ||
51217                            ((instr & 0xe20) == 0x620) ||
51218                            ((instr & 0xf30) == 0xa30)) {
51219                          UnallocatedA32(instr);
51220                          return;
51221                        }
51222                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51223                        if (dt.Is(kDataTypeValueInvalid)) {
51224                          UnallocatedA32(instr);
51225                          return;
51226                        }
51227                        Alignment align =
51228                            Align_align_5_Decode((instr >> 4) & 0x3);
51229                        if (dt.Is(kDataTypeValueInvalid) ||
51230                            align.Is(kBadAlignment)) {
51231                          UnallocatedA32(instr);
51232                          return;
51233                        }
51234                        unsigned first = ExtractDRegister(instr, 22, 12);
51235                        unsigned length;
51236                        SpacingType spacing = kSingle;
51237                        switch ((instr >> 8) & 0xf) {
51238                          default:
51239                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51240                          case 0x7:
51241                            length = 1;
51242                            break;
51243                          case 0xa:
51244                            length = 2;
51245                            break;
51246                          case 0x6:
51247                            length = 3;
51248                            break;
51249                          case 0x2:
51250                            length = 4;
51251                            break;
51252                        }
51253                        unsigned last = first + length - 1;
51254                        TransferType transfer = kMultipleLanes;
51255                        unsigned rn = (instr >> 16) & 0xf;
51256                        unsigned rm = instr & 0xf;
51257                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51258                        vst1(al,
51259                             dt,
51260                             NeonRegisterList(DRegister(first),
51261                                              DRegister(last),
51262                                              spacing,
51263                                              transfer),
51264                             AlignedMemOperand(Register(rn),
51265                                               align,
51266                                               Register(rm),
51267                                               PostIndex));
51268                        break;
51269                      }
51270                      case 0x00000300: {
51271                        // 0xf4000300
51272                        if (((instr & 0xd) == 0xd) ||
51273                            ((instr & 0xe30) == 0x830)) {
51274                          UnallocatedA32(instr);
51275                          return;
51276                        }
51277                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51278                        if (dt.Is(kDataTypeValueInvalid)) {
51279                          UnallocatedA32(instr);
51280                          return;
51281                        }
51282                        Alignment align =
51283                            Align_align_2_Decode((instr >> 4) & 0x3);
51284                        if (dt.Is(kDataTypeValueInvalid) ||
51285                            align.Is(kBadAlignment)) {
51286                          UnallocatedA32(instr);
51287                          return;
51288                        }
51289                        unsigned first = ExtractDRegister(instr, 22, 12);
51290                        unsigned length;
51291                        SpacingType spacing;
51292                        switch ((instr >> 8) & 0xf) {
51293                          default:
51294                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51295                          case 0x8:
51296                            length = 2;
51297                            spacing = kSingle;
51298                            break;
51299                          case 0x9:
51300                            length = 2;
51301                            spacing = kDouble;
51302                            break;
51303                          case 0x3:
51304                            length = 4;
51305                            spacing = kSingle;
51306                            break;
51307                        }
51308                        unsigned last =
51309                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51310                        TransferType transfer = kMultipleLanes;
51311                        unsigned rn = (instr >> 16) & 0xf;
51312                        unsigned rm = instr & 0xf;
51313                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51314                        vst2(al,
51315                             dt,
51316                             NeonRegisterList(DRegister(first),
51317                                              DRegister(last),
51318                                              spacing,
51319                                              transfer),
51320                             AlignedMemOperand(Register(rn),
51321                                               align,
51322                                               Register(rm),
51323                                               PostIndex));
51324                        break;
51325                      }
51326                      case 0x00000400: {
51327                        // 0xf4000400
51328                        if (((instr & 0xd) == 0xd) ||
51329                            ((instr & 0x20) == 0x20)) {
51330                          UnallocatedA32(instr);
51331                          return;
51332                        }
51333                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51334                        if (dt.Is(kDataTypeValueInvalid)) {
51335                          UnallocatedA32(instr);
51336                          return;
51337                        }
51338                        Alignment align =
51339                            Align_align_3_Decode((instr >> 4) & 0x3);
51340                        if (dt.Is(kDataTypeValueInvalid) ||
51341                            align.Is(kBadAlignment)) {
51342                          UnallocatedA32(instr);
51343                          return;
51344                        }
51345                        unsigned first = ExtractDRegister(instr, 22, 12);
51346                        unsigned length;
51347                        SpacingType spacing;
51348                        switch ((instr >> 8) & 0xf) {
51349                          default:
51350                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51351                          case 0x4:
51352                            length = 3;
51353                            spacing = kSingle;
51354                            break;
51355                          case 0x5:
51356                            length = 3;
51357                            spacing = kDouble;
51358                            break;
51359                        }
51360                        unsigned last =
51361                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51362                        TransferType transfer = kMultipleLanes;
51363                        unsigned rn = (instr >> 16) & 0xf;
51364                        unsigned rm = instr & 0xf;
51365                        // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51366                        vst3(al,
51367                             dt,
51368                             NeonRegisterList(DRegister(first),
51369                                              DRegister(last),
51370                                              spacing,
51371                                              transfer),
51372                             AlignedMemOperand(Register(rn),
51373                                               align,
51374                                               Register(rm),
51375                                               PostIndex));
51376                        break;
51377                      }
51378                      case 0x00000500: {
51379                        // 0xf4000500
51380                        if (((instr & 0xd) == 0xd) ||
51381                            ((instr & 0x20) == 0x20)) {
51382                          UnallocatedA32(instr);
51383                          return;
51384                        }
51385                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51386                        if (dt.Is(kDataTypeValueInvalid)) {
51387                          UnallocatedA32(instr);
51388                          return;
51389                        }
51390                        Alignment align =
51391                            Align_align_3_Decode((instr >> 4) & 0x3);
51392                        if (dt.Is(kDataTypeValueInvalid) ||
51393                            align.Is(kBadAlignment)) {
51394                          UnallocatedA32(instr);
51395                          return;
51396                        }
51397                        unsigned first = ExtractDRegister(instr, 22, 12);
51398                        unsigned length;
51399                        SpacingType spacing;
51400                        switch ((instr >> 8) & 0xf) {
51401                          default:
51402                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51403                          case 0x4:
51404                            length = 3;
51405                            spacing = kSingle;
51406                            break;
51407                          case 0x5:
51408                            length = 3;
51409                            spacing = kDouble;
51410                            break;
51411                        }
51412                        unsigned last =
51413                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51414                        TransferType transfer = kMultipleLanes;
51415                        unsigned rn = (instr >> 16) & 0xf;
51416                        unsigned rm = instr & 0xf;
51417                        // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51418                        vst3(al,
51419                             dt,
51420                             NeonRegisterList(DRegister(first),
51421                                              DRegister(last),
51422                                              spacing,
51423                                              transfer),
51424                             AlignedMemOperand(Register(rn),
51425                                               align,
51426                                               Register(rm),
51427                                               PostIndex));
51428                        break;
51429                      }
51430                      case 0x00000600: {
51431                        // 0xf4000600
51432                        if (((instr & 0xd) == 0xd) ||
51433                            ((instr & 0xe20) == 0x620) ||
51434                            ((instr & 0xf30) == 0xa30)) {
51435                          UnallocatedA32(instr);
51436                          return;
51437                        }
51438                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51439                        if (dt.Is(kDataTypeValueInvalid)) {
51440                          UnallocatedA32(instr);
51441                          return;
51442                        }
51443                        Alignment align =
51444                            Align_align_5_Decode((instr >> 4) & 0x3);
51445                        if (dt.Is(kDataTypeValueInvalid) ||
51446                            align.Is(kBadAlignment)) {
51447                          UnallocatedA32(instr);
51448                          return;
51449                        }
51450                        unsigned first = ExtractDRegister(instr, 22, 12);
51451                        unsigned length;
51452                        SpacingType spacing = kSingle;
51453                        switch ((instr >> 8) & 0xf) {
51454                          default:
51455                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51456                          case 0x7:
51457                            length = 1;
51458                            break;
51459                          case 0xa:
51460                            length = 2;
51461                            break;
51462                          case 0x6:
51463                            length = 3;
51464                            break;
51465                          case 0x2:
51466                            length = 4;
51467                            break;
51468                        }
51469                        unsigned last = first + length - 1;
51470                        TransferType transfer = kMultipleLanes;
51471                        unsigned rn = (instr >> 16) & 0xf;
51472                        unsigned rm = instr & 0xf;
51473                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51474                        vst1(al,
51475                             dt,
51476                             NeonRegisterList(DRegister(first),
51477                                              DRegister(last),
51478                                              spacing,
51479                                              transfer),
51480                             AlignedMemOperand(Register(rn),
51481                                               align,
51482                                               Register(rm),
51483                                               PostIndex));
51484                        break;
51485                      }
51486                      case 0x00000700: {
51487                        // 0xf4000700
51488                        if (((instr & 0xd) == 0xd) ||
51489                            ((instr & 0xe20) == 0x620) ||
51490                            ((instr & 0xf30) == 0xa30)) {
51491                          UnallocatedA32(instr);
51492                          return;
51493                        }
51494                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51495                        if (dt.Is(kDataTypeValueInvalid)) {
51496                          UnallocatedA32(instr);
51497                          return;
51498                        }
51499                        Alignment align =
51500                            Align_align_5_Decode((instr >> 4) & 0x3);
51501                        if (dt.Is(kDataTypeValueInvalid) ||
51502                            align.Is(kBadAlignment)) {
51503                          UnallocatedA32(instr);
51504                          return;
51505                        }
51506                        unsigned first = ExtractDRegister(instr, 22, 12);
51507                        unsigned length;
51508                        SpacingType spacing = kSingle;
51509                        switch ((instr >> 8) & 0xf) {
51510                          default:
51511                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51512                          case 0x7:
51513                            length = 1;
51514                            break;
51515                          case 0xa:
51516                            length = 2;
51517                            break;
51518                          case 0x6:
51519                            length = 3;
51520                            break;
51521                          case 0x2:
51522                            length = 4;
51523                            break;
51524                        }
51525                        unsigned last = first + length - 1;
51526                        TransferType transfer = kMultipleLanes;
51527                        unsigned rn = (instr >> 16) & 0xf;
51528                        unsigned rm = instr & 0xf;
51529                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51530                        vst1(al,
51531                             dt,
51532                             NeonRegisterList(DRegister(first),
51533                                              DRegister(last),
51534                                              spacing,
51535                                              transfer),
51536                             AlignedMemOperand(Register(rn),
51537                                               align,
51538                                               Register(rm),
51539                                               PostIndex));
51540                        break;
51541                      }
51542                      case 0x00000800: {
51543                        // 0xf4000800
51544                        if (((instr & 0xd) == 0xd) ||
51545                            ((instr & 0xe30) == 0x830)) {
51546                          UnallocatedA32(instr);
51547                          return;
51548                        }
51549                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51550                        if (dt.Is(kDataTypeValueInvalid)) {
51551                          UnallocatedA32(instr);
51552                          return;
51553                        }
51554                        Alignment align =
51555                            Align_align_2_Decode((instr >> 4) & 0x3);
51556                        if (dt.Is(kDataTypeValueInvalid) ||
51557                            align.Is(kBadAlignment)) {
51558                          UnallocatedA32(instr);
51559                          return;
51560                        }
51561                        unsigned first = ExtractDRegister(instr, 22, 12);
51562                        unsigned length;
51563                        SpacingType spacing;
51564                        switch ((instr >> 8) & 0xf) {
51565                          default:
51566                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51567                          case 0x8:
51568                            length = 2;
51569                            spacing = kSingle;
51570                            break;
51571                          case 0x9:
51572                            length = 2;
51573                            spacing = kDouble;
51574                            break;
51575                          case 0x3:
51576                            length = 4;
51577                            spacing = kSingle;
51578                            break;
51579                        }
51580                        unsigned last =
51581                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51582                        TransferType transfer = kMultipleLanes;
51583                        unsigned rn = (instr >> 16) & 0xf;
51584                        unsigned rm = instr & 0xf;
51585                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51586                        vst2(al,
51587                             dt,
51588                             NeonRegisterList(DRegister(first),
51589                                              DRegister(last),
51590                                              spacing,
51591                                              transfer),
51592                             AlignedMemOperand(Register(rn),
51593                                               align,
51594                                               Register(rm),
51595                                               PostIndex));
51596                        break;
51597                      }
51598                      case 0x00000900: {
51599                        // 0xf4000900
51600                        if (((instr & 0xd) == 0xd) ||
51601                            ((instr & 0xe30) == 0x830)) {
51602                          UnallocatedA32(instr);
51603                          return;
51604                        }
51605                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51606                        if (dt.Is(kDataTypeValueInvalid)) {
51607                          UnallocatedA32(instr);
51608                          return;
51609                        }
51610                        Alignment align =
51611                            Align_align_2_Decode((instr >> 4) & 0x3);
51612                        if (dt.Is(kDataTypeValueInvalid) ||
51613                            align.Is(kBadAlignment)) {
51614                          UnallocatedA32(instr);
51615                          return;
51616                        }
51617                        unsigned first = ExtractDRegister(instr, 22, 12);
51618                        unsigned length;
51619                        SpacingType spacing;
51620                        switch ((instr >> 8) & 0xf) {
51621                          default:
51622                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51623                          case 0x8:
51624                            length = 2;
51625                            spacing = kSingle;
51626                            break;
51627                          case 0x9:
51628                            length = 2;
51629                            spacing = kDouble;
51630                            break;
51631                          case 0x3:
51632                            length = 4;
51633                            spacing = kSingle;
51634                            break;
51635                        }
51636                        unsigned last =
51637                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51638                        TransferType transfer = kMultipleLanes;
51639                        unsigned rn = (instr >> 16) & 0xf;
51640                        unsigned rm = instr & 0xf;
51641                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51642                        vst2(al,
51643                             dt,
51644                             NeonRegisterList(DRegister(first),
51645                                              DRegister(last),
51646                                              spacing,
51647                                              transfer),
51648                             AlignedMemOperand(Register(rn),
51649                                               align,
51650                                               Register(rm),
51651                                               PostIndex));
51652                        break;
51653                      }
51654                      case 0x00000a00: {
51655                        // 0xf4000a00
51656                        if (((instr & 0xd) == 0xd) ||
51657                            ((instr & 0xe20) == 0x620) ||
51658                            ((instr & 0xf30) == 0xa30)) {
51659                          UnallocatedA32(instr);
51660                          return;
51661                        }
51662                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51663                        if (dt.Is(kDataTypeValueInvalid)) {
51664                          UnallocatedA32(instr);
51665                          return;
51666                        }
51667                        Alignment align =
51668                            Align_align_5_Decode((instr >> 4) & 0x3);
51669                        if (dt.Is(kDataTypeValueInvalid) ||
51670                            align.Is(kBadAlignment)) {
51671                          UnallocatedA32(instr);
51672                          return;
51673                        }
51674                        unsigned first = ExtractDRegister(instr, 22, 12);
51675                        unsigned length;
51676                        SpacingType spacing = kSingle;
51677                        switch ((instr >> 8) & 0xf) {
51678                          default:
51679                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51680                          case 0x7:
51681                            length = 1;
51682                            break;
51683                          case 0xa:
51684                            length = 2;
51685                            break;
51686                          case 0x6:
51687                            length = 3;
51688                            break;
51689                          case 0x2:
51690                            length = 4;
51691                            break;
51692                        }
51693                        unsigned last = first + length - 1;
51694                        TransferType transfer = kMultipleLanes;
51695                        unsigned rn = (instr >> 16) & 0xf;
51696                        unsigned rm = instr & 0xf;
51697                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51698                        vst1(al,
51699                             dt,
51700                             NeonRegisterList(DRegister(first),
51701                                              DRegister(last),
51702                                              spacing,
51703                                              transfer),
51704                             AlignedMemOperand(Register(rn),
51705                                               align,
51706                                               Register(rm),
51707                                               PostIndex));
51708                        break;
51709                      }
51710                      default:
51711                        UnallocatedA32(instr);
51712                        break;
51713                    }
51714                    break;
51715                  }
51716                }
51717                break;
51718              }
51719              case 0x00800000: {
51720                // 0xf4800000
51721                switch (instr & 0x00000300) {
51722                  case 0x00000000: {
51723                    // 0xf4800000
51724                    switch (instr & 0x00000c00) {
51725                      case 0x00000c00: {
51726                        // 0xf4800c00
51727                        UnallocatedA32(instr);
51728                        break;
51729                      }
51730                      default: {
51731                        switch (instr & 0x0000000d) {
51732                          case 0x0000000d: {
51733                            // 0xf480000d
51734                            switch (instr & 0x00000002) {
51735                              case 0x00000000: {
51736                                // 0xf480000d
51737                                if (((instr & 0xc00) == 0xc00)) {
51738                                  UnallocatedA32(instr);
51739                                  return;
51740                                }
51741                                DataType dt =
51742                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51743                                if (dt.Is(kDataTypeValueInvalid)) {
51744                                  UnallocatedA32(instr);
51745                                  return;
51746                                }
51747                                DecodeNeonAndAlign decode_neon =
51748                                    Align_index_align_1_Decode((instr >> 4) &
51749                                                                   0xf,
51750                                                               dt);
51751                                if (!decode_neon.IsValid()) {
51752                                  UnallocatedA32(instr);
51753                                  return;
51754                                }
51755                                Alignment align = decode_neon.GetAlign();
51756                                int lane = decode_neon.GetLane();
51757                                SpacingType spacing = decode_neon.GetSpacing();
51758                                unsigned first =
51759                                    ExtractDRegister(instr, 22, 12);
51760                                unsigned length = 1;
51761                                unsigned last = first + length - 1;
51762                                unsigned rn = (instr >> 16) & 0xf;
51763                                // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51764                                vst1(al,
51765                                     dt,
51766                                     NeonRegisterList(DRegister(first),
51767                                                      DRegister(last),
51768                                                      spacing,
51769                                                      lane),
51770                                     AlignedMemOperand(Register(rn),
51771                                                       align,
51772                                                       PostIndex));
51773                                break;
51774                              }
51775                              case 0x00000002: {
51776                                // 0xf480000f
51777                                if (((instr & 0xc00) == 0xc00)) {
51778                                  UnallocatedA32(instr);
51779                                  return;
51780                                }
51781                                DataType dt =
51782                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51783                                if (dt.Is(kDataTypeValueInvalid)) {
51784                                  UnallocatedA32(instr);
51785                                  return;
51786                                }
51787                                DecodeNeonAndAlign decode_neon =
51788                                    Align_index_align_1_Decode((instr >> 4) &
51789                                                                   0xf,
51790                                                               dt);
51791                                if (!decode_neon.IsValid()) {
51792                                  UnallocatedA32(instr);
51793                                  return;
51794                                }
51795                                Alignment align = decode_neon.GetAlign();
51796                                int lane = decode_neon.GetLane();
51797                                SpacingType spacing = decode_neon.GetSpacing();
51798                                unsigned first =
51799                                    ExtractDRegister(instr, 22, 12);
51800                                unsigned length = 1;
51801                                unsigned last = first + length - 1;
51802                                unsigned rn = (instr >> 16) & 0xf;
51803                                // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51804                                vst1(al,
51805                                     dt,
51806                                     NeonRegisterList(DRegister(first),
51807                                                      DRegister(last),
51808                                                      spacing,
51809                                                      lane),
51810                                     AlignedMemOperand(Register(rn),
51811                                                       align,
51812                                                       Offset));
51813                                break;
51814                              }
51815                            }
51816                            break;
51817                          }
51818                          default: {
51819                            if (((instr & 0xc00) == 0xc00) ||
51820                                ((instr & 0xd) == 0xd)) {
51821                              UnallocatedA32(instr);
51822                              return;
51823                            }
51824                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51825                            if (dt.Is(kDataTypeValueInvalid)) {
51826                              UnallocatedA32(instr);
51827                              return;
51828                            }
51829                            DecodeNeonAndAlign decode_neon =
51830                                Align_index_align_1_Decode((instr >> 4) & 0xf,
51831                                                           dt);
51832                            if (!decode_neon.IsValid()) {
51833                              UnallocatedA32(instr);
51834                              return;
51835                            }
51836                            Alignment align = decode_neon.GetAlign();
51837                            int lane = decode_neon.GetLane();
51838                            SpacingType spacing = decode_neon.GetSpacing();
51839                            unsigned first = ExtractDRegister(instr, 22, 12);
51840                            unsigned length = 1;
51841                            unsigned last = first + length - 1;
51842                            unsigned rn = (instr >> 16) & 0xf;
51843                            unsigned rm = instr & 0xf;
51844                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51845                            vst1(al,
51846                                 dt,
51847                                 NeonRegisterList(DRegister(first),
51848                                                  DRegister(last),
51849                                                  spacing,
51850                                                  lane),
51851                                 AlignedMemOperand(Register(rn),
51852                                                   align,
51853                                                   Register(rm),
51854                                                   PostIndex));
51855                            break;
51856                          }
51857                        }
51858                        break;
51859                      }
51860                    }
51861                    break;
51862                  }
51863                  case 0x00000100: {
51864                    // 0xf4800100
51865                    switch (instr & 0x00000c00) {
51866                      case 0x00000c00: {
51867                        // 0xf4800d00
51868                        UnallocatedA32(instr);
51869                        break;
51870                      }
51871                      default: {
51872                        switch (instr & 0x0000000d) {
51873                          case 0x0000000d: {
51874                            // 0xf480010d
51875                            switch (instr & 0x00000002) {
51876                              case 0x00000000: {
51877                                // 0xf480010d
51878                                if (((instr & 0xc00) == 0xc00)) {
51879                                  UnallocatedA32(instr);
51880                                  return;
51881                                }
51882                                DataType dt =
51883                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51884                                if (dt.Is(kDataTypeValueInvalid)) {
51885                                  UnallocatedA32(instr);
51886                                  return;
51887                                }
51888                                DecodeNeonAndAlign decode_neon =
51889                                    Align_index_align_2_Decode((instr >> 4) &
51890                                                                   0xf,
51891                                                               dt);
51892                                if (!decode_neon.IsValid()) {
51893                                  UnallocatedA32(instr);
51894                                  return;
51895                                }
51896                                Alignment align = decode_neon.GetAlign();
51897                                int lane = decode_neon.GetLane();
51898                                SpacingType spacing = decode_neon.GetSpacing();
51899                                unsigned first =
51900                                    ExtractDRegister(instr, 22, 12);
51901                                unsigned length = 2;
51902                                unsigned last =
51903                                    first +
51904                                    (length - 1) * (spacing == kSingle ? 1 : 2);
51905                                unsigned rn = (instr >> 16) & 0xf;
51906                                // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51907                                vst2(al,
51908                                     dt,
51909                                     NeonRegisterList(DRegister(first),
51910                                                      DRegister(last),
51911                                                      spacing,
51912                                                      lane),
51913                                     AlignedMemOperand(Register(rn),
51914                                                       align,
51915                                                       PostIndex));
51916                                break;
51917                              }
51918                              case 0x00000002: {
51919                                // 0xf480010f
51920                                if (((instr & 0xc00) == 0xc00)) {
51921                                  UnallocatedA32(instr);
51922                                  return;
51923                                }
51924                                DataType dt =
51925                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51926                                if (dt.Is(kDataTypeValueInvalid)) {
51927                                  UnallocatedA32(instr);
51928                                  return;
51929                                }
51930                                DecodeNeonAndAlign decode_neon =
51931                                    Align_index_align_2_Decode((instr >> 4) &
51932                                                                   0xf,
51933                                                               dt);
51934                                if (!decode_neon.IsValid()) {
51935                                  UnallocatedA32(instr);
51936                                  return;
51937                                }
51938                                Alignment align = decode_neon.GetAlign();
51939                                int lane = decode_neon.GetLane();
51940                                SpacingType spacing = decode_neon.GetSpacing();
51941                                unsigned first =
51942                                    ExtractDRegister(instr, 22, 12);
51943                                unsigned length = 2;
51944                                unsigned last =
51945                                    first +
51946                                    (length - 1) * (spacing == kSingle ? 1 : 2);
51947                                unsigned rn = (instr >> 16) & 0xf;
51948                                // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51949                                vst2(al,
51950                                     dt,
51951                                     NeonRegisterList(DRegister(first),
51952                                                      DRegister(last),
51953                                                      spacing,
51954                                                      lane),
51955                                     AlignedMemOperand(Register(rn),
51956                                                       align,
51957                                                       Offset));
51958                                break;
51959                              }
51960                            }
51961                            break;
51962                          }
51963                          default: {
51964                            if (((instr & 0xc00) == 0xc00) ||
51965                                ((instr & 0xd) == 0xd)) {
51966                              UnallocatedA32(instr);
51967                              return;
51968                            }
51969                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51970                            if (dt.Is(kDataTypeValueInvalid)) {
51971                              UnallocatedA32(instr);
51972                              return;
51973                            }
51974                            DecodeNeonAndAlign decode_neon =
51975                                Align_index_align_2_Decode((instr >> 4) & 0xf,
51976                                                           dt);
51977                            if (!decode_neon.IsValid()) {
51978                              UnallocatedA32(instr);
51979                              return;
51980                            }
51981                            Alignment align = decode_neon.GetAlign();
51982                            int lane = decode_neon.GetLane();
51983                            SpacingType spacing = decode_neon.GetSpacing();
51984                            unsigned first = ExtractDRegister(instr, 22, 12);
51985                            unsigned length = 2;
51986                            unsigned last =
51987                                first +
51988                                (length - 1) * (spacing == kSingle ? 1 : 2);
51989                            unsigned rn = (instr >> 16) & 0xf;
51990                            unsigned rm = instr & 0xf;
51991                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51992                            vst2(al,
51993                                 dt,
51994                                 NeonRegisterList(DRegister(first),
51995                                                  DRegister(last),
51996                                                  spacing,
51997                                                  lane),
51998                                 AlignedMemOperand(Register(rn),
51999                                                   align,
52000                                                   Register(rm),
52001                                                   PostIndex));
52002                            break;
52003                          }
52004                        }
52005                        break;
52006                      }
52007                    }
52008                    break;
52009                  }
52010                  case 0x00000200: {
52011                    // 0xf4800200
52012                    switch (instr & 0x00000c30) {
52013                      case 0x00000010: {
52014                        // 0xf4800210
52015                        UnallocatedA32(instr);
52016                        break;
52017                      }
52018                      case 0x00000030: {
52019                        // 0xf4800230
52020                        UnallocatedA32(instr);
52021                        break;
52022                      }
52023                      case 0x00000410: {
52024                        // 0xf4800610
52025                        UnallocatedA32(instr);
52026                        break;
52027                      }
52028                      case 0x00000430: {
52029                        // 0xf4800630
52030                        UnallocatedA32(instr);
52031                        break;
52032                      }
52033                      case 0x00000810: {
52034                        // 0xf4800a10
52035                        UnallocatedA32(instr);
52036                        break;
52037                      }
52038                      case 0x00000820: {
52039                        // 0xf4800a20
52040                        UnallocatedA32(instr);
52041                        break;
52042                      }
52043                      case 0x00000830: {
52044                        // 0xf4800a30
52045                        UnallocatedA32(instr);
52046                        break;
52047                      }
52048                      case 0x00000c00: {
52049                        // 0xf4800e00
52050                        UnallocatedA32(instr);
52051                        break;
52052                      }
52053                      case 0x00000c10: {
52054                        // 0xf4800e10
52055                        UnallocatedA32(instr);
52056                        break;
52057                      }
52058                      case 0x00000c20: {
52059                        // 0xf4800e20
52060                        UnallocatedA32(instr);
52061                        break;
52062                      }
52063                      case 0x00000c30: {
52064                        // 0xf4800e30
52065                        UnallocatedA32(instr);
52066                        break;
52067                      }
52068                      default: {
52069                        switch (instr & 0x0000000d) {
52070                          case 0x0000000d: {
52071                            // 0xf480020d
52072                            switch (instr & 0x00000002) {
52073                              case 0x00000000: {
52074                                // 0xf480020d
52075                                if (((instr & 0xc00) == 0xc00) ||
52076                                    ((instr & 0x810) == 0x10) ||
52077                                    ((instr & 0xc30) == 0x810) ||
52078                                    ((instr & 0xc30) == 0x820) ||
52079                                    ((instr & 0xc30) == 0x830)) {
52080                                  UnallocatedA32(instr);
52081                                  return;
52082                                }
52083                                DataType dt =
52084                                    Dt_size_7_Decode((instr >> 10) & 0x3);
52085                                if (dt.Is(kDataTypeValueInvalid)) {
52086                                  UnallocatedA32(instr);
52087                                  return;
52088                                }
52089                                DecodeNeon decode_neon =
52090                                    Index_1_Decode((instr >> 4) & 0xf, dt);
52091                                if (!decode_neon.IsValid()) {
52092                                  UnallocatedA32(instr);
52093                                  return;
52094                                }
52095                                int lane = decode_neon.GetLane();
52096                                SpacingType spacing = decode_neon.GetSpacing();
52097                                unsigned first =
52098                                    ExtractDRegister(instr, 22, 12);
52099                                unsigned length = 3;
52100                                unsigned last =
52101                                    first +
52102                                    (length - 1) * (spacing == kSingle ? 1 : 2);
52103                                unsigned rn = (instr >> 16) & 0xf;
52104                                // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
52105                                vst3(al,
52106                                     dt,
52107                                     NeonRegisterList(DRegister(first),
52108                                                      DRegister(last),
52109                                                      spacing,
52110                                                      lane),
52111                                     MemOperand(Register(rn), PostIndex));
52112                                break;
52113                              }
52114                              case 0x00000002: {
52115                                // 0xf480020f
52116                                if (((instr & 0xc00) == 0xc00) ||
52117                                    ((instr & 0x810) == 0x10) ||
52118                                    ((instr & 0xc30) == 0x810) ||
52119                                    ((instr & 0xc30) == 0x820) ||
52120                                    ((instr & 0xc30) == 0x830)) {
52121                                  UnallocatedA32(instr);
52122                                  return;
52123                                }
52124                                DataType dt =
52125                                    Dt_size_7_Decode((instr >> 10) & 0x3);
52126                                if (dt.Is(kDataTypeValueInvalid)) {
52127                                  UnallocatedA32(instr);
52128                                  return;
52129                                }
52130                                DecodeNeon decode_neon =
52131                                    Index_1_Decode((instr >> 4) & 0xf, dt);
52132                                if (!decode_neon.IsValid()) {
52133                                  UnallocatedA32(instr);
52134                                  return;
52135                                }
52136                                int lane = decode_neon.GetLane();
52137                                SpacingType spacing = decode_neon.GetSpacing();
52138                                unsigned first =
52139                                    ExtractDRegister(instr, 22, 12);
52140                                unsigned length = 3;
52141                                unsigned last =
52142                                    first +
52143                                    (length - 1) * (spacing == kSingle ? 1 : 2);
52144                                unsigned rn = (instr >> 16) & 0xf;
52145                                // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
52146                                vst3(al,
52147                                     dt,
52148                                     NeonRegisterList(DRegister(first),
52149                                                      DRegister(last),
52150                                                      spacing,
52151                                                      lane),
52152                                     MemOperand(Register(rn), Offset));
52153                                break;
52154                              }
52155                            }
52156                            break;
52157                          }
52158                          default: {
52159                            if (((instr & 0xc00) == 0xc00) ||
52160                                ((instr & 0xd) == 0xd) ||
52161                                ((instr & 0x810) == 0x10) ||
52162                                ((instr & 0xc30) == 0x810) ||
52163                                ((instr & 0xc30) == 0x820) ||
52164                                ((instr & 0xc30) == 0x830)) {
52165                              UnallocatedA32(instr);
52166                              return;
52167                            }
52168                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
52169                            if (dt.Is(kDataTypeValueInvalid)) {
52170                              UnallocatedA32(instr);
52171                              return;
52172                            }
52173                            DecodeNeon decode_neon =
52174                                Index_1_Decode((instr >> 4) & 0xf, dt);
52175                            if (!decode_neon.IsValid()) {
52176                              UnallocatedA32(instr);
52177                              return;
52178                            }
52179                            int lane = decode_neon.GetLane();
52180                            SpacingType spacing = decode_neon.GetSpacing();
52181                            unsigned first = ExtractDRegister(instr, 22, 12);
52182                            unsigned length = 3;
52183                            unsigned last =
52184                                first +
52185                                (length - 1) * (spacing == kSingle ? 1 : 2);
52186                            unsigned rn = (instr >> 16) & 0xf;
52187                            Sign sign(plus);
52188                            unsigned rm = instr & 0xf;
52189                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
52190                            vst3(al,
52191                                 dt,
52192                                 NeonRegisterList(DRegister(first),
52193                                                  DRegister(last),
52194                                                  spacing,
52195                                                  lane),
52196                                 MemOperand(Register(rn),
52197                                            sign,
52198                                            Register(rm),
52199                                            PostIndex));
52200                            break;
52201                          }
52202                        }
52203                        break;
52204                      }
52205                    }
52206                    break;
52207                  }
52208                  case 0x00000300: {
52209                    // 0xf4800300
52210                    switch (instr & 0x00000c00) {
52211                      case 0x00000c00: {
52212                        // 0xf4800f00
52213                        UnallocatedA32(instr);
52214                        break;
52215                      }
52216                      default: {
52217                        switch (instr & 0x0000000d) {
52218                          case 0x0000000d: {
52219                            // 0xf480030d
52220                            switch (instr & 0x00000002) {
52221                              case 0x00000000: {
52222                                // 0xf480030d
52223                                if (((instr & 0xc00) == 0xc00)) {
52224                                  UnallocatedA32(instr);
52225                                  return;
52226                                }
52227                                DataType dt =
52228                                    Dt_size_7_Decode((instr >> 10) & 0x3);
52229                                if (dt.Is(kDataTypeValueInvalid)) {
52230                                  UnallocatedA32(instr);
52231                                  return;
52232                                }
52233                                DecodeNeonAndAlign decode_neon =
52234                                    Align_index_align_3_Decode((instr >> 4) &
52235                                                                   0xf,
52236                                                               dt);
52237                                if (!decode_neon.IsValid()) {
52238                                  UnallocatedA32(instr);
52239                                  return;
52240                                }
52241                                Alignment align = decode_neon.GetAlign();
52242                                int lane = decode_neon.GetLane();
52243                                SpacingType spacing = decode_neon.GetSpacing();
52244                                unsigned first =
52245                                    ExtractDRegister(instr, 22, 12);
52246                                unsigned length = 4;
52247                                unsigned last =
52248                                    first +
52249                                    (length - 1) * (spacing == kSingle ? 1 : 2);
52250                                unsigned rn = (instr >> 16) & 0xf;
52251                                // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52252                                vst4(al,
52253                                     dt,
52254                                     NeonRegisterList(DRegister(first),
52255                                                      DRegister(last),
52256                                                      spacing,
52257                                                      lane),
52258                                     AlignedMemOperand(Register(rn),
52259                                                       align,
52260                                                       PostIndex));
52261                                break;
52262                              }
52263                              case 0x00000002: {
52264                                // 0xf480030f
52265                                if (((instr & 0xc00) == 0xc00)) {
52266                                  UnallocatedA32(instr);
52267                                  return;
52268                                }
52269                                DataType dt =
52270                                    Dt_size_7_Decode((instr >> 10) & 0x3);
52271                                if (dt.Is(kDataTypeValueInvalid)) {
52272                                  UnallocatedA32(instr);
52273                                  return;
52274                                }
52275                                DecodeNeonAndAlign decode_neon =
52276                                    Align_index_align_3_Decode((instr >> 4) &
52277                                                                   0xf,
52278                                                               dt);
52279                                if (!decode_neon.IsValid()) {
52280                                  UnallocatedA32(instr);
52281                                  return;
52282                                }
52283                                Alignment align = decode_neon.GetAlign();
52284                                int lane = decode_neon.GetLane();
52285                                SpacingType spacing = decode_neon.GetSpacing();
52286                                unsigned first =
52287                                    ExtractDRegister(instr, 22, 12);
52288                                unsigned length = 4;
52289                                unsigned last =
52290                                    first +
52291                                    (length - 1) * (spacing == kSingle ? 1 : 2);
52292                                unsigned rn = (instr >> 16) & 0xf;
52293                                // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
52294                                vst4(al,
52295                                     dt,
52296                                     NeonRegisterList(DRegister(first),
52297                                                      DRegister(last),
52298                                                      spacing,
52299                                                      lane),
52300                                     AlignedMemOperand(Register(rn),
52301                                                       align,
52302                                                       Offset));
52303                                break;
52304                              }
52305                            }
52306                            break;
52307                          }
52308                          default: {
52309                            if (((instr & 0xc00) == 0xc00) ||
52310                                ((instr & 0xd) == 0xd)) {
52311                              UnallocatedA32(instr);
52312                              return;
52313                            }
52314                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
52315                            if (dt.Is(kDataTypeValueInvalid)) {
52316                              UnallocatedA32(instr);
52317                              return;
52318                            }
52319                            DecodeNeonAndAlign decode_neon =
52320                                Align_index_align_3_Decode((instr >> 4) & 0xf,
52321                                                           dt);
52322                            if (!decode_neon.IsValid()) {
52323                              UnallocatedA32(instr);
52324                              return;
52325                            }
52326                            Alignment align = decode_neon.GetAlign();
52327                            int lane = decode_neon.GetLane();
52328                            SpacingType spacing = decode_neon.GetSpacing();
52329                            unsigned first = ExtractDRegister(instr, 22, 12);
52330                            unsigned length = 4;
52331                            unsigned last =
52332                                first +
52333                                (length - 1) * (spacing == kSingle ? 1 : 2);
52334                            unsigned rn = (instr >> 16) & 0xf;
52335                            unsigned rm = instr & 0xf;
52336                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
52337                            vst4(al,
52338                                 dt,
52339                                 NeonRegisterList(DRegister(first),
52340                                                  DRegister(last),
52341                                                  spacing,
52342                                                  lane),
52343                                 AlignedMemOperand(Register(rn),
52344                                                   align,
52345                                                   Register(rm),
52346                                                   PostIndex));
52347                            break;
52348                          }
52349                        }
52350                        break;
52351                      }
52352                    }
52353                    break;
52354                  }
52355                }
52356                break;
52357              }
52358            }
52359            break;
52360          }
52361          case 0x00100000: {
52362            // 0xf4100000
52363            switch (instr & 0x00400000) {
52364              case 0x00400000: {
52365                // 0xf4500000
52366                switch (instr & 0x000f0000) {
52367                  case 0x000f0000: {
52368                    // 0xf45f0000
52369                    uint32_t U = (instr >> 23) & 0x1;
52370                    int32_t imm = instr & 0xfff;
52371                    if (U == 0) imm = -imm;
52372                    bool minus_zero = (imm == 0) && (U == 0);
52373                    Location location(imm, kA32PcDelta);
52374                    // PLI{<c>}{<q>} <label> ; A1
52375                    if (minus_zero) {
52376                      pli(al, MemOperand(pc, minus, 0));
52377                    } else {
52378                      pli(al, &location);
52379                    }
52380                    if (((instr & 0xff7ff000) != 0xf45ff000)) {
52381                      UnpredictableA32(instr);
52382                    }
52383                    break;
52384                  }
52385                  default: {
52386                    if (((instr & 0xf0000) == 0xf0000)) {
52387                      UnallocatedA32(instr);
52388                      return;
52389                    }
52390                    unsigned rn = (instr >> 16) & 0xf;
52391                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
52392                    int32_t offset = instr & 0xfff;
52393                    // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1
52394                    pli(al, MemOperand(Register(rn), sign, offset, Offset));
52395                    if (((instr & 0xff70f000) != 0xf450f000)) {
52396                      UnpredictableA32(instr);
52397                    }
52398                    break;
52399                  }
52400                }
52401                break;
52402              }
52403              default:
52404                UnallocatedA32(instr);
52405                break;
52406            }
52407            break;
52408          }
52409          case 0x00200000: {
52410            // 0xf4200000
52411            switch (instr & 0x00800000) {
52412              case 0x00000000: {
52413                // 0xf4200000
52414                switch (instr & 0x0000000d) {
52415                  case 0x0000000d: {
52416                    // 0xf420000d
52417                    switch (instr & 0x00000002) {
52418                      case 0x00000000: {
52419                        // 0xf420000d
52420                        switch (instr & 0x00000f00) {
52421                          case 0x00000000: {
52422                            // 0xf420000d
52423                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52424                            if (dt.Is(kDataTypeValueInvalid)) {
52425                              UnallocatedA32(instr);
52426                              return;
52427                            }
52428                            Alignment align =
52429                                Align_align_4_Decode((instr >> 4) & 0x3);
52430                            if (dt.Is(kDataTypeValueInvalid) ||
52431                                align.Is(kBadAlignment)) {
52432                              UnallocatedA32(instr);
52433                              return;
52434                            }
52435                            unsigned first = ExtractDRegister(instr, 22, 12);
52436                            unsigned length;
52437                            SpacingType spacing;
52438                            switch ((instr >> 8) & 0xf) {
52439                              default:
52440                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52441                              case 0x0:
52442                                length = 4;
52443                                spacing = kSingle;
52444                                break;
52445                              case 0x1:
52446                                length = 4;
52447                                spacing = kDouble;
52448                                break;
52449                            }
52450                            unsigned last =
52451                                first +
52452                                (length - 1) * (spacing == kSingle ? 1 : 2);
52453                            TransferType transfer = kMultipleLanes;
52454                            unsigned rn = (instr >> 16) & 0xf;
52455                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52456                            vld4(al,
52457                                 dt,
52458                                 NeonRegisterList(DRegister(first),
52459                                                  DRegister(last),
52460                                                  spacing,
52461                                                  transfer),
52462                                 AlignedMemOperand(Register(rn),
52463                                                   align,
52464                                                   PostIndex));
52465                            break;
52466                          }
52467                          case 0x00000100: {
52468                            // 0xf420010d
52469                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52470                            if (dt.Is(kDataTypeValueInvalid)) {
52471                              UnallocatedA32(instr);
52472                              return;
52473                            }
52474                            Alignment align =
52475                                Align_align_4_Decode((instr >> 4) & 0x3);
52476                            if (dt.Is(kDataTypeValueInvalid) ||
52477                                align.Is(kBadAlignment)) {
52478                              UnallocatedA32(instr);
52479                              return;
52480                            }
52481                            unsigned first = ExtractDRegister(instr, 22, 12);
52482                            unsigned length;
52483                            SpacingType spacing;
52484                            switch ((instr >> 8) & 0xf) {
52485                              default:
52486                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52487                              case 0x0:
52488                                length = 4;
52489                                spacing = kSingle;
52490                                break;
52491                              case 0x1:
52492                                length = 4;
52493                                spacing = kDouble;
52494                                break;
52495                            }
52496                            unsigned last =
52497                                first +
52498                                (length - 1) * (spacing == kSingle ? 1 : 2);
52499                            TransferType transfer = kMultipleLanes;
52500                            unsigned rn = (instr >> 16) & 0xf;
52501                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52502                            vld4(al,
52503                                 dt,
52504                                 NeonRegisterList(DRegister(first),
52505                                                  DRegister(last),
52506                                                  spacing,
52507                                                  transfer),
52508                                 AlignedMemOperand(Register(rn),
52509                                                   align,
52510                                                   PostIndex));
52511                            break;
52512                          }
52513                          case 0x00000200: {
52514                            // 0xf420020d
52515                            if (((instr & 0xe20) == 0x620) ||
52516                                ((instr & 0xf30) == 0xa30)) {
52517                              UnallocatedA32(instr);
52518                              return;
52519                            }
52520                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52521                            if (dt.Is(kDataTypeValueInvalid)) {
52522                              UnallocatedA32(instr);
52523                              return;
52524                            }
52525                            Alignment align =
52526                                Align_align_1_Decode((instr >> 4) & 0x3);
52527                            if (dt.Is(kDataTypeValueInvalid) ||
52528                                align.Is(kBadAlignment)) {
52529                              UnallocatedA32(instr);
52530                              return;
52531                            }
52532                            unsigned first = ExtractDRegister(instr, 22, 12);
52533                            unsigned length;
52534                            SpacingType spacing = kSingle;
52535                            switch ((instr >> 8) & 0xf) {
52536                              default:
52537                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52538                              case 0x7:
52539                                length = 1;
52540                                break;
52541                              case 0xa:
52542                                length = 2;
52543                                break;
52544                              case 0x6:
52545                                length = 3;
52546                                break;
52547                              case 0x2:
52548                                length = 4;
52549                                break;
52550                            }
52551                            unsigned last = first + length - 1;
52552                            TransferType transfer = kMultipleLanes;
52553                            unsigned rn = (instr >> 16) & 0xf;
52554                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52555                            vld1(al,
52556                                 dt,
52557                                 NeonRegisterList(DRegister(first),
52558                                                  DRegister(last),
52559                                                  spacing,
52560                                                  transfer),
52561                                 AlignedMemOperand(Register(rn),
52562                                                   align,
52563                                                   PostIndex));
52564                            break;
52565                          }
52566                          case 0x00000300: {
52567                            // 0xf420030d
52568                            if (((instr & 0xe30) == 0x830)) {
52569                              UnallocatedA32(instr);
52570                              return;
52571                            }
52572                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52573                            if (dt.Is(kDataTypeValueInvalid)) {
52574                              UnallocatedA32(instr);
52575                              return;
52576                            }
52577                            Alignment align =
52578                                Align_align_2_Decode((instr >> 4) & 0x3);
52579                            if (dt.Is(kDataTypeValueInvalid) ||
52580                                align.Is(kBadAlignment)) {
52581                              UnallocatedA32(instr);
52582                              return;
52583                            }
52584                            unsigned first = ExtractDRegister(instr, 22, 12);
52585                            unsigned length;
52586                            SpacingType spacing;
52587                            switch ((instr >> 8) & 0xf) {
52588                              default:
52589                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52590                              case 0x8:
52591                                length = 2;
52592                                spacing = kSingle;
52593                                break;
52594                              case 0x9:
52595                                length = 2;
52596                                spacing = kDouble;
52597                                break;
52598                              case 0x3:
52599                                length = 4;
52600                                spacing = kSingle;
52601                                break;
52602                            }
52603                            unsigned last =
52604                                first +
52605                                (length - 1) * (spacing == kSingle ? 1 : 2);
52606                            TransferType transfer = kMultipleLanes;
52607                            unsigned rn = (instr >> 16) & 0xf;
52608                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52609                            vld2(al,
52610                                 dt,
52611                                 NeonRegisterList(DRegister(first),
52612                                                  DRegister(last),
52613                                                  spacing,
52614                                                  transfer),
52615                                 AlignedMemOperand(Register(rn),
52616                                                   align,
52617                                                   PostIndex));
52618                            break;
52619                          }
52620                          case 0x00000400: {
52621                            // 0xf420040d
52622                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52623                            if (dt.Is(kDataTypeValueInvalid)) {
52624                              UnallocatedA32(instr);
52625                              return;
52626                            }
52627                            Alignment align =
52628                                Align_align_3_Decode((instr >> 4) & 0x3);
52629                            if (dt.Is(kDataTypeValueInvalid) ||
52630                                align.Is(kBadAlignment)) {
52631                              UnallocatedA32(instr);
52632                              return;
52633                            }
52634                            unsigned first = ExtractDRegister(instr, 22, 12);
52635                            unsigned length;
52636                            SpacingType spacing;
52637                            switch ((instr >> 8) & 0xf) {
52638                              default:
52639                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52640                              case 0x4:
52641                                length = 3;
52642                                spacing = kSingle;
52643                                break;
52644                              case 0x5:
52645                                length = 3;
52646                                spacing = kDouble;
52647                                break;
52648                            }
52649                            unsigned last =
52650                                first +
52651                                (length - 1) * (spacing == kSingle ? 1 : 2);
52652                            TransferType transfer = kMultipleLanes;
52653                            unsigned rn = (instr >> 16) & 0xf;
52654                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52655                            vld3(al,
52656                                 dt,
52657                                 NeonRegisterList(DRegister(first),
52658                                                  DRegister(last),
52659                                                  spacing,
52660                                                  transfer),
52661                                 AlignedMemOperand(Register(rn),
52662                                                   align,
52663                                                   PostIndex));
52664                            break;
52665                          }
52666                          case 0x00000500: {
52667                            // 0xf420050d
52668                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52669                            if (dt.Is(kDataTypeValueInvalid)) {
52670                              UnallocatedA32(instr);
52671                              return;
52672                            }
52673                            Alignment align =
52674                                Align_align_3_Decode((instr >> 4) & 0x3);
52675                            if (dt.Is(kDataTypeValueInvalid) ||
52676                                align.Is(kBadAlignment)) {
52677                              UnallocatedA32(instr);
52678                              return;
52679                            }
52680                            unsigned first = ExtractDRegister(instr, 22, 12);
52681                            unsigned length;
52682                            SpacingType spacing;
52683                            switch ((instr >> 8) & 0xf) {
52684                              default:
52685                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52686                              case 0x4:
52687                                length = 3;
52688                                spacing = kSingle;
52689                                break;
52690                              case 0x5:
52691                                length = 3;
52692                                spacing = kDouble;
52693                                break;
52694                            }
52695                            unsigned last =
52696                                first +
52697                                (length - 1) * (spacing == kSingle ? 1 : 2);
52698                            TransferType transfer = kMultipleLanes;
52699                            unsigned rn = (instr >> 16) & 0xf;
52700                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52701                            vld3(al,
52702                                 dt,
52703                                 NeonRegisterList(DRegister(first),
52704                                                  DRegister(last),
52705                                                  spacing,
52706                                                  transfer),
52707                                 AlignedMemOperand(Register(rn),
52708                                                   align,
52709                                                   PostIndex));
52710                            break;
52711                          }
52712                          case 0x00000600: {
52713                            // 0xf420060d
52714                            if (((instr & 0xe20) == 0x620) ||
52715                                ((instr & 0xf30) == 0xa30)) {
52716                              UnallocatedA32(instr);
52717                              return;
52718                            }
52719                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52720                            if (dt.Is(kDataTypeValueInvalid)) {
52721                              UnallocatedA32(instr);
52722                              return;
52723                            }
52724                            Alignment align =
52725                                Align_align_1_Decode((instr >> 4) & 0x3);
52726                            if (dt.Is(kDataTypeValueInvalid) ||
52727                                align.Is(kBadAlignment)) {
52728                              UnallocatedA32(instr);
52729                              return;
52730                            }
52731                            unsigned first = ExtractDRegister(instr, 22, 12);
52732                            unsigned length;
52733                            SpacingType spacing = kSingle;
52734                            switch ((instr >> 8) & 0xf) {
52735                              default:
52736                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52737                              case 0x7:
52738                                length = 1;
52739                                break;
52740                              case 0xa:
52741                                length = 2;
52742                                break;
52743                              case 0x6:
52744                                length = 3;
52745                                break;
52746                              case 0x2:
52747                                length = 4;
52748                                break;
52749                            }
52750                            unsigned last = first + length - 1;
52751                            TransferType transfer = kMultipleLanes;
52752                            unsigned rn = (instr >> 16) & 0xf;
52753                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52754                            vld1(al,
52755                                 dt,
52756                                 NeonRegisterList(DRegister(first),
52757                                                  DRegister(last),
52758                                                  spacing,
52759                                                  transfer),
52760                                 AlignedMemOperand(Register(rn),
52761                                                   align,
52762                                                   PostIndex));
52763                            break;
52764                          }
52765                          case 0x00000700: {
52766                            // 0xf420070d
52767                            if (((instr & 0xe20) == 0x620) ||
52768                                ((instr & 0xf30) == 0xa30)) {
52769                              UnallocatedA32(instr);
52770                              return;
52771                            }
52772                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52773                            if (dt.Is(kDataTypeValueInvalid)) {
52774                              UnallocatedA32(instr);
52775                              return;
52776                            }
52777                            Alignment align =
52778                                Align_align_1_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 = kSingle;
52787                            switch ((instr >> 8) & 0xf) {
52788                              default:
52789                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52790                              case 0x7:
52791                                length = 1;
52792                                break;
52793                              case 0xa:
52794                                length = 2;
52795                                break;
52796                              case 0x6:
52797                                length = 3;
52798                                break;
52799                              case 0x2:
52800                                length = 4;
52801                                break;
52802                            }
52803                            unsigned last = first + length - 1;
52804                            TransferType transfer = kMultipleLanes;
52805                            unsigned rn = (instr >> 16) & 0xf;
52806                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52807                            vld1(al,
52808                                 dt,
52809                                 NeonRegisterList(DRegister(first),
52810                                                  DRegister(last),
52811                                                  spacing,
52812                                                  transfer),
52813                                 AlignedMemOperand(Register(rn),
52814                                                   align,
52815                                                   PostIndex));
52816                            break;
52817                          }
52818                          case 0x00000800: {
52819                            // 0xf420080d
52820                            if (((instr & 0xe30) == 0x830)) {
52821                              UnallocatedA32(instr);
52822                              return;
52823                            }
52824                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52825                            if (dt.Is(kDataTypeValueInvalid)) {
52826                              UnallocatedA32(instr);
52827                              return;
52828                            }
52829                            Alignment align =
52830                                Align_align_2_Decode((instr >> 4) & 0x3);
52831                            if (dt.Is(kDataTypeValueInvalid) ||
52832                                align.Is(kBadAlignment)) {
52833                              UnallocatedA32(instr);
52834                              return;
52835                            }
52836                            unsigned first = ExtractDRegister(instr, 22, 12);
52837                            unsigned length;
52838                            SpacingType spacing;
52839                            switch ((instr >> 8) & 0xf) {
52840                              default:
52841                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52842                              case 0x8:
52843                                length = 2;
52844                                spacing = kSingle;
52845                                break;
52846                              case 0x9:
52847                                length = 2;
52848                                spacing = kDouble;
52849                                break;
52850                              case 0x3:
52851                                length = 4;
52852                                spacing = kSingle;
52853                                break;
52854                            }
52855                            unsigned last =
52856                                first +
52857                                (length - 1) * (spacing == kSingle ? 1 : 2);
52858                            TransferType transfer = kMultipleLanes;
52859                            unsigned rn = (instr >> 16) & 0xf;
52860                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52861                            vld2(al,
52862                                 dt,
52863                                 NeonRegisterList(DRegister(first),
52864                                                  DRegister(last),
52865                                                  spacing,
52866                                                  transfer),
52867                                 AlignedMemOperand(Register(rn),
52868                                                   align,
52869                                                   PostIndex));
52870                            break;
52871                          }
52872                          case 0x00000900: {
52873                            // 0xf420090d
52874                            if (((instr & 0xe30) == 0x830)) {
52875                              UnallocatedA32(instr);
52876                              return;
52877                            }
52878                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52879                            if (dt.Is(kDataTypeValueInvalid)) {
52880                              UnallocatedA32(instr);
52881                              return;
52882                            }
52883                            Alignment align =
52884                                Align_align_2_Decode((instr >> 4) & 0x3);
52885                            if (dt.Is(kDataTypeValueInvalid) ||
52886                                align.Is(kBadAlignment)) {
52887                              UnallocatedA32(instr);
52888                              return;
52889                            }
52890                            unsigned first = ExtractDRegister(instr, 22, 12);
52891                            unsigned length;
52892                            SpacingType spacing;
52893                            switch ((instr >> 8) & 0xf) {
52894                              default:
52895                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52896                              case 0x8:
52897                                length = 2;
52898                                spacing = kSingle;
52899                                break;
52900                              case 0x9:
52901                                length = 2;
52902                                spacing = kDouble;
52903                                break;
52904                              case 0x3:
52905                                length = 4;
52906                                spacing = kSingle;
52907                                break;
52908                            }
52909                            unsigned last =
52910                                first +
52911                                (length - 1) * (spacing == kSingle ? 1 : 2);
52912                            TransferType transfer = kMultipleLanes;
52913                            unsigned rn = (instr >> 16) & 0xf;
52914                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52915                            vld2(al,
52916                                 dt,
52917                                 NeonRegisterList(DRegister(first),
52918                                                  DRegister(last),
52919                                                  spacing,
52920                                                  transfer),
52921                                 AlignedMemOperand(Register(rn),
52922                                                   align,
52923                                                   PostIndex));
52924                            break;
52925                          }
52926                          case 0x00000a00: {
52927                            // 0xf4200a0d
52928                            if (((instr & 0xe20) == 0x620) ||
52929                                ((instr & 0xf30) == 0xa30)) {
52930                              UnallocatedA32(instr);
52931                              return;
52932                            }
52933                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52934                            if (dt.Is(kDataTypeValueInvalid)) {
52935                              UnallocatedA32(instr);
52936                              return;
52937                            }
52938                            Alignment align =
52939                                Align_align_1_Decode((instr >> 4) & 0x3);
52940                            if (dt.Is(kDataTypeValueInvalid) ||
52941                                align.Is(kBadAlignment)) {
52942                              UnallocatedA32(instr);
52943                              return;
52944                            }
52945                            unsigned first = ExtractDRegister(instr, 22, 12);
52946                            unsigned length;
52947                            SpacingType spacing = kSingle;
52948                            switch ((instr >> 8) & 0xf) {
52949                              default:
52950                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52951                              case 0x7:
52952                                length = 1;
52953                                break;
52954                              case 0xa:
52955                                length = 2;
52956                                break;
52957                              case 0x6:
52958                                length = 3;
52959                                break;
52960                              case 0x2:
52961                                length = 4;
52962                                break;
52963                            }
52964                            unsigned last = first + length - 1;
52965                            TransferType transfer = kMultipleLanes;
52966                            unsigned rn = (instr >> 16) & 0xf;
52967                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52968                            vld1(al,
52969                                 dt,
52970                                 NeonRegisterList(DRegister(first),
52971                                                  DRegister(last),
52972                                                  spacing,
52973                                                  transfer),
52974                                 AlignedMemOperand(Register(rn),
52975                                                   align,
52976                                                   PostIndex));
52977                            break;
52978                          }
52979                          default:
52980                            UnallocatedA32(instr);
52981                            break;
52982                        }
52983                        break;
52984                      }
52985                      case 0x00000002: {
52986                        // 0xf420000f
52987                        switch (instr & 0x00000f00) {
52988                          case 0x00000000: {
52989                            // 0xf420000d
52990                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52991                            if (dt.Is(kDataTypeValueInvalid)) {
52992                              UnallocatedA32(instr);
52993                              return;
52994                            }
52995                            Alignment align =
52996                                Align_align_4_Decode((instr >> 4) & 0x3);
52997                            if (dt.Is(kDataTypeValueInvalid) ||
52998                                align.Is(kBadAlignment)) {
52999                              UnallocatedA32(instr);
53000                              return;
53001                            }
53002                            unsigned first = ExtractDRegister(instr, 22, 12);
53003                            unsigned length;
53004                            SpacingType spacing;
53005                            switch ((instr >> 8) & 0xf) {
53006                              default:
53007                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53008                              case 0x0:
53009                                length = 4;
53010                                spacing = kSingle;
53011                                break;
53012                              case 0x1:
53013                                length = 4;
53014                                spacing = kDouble;
53015                                break;
53016                            }
53017                            unsigned last =
53018                                first +
53019                                (length - 1) * (spacing == kSingle ? 1 : 2);
53020                            TransferType transfer = kMultipleLanes;
53021                            unsigned rn = (instr >> 16) & 0xf;
53022                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53023                            vld4(al,
53024                                 dt,
53025                                 NeonRegisterList(DRegister(first),
53026                                                  DRegister(last),
53027                                                  spacing,
53028                                                  transfer),
53029                                 AlignedMemOperand(Register(rn),
53030                                                   align,
53031                                                   Offset));
53032                            break;
53033                          }
53034                          case 0x00000100: {
53035                            // 0xf420010d
53036                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53037                            if (dt.Is(kDataTypeValueInvalid)) {
53038                              UnallocatedA32(instr);
53039                              return;
53040                            }
53041                            Alignment align =
53042                                Align_align_4_Decode((instr >> 4) & 0x3);
53043                            if (dt.Is(kDataTypeValueInvalid) ||
53044                                align.Is(kBadAlignment)) {
53045                              UnallocatedA32(instr);
53046                              return;
53047                            }
53048                            unsigned first = ExtractDRegister(instr, 22, 12);
53049                            unsigned length;
53050                            SpacingType spacing;
53051                            switch ((instr >> 8) & 0xf) {
53052                              default:
53053                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53054                              case 0x0:
53055                                length = 4;
53056                                spacing = kSingle;
53057                                break;
53058                              case 0x1:
53059                                length = 4;
53060                                spacing = kDouble;
53061                                break;
53062                            }
53063                            unsigned last =
53064                                first +
53065                                (length - 1) * (spacing == kSingle ? 1 : 2);
53066                            TransferType transfer = kMultipleLanes;
53067                            unsigned rn = (instr >> 16) & 0xf;
53068                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53069                            vld4(al,
53070                                 dt,
53071                                 NeonRegisterList(DRegister(first),
53072                                                  DRegister(last),
53073                                                  spacing,
53074                                                  transfer),
53075                                 AlignedMemOperand(Register(rn),
53076                                                   align,
53077                                                   Offset));
53078                            break;
53079                          }
53080                          case 0x00000200: {
53081                            // 0xf420020d
53082                            if (((instr & 0xe20) == 0x620) ||
53083                                ((instr & 0xf30) == 0xa30)) {
53084                              UnallocatedA32(instr);
53085                              return;
53086                            }
53087                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53088                            if (dt.Is(kDataTypeValueInvalid)) {
53089                              UnallocatedA32(instr);
53090                              return;
53091                            }
53092                            Alignment align =
53093                                Align_align_1_Decode((instr >> 4) & 0x3);
53094                            if (dt.Is(kDataTypeValueInvalid) ||
53095                                align.Is(kBadAlignment)) {
53096                              UnallocatedA32(instr);
53097                              return;
53098                            }
53099                            unsigned first = ExtractDRegister(instr, 22, 12);
53100                            unsigned length;
53101                            SpacingType spacing = kSingle;
53102                            switch ((instr >> 8) & 0xf) {
53103                              default:
53104                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53105                              case 0x7:
53106                                length = 1;
53107                                break;
53108                              case 0xa:
53109                                length = 2;
53110                                break;
53111                              case 0x6:
53112                                length = 3;
53113                                break;
53114                              case 0x2:
53115                                length = 4;
53116                                break;
53117                            }
53118                            unsigned last = first + length - 1;
53119                            TransferType transfer = kMultipleLanes;
53120                            unsigned rn = (instr >> 16) & 0xf;
53121                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53122                            vld1(al,
53123                                 dt,
53124                                 NeonRegisterList(DRegister(first),
53125                                                  DRegister(last),
53126                                                  spacing,
53127                                                  transfer),
53128                                 AlignedMemOperand(Register(rn),
53129                                                   align,
53130                                                   Offset));
53131                            break;
53132                          }
53133                          case 0x00000300: {
53134                            // 0xf420030d
53135                            if (((instr & 0xe30) == 0x830)) {
53136                              UnallocatedA32(instr);
53137                              return;
53138                            }
53139                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53140                            if (dt.Is(kDataTypeValueInvalid)) {
53141                              UnallocatedA32(instr);
53142                              return;
53143                            }
53144                            Alignment align =
53145                                Align_align_2_Decode((instr >> 4) & 0x3);
53146                            if (dt.Is(kDataTypeValueInvalid) ||
53147                                align.Is(kBadAlignment)) {
53148                              UnallocatedA32(instr);
53149                              return;
53150                            }
53151                            unsigned first = ExtractDRegister(instr, 22, 12);
53152                            unsigned length;
53153                            SpacingType spacing;
53154                            switch ((instr >> 8) & 0xf) {
53155                              default:
53156                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53157                              case 0x8:
53158                                length = 2;
53159                                spacing = kSingle;
53160                                break;
53161                              case 0x9:
53162                                length = 2;
53163                                spacing = kDouble;
53164                                break;
53165                              case 0x3:
53166                                length = 4;
53167                                spacing = kSingle;
53168                                break;
53169                            }
53170                            unsigned last =
53171                                first +
53172                                (length - 1) * (spacing == kSingle ? 1 : 2);
53173                            TransferType transfer = kMultipleLanes;
53174                            unsigned rn = (instr >> 16) & 0xf;
53175                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53176                            vld2(al,
53177                                 dt,
53178                                 NeonRegisterList(DRegister(first),
53179                                                  DRegister(last),
53180                                                  spacing,
53181                                                  transfer),
53182                                 AlignedMemOperand(Register(rn),
53183                                                   align,
53184                                                   Offset));
53185                            break;
53186                          }
53187                          case 0x00000400: {
53188                            // 0xf420040d
53189                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53190                            if (dt.Is(kDataTypeValueInvalid)) {
53191                              UnallocatedA32(instr);
53192                              return;
53193                            }
53194                            Alignment align =
53195                                Align_align_3_Decode((instr >> 4) & 0x3);
53196                            if (dt.Is(kDataTypeValueInvalid) ||
53197                                align.Is(kBadAlignment)) {
53198                              UnallocatedA32(instr);
53199                              return;
53200                            }
53201                            unsigned first = ExtractDRegister(instr, 22, 12);
53202                            unsigned length;
53203                            SpacingType spacing;
53204                            switch ((instr >> 8) & 0xf) {
53205                              default:
53206                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53207                              case 0x4:
53208                                length = 3;
53209                                spacing = kSingle;
53210                                break;
53211                              case 0x5:
53212                                length = 3;
53213                                spacing = kDouble;
53214                                break;
53215                            }
53216                            unsigned last =
53217                                first +
53218                                (length - 1) * (spacing == kSingle ? 1 : 2);
53219                            TransferType transfer = kMultipleLanes;
53220                            unsigned rn = (instr >> 16) & 0xf;
53221                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53222                            vld3(al,
53223                                 dt,
53224                                 NeonRegisterList(DRegister(first),
53225                                                  DRegister(last),
53226                                                  spacing,
53227                                                  transfer),
53228                                 AlignedMemOperand(Register(rn),
53229                                                   align,
53230                                                   Offset));
53231                            break;
53232                          }
53233                          case 0x00000500: {
53234                            // 0xf420050d
53235                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53236                            if (dt.Is(kDataTypeValueInvalid)) {
53237                              UnallocatedA32(instr);
53238                              return;
53239                            }
53240                            Alignment align =
53241                                Align_align_3_Decode((instr >> 4) & 0x3);
53242                            if (dt.Is(kDataTypeValueInvalid) ||
53243                                align.Is(kBadAlignment)) {
53244                              UnallocatedA32(instr);
53245                              return;
53246                            }
53247                            unsigned first = ExtractDRegister(instr, 22, 12);
53248                            unsigned length;
53249                            SpacingType spacing;
53250                            switch ((instr >> 8) & 0xf) {
53251                              default:
53252                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53253                              case 0x4:
53254                                length = 3;
53255                                spacing = kSingle;
53256                                break;
53257                              case 0x5:
53258                                length = 3;
53259                                spacing = kDouble;
53260                                break;
53261                            }
53262                            unsigned last =
53263                                first +
53264                                (length - 1) * (spacing == kSingle ? 1 : 2);
53265                            TransferType transfer = kMultipleLanes;
53266                            unsigned rn = (instr >> 16) & 0xf;
53267                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53268                            vld3(al,
53269                                 dt,
53270                                 NeonRegisterList(DRegister(first),
53271                                                  DRegister(last),
53272                                                  spacing,
53273                                                  transfer),
53274                                 AlignedMemOperand(Register(rn),
53275                                                   align,
53276                                                   Offset));
53277                            break;
53278                          }
53279                          case 0x00000600: {
53280                            // 0xf420060d
53281                            if (((instr & 0xe20) == 0x620) ||
53282                                ((instr & 0xf30) == 0xa30)) {
53283                              UnallocatedA32(instr);
53284                              return;
53285                            }
53286                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53287                            if (dt.Is(kDataTypeValueInvalid)) {
53288                              UnallocatedA32(instr);
53289                              return;
53290                            }
53291                            Alignment align =
53292                                Align_align_1_Decode((instr >> 4) & 0x3);
53293                            if (dt.Is(kDataTypeValueInvalid) ||
53294                                align.Is(kBadAlignment)) {
53295                              UnallocatedA32(instr);
53296                              return;
53297                            }
53298                            unsigned first = ExtractDRegister(instr, 22, 12);
53299                            unsigned length;
53300                            SpacingType spacing = kSingle;
53301                            switch ((instr >> 8) & 0xf) {
53302                              default:
53303                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53304                              case 0x7:
53305                                length = 1;
53306                                break;
53307                              case 0xa:
53308                                length = 2;
53309                                break;
53310                              case 0x6:
53311                                length = 3;
53312                                break;
53313                              case 0x2:
53314                                length = 4;
53315                                break;
53316                            }
53317                            unsigned last = first + length - 1;
53318                            TransferType transfer = kMultipleLanes;
53319                            unsigned rn = (instr >> 16) & 0xf;
53320                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53321                            vld1(al,
53322                                 dt,
53323                                 NeonRegisterList(DRegister(first),
53324                                                  DRegister(last),
53325                                                  spacing,
53326                                                  transfer),
53327                                 AlignedMemOperand(Register(rn),
53328                                                   align,
53329                                                   Offset));
53330                            break;
53331                          }
53332                          case 0x00000700: {
53333                            // 0xf420070d
53334                            if (((instr & 0xe20) == 0x620) ||
53335                                ((instr & 0xf30) == 0xa30)) {
53336                              UnallocatedA32(instr);
53337                              return;
53338                            }
53339                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53340                            if (dt.Is(kDataTypeValueInvalid)) {
53341                              UnallocatedA32(instr);
53342                              return;
53343                            }
53344                            Alignment align =
53345                                Align_align_1_Decode((instr >> 4) & 0x3);
53346                            if (dt.Is(kDataTypeValueInvalid) ||
53347                                align.Is(kBadAlignment)) {
53348                              UnallocatedA32(instr);
53349                              return;
53350                            }
53351                            unsigned first = ExtractDRegister(instr, 22, 12);
53352                            unsigned length;
53353                            SpacingType spacing = kSingle;
53354                            switch ((instr >> 8) & 0xf) {
53355                              default:
53356                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53357                              case 0x7:
53358                                length = 1;
53359                                break;
53360                              case 0xa:
53361                                length = 2;
53362                                break;
53363                              case 0x6:
53364                                length = 3;
53365                                break;
53366                              case 0x2:
53367                                length = 4;
53368                                break;
53369                            }
53370                            unsigned last = first + length - 1;
53371                            TransferType transfer = kMultipleLanes;
53372                            unsigned rn = (instr >> 16) & 0xf;
53373                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53374                            vld1(al,
53375                                 dt,
53376                                 NeonRegisterList(DRegister(first),
53377                                                  DRegister(last),
53378                                                  spacing,
53379                                                  transfer),
53380                                 AlignedMemOperand(Register(rn),
53381                                                   align,
53382                                                   Offset));
53383                            break;
53384                          }
53385                          case 0x00000800: {
53386                            // 0xf420080d
53387                            if (((instr & 0xe30) == 0x830)) {
53388                              UnallocatedA32(instr);
53389                              return;
53390                            }
53391                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53392                            if (dt.Is(kDataTypeValueInvalid)) {
53393                              UnallocatedA32(instr);
53394                              return;
53395                            }
53396                            Alignment align =
53397                                Align_align_2_Decode((instr >> 4) & 0x3);
53398                            if (dt.Is(kDataTypeValueInvalid) ||
53399                                align.Is(kBadAlignment)) {
53400                              UnallocatedA32(instr);
53401                              return;
53402                            }
53403                            unsigned first = ExtractDRegister(instr, 22, 12);
53404                            unsigned length;
53405                            SpacingType spacing;
53406                            switch ((instr >> 8) & 0xf) {
53407                              default:
53408                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53409                              case 0x8:
53410                                length = 2;
53411                                spacing = kSingle;
53412                                break;
53413                              case 0x9:
53414                                length = 2;
53415                                spacing = kDouble;
53416                                break;
53417                              case 0x3:
53418                                length = 4;
53419                                spacing = kSingle;
53420                                break;
53421                            }
53422                            unsigned last =
53423                                first +
53424                                (length - 1) * (spacing == kSingle ? 1 : 2);
53425                            TransferType transfer = kMultipleLanes;
53426                            unsigned rn = (instr >> 16) & 0xf;
53427                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53428                            vld2(al,
53429                                 dt,
53430                                 NeonRegisterList(DRegister(first),
53431                                                  DRegister(last),
53432                                                  spacing,
53433                                                  transfer),
53434                                 AlignedMemOperand(Register(rn),
53435                                                   align,
53436                                                   Offset));
53437                            break;
53438                          }
53439                          case 0x00000900: {
53440                            // 0xf420090d
53441                            if (((instr & 0xe30) == 0x830)) {
53442                              UnallocatedA32(instr);
53443                              return;
53444                            }
53445                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53446                            if (dt.Is(kDataTypeValueInvalid)) {
53447                              UnallocatedA32(instr);
53448                              return;
53449                            }
53450                            Alignment align =
53451                                Align_align_2_Decode((instr >> 4) & 0x3);
53452                            if (dt.Is(kDataTypeValueInvalid) ||
53453                                align.Is(kBadAlignment)) {
53454                              UnallocatedA32(instr);
53455                              return;
53456                            }
53457                            unsigned first = ExtractDRegister(instr, 22, 12);
53458                            unsigned length;
53459                            SpacingType spacing;
53460                            switch ((instr >> 8) & 0xf) {
53461                              default:
53462                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53463                              case 0x8:
53464                                length = 2;
53465                                spacing = kSingle;
53466                                break;
53467                              case 0x9:
53468                                length = 2;
53469                                spacing = kDouble;
53470                                break;
53471                              case 0x3:
53472                                length = 4;
53473                                spacing = kSingle;
53474                                break;
53475                            }
53476                            unsigned last =
53477                                first +
53478                                (length - 1) * (spacing == kSingle ? 1 : 2);
53479                            TransferType transfer = kMultipleLanes;
53480                            unsigned rn = (instr >> 16) & 0xf;
53481                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53482                            vld2(al,
53483                                 dt,
53484                                 NeonRegisterList(DRegister(first),
53485                                                  DRegister(last),
53486                                                  spacing,
53487                                                  transfer),
53488                                 AlignedMemOperand(Register(rn),
53489                                                   align,
53490                                                   Offset));
53491                            break;
53492                          }
53493                          case 0x00000a00: {
53494                            // 0xf4200a0d
53495                            if (((instr & 0xe20) == 0x620) ||
53496                                ((instr & 0xf30) == 0xa30)) {
53497                              UnallocatedA32(instr);
53498                              return;
53499                            }
53500                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53501                            if (dt.Is(kDataTypeValueInvalid)) {
53502                              UnallocatedA32(instr);
53503                              return;
53504                            }
53505                            Alignment align =
53506                                Align_align_1_Decode((instr >> 4) & 0x3);
53507                            if (dt.Is(kDataTypeValueInvalid) ||
53508                                align.Is(kBadAlignment)) {
53509                              UnallocatedA32(instr);
53510                              return;
53511                            }
53512                            unsigned first = ExtractDRegister(instr, 22, 12);
53513                            unsigned length;
53514                            SpacingType spacing = kSingle;
53515                            switch ((instr >> 8) & 0xf) {
53516                              default:
53517                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53518                              case 0x7:
53519                                length = 1;
53520                                break;
53521                              case 0xa:
53522                                length = 2;
53523                                break;
53524                              case 0x6:
53525                                length = 3;
53526                                break;
53527                              case 0x2:
53528                                length = 4;
53529                                break;
53530                            }
53531                            unsigned last = first + length - 1;
53532                            TransferType transfer = kMultipleLanes;
53533                            unsigned rn = (instr >> 16) & 0xf;
53534                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53535                            vld1(al,
53536                                 dt,
53537                                 NeonRegisterList(DRegister(first),
53538                                                  DRegister(last),
53539                                                  spacing,
53540                                                  transfer),
53541                                 AlignedMemOperand(Register(rn),
53542                                                   align,
53543                                                   Offset));
53544                            break;
53545                          }
53546                          default:
53547                            UnallocatedA32(instr);
53548                            break;
53549                        }
53550                        break;
53551                      }
53552                    }
53553                    break;
53554                  }
53555                  default: {
53556                    switch (instr & 0x00000f00) {
53557                      case 0x00000000: {
53558                        // 0xf4200000
53559                        if (((instr & 0xd) == 0xd)) {
53560                          UnallocatedA32(instr);
53561                          return;
53562                        }
53563                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53564                        if (dt.Is(kDataTypeValueInvalid)) {
53565                          UnallocatedA32(instr);
53566                          return;
53567                        }
53568                        Alignment align =
53569                            Align_align_4_Decode((instr >> 4) & 0x3);
53570                        if (dt.Is(kDataTypeValueInvalid) ||
53571                            align.Is(kBadAlignment)) {
53572                          UnallocatedA32(instr);
53573                          return;
53574                        }
53575                        unsigned first = ExtractDRegister(instr, 22, 12);
53576                        unsigned length;
53577                        SpacingType spacing;
53578                        switch ((instr >> 8) & 0xf) {
53579                          default:
53580                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53581                          case 0x0:
53582                            length = 4;
53583                            spacing = kSingle;
53584                            break;
53585                          case 0x1:
53586                            length = 4;
53587                            spacing = kDouble;
53588                            break;
53589                        }
53590                        unsigned last =
53591                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53592                        TransferType transfer = kMultipleLanes;
53593                        unsigned rn = (instr >> 16) & 0xf;
53594                        unsigned rm = instr & 0xf;
53595                        // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53596                        vld4(al,
53597                             dt,
53598                             NeonRegisterList(DRegister(first),
53599                                              DRegister(last),
53600                                              spacing,
53601                                              transfer),
53602                             AlignedMemOperand(Register(rn),
53603                                               align,
53604                                               Register(rm),
53605                                               PostIndex));
53606                        break;
53607                      }
53608                      case 0x00000100: {
53609                        // 0xf4200100
53610                        if (((instr & 0xd) == 0xd)) {
53611                          UnallocatedA32(instr);
53612                          return;
53613                        }
53614                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53615                        if (dt.Is(kDataTypeValueInvalid)) {
53616                          UnallocatedA32(instr);
53617                          return;
53618                        }
53619                        Alignment align =
53620                            Align_align_4_Decode((instr >> 4) & 0x3);
53621                        if (dt.Is(kDataTypeValueInvalid) ||
53622                            align.Is(kBadAlignment)) {
53623                          UnallocatedA32(instr);
53624                          return;
53625                        }
53626                        unsigned first = ExtractDRegister(instr, 22, 12);
53627                        unsigned length;
53628                        SpacingType spacing;
53629                        switch ((instr >> 8) & 0xf) {
53630                          default:
53631                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53632                          case 0x0:
53633                            length = 4;
53634                            spacing = kSingle;
53635                            break;
53636                          case 0x1:
53637                            length = 4;
53638                            spacing = kDouble;
53639                            break;
53640                        }
53641                        unsigned last =
53642                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53643                        TransferType transfer = kMultipleLanes;
53644                        unsigned rn = (instr >> 16) & 0xf;
53645                        unsigned rm = instr & 0xf;
53646                        // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53647                        vld4(al,
53648                             dt,
53649                             NeonRegisterList(DRegister(first),
53650                                              DRegister(last),
53651                                              spacing,
53652                                              transfer),
53653                             AlignedMemOperand(Register(rn),
53654                                               align,
53655                                               Register(rm),
53656                                               PostIndex));
53657                        break;
53658                      }
53659                      case 0x00000200: {
53660                        // 0xf4200200
53661                        if (((instr & 0xd) == 0xd) ||
53662                            ((instr & 0xe20) == 0x620) ||
53663                            ((instr & 0xf30) == 0xa30)) {
53664                          UnallocatedA32(instr);
53665                          return;
53666                        }
53667                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53668                        if (dt.Is(kDataTypeValueInvalid)) {
53669                          UnallocatedA32(instr);
53670                          return;
53671                        }
53672                        Alignment align =
53673                            Align_align_1_Decode((instr >> 4) & 0x3);
53674                        if (dt.Is(kDataTypeValueInvalid) ||
53675                            align.Is(kBadAlignment)) {
53676                          UnallocatedA32(instr);
53677                          return;
53678                        }
53679                        unsigned first = ExtractDRegister(instr, 22, 12);
53680                        unsigned length;
53681                        SpacingType spacing = kSingle;
53682                        switch ((instr >> 8) & 0xf) {
53683                          default:
53684                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53685                          case 0x7:
53686                            length = 1;
53687                            break;
53688                          case 0xa:
53689                            length = 2;
53690                            break;
53691                          case 0x6:
53692                            length = 3;
53693                            break;
53694                          case 0x2:
53695                            length = 4;
53696                            break;
53697                        }
53698                        unsigned last = first + length - 1;
53699                        TransferType transfer = kMultipleLanes;
53700                        unsigned rn = (instr >> 16) & 0xf;
53701                        unsigned rm = instr & 0xf;
53702                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53703                        vld1(al,
53704                             dt,
53705                             NeonRegisterList(DRegister(first),
53706                                              DRegister(last),
53707                                              spacing,
53708                                              transfer),
53709                             AlignedMemOperand(Register(rn),
53710                                               align,
53711                                               Register(rm),
53712                                               PostIndex));
53713                        break;
53714                      }
53715                      case 0x00000300: {
53716                        // 0xf4200300
53717                        if (((instr & 0xd) == 0xd) ||
53718                            ((instr & 0xe30) == 0x830)) {
53719                          UnallocatedA32(instr);
53720                          return;
53721                        }
53722                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53723                        if (dt.Is(kDataTypeValueInvalid)) {
53724                          UnallocatedA32(instr);
53725                          return;
53726                        }
53727                        Alignment align =
53728                            Align_align_2_Decode((instr >> 4) & 0x3);
53729                        if (dt.Is(kDataTypeValueInvalid) ||
53730                            align.Is(kBadAlignment)) {
53731                          UnallocatedA32(instr);
53732                          return;
53733                        }
53734                        unsigned first = ExtractDRegister(instr, 22, 12);
53735                        unsigned length;
53736                        SpacingType spacing;
53737                        switch ((instr >> 8) & 0xf) {
53738                          default:
53739                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53740                          case 0x8:
53741                            length = 2;
53742                            spacing = kSingle;
53743                            break;
53744                          case 0x9:
53745                            length = 2;
53746                            spacing = kDouble;
53747                            break;
53748                          case 0x3:
53749                            length = 4;
53750                            spacing = kSingle;
53751                            break;
53752                        }
53753                        unsigned last =
53754                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53755                        TransferType transfer = kMultipleLanes;
53756                        unsigned rn = (instr >> 16) & 0xf;
53757                        unsigned rm = instr & 0xf;
53758                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53759                        vld2(al,
53760                             dt,
53761                             NeonRegisterList(DRegister(first),
53762                                              DRegister(last),
53763                                              spacing,
53764                                              transfer),
53765                             AlignedMemOperand(Register(rn),
53766                                               align,
53767                                               Register(rm),
53768                                               PostIndex));
53769                        break;
53770                      }
53771                      case 0x00000400: {
53772                        // 0xf4200400
53773                        if (((instr & 0xd) == 0xd)) {
53774                          UnallocatedA32(instr);
53775                          return;
53776                        }
53777                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53778                        if (dt.Is(kDataTypeValueInvalid)) {
53779                          UnallocatedA32(instr);
53780                          return;
53781                        }
53782                        Alignment align =
53783                            Align_align_3_Decode((instr >> 4) & 0x3);
53784                        if (dt.Is(kDataTypeValueInvalid) ||
53785                            align.Is(kBadAlignment)) {
53786                          UnallocatedA32(instr);
53787                          return;
53788                        }
53789                        unsigned first = ExtractDRegister(instr, 22, 12);
53790                        unsigned length;
53791                        SpacingType spacing;
53792                        switch ((instr >> 8) & 0xf) {
53793                          default:
53794                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53795                          case 0x4:
53796                            length = 3;
53797                            spacing = kSingle;
53798                            break;
53799                          case 0x5:
53800                            length = 3;
53801                            spacing = kDouble;
53802                            break;
53803                        }
53804                        unsigned last =
53805                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53806                        TransferType transfer = kMultipleLanes;
53807                        unsigned rn = (instr >> 16) & 0xf;
53808                        unsigned rm = instr & 0xf;
53809                        // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53810                        vld3(al,
53811                             dt,
53812                             NeonRegisterList(DRegister(first),
53813                                              DRegister(last),
53814                                              spacing,
53815                                              transfer),
53816                             AlignedMemOperand(Register(rn),
53817                                               align,
53818                                               Register(rm),
53819                                               PostIndex));
53820                        break;
53821                      }
53822                      case 0x00000500: {
53823                        // 0xf4200500
53824                        if (((instr & 0xd) == 0xd)) {
53825                          UnallocatedA32(instr);
53826                          return;
53827                        }
53828                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53829                        if (dt.Is(kDataTypeValueInvalid)) {
53830                          UnallocatedA32(instr);
53831                          return;
53832                        }
53833                        Alignment align =
53834                            Align_align_3_Decode((instr >> 4) & 0x3);
53835                        if (dt.Is(kDataTypeValueInvalid) ||
53836                            align.Is(kBadAlignment)) {
53837                          UnallocatedA32(instr);
53838                          return;
53839                        }
53840                        unsigned first = ExtractDRegister(instr, 22, 12);
53841                        unsigned length;
53842                        SpacingType spacing;
53843                        switch ((instr >> 8) & 0xf) {
53844                          default:
53845                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53846                          case 0x4:
53847                            length = 3;
53848                            spacing = kSingle;
53849                            break;
53850                          case 0x5:
53851                            length = 3;
53852                            spacing = kDouble;
53853                            break;
53854                        }
53855                        unsigned last =
53856                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53857                        TransferType transfer = kMultipleLanes;
53858                        unsigned rn = (instr >> 16) & 0xf;
53859                        unsigned rm = instr & 0xf;
53860                        // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53861                        vld3(al,
53862                             dt,
53863                             NeonRegisterList(DRegister(first),
53864                                              DRegister(last),
53865                                              spacing,
53866                                              transfer),
53867                             AlignedMemOperand(Register(rn),
53868                                               align,
53869                                               Register(rm),
53870                                               PostIndex));
53871                        break;
53872                      }
53873                      case 0x00000600: {
53874                        // 0xf4200600
53875                        if (((instr & 0xd) == 0xd) ||
53876                            ((instr & 0xe20) == 0x620) ||
53877                            ((instr & 0xf30) == 0xa30)) {
53878                          UnallocatedA32(instr);
53879                          return;
53880                        }
53881                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53882                        if (dt.Is(kDataTypeValueInvalid)) {
53883                          UnallocatedA32(instr);
53884                          return;
53885                        }
53886                        Alignment align =
53887                            Align_align_1_Decode((instr >> 4) & 0x3);
53888                        if (dt.Is(kDataTypeValueInvalid) ||
53889                            align.Is(kBadAlignment)) {
53890                          UnallocatedA32(instr);
53891                          return;
53892                        }
53893                        unsigned first = ExtractDRegister(instr, 22, 12);
53894                        unsigned length;
53895                        SpacingType spacing = kSingle;
53896                        switch ((instr >> 8) & 0xf) {
53897                          default:
53898                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53899                          case 0x7:
53900                            length = 1;
53901                            break;
53902                          case 0xa:
53903                            length = 2;
53904                            break;
53905                          case 0x6:
53906                            length = 3;
53907                            break;
53908                          case 0x2:
53909                            length = 4;
53910                            break;
53911                        }
53912                        unsigned last = first + length - 1;
53913                        TransferType transfer = kMultipleLanes;
53914                        unsigned rn = (instr >> 16) & 0xf;
53915                        unsigned rm = instr & 0xf;
53916                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53917                        vld1(al,
53918                             dt,
53919                             NeonRegisterList(DRegister(first),
53920                                              DRegister(last),
53921                                              spacing,
53922                                              transfer),
53923                             AlignedMemOperand(Register(rn),
53924                                               align,
53925                                               Register(rm),
53926                                               PostIndex));
53927                        break;
53928                      }
53929                      case 0x00000700: {
53930                        // 0xf4200700
53931                        if (((instr & 0xd) == 0xd) ||
53932                            ((instr & 0xe20) == 0x620) ||
53933                            ((instr & 0xf30) == 0xa30)) {
53934                          UnallocatedA32(instr);
53935                          return;
53936                        }
53937                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53938                        if (dt.Is(kDataTypeValueInvalid)) {
53939                          UnallocatedA32(instr);
53940                          return;
53941                        }
53942                        Alignment align =
53943                            Align_align_1_Decode((instr >> 4) & 0x3);
53944                        if (dt.Is(kDataTypeValueInvalid) ||
53945                            align.Is(kBadAlignment)) {
53946                          UnallocatedA32(instr);
53947                          return;
53948                        }
53949                        unsigned first = ExtractDRegister(instr, 22, 12);
53950                        unsigned length;
53951                        SpacingType spacing = kSingle;
53952                        switch ((instr >> 8) & 0xf) {
53953                          default:
53954                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53955                          case 0x7:
53956                            length = 1;
53957                            break;
53958                          case 0xa:
53959                            length = 2;
53960                            break;
53961                          case 0x6:
53962                            length = 3;
53963                            break;
53964                          case 0x2:
53965                            length = 4;
53966                            break;
53967                        }
53968                        unsigned last = first + length - 1;
53969                        TransferType transfer = kMultipleLanes;
53970                        unsigned rn = (instr >> 16) & 0xf;
53971                        unsigned rm = instr & 0xf;
53972                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53973                        vld1(al,
53974                             dt,
53975                             NeonRegisterList(DRegister(first),
53976                                              DRegister(last),
53977                                              spacing,
53978                                              transfer),
53979                             AlignedMemOperand(Register(rn),
53980                                               align,
53981                                               Register(rm),
53982                                               PostIndex));
53983                        break;
53984                      }
53985                      case 0x00000800: {
53986                        // 0xf4200800
53987                        if (((instr & 0xd) == 0xd) ||
53988                            ((instr & 0xe30) == 0x830)) {
53989                          UnallocatedA32(instr);
53990                          return;
53991                        }
53992                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53993                        if (dt.Is(kDataTypeValueInvalid)) {
53994                          UnallocatedA32(instr);
53995                          return;
53996                        }
53997                        Alignment align =
53998                            Align_align_2_Decode((instr >> 4) & 0x3);
53999                        if (dt.Is(kDataTypeValueInvalid) ||
54000                            align.Is(kBadAlignment)) {
54001                          UnallocatedA32(instr);
54002                          return;
54003                        }
54004                        unsigned first = ExtractDRegister(instr, 22, 12);
54005                        unsigned length;
54006                        SpacingType spacing;
54007                        switch ((instr >> 8) & 0xf) {
54008                          default:
54009                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
54010                          case 0x8:
54011                            length = 2;
54012                            spacing = kSingle;
54013                            break;
54014                          case 0x9:
54015                            length = 2;
54016                            spacing = kDouble;
54017                            break;
54018                          case 0x3:
54019                            length = 4;
54020                            spacing = kSingle;
54021                            break;
54022                        }
54023                        unsigned last =
54024                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
54025                        TransferType transfer = kMultipleLanes;
54026                        unsigned rn = (instr >> 16) & 0xf;
54027                        unsigned rm = instr & 0xf;
54028                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54029                        vld2(al,
54030                             dt,
54031                             NeonRegisterList(DRegister(first),
54032                                              DRegister(last),
54033                                              spacing,
54034                                              transfer),
54035                             AlignedMemOperand(Register(rn),
54036                                               align,
54037                                               Register(rm),
54038                                               PostIndex));
54039                        break;
54040                      }
54041                      case 0x00000900: {
54042                        // 0xf4200900
54043                        if (((instr & 0xd) == 0xd) ||
54044                            ((instr & 0xe30) == 0x830)) {
54045                          UnallocatedA32(instr);
54046                          return;
54047                        }
54048                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
54049                        if (dt.Is(kDataTypeValueInvalid)) {
54050                          UnallocatedA32(instr);
54051                          return;
54052                        }
54053                        Alignment align =
54054                            Align_align_2_Decode((instr >> 4) & 0x3);
54055                        if (dt.Is(kDataTypeValueInvalid) ||
54056                            align.Is(kBadAlignment)) {
54057                          UnallocatedA32(instr);
54058                          return;
54059                        }
54060                        unsigned first = ExtractDRegister(instr, 22, 12);
54061                        unsigned length;
54062                        SpacingType spacing;
54063                        switch ((instr >> 8) & 0xf) {
54064                          default:
54065                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
54066                          case 0x8:
54067                            length = 2;
54068                            spacing = kSingle;
54069                            break;
54070                          case 0x9:
54071                            length = 2;
54072                            spacing = kDouble;
54073                            break;
54074                          case 0x3:
54075                            length = 4;
54076                            spacing = kSingle;
54077                            break;
54078                        }
54079                        unsigned last =
54080                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
54081                        TransferType transfer = kMultipleLanes;
54082                        unsigned rn = (instr >> 16) & 0xf;
54083                        unsigned rm = instr & 0xf;
54084                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54085                        vld2(al,
54086                             dt,
54087                             NeonRegisterList(DRegister(first),
54088                                              DRegister(last),
54089                                              spacing,
54090                                              transfer),
54091                             AlignedMemOperand(Register(rn),
54092                                               align,
54093                                               Register(rm),
54094                                               PostIndex));
54095                        break;
54096                      }
54097                      case 0x00000a00: {
54098                        // 0xf4200a00
54099                        if (((instr & 0xd) == 0xd) ||
54100                            ((instr & 0xe20) == 0x620) ||
54101                            ((instr & 0xf30) == 0xa30)) {
54102                          UnallocatedA32(instr);
54103                          return;
54104                        }
54105                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
54106                        if (dt.Is(kDataTypeValueInvalid)) {
54107                          UnallocatedA32(instr);
54108                          return;
54109                        }
54110                        Alignment align =
54111                            Align_align_1_Decode((instr >> 4) & 0x3);
54112                        if (dt.Is(kDataTypeValueInvalid) ||
54113                            align.Is(kBadAlignment)) {
54114                          UnallocatedA32(instr);
54115                          return;
54116                        }
54117                        unsigned first = ExtractDRegister(instr, 22, 12);
54118                        unsigned length;
54119                        SpacingType spacing = kSingle;
54120                        switch ((instr >> 8) & 0xf) {
54121                          default:
54122                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
54123                          case 0x7:
54124                            length = 1;
54125                            break;
54126                          case 0xa:
54127                            length = 2;
54128                            break;
54129                          case 0x6:
54130                            length = 3;
54131                            break;
54132                          case 0x2:
54133                            length = 4;
54134                            break;
54135                        }
54136                        unsigned last = first + length - 1;
54137                        TransferType transfer = kMultipleLanes;
54138                        unsigned rn = (instr >> 16) & 0xf;
54139                        unsigned rm = instr & 0xf;
54140                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54141                        vld1(al,
54142                             dt,
54143                             NeonRegisterList(DRegister(first),
54144                                              DRegister(last),
54145                                              spacing,
54146                                              transfer),
54147                             AlignedMemOperand(Register(rn),
54148                                               align,
54149                                               Register(rm),
54150                                               PostIndex));
54151                        break;
54152                      }
54153                      default:
54154                        UnallocatedA32(instr);
54155                        break;
54156                    }
54157                    break;
54158                  }
54159                }
54160                break;
54161              }
54162              case 0x00800000: {
54163                // 0xf4a00000
54164                switch (instr & 0x00000300) {
54165                  case 0x00000000: {
54166                    // 0xf4a00000
54167                    switch (instr & 0x00000c00) {
54168                      case 0x00000c00: {
54169                        // 0xf4a00c00
54170                        switch (instr & 0x0000000d) {
54171                          case 0x0000000d: {
54172                            // 0xf4a00c0d
54173                            switch (instr & 0x00000002) {
54174                              case 0x00000000: {
54175                                // 0xf4a00c0d
54176                                DataType dt =
54177                                    Dt_size_7_Decode((instr >> 6) & 0x3);
54178                                if (dt.Is(kDataTypeValueInvalid)) {
54179                                  UnallocatedA32(instr);
54180                                  return;
54181                                }
54182                                Alignment align =
54183                                    Align_a_1_Decode((instr >> 4) & 0x1, dt);
54184                                if (dt.Is(kDataTypeValueInvalid) ||
54185                                    align.Is(kBadAlignment)) {
54186                                  UnallocatedA32(instr);
54187                                  return;
54188                                }
54189                                unsigned first =
54190                                    ExtractDRegister(instr, 22, 12);
54191                                unsigned length;
54192                                SpacingType spacing = kSingle;
54193                                switch ((instr >> 5) & 0x1) {
54194                                  default:
54195                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54196                                  case 0x0:
54197                                    length = 1;
54198                                    break;
54199                                  case 0x1:
54200                                    length = 2;
54201                                    break;
54202                                }
54203                                unsigned last = first + length - 1;
54204                                TransferType transfer = kAllLanes;
54205                                unsigned rn = (instr >> 16) & 0xf;
54206                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54207                                vld1(al,
54208                                     dt,
54209                                     NeonRegisterList(DRegister(first),
54210                                                      DRegister(last),
54211                                                      spacing,
54212                                                      transfer),
54213                                     AlignedMemOperand(Register(rn),
54214                                                       align,
54215                                                       PostIndex));
54216                                break;
54217                              }
54218                              case 0x00000002: {
54219                                // 0xf4a00c0f
54220                                DataType dt =
54221                                    Dt_size_7_Decode((instr >> 6) & 0x3);
54222                                if (dt.Is(kDataTypeValueInvalid)) {
54223                                  UnallocatedA32(instr);
54224                                  return;
54225                                }
54226                                Alignment align =
54227                                    Align_a_1_Decode((instr >> 4) & 0x1, dt);
54228                                if (dt.Is(kDataTypeValueInvalid) ||
54229                                    align.Is(kBadAlignment)) {
54230                                  UnallocatedA32(instr);
54231                                  return;
54232                                }
54233                                unsigned first =
54234                                    ExtractDRegister(instr, 22, 12);
54235                                unsigned length;
54236                                SpacingType spacing = kSingle;
54237                                switch ((instr >> 5) & 0x1) {
54238                                  default:
54239                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54240                                  case 0x0:
54241                                    length = 1;
54242                                    break;
54243                                  case 0x1:
54244                                    length = 2;
54245                                    break;
54246                                }
54247                                unsigned last = first + length - 1;
54248                                TransferType transfer = kAllLanes;
54249                                unsigned rn = (instr >> 16) & 0xf;
54250                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54251                                vld1(al,
54252                                     dt,
54253                                     NeonRegisterList(DRegister(first),
54254                                                      DRegister(last),
54255                                                      spacing,
54256                                                      transfer),
54257                                     AlignedMemOperand(Register(rn),
54258                                                       align,
54259                                                       Offset));
54260                                break;
54261                              }
54262                            }
54263                            break;
54264                          }
54265                          default: {
54266                            if (((instr & 0xd) == 0xd)) {
54267                              UnallocatedA32(instr);
54268                              return;
54269                            }
54270                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
54271                            if (dt.Is(kDataTypeValueInvalid)) {
54272                              UnallocatedA32(instr);
54273                              return;
54274                            }
54275                            Alignment align =
54276                                Align_a_1_Decode((instr >> 4) & 0x1, dt);
54277                            if (dt.Is(kDataTypeValueInvalid) ||
54278                                align.Is(kBadAlignment)) {
54279                              UnallocatedA32(instr);
54280                              return;
54281                            }
54282                            unsigned first = ExtractDRegister(instr, 22, 12);
54283                            unsigned length;
54284                            SpacingType spacing = kSingle;
54285                            switch ((instr >> 5) & 0x1) {
54286                              default:
54287                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
54288                              case 0x0:
54289                                length = 1;
54290                                break;
54291                              case 0x1:
54292                                length = 2;
54293                                break;
54294                            }
54295                            unsigned last = first + length - 1;
54296                            TransferType transfer = kAllLanes;
54297                            unsigned rn = (instr >> 16) & 0xf;
54298                            unsigned rm = instr & 0xf;
54299                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54300                            vld1(al,
54301                                 dt,
54302                                 NeonRegisterList(DRegister(first),
54303                                                  DRegister(last),
54304                                                  spacing,
54305                                                  transfer),
54306                                 AlignedMemOperand(Register(rn),
54307                                                   align,
54308                                                   Register(rm),
54309                                                   PostIndex));
54310                            break;
54311                          }
54312                        }
54313                        break;
54314                      }
54315                      default: {
54316                        switch (instr & 0x0000000d) {
54317                          case 0x0000000d: {
54318                            // 0xf4a0000d
54319                            switch (instr & 0x00000002) {
54320                              case 0x00000000: {
54321                                // 0xf4a0000d
54322                                if (((instr & 0xc00) == 0xc00)) {
54323                                  UnallocatedA32(instr);
54324                                  return;
54325                                }
54326                                DataType dt =
54327                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54328                                if (dt.Is(kDataTypeValueInvalid)) {
54329                                  UnallocatedA32(instr);
54330                                  return;
54331                                }
54332                                DecodeNeonAndAlign decode_neon =
54333                                    Align_index_align_1_Decode((instr >> 4) &
54334                                                                   0xf,
54335                                                               dt);
54336                                if (!decode_neon.IsValid()) {
54337                                  UnallocatedA32(instr);
54338                                  return;
54339                                }
54340                                Alignment align = decode_neon.GetAlign();
54341                                int lane = decode_neon.GetLane();
54342                                SpacingType spacing = decode_neon.GetSpacing();
54343                                unsigned first =
54344                                    ExtractDRegister(instr, 22, 12);
54345                                unsigned length = 1;
54346                                unsigned last = first + length - 1;
54347                                unsigned rn = (instr >> 16) & 0xf;
54348                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54349                                vld1(al,
54350                                     dt,
54351                                     NeonRegisterList(DRegister(first),
54352                                                      DRegister(last),
54353                                                      spacing,
54354                                                      lane),
54355                                     AlignedMemOperand(Register(rn),
54356                                                       align,
54357                                                       PostIndex));
54358                                break;
54359                              }
54360                              case 0x00000002: {
54361                                // 0xf4a0000f
54362                                if (((instr & 0xc00) == 0xc00)) {
54363                                  UnallocatedA32(instr);
54364                                  return;
54365                                }
54366                                DataType dt =
54367                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54368                                if (dt.Is(kDataTypeValueInvalid)) {
54369                                  UnallocatedA32(instr);
54370                                  return;
54371                                }
54372                                DecodeNeonAndAlign decode_neon =
54373                                    Align_index_align_1_Decode((instr >> 4) &
54374                                                                   0xf,
54375                                                               dt);
54376                                if (!decode_neon.IsValid()) {
54377                                  UnallocatedA32(instr);
54378                                  return;
54379                                }
54380                                Alignment align = decode_neon.GetAlign();
54381                                int lane = decode_neon.GetLane();
54382                                SpacingType spacing = decode_neon.GetSpacing();
54383                                unsigned first =
54384                                    ExtractDRegister(instr, 22, 12);
54385                                unsigned length = 1;
54386                                unsigned last = first + length - 1;
54387                                unsigned rn = (instr >> 16) & 0xf;
54388                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54389                                vld1(al,
54390                                     dt,
54391                                     NeonRegisterList(DRegister(first),
54392                                                      DRegister(last),
54393                                                      spacing,
54394                                                      lane),
54395                                     AlignedMemOperand(Register(rn),
54396                                                       align,
54397                                                       Offset));
54398                                break;
54399                              }
54400                            }
54401                            break;
54402                          }
54403                          default: {
54404                            if (((instr & 0xc00) == 0xc00) ||
54405                                ((instr & 0xd) == 0xd)) {
54406                              UnallocatedA32(instr);
54407                              return;
54408                            }
54409                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54410                            if (dt.Is(kDataTypeValueInvalid)) {
54411                              UnallocatedA32(instr);
54412                              return;
54413                            }
54414                            DecodeNeonAndAlign decode_neon =
54415                                Align_index_align_1_Decode((instr >> 4) & 0xf,
54416                                                           dt);
54417                            if (!decode_neon.IsValid()) {
54418                              UnallocatedA32(instr);
54419                              return;
54420                            }
54421                            Alignment align = decode_neon.GetAlign();
54422                            int lane = decode_neon.GetLane();
54423                            SpacingType spacing = decode_neon.GetSpacing();
54424                            unsigned first = ExtractDRegister(instr, 22, 12);
54425                            unsigned length = 1;
54426                            unsigned last = first + length - 1;
54427                            unsigned rn = (instr >> 16) & 0xf;
54428                            unsigned rm = instr & 0xf;
54429                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54430                            vld1(al,
54431                                 dt,
54432                                 NeonRegisterList(DRegister(first),
54433                                                  DRegister(last),
54434                                                  spacing,
54435                                                  lane),
54436                                 AlignedMemOperand(Register(rn),
54437                                                   align,
54438                                                   Register(rm),
54439                                                   PostIndex));
54440                            break;
54441                          }
54442                        }
54443                        break;
54444                      }
54445                    }
54446                    break;
54447                  }
54448                  case 0x00000100: {
54449                    // 0xf4a00100
54450                    switch (instr & 0x00000c00) {
54451                      case 0x00000c00: {
54452                        // 0xf4a00d00
54453                        switch (instr & 0x0000000d) {
54454                          case 0x0000000d: {
54455                            // 0xf4a00d0d
54456                            switch (instr & 0x00000002) {
54457                              case 0x00000000: {
54458                                // 0xf4a00d0d
54459                                DataType dt =
54460                                    Dt_size_7_Decode((instr >> 6) & 0x3);
54461                                if (dt.Is(kDataTypeValueInvalid)) {
54462                                  UnallocatedA32(instr);
54463                                  return;
54464                                }
54465                                Alignment align =
54466                                    Align_a_2_Decode((instr >> 4) & 0x1, dt);
54467                                if (dt.Is(kDataTypeValueInvalid) ||
54468                                    align.Is(kBadAlignment)) {
54469                                  UnallocatedA32(instr);
54470                                  return;
54471                                }
54472                                unsigned first =
54473                                    ExtractDRegister(instr, 22, 12);
54474                                unsigned length;
54475                                SpacingType spacing;
54476                                switch ((instr >> 5) & 0x1) {
54477                                  default:
54478                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54479                                  case 0x0:
54480                                    length = 2;
54481                                    spacing = kSingle;
54482                                    break;
54483                                  case 0x1:
54484                                    length = 2;
54485                                    spacing = kDouble;
54486                                    break;
54487                                }
54488                                unsigned last =
54489                                    first +
54490                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54491                                TransferType transfer = kAllLanes;
54492                                unsigned rn = (instr >> 16) & 0xf;
54493                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54494                                vld2(al,
54495                                     dt,
54496                                     NeonRegisterList(DRegister(first),
54497                                                      DRegister(last),
54498                                                      spacing,
54499                                                      transfer),
54500                                     AlignedMemOperand(Register(rn),
54501                                                       align,
54502                                                       PostIndex));
54503                                break;
54504                              }
54505                              case 0x00000002: {
54506                                // 0xf4a00d0f
54507                                DataType dt =
54508                                    Dt_size_7_Decode((instr >> 6) & 0x3);
54509                                if (dt.Is(kDataTypeValueInvalid)) {
54510                                  UnallocatedA32(instr);
54511                                  return;
54512                                }
54513                                Alignment align =
54514                                    Align_a_2_Decode((instr >> 4) & 0x1, dt);
54515                                if (dt.Is(kDataTypeValueInvalid) ||
54516                                    align.Is(kBadAlignment)) {
54517                                  UnallocatedA32(instr);
54518                                  return;
54519                                }
54520                                unsigned first =
54521                                    ExtractDRegister(instr, 22, 12);
54522                                unsigned length;
54523                                SpacingType spacing;
54524                                switch ((instr >> 5) & 0x1) {
54525                                  default:
54526                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54527                                  case 0x0:
54528                                    length = 2;
54529                                    spacing = kSingle;
54530                                    break;
54531                                  case 0x1:
54532                                    length = 2;
54533                                    spacing = kDouble;
54534                                    break;
54535                                }
54536                                unsigned last =
54537                                    first +
54538                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54539                                TransferType transfer = kAllLanes;
54540                                unsigned rn = (instr >> 16) & 0xf;
54541                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54542                                vld2(al,
54543                                     dt,
54544                                     NeonRegisterList(DRegister(first),
54545                                                      DRegister(last),
54546                                                      spacing,
54547                                                      transfer),
54548                                     AlignedMemOperand(Register(rn),
54549                                                       align,
54550                                                       Offset));
54551                                break;
54552                              }
54553                            }
54554                            break;
54555                          }
54556                          default: {
54557                            if (((instr & 0xd) == 0xd)) {
54558                              UnallocatedA32(instr);
54559                              return;
54560                            }
54561                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
54562                            if (dt.Is(kDataTypeValueInvalid)) {
54563                              UnallocatedA32(instr);
54564                              return;
54565                            }
54566                            Alignment align =
54567                                Align_a_2_Decode((instr >> 4) & 0x1, dt);
54568                            if (dt.Is(kDataTypeValueInvalid) ||
54569                                align.Is(kBadAlignment)) {
54570                              UnallocatedA32(instr);
54571                              return;
54572                            }
54573                            unsigned first = ExtractDRegister(instr, 22, 12);
54574                            unsigned length;
54575                            SpacingType spacing;
54576                            switch ((instr >> 5) & 0x1) {
54577                              default:
54578                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
54579                              case 0x0:
54580                                length = 2;
54581                                spacing = kSingle;
54582                                break;
54583                              case 0x1:
54584                                length = 2;
54585                                spacing = kDouble;
54586                                break;
54587                            }
54588                            unsigned last =
54589                                first +
54590                                (length - 1) * (spacing == kSingle ? 1 : 2);
54591                            TransferType transfer = kAllLanes;
54592                            unsigned rn = (instr >> 16) & 0xf;
54593                            unsigned rm = instr & 0xf;
54594                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54595                            vld2(al,
54596                                 dt,
54597                                 NeonRegisterList(DRegister(first),
54598                                                  DRegister(last),
54599                                                  spacing,
54600                                                  transfer),
54601                                 AlignedMemOperand(Register(rn),
54602                                                   align,
54603                                                   Register(rm),
54604                                                   PostIndex));
54605                            break;
54606                          }
54607                        }
54608                        break;
54609                      }
54610                      default: {
54611                        switch (instr & 0x0000000d) {
54612                          case 0x0000000d: {
54613                            // 0xf4a0010d
54614                            switch (instr & 0x00000002) {
54615                              case 0x00000000: {
54616                                // 0xf4a0010d
54617                                if (((instr & 0xc00) == 0xc00)) {
54618                                  UnallocatedA32(instr);
54619                                  return;
54620                                }
54621                                DataType dt =
54622                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54623                                if (dt.Is(kDataTypeValueInvalid)) {
54624                                  UnallocatedA32(instr);
54625                                  return;
54626                                }
54627                                DecodeNeonAndAlign decode_neon =
54628                                    Align_index_align_2_Decode((instr >> 4) &
54629                                                                   0xf,
54630                                                               dt);
54631                                if (!decode_neon.IsValid()) {
54632                                  UnallocatedA32(instr);
54633                                  return;
54634                                }
54635                                Alignment align = decode_neon.GetAlign();
54636                                int lane = decode_neon.GetLane();
54637                                SpacingType spacing = decode_neon.GetSpacing();
54638                                unsigned first =
54639                                    ExtractDRegister(instr, 22, 12);
54640                                unsigned length = 2;
54641                                unsigned last =
54642                                    first +
54643                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54644                                unsigned rn = (instr >> 16) & 0xf;
54645                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54646                                vld2(al,
54647                                     dt,
54648                                     NeonRegisterList(DRegister(first),
54649                                                      DRegister(last),
54650                                                      spacing,
54651                                                      lane),
54652                                     AlignedMemOperand(Register(rn),
54653                                                       align,
54654                                                       PostIndex));
54655                                break;
54656                              }
54657                              case 0x00000002: {
54658                                // 0xf4a0010f
54659                                if (((instr & 0xc00) == 0xc00)) {
54660                                  UnallocatedA32(instr);
54661                                  return;
54662                                }
54663                                DataType dt =
54664                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54665                                if (dt.Is(kDataTypeValueInvalid)) {
54666                                  UnallocatedA32(instr);
54667                                  return;
54668                                }
54669                                DecodeNeonAndAlign decode_neon =
54670                                    Align_index_align_2_Decode((instr >> 4) &
54671                                                                   0xf,
54672                                                               dt);
54673                                if (!decode_neon.IsValid()) {
54674                                  UnallocatedA32(instr);
54675                                  return;
54676                                }
54677                                Alignment align = decode_neon.GetAlign();
54678                                int lane = decode_neon.GetLane();
54679                                SpacingType spacing = decode_neon.GetSpacing();
54680                                unsigned first =
54681                                    ExtractDRegister(instr, 22, 12);
54682                                unsigned length = 2;
54683                                unsigned last =
54684                                    first +
54685                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54686                                unsigned rn = (instr >> 16) & 0xf;
54687                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54688                                vld2(al,
54689                                     dt,
54690                                     NeonRegisterList(DRegister(first),
54691                                                      DRegister(last),
54692                                                      spacing,
54693                                                      lane),
54694                                     AlignedMemOperand(Register(rn),
54695                                                       align,
54696                                                       Offset));
54697                                break;
54698                              }
54699                            }
54700                            break;
54701                          }
54702                          default: {
54703                            if (((instr & 0xc00) == 0xc00) ||
54704                                ((instr & 0xd) == 0xd)) {
54705                              UnallocatedA32(instr);
54706                              return;
54707                            }
54708                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54709                            if (dt.Is(kDataTypeValueInvalid)) {
54710                              UnallocatedA32(instr);
54711                              return;
54712                            }
54713                            DecodeNeonAndAlign decode_neon =
54714                                Align_index_align_2_Decode((instr >> 4) & 0xf,
54715                                                           dt);
54716                            if (!decode_neon.IsValid()) {
54717                              UnallocatedA32(instr);
54718                              return;
54719                            }
54720                            Alignment align = decode_neon.GetAlign();
54721                            int lane = decode_neon.GetLane();
54722                            SpacingType spacing = decode_neon.GetSpacing();
54723                            unsigned first = ExtractDRegister(instr, 22, 12);
54724                            unsigned length = 2;
54725                            unsigned last =
54726                                first +
54727                                (length - 1) * (spacing == kSingle ? 1 : 2);
54728                            unsigned rn = (instr >> 16) & 0xf;
54729                            unsigned rm = instr & 0xf;
54730                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54731                            vld2(al,
54732                                 dt,
54733                                 NeonRegisterList(DRegister(first),
54734                                                  DRegister(last),
54735                                                  spacing,
54736                                                  lane),
54737                                 AlignedMemOperand(Register(rn),
54738                                                   align,
54739                                                   Register(rm),
54740                                                   PostIndex));
54741                            break;
54742                          }
54743                        }
54744                        break;
54745                      }
54746                    }
54747                    break;
54748                  }
54749                  case 0x00000200: {
54750                    // 0xf4a00200
54751                    switch (instr & 0x00000c00) {
54752                      case 0x00000c00: {
54753                        // 0xf4a00e00
54754                        switch (instr & 0x00000010) {
54755                          case 0x00000000: {
54756                            // 0xf4a00e00
54757                            switch (instr & 0x0000000d) {
54758                              case 0x0000000d: {
54759                                // 0xf4a00e0d
54760                                switch (instr & 0x00000002) {
54761                                  case 0x00000000: {
54762                                    // 0xf4a00e0d
54763                                    DataType dt =
54764                                        Dt_size_7_Decode((instr >> 6) & 0x3);
54765                                    if (dt.Is(kDataTypeValueInvalid)) {
54766                                      UnallocatedA32(instr);
54767                                      return;
54768                                    }
54769                                    unsigned first =
54770                                        ExtractDRegister(instr, 22, 12);
54771                                    unsigned length;
54772                                    SpacingType spacing;
54773                                    switch ((instr >> 5) & 0x1) {
54774                                      default:
54775                                        VIXL_UNREACHABLE_OR_FALLTHROUGH();
54776                                      case 0x0:
54777                                        length = 3;
54778                                        spacing = kSingle;
54779                                        break;
54780                                      case 0x1:
54781                                        length = 3;
54782                                        spacing = kDouble;
54783                                        break;
54784                                    }
54785                                    unsigned last =
54786                                        first +
54787                                        (length - 1) *
54788                                            (spacing == kSingle ? 1 : 2);
54789                                    TransferType transfer = kAllLanes;
54790                                    unsigned rn = (instr >> 16) & 0xf;
54791                                    // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
54792                                    vld3(al,
54793                                         dt,
54794                                         NeonRegisterList(DRegister(first),
54795                                                          DRegister(last),
54796                                                          spacing,
54797                                                          transfer),
54798                                         MemOperand(Register(rn), PostIndex));
54799                                    break;
54800                                  }
54801                                  case 0x00000002: {
54802                                    // 0xf4a00e0f
54803                                    DataType dt =
54804                                        Dt_size_7_Decode((instr >> 6) & 0x3);
54805                                    if (dt.Is(kDataTypeValueInvalid)) {
54806                                      UnallocatedA32(instr);
54807                                      return;
54808                                    }
54809                                    unsigned first =
54810                                        ExtractDRegister(instr, 22, 12);
54811                                    unsigned length;
54812                                    SpacingType spacing;
54813                                    switch ((instr >> 5) & 0x1) {
54814                                      default:
54815                                        VIXL_UNREACHABLE_OR_FALLTHROUGH();
54816                                      case 0x0:
54817                                        length = 3;
54818                                        spacing = kSingle;
54819                                        break;
54820                                      case 0x1:
54821                                        length = 3;
54822                                        spacing = kDouble;
54823                                        break;
54824                                    }
54825                                    unsigned last =
54826                                        first +
54827                                        (length - 1) *
54828                                            (spacing == kSingle ? 1 : 2);
54829                                    TransferType transfer = kAllLanes;
54830                                    unsigned rn = (instr >> 16) & 0xf;
54831                                    // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
54832                                    vld3(al,
54833                                         dt,
54834                                         NeonRegisterList(DRegister(first),
54835                                                          DRegister(last),
54836                                                          spacing,
54837                                                          transfer),
54838                                         MemOperand(Register(rn), Offset));
54839                                    break;
54840                                  }
54841                                }
54842                                break;
54843                              }
54844                              default: {
54845                                if (((instr & 0xd) == 0xd)) {
54846                                  UnallocatedA32(instr);
54847                                  return;
54848                                }
54849                                DataType dt =
54850                                    Dt_size_7_Decode((instr >> 6) & 0x3);
54851                                if (dt.Is(kDataTypeValueInvalid)) {
54852                                  UnallocatedA32(instr);
54853                                  return;
54854                                }
54855                                unsigned first =
54856                                    ExtractDRegister(instr, 22, 12);
54857                                unsigned length;
54858                                SpacingType spacing;
54859                                switch ((instr >> 5) & 0x1) {
54860                                  default:
54861                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54862                                  case 0x0:
54863                                    length = 3;
54864                                    spacing = kSingle;
54865                                    break;
54866                                  case 0x1:
54867                                    length = 3;
54868                                    spacing = kDouble;
54869                                    break;
54870                                }
54871                                unsigned last =
54872                                    first +
54873                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54874                                TransferType transfer = kAllLanes;
54875                                unsigned rn = (instr >> 16) & 0xf;
54876                                Sign sign(plus);
54877                                unsigned rm = instr & 0xf;
54878                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length)
54879                                vld3(al,
54880                                     dt,
54881                                     NeonRegisterList(DRegister(first),
54882                                                      DRegister(last),
54883                                                      spacing,
54884                                                      transfer),
54885                                     MemOperand(Register(rn),
54886                                                sign,
54887                                                Register(rm),
54888                                                PostIndex));
54889                                break;
54890                              }
54891                            }
54892                            break;
54893                          }
54894                          default:
54895                            UnallocatedA32(instr);
54896                            break;
54897                        }
54898                        break;
54899                      }
54900                      default: {
54901                        switch (instr & 0x0000000d) {
54902                          case 0x0000000d: {
54903                            // 0xf4a0020d
54904                            switch (instr & 0x00000002) {
54905                              case 0x00000000: {
54906                                // 0xf4a0020d
54907                                if (((instr & 0xc00) == 0xc00)) {
54908                                  UnallocatedA32(instr);
54909                                  return;
54910                                }
54911                                DataType dt =
54912                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54913                                if (dt.Is(kDataTypeValueInvalid)) {
54914                                  UnallocatedA32(instr);
54915                                  return;
54916                                }
54917                                DecodeNeon decode_neon =
54918                                    Index_1_Decode((instr >> 4) & 0xf, dt);
54919                                if (!decode_neon.IsValid()) {
54920                                  UnallocatedA32(instr);
54921                                  return;
54922                                }
54923                                int lane = decode_neon.GetLane();
54924                                SpacingType spacing = decode_neon.GetSpacing();
54925                                unsigned first =
54926                                    ExtractDRegister(instr, 22, 12);
54927                                unsigned length = 3;
54928                                unsigned last =
54929                                    first +
54930                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54931                                unsigned rn = (instr >> 16) & 0xf;
54932                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
54933                                vld3(al,
54934                                     dt,
54935                                     NeonRegisterList(DRegister(first),
54936                                                      DRegister(last),
54937                                                      spacing,
54938                                                      lane),
54939                                     MemOperand(Register(rn), PostIndex));
54940                                break;
54941                              }
54942                              case 0x00000002: {
54943                                // 0xf4a0020f
54944                                if (((instr & 0xc00) == 0xc00)) {
54945                                  UnallocatedA32(instr);
54946                                  return;
54947                                }
54948                                DataType dt =
54949                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54950                                if (dt.Is(kDataTypeValueInvalid)) {
54951                                  UnallocatedA32(instr);
54952                                  return;
54953                                }
54954                                DecodeNeon decode_neon =
54955                                    Index_1_Decode((instr >> 4) & 0xf, dt);
54956                                if (!decode_neon.IsValid()) {
54957                                  UnallocatedA32(instr);
54958                                  return;
54959                                }
54960                                int lane = decode_neon.GetLane();
54961                                SpacingType spacing = decode_neon.GetSpacing();
54962                                unsigned first =
54963                                    ExtractDRegister(instr, 22, 12);
54964                                unsigned length = 3;
54965                                unsigned last =
54966                                    first +
54967                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54968                                unsigned rn = (instr >> 16) & 0xf;
54969                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
54970                                vld3(al,
54971                                     dt,
54972                                     NeonRegisterList(DRegister(first),
54973                                                      DRegister(last),
54974                                                      spacing,
54975                                                      lane),
54976                                     MemOperand(Register(rn), Offset));
54977                                break;
54978                              }
54979                            }
54980                            break;
54981                          }
54982                          default: {
54983                            if (((instr & 0xc00) == 0xc00) ||
54984                                ((instr & 0xd) == 0xd)) {
54985                              UnallocatedA32(instr);
54986                              return;
54987                            }
54988                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54989                            if (dt.Is(kDataTypeValueInvalid)) {
54990                              UnallocatedA32(instr);
54991                              return;
54992                            }
54993                            DecodeNeon decode_neon =
54994                                Index_1_Decode((instr >> 4) & 0xf, dt);
54995                            if (!decode_neon.IsValid()) {
54996                              UnallocatedA32(instr);
54997                              return;
54998                            }
54999                            int lane = decode_neon.GetLane();
55000                            SpacingType spacing = decode_neon.GetSpacing();
55001                            unsigned first = ExtractDRegister(instr, 22, 12);
55002                            unsigned length = 3;
55003                            unsigned last =
55004                                first +
55005                                (length - 1) * (spacing == kSingle ? 1 : 2);
55006                            unsigned rn = (instr >> 16) & 0xf;
55007                            Sign sign(plus);
55008                            unsigned rm = instr & 0xf;
55009                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
55010                            vld3(al,
55011                                 dt,
55012                                 NeonRegisterList(DRegister(first),
55013                                                  DRegister(last),
55014                                                  spacing,
55015                                                  lane),
55016                                 MemOperand(Register(rn),
55017                                            sign,
55018                                            Register(rm),
55019                                            PostIndex));
55020                            break;
55021                          }
55022                        }
55023                        break;
55024                      }
55025                    }
55026                    break;
55027                  }
55028                  case 0x00000300: {
55029                    // 0xf4a00300
55030                    switch (instr & 0x00000c00) {
55031                      case 0x00000c00: {
55032                        // 0xf4a00f00
55033                        switch (instr & 0x0000000d) {
55034                          case 0x0000000d: {
55035                            // 0xf4a00f0d
55036                            switch (instr & 0x00000002) {
55037                              case 0x00000000: {
55038                                // 0xf4a00f0d
55039                                DataType dt =
55040                                    Dt_size_8_Decode((instr >> 6) & 0x3);
55041                                if (dt.Is(kDataTypeValueInvalid)) {
55042                                  UnallocatedA32(instr);
55043                                  return;
55044                                }
55045                                Alignment align =
55046                                    Align_a_3_Decode((instr >> 4) & 0x1,
55047                                                     dt,
55048                                                     (instr >> 6) & 0x3);
55049                                if (dt.Is(kDataTypeValueInvalid) ||
55050                                    align.Is(kBadAlignment)) {
55051                                  UnallocatedA32(instr);
55052                                  return;
55053                                }
55054                                unsigned first =
55055                                    ExtractDRegister(instr, 22, 12);
55056                                unsigned length;
55057                                SpacingType spacing;
55058                                switch ((instr >> 5) & 0x1) {
55059                                  default:
55060                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
55061                                  case 0x0:
55062                                    length = 4;
55063                                    spacing = kSingle;
55064                                    break;
55065                                  case 0x1:
55066                                    length = 4;
55067                                    spacing = kDouble;
55068                                    break;
55069                                }
55070                                unsigned last =
55071                                    first +
55072                                    (length - 1) * (spacing == kSingle ? 1 : 2);
55073                                TransferType transfer = kAllLanes;
55074                                unsigned rn = (instr >> 16) & 0xf;
55075                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
55076                                vld4(al,
55077                                     dt,
55078                                     NeonRegisterList(DRegister(first),
55079                                                      DRegister(last),
55080                                                      spacing,
55081                                                      transfer),
55082                                     AlignedMemOperand(Register(rn),
55083                                                       align,
55084                                                       PostIndex));
55085                                break;
55086                              }
55087                              case 0x00000002: {
55088                                // 0xf4a00f0f
55089                                DataType dt =
55090                                    Dt_size_8_Decode((instr >> 6) & 0x3);
55091                                if (dt.Is(kDataTypeValueInvalid)) {
55092                                  UnallocatedA32(instr);
55093                                  return;
55094                                }
55095                                Alignment align =
55096                                    Align_a_3_Decode((instr >> 4) & 0x1,
55097                                                     dt,
55098                                                     (instr >> 6) & 0x3);
55099                                if (dt.Is(kDataTypeValueInvalid) ||
55100                                    align.Is(kBadAlignment)) {
55101                                  UnallocatedA32(instr);
55102                                  return;
55103                                }
55104                                unsigned first =
55105                                    ExtractDRegister(instr, 22, 12);
55106                                unsigned length;
55107                                SpacingType spacing;
55108                                switch ((instr >> 5) & 0x1) {
55109                                  default:
55110                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
55111                                  case 0x0:
55112                                    length = 4;
55113                                    spacing = kSingle;
55114                                    break;
55115                                  case 0x1:
55116                                    length = 4;
55117                                    spacing = kDouble;
55118                                    break;
55119                                }
55120                                unsigned last =
55121                                    first +
55122                                    (length - 1) * (spacing == kSingle ? 1 : 2);
55123                                TransferType transfer = kAllLanes;
55124                                unsigned rn = (instr >> 16) & 0xf;
55125                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
55126                                vld4(al,
55127                                     dt,
55128                                     NeonRegisterList(DRegister(first),
55129                                                      DRegister(last),
55130                                                      spacing,
55131                                                      transfer),
55132                                     AlignedMemOperand(Register(rn),
55133                                                       align,
55134                                                       Offset));
55135                                break;
55136                              }
55137                            }
55138                            break;
55139                          }
55140                          default: {
55141                            if (((instr & 0xd) == 0xd)) {
55142                              UnallocatedA32(instr);
55143                              return;
55144                            }
55145                            DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3);
55146                            if (dt.Is(kDataTypeValueInvalid)) {
55147                              UnallocatedA32(instr);
55148                              return;
55149                            }
55150                            Alignment align =
55151                                Align_a_3_Decode((instr >> 4) & 0x1,
55152                                                 dt,
55153                                                 (instr >> 6) & 0x3);
55154                            if (dt.Is(kDataTypeValueInvalid) ||
55155                                align.Is(kBadAlignment)) {
55156                              UnallocatedA32(instr);
55157                              return;
55158                            }
55159                            unsigned first = ExtractDRegister(instr, 22, 12);
55160                            unsigned length;
55161                            SpacingType spacing;
55162                            switch ((instr >> 5) & 0x1) {
55163                              default:
55164                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
55165                              case 0x0:
55166                                length = 4;
55167                                spacing = kSingle;
55168                                break;
55169                              case 0x1:
55170                                length = 4;
55171                                spacing = kDouble;
55172                                break;
55173                            }
55174                            unsigned last =
55175                                first +
55176                                (length - 1) * (spacing == kSingle ? 1 : 2);
55177                            TransferType transfer = kAllLanes;
55178                            unsigned rn = (instr >> 16) & 0xf;
55179                            unsigned rm = instr & 0xf;
55180                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
55181                            vld4(al,
55182                                 dt,
55183                                 NeonRegisterList(DRegister(first),
55184                                                  DRegister(last),
55185                                                  spacing,
55186                                                  transfer),
55187                                 AlignedMemOperand(Register(rn),
55188                                                   align,
55189                                                   Register(rm),
55190                                                   PostIndex));
55191                            break;
55192                          }
55193                        }
55194                        break;
55195                      }
55196                      default: {
55197                        switch (instr & 0x0000000d) {
55198                          case 0x0000000d: {
55199                            // 0xf4a0030d
55200                            switch (instr & 0x00000002) {
55201                              case 0x00000000: {
55202                                // 0xf4a0030d
55203                                if (((instr & 0xc00) == 0xc00)) {
55204                                  UnallocatedA32(instr);
55205                                  return;
55206                                }
55207                                DataType dt =
55208                                    Dt_size_7_Decode((instr >> 10) & 0x3);
55209                                if (dt.Is(kDataTypeValueInvalid)) {
55210                                  UnallocatedA32(instr);
55211                                  return;
55212                                }
55213                                DecodeNeonAndAlign decode_neon =
55214                                    Align_index_align_3_Decode((instr >> 4) &
55215                                                                   0xf,
55216                                                               dt);
55217                                if (!decode_neon.IsValid()) {
55218                                  UnallocatedA32(instr);
55219                                  return;
55220                                }
55221                                Alignment align = decode_neon.GetAlign();
55222                                int lane = decode_neon.GetLane();
55223                                SpacingType spacing = decode_neon.GetSpacing();
55224                                unsigned first =
55225                                    ExtractDRegister(instr, 22, 12);
55226                                unsigned length = 4;
55227                                unsigned last =
55228                                    first +
55229                                    (length - 1) * (spacing == kSingle ? 1 : 2);
55230                                unsigned rn = (instr >> 16) & 0xf;
55231                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
55232                                vld4(al,
55233                                     dt,
55234                                     NeonRegisterList(DRegister(first),
55235                                                      DRegister(last),
55236                                                      spacing,
55237                                                      lane),
55238                                     AlignedMemOperand(Register(rn),
55239                                                       align,
55240                                                       PostIndex));
55241                                break;
55242                              }
55243                              case 0x00000002: {
55244                                // 0xf4a0030f
55245                                if (((instr & 0xc00) == 0xc00)) {
55246                                  UnallocatedA32(instr);
55247                                  return;
55248                                }
55249                                DataType dt =
55250                                    Dt_size_7_Decode((instr >> 10) & 0x3);
55251                                if (dt.Is(kDataTypeValueInvalid)) {
55252                                  UnallocatedA32(instr);
55253                                  return;
55254                                }
55255                                DecodeNeonAndAlign decode_neon =
55256                                    Align_index_align_3_Decode((instr >> 4) &
55257                                                                   0xf,
55258                                                               dt);
55259                                if (!decode_neon.IsValid()) {
55260                                  UnallocatedA32(instr);
55261                                  return;
55262                                }
55263                                Alignment align = decode_neon.GetAlign();
55264                                int lane = decode_neon.GetLane();
55265                                SpacingType spacing = decode_neon.GetSpacing();
55266                                unsigned first =
55267                                    ExtractDRegister(instr, 22, 12);
55268                                unsigned length = 4;
55269                                unsigned last =
55270                                    first +
55271                                    (length - 1) * (spacing == kSingle ? 1 : 2);
55272                                unsigned rn = (instr >> 16) & 0xf;
55273                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
55274                                vld4(al,
55275                                     dt,
55276                                     NeonRegisterList(DRegister(first),
55277                                                      DRegister(last),
55278                                                      spacing,
55279                                                      lane),
55280                                     AlignedMemOperand(Register(rn),
55281                                                       align,
55282                                                       Offset));
55283                                break;
55284                              }
55285                            }
55286                            break;
55287                          }
55288                          default: {
55289                            if (((instr & 0xc00) == 0xc00) ||
55290                                ((instr & 0xd) == 0xd)) {
55291                              UnallocatedA32(instr);
55292                              return;
55293                            }
55294                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
55295                            if (dt.Is(kDataTypeValueInvalid)) {
55296                              UnallocatedA32(instr);
55297                              return;
55298                            }
55299                            DecodeNeonAndAlign decode_neon =
55300                                Align_index_align_3_Decode((instr >> 4) & 0xf,
55301                                                           dt);
55302                            if (!decode_neon.IsValid()) {
55303                              UnallocatedA32(instr);
55304                              return;
55305                            }
55306                            Alignment align = decode_neon.GetAlign();
55307                            int lane = decode_neon.GetLane();
55308                            SpacingType spacing = decode_neon.GetSpacing();
55309                            unsigned first = ExtractDRegister(instr, 22, 12);
55310                            unsigned length = 4;
55311                            unsigned last =
55312                                first +
55313                                (length - 1) * (spacing == kSingle ? 1 : 2);
55314                            unsigned rn = (instr >> 16) & 0xf;
55315                            unsigned rm = instr & 0xf;
55316                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
55317                            vld4(al,
55318                                 dt,
55319                                 NeonRegisterList(DRegister(first),
55320                                                  DRegister(last),
55321                                                  spacing,
55322                                                  lane),
55323                                 AlignedMemOperand(Register(rn),
55324                                                   align,
55325                                                   Register(rm),
55326                                                   PostIndex));
55327                            break;
55328                          }
55329                        }
55330                        break;
55331                      }
55332                    }
55333                    break;
55334                  }
55335                }
55336                break;
55337              }
55338            }
55339            break;
55340          }
55341          case 0x01100000: {
55342            // 0xf5100000
55343            switch (instr & 0x000f0000) {
55344              case 0x000f0000: {
55345                // 0xf51f0000
55346                uint32_t U = (instr >> 23) & 0x1;
55347                int32_t imm = instr & 0xfff;
55348                if (U == 0) imm = -imm;
55349                bool minus_zero = (imm == 0) && (U == 0);
55350                Location location(imm, kA32PcDelta);
55351                // PLD{<c>}{<q>} <label> ; A1
55352                if (minus_zero) {
55353                  pld(al, MemOperand(pc, minus, 0));
55354                } else {
55355                  pld(al, &location);
55356                }
55357                if (((instr & 0xff7ff000) != 0xf55ff000)) {
55358                  UnpredictableA32(instr);
55359                }
55360                break;
55361              }
55362              default: {
55363                switch (instr & 0x00400000) {
55364                  case 0x00000000: {
55365                    // 0xf5100000
55366                    if (((instr & 0xf0000) == 0xf0000)) {
55367                      UnallocatedA32(instr);
55368                      return;
55369                    }
55370                    unsigned rn = (instr >> 16) & 0xf;
55371                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
55372                    int32_t offset = instr & 0xfff;
55373                    // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
55374                    pldw(al, MemOperand(Register(rn), sign, offset, Offset));
55375                    if (((instr & 0xff70f000) != 0xf510f000)) {
55376                      UnpredictableA32(instr);
55377                    }
55378                    break;
55379                  }
55380                  case 0x00400000: {
55381                    // 0xf5500000
55382                    if (((instr & 0xf0000) == 0xf0000)) {
55383                      UnallocatedA32(instr);
55384                      return;
55385                    }
55386                    unsigned rn = (instr >> 16) & 0xf;
55387                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
55388                    int32_t offset = instr & 0xfff;
55389                    // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
55390                    pld(al, MemOperand(Register(rn), sign, offset, Offset));
55391                    if (((instr & 0xff70f000) != 0xf550f000)) {
55392                      UnpredictableA32(instr);
55393                    }
55394                    break;
55395                  }
55396                }
55397                break;
55398              }
55399            }
55400            break;
55401          }
55402          case 0x01300000: {
55403            // 0xf5300000
55404            switch (instr & 0x00c000f0) {
55405              case 0x00400010: {
55406                // 0xf5700010
55407                // CLREX{<c>}{<q>} ; A1
55408                clrex(al);
55409                if (((instr & 0xffffffff) != 0xf57ff01f)) {
55410                  UnpredictableA32(instr);
55411                }
55412                break;
55413              }
55414              case 0x00400040: {
55415                // 0xf5700040
55416                MemoryBarrier option(instr & 0xf);
55417                // DSB{<c>}{<q>} {<option>} ; A1
55418                dsb(al, option);
55419                if (((instr & 0xfffffff0) != 0xf57ff040)) {
55420                  UnpredictableA32(instr);
55421                }
55422                break;
55423              }
55424              case 0x00400050: {
55425                // 0xf5700050
55426                MemoryBarrier option(instr & 0xf);
55427                // DMB{<c>}{<q>} {<option>} ; A1
55428                dmb(al, option);
55429                if (((instr & 0xfffffff0) != 0xf57ff050)) {
55430                  UnpredictableA32(instr);
55431                }
55432                break;
55433              }
55434              case 0x00400060: {
55435                // 0xf5700060
55436                MemoryBarrier option(instr & 0xf);
55437                // ISB{<c>}{<q>} {<option>} ; A1
55438                isb(al, option);
55439                if (((instr & 0xfffffff0) != 0xf57ff060)) {
55440                  UnpredictableA32(instr);
55441                }
55442                break;
55443              }
55444              default:
55445                UnallocatedA32(instr);
55446                break;
55447            }
55448            break;
55449          }
55450          default:
55451            UnallocatedA32(instr);
55452            break;
55453        }
55454        break;
55455      }
55456      case 0x06000000: {
55457        // 0xf6000000
55458        switch (instr & 0x01700010) {
55459          case 0x00500000: {
55460            // 0xf6500000
55461            switch (instr & 0x00000fe0) {
55462              case 0x00000060: {
55463                // 0xf6500060
55464                unsigned rn = (instr >> 16) & 0xf;
55465                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55466                unsigned rm = instr & 0xf;
55467                Shift shift = RRX;
55468                uint32_t amount = 0;
55469                AddrMode addrmode = Offset;
55470                // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55471                pli(al,
55472                    MemOperand(Register(rn),
55473                               sign,
55474                               Register(rm),
55475                               shift,
55476                               amount,
55477                               addrmode));
55478                if (((instr & 0xff70fff0) != 0xf650f060)) {
55479                  UnpredictableA32(instr);
55480                }
55481                break;
55482              }
55483              default: {
55484                if (((instr & 0xfe0) == 0x60)) {
55485                  UnallocatedA32(instr);
55486                  return;
55487                }
55488                unsigned rn = (instr >> 16) & 0xf;
55489                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55490                unsigned rm = instr & 0xf;
55491                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55492                                                    (instr >> 7) & 0x1f);
55493                Shift shift = shift_operand.GetShift();
55494                uint32_t amount = shift_operand.GetAmount();
55495                AddrMode addrmode = Offset;
55496                // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55497                pli(al,
55498                    MemOperand(Register(rn),
55499                               sign,
55500                               Register(rm),
55501                               shift,
55502                               amount,
55503                               addrmode));
55504                if (((instr & 0xff70f010) != 0xf650f000)) {
55505                  UnpredictableA32(instr);
55506                }
55507                break;
55508              }
55509            }
55510            break;
55511          }
55512          case 0x01100000: {
55513            // 0xf7100000
55514            switch (instr & 0x00000fe0) {
55515              case 0x00000060: {
55516                // 0xf7100060
55517                unsigned rn = (instr >> 16) & 0xf;
55518                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55519                unsigned rm = instr & 0xf;
55520                Shift shift = RRX;
55521                uint32_t amount = 0;
55522                AddrMode addrmode = Offset;
55523                // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55524                pldw(al,
55525                     MemOperand(Register(rn),
55526                                sign,
55527                                Register(rm),
55528                                shift,
55529                                amount,
55530                                addrmode));
55531                if (((instr & 0xff70fff0) != 0xf710f060)) {
55532                  UnpredictableA32(instr);
55533                }
55534                break;
55535              }
55536              default: {
55537                if (((instr & 0xfe0) == 0x60)) {
55538                  UnallocatedA32(instr);
55539                  return;
55540                }
55541                unsigned rn = (instr >> 16) & 0xf;
55542                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55543                unsigned rm = instr & 0xf;
55544                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55545                                                    (instr >> 7) & 0x1f);
55546                Shift shift = shift_operand.GetShift();
55547                uint32_t amount = shift_operand.GetAmount();
55548                AddrMode addrmode = Offset;
55549                // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55550                pldw(al,
55551                     MemOperand(Register(rn),
55552                                sign,
55553                                Register(rm),
55554                                shift,
55555                                amount,
55556                                addrmode));
55557                if (((instr & 0xff70f010) != 0xf710f000)) {
55558                  UnpredictableA32(instr);
55559                }
55560                break;
55561              }
55562            }
55563            break;
55564          }
55565          case 0x01500000: {
55566            // 0xf7500000
55567            switch (instr & 0x00000fe0) {
55568              case 0x00000060: {
55569                // 0xf7500060
55570                unsigned rn = (instr >> 16) & 0xf;
55571                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55572                unsigned rm = instr & 0xf;
55573                Shift shift = RRX;
55574                uint32_t amount = 0;
55575                AddrMode addrmode = Offset;
55576                // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55577                pld(al,
55578                    MemOperand(Register(rn),
55579                               sign,
55580                               Register(rm),
55581                               shift,
55582                               amount,
55583                               addrmode));
55584                if (((instr & 0xff70fff0) != 0xf750f060)) {
55585                  UnpredictableA32(instr);
55586                }
55587                break;
55588              }
55589              default: {
55590                if (((instr & 0xfe0) == 0x60)) {
55591                  UnallocatedA32(instr);
55592                  return;
55593                }
55594                unsigned rn = (instr >> 16) & 0xf;
55595                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55596                unsigned rm = instr & 0xf;
55597                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55598                                                    (instr >> 7) & 0x1f);
55599                Shift shift = shift_operand.GetShift();
55600                uint32_t amount = shift_operand.GetAmount();
55601                AddrMode addrmode = Offset;
55602                // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55603                pld(al,
55604                    MemOperand(Register(rn),
55605                               sign,
55606                               Register(rm),
55607                               shift,
55608                               amount,
55609                               addrmode));
55610                if (((instr & 0xff70f010) != 0xf750f000)) {
55611                  UnpredictableA32(instr);
55612                }
55613                break;
55614              }
55615            }
55616            break;
55617          }
55618          default:
55619            UnallocatedA32(instr);
55620            break;
55621        }
55622        break;
55623      }
55624      case 0x08000000: {
55625        // 0xf8000000
55626        switch (instr & 0x01d00000) {
55627          case 0x00100000: {
55628            // 0xf8100000
55629            UnimplementedA32("RFEDA", instr);
55630            break;
55631          }
55632          case 0x00400000: {
55633            // 0xf8400000
55634            UnimplementedA32("SRSDA", instr);
55635            break;
55636          }
55637          case 0x00900000: {
55638            // 0xf8900000
55639            UnimplementedA32("RFE{IA}", instr);
55640            break;
55641          }
55642          case 0x00c00000: {
55643            // 0xf8c00000
55644            UnimplementedA32("SRS{IA}", instr);
55645            break;
55646          }
55647          case 0x01100000: {
55648            // 0xf9100000
55649            UnimplementedA32("RFEDB", instr);
55650            break;
55651          }
55652          case 0x01400000: {
55653            // 0xf9400000
55654            UnimplementedA32("SRSDB", instr);
55655            break;
55656          }
55657          case 0x01900000: {
55658            // 0xf9900000
55659            UnimplementedA32("RFEIB", instr);
55660            break;
55661          }
55662          case 0x01c00000: {
55663            // 0xf9c00000
55664            UnimplementedA32("SRSIB", instr);
55665            break;
55666          }
55667          default:
55668            UnallocatedA32(instr);
55669            break;
55670        }
55671        break;
55672      }
55673      case 0x0a000000: {
55674        // 0xfa000000
55675        int32_t imm = SignExtend<int32_t>(((instr >> 24) & 0x1) |
55676                                              ((instr << 1) & 0x1fffffe),
55677                                          25)
55678                      << 1;
55679        Location location(imm, kA32PcDelta);
55680        // BLX{<c>}{<q>} <label> ; A2
55681        blx(al, &location);
55682        break;
55683      }
55684      case 0x0c000000: {
55685        // 0xfc000000
55686        switch (instr & 0x01300000) {
55687          case 0x00000000: {
55688            // 0xfc000000
55689            switch (instr & 0x00800000) {
55690              case 0x00000000: {
55691                // 0xfc000000
55692                if ((instr & 0x00400000) == 0x00400000) {
55693                  if (((instr & 0xe00) == 0xa00)) {
55694                    UnallocatedA32(instr);
55695                    return;
55696                  }
55697                  UnimplementedA32("MCRR2", instr);
55698                } else {
55699                  UnallocatedA32(instr);
55700                }
55701                break;
55702              }
55703              case 0x00800000: {
55704                // 0xfc800000
55705                if (((instr & 0xe00) == 0xa00)) {
55706                  UnallocatedA32(instr);
55707                  return;
55708                }
55709                UnimplementedA32("STC2", instr);
55710                break;
55711              }
55712            }
55713            break;
55714          }
55715          case 0x00100000: {
55716            // 0xfc100000
55717            switch (instr & 0x00800000) {
55718              case 0x00000000: {
55719                // 0xfc100000
55720                if ((instr & 0x00400000) == 0x00400000) {
55721                  if (((instr & 0xe00) == 0xa00)) {
55722                    UnallocatedA32(instr);
55723                    return;
55724                  }
55725                  UnimplementedA32("MRRC2", instr);
55726                } else {
55727                  UnallocatedA32(instr);
55728                }
55729                break;
55730              }
55731              case 0x00800000: {
55732                // 0xfc900000
55733                switch (instr & 0x00000e00) {
55734                  case 0x00000a00: {
55735                    // 0xfc900a00
55736                    UnallocatedA32(instr);
55737                    break;
55738                  }
55739                  default: {
55740                    switch (instr & 0x000f0000) {
55741                      case 0x000f0000: {
55742                        // 0xfc9f0000
55743                        if (((instr & 0xe00) == 0xa00)) {
55744                          UnallocatedA32(instr);
55745                          return;
55746                        }
55747                        UnimplementedA32("LDC2", instr);
55748                        break;
55749                      }
55750                      default: {
55751                        if (((instr & 0xf0000) == 0xf0000) ||
55752                            ((instr & 0xe00) == 0xa00)) {
55753                          UnallocatedA32(instr);
55754                          return;
55755                        }
55756                        UnimplementedA32("LDC2", instr);
55757                        break;
55758                      }
55759                    }
55760                    break;
55761                  }
55762                }
55763                break;
55764              }
55765            }
55766            break;
55767          }
55768          case 0x00200000: {
55769            // 0xfc200000
55770            if (((instr & 0xe00) == 0xa00)) {
55771              UnallocatedA32(instr);
55772              return;
55773            }
55774            UnimplementedA32("STC2", instr);
55775            break;
55776          }
55777          case 0x00300000: {
55778            // 0xfc300000
55779            if (((instr & 0xf0000) == 0xf0000) || ((instr & 0xe00) == 0xa00)) {
55780              UnallocatedA32(instr);
55781              return;
55782            }
55783            UnimplementedA32("LDC2", instr);
55784            break;
55785          }
55786          case 0x01000000: {
55787            // 0xfd000000
55788            if (((instr & 0xe00) == 0xa00)) {
55789              UnallocatedA32(instr);
55790              return;
55791            }
55792            UnimplementedA32("STC2", instr);
55793            break;
55794          }
55795          case 0x01100000: {
55796            // 0xfd100000
55797            switch (instr & 0x00000e00) {
55798              case 0x00000a00: {
55799                // 0xfd100a00
55800                UnallocatedA32(instr);
55801                break;
55802              }
55803              default: {
55804                switch (instr & 0x000f0000) {
55805                  case 0x000f0000: {
55806                    // 0xfd1f0000
55807                    if (((instr & 0xe00) == 0xa00)) {
55808                      UnallocatedA32(instr);
55809                      return;
55810                    }
55811                    UnimplementedA32("LDC2", instr);
55812                    break;
55813                  }
55814                  default: {
55815                    if (((instr & 0xf0000) == 0xf0000) ||
55816                        ((instr & 0xe00) == 0xa00)) {
55817                      UnallocatedA32(instr);
55818                      return;
55819                    }
55820                    UnimplementedA32("LDC2", instr);
55821                    break;
55822                  }
55823                }
55824                break;
55825              }
55826            }
55827            break;
55828          }
55829          case 0x01200000: {
55830            // 0xfd200000
55831            if (((instr & 0xe00) == 0xa00)) {
55832              UnallocatedA32(instr);
55833              return;
55834            }
55835            UnimplementedA32("STC2", instr);
55836            break;
55837          }
55838          case 0x01300000: {
55839            // 0xfd300000
55840            if (((instr & 0xf0000) == 0xf0000) || ((instr & 0xe00) == 0xa00)) {
55841              UnallocatedA32(instr);
55842              return;
55843            }
55844            UnimplementedA32("LDC2", instr);
55845            break;
55846          }
55847        }
55848        break;
55849      }
55850      case 0x0e000000: {
55851        // 0xfe000000
55852        switch (instr & 0x01000010) {
55853          case 0x00000000: {
55854            // 0xfe000000
55855            switch (instr & 0x00000e00) {
55856              case 0x00000a00: {
55857                // 0xfe000a00
55858                switch (instr & 0x00b00140) {
55859                  case 0x00000000: {
55860                    // 0xfe000a00
55861                    unsigned rd = ExtractSRegister(instr, 22, 12);
55862                    unsigned rn = ExtractSRegister(instr, 7, 16);
55863                    unsigned rm = ExtractSRegister(instr, 5, 0);
55864                    // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1
55865                    vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55866                    break;
55867                  }
55868                  case 0x00000100: {
55869                    // 0xfe000b00
55870                    unsigned rd = ExtractDRegister(instr, 22, 12);
55871                    unsigned rn = ExtractDRegister(instr, 7, 16);
55872                    unsigned rm = ExtractDRegister(instr, 5, 0);
55873                    // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1
55874                    vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55875                    break;
55876                  }
55877                  case 0x00100000: {
55878                    // 0xfe100a00
55879                    unsigned rd = ExtractSRegister(instr, 22, 12);
55880                    unsigned rn = ExtractSRegister(instr, 7, 16);
55881                    unsigned rm = ExtractSRegister(instr, 5, 0);
55882                    // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1
55883                    vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55884                    break;
55885                  }
55886                  case 0x00100100: {
55887                    // 0xfe100b00
55888                    unsigned rd = ExtractDRegister(instr, 22, 12);
55889                    unsigned rn = ExtractDRegister(instr, 7, 16);
55890                    unsigned rm = ExtractDRegister(instr, 5, 0);
55891                    // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1
55892                    vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55893                    break;
55894                  }
55895                  case 0x00200000: {
55896                    // 0xfe200a00
55897                    unsigned rd = ExtractSRegister(instr, 22, 12);
55898                    unsigned rn = ExtractSRegister(instr, 7, 16);
55899                    unsigned rm = ExtractSRegister(instr, 5, 0);
55900                    // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1
55901                    vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55902                    break;
55903                  }
55904                  case 0x00200100: {
55905                    // 0xfe200b00
55906                    unsigned rd = ExtractDRegister(instr, 22, 12);
55907                    unsigned rn = ExtractDRegister(instr, 7, 16);
55908                    unsigned rm = ExtractDRegister(instr, 5, 0);
55909                    // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1
55910                    vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55911                    break;
55912                  }
55913                  case 0x00300000: {
55914                    // 0xfe300a00
55915                    unsigned rd = ExtractSRegister(instr, 22, 12);
55916                    unsigned rn = ExtractSRegister(instr, 7, 16);
55917                    unsigned rm = ExtractSRegister(instr, 5, 0);
55918                    // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1
55919                    vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55920                    break;
55921                  }
55922                  case 0x00300100: {
55923                    // 0xfe300b00
55924                    unsigned rd = ExtractDRegister(instr, 22, 12);
55925                    unsigned rn = ExtractDRegister(instr, 7, 16);
55926                    unsigned rm = ExtractDRegister(instr, 5, 0);
55927                    // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1
55928                    vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55929                    break;
55930                  }
55931                  case 0x00800000: {
55932                    // 0xfe800a00
55933                    unsigned rd = ExtractSRegister(instr, 22, 12);
55934                    unsigned rn = ExtractSRegister(instr, 7, 16);
55935                    unsigned rm = ExtractSRegister(instr, 5, 0);
55936                    // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
55937                    vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55938                    break;
55939                  }
55940                  case 0x00800040: {
55941                    // 0xfe800a40
55942                    unsigned rd = ExtractSRegister(instr, 22, 12);
55943                    unsigned rn = ExtractSRegister(instr, 7, 16);
55944                    unsigned rm = ExtractSRegister(instr, 5, 0);
55945                    // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
55946                    vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55947                    break;
55948                  }
55949                  case 0x00800100: {
55950                    // 0xfe800b00
55951                    unsigned rd = ExtractDRegister(instr, 22, 12);
55952                    unsigned rn = ExtractDRegister(instr, 7, 16);
55953                    unsigned rm = ExtractDRegister(instr, 5, 0);
55954                    // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
55955                    vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55956                    break;
55957                  }
55958                  case 0x00800140: {
55959                    // 0xfe800b40
55960                    unsigned rd = ExtractDRegister(instr, 22, 12);
55961                    unsigned rn = ExtractDRegister(instr, 7, 16);
55962                    unsigned rm = ExtractDRegister(instr, 5, 0);
55963                    // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
55964                    vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55965                    break;
55966                  }
55967                  case 0x00b00040: {
55968                    // 0xfeb00a40
55969                    switch (instr & 0x000f0000) {
55970                      case 0x00080000: {
55971                        // 0xfeb80a40
55972                        if ((instr & 0x00000080) == 0x00000000) {
55973                          unsigned rd = ExtractSRegister(instr, 22, 12);
55974                          unsigned rm = ExtractSRegister(instr, 5, 0);
55975                          // VRINTA{<q>}.F32.F32 <Sd>, <Sm> ; A1
55976                          vrinta(F32, F32, SRegister(rd), SRegister(rm));
55977                        } else {
55978                          UnallocatedA32(instr);
55979                        }
55980                        break;
55981                      }
55982                      case 0x00090000: {
55983                        // 0xfeb90a40
55984                        if ((instr & 0x00000080) == 0x00000000) {
55985                          unsigned rd = ExtractSRegister(instr, 22, 12);
55986                          unsigned rm = ExtractSRegister(instr, 5, 0);
55987                          // VRINTN{<q>}.F32.F32 <Sd>, <Sm> ; A1
55988                          vrintn(F32, F32, SRegister(rd), SRegister(rm));
55989                        } else {
55990                          UnallocatedA32(instr);
55991                        }
55992                        break;
55993                      }
55994                      case 0x000a0000: {
55995                        // 0xfeba0a40
55996                        if ((instr & 0x00000080) == 0x00000000) {
55997                          unsigned rd = ExtractSRegister(instr, 22, 12);
55998                          unsigned rm = ExtractSRegister(instr, 5, 0);
55999                          // VRINTP{<q>}.F32.F32 <Sd>, <Sm> ; A1
56000                          vrintp(F32, F32, SRegister(rd), SRegister(rm));
56001                        } else {
56002                          UnallocatedA32(instr);
56003                        }
56004                        break;
56005                      }
56006                      case 0x000b0000: {
56007                        // 0xfebb0a40
56008                        if ((instr & 0x00000080) == 0x00000000) {
56009                          unsigned rd = ExtractSRegister(instr, 22, 12);
56010                          unsigned rm = ExtractSRegister(instr, 5, 0);
56011                          // VRINTM{<q>}.F32.F32 <Sd>, <Sm> ; A1
56012                          vrintm(F32, F32, SRegister(rd), SRegister(rm));
56013                        } else {
56014                          UnallocatedA32(instr);
56015                        }
56016                        break;
56017                      }
56018                      case 0x000c0000: {
56019                        // 0xfebc0a40
56020                        DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56021                        if (dt.Is(kDataTypeValueInvalid)) {
56022                          UnallocatedA32(instr);
56023                          return;
56024                        }
56025                        unsigned rd = ExtractSRegister(instr, 22, 12);
56026                        unsigned rm = ExtractSRegister(instr, 5, 0);
56027                        // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
56028                        vcvta(dt, F32, SRegister(rd), SRegister(rm));
56029                        break;
56030                      }
56031                      case 0x000d0000: {
56032                        // 0xfebd0a40
56033                        DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56034                        if (dt.Is(kDataTypeValueInvalid)) {
56035                          UnallocatedA32(instr);
56036                          return;
56037                        }
56038                        unsigned rd = ExtractSRegister(instr, 22, 12);
56039                        unsigned rm = ExtractSRegister(instr, 5, 0);
56040                        // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
56041                        vcvtn(dt, F32, SRegister(rd), SRegister(rm));
56042                        break;
56043                      }
56044                      case 0x000e0000: {
56045                        // 0xfebe0a40
56046                        DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56047                        if (dt.Is(kDataTypeValueInvalid)) {
56048                          UnallocatedA32(instr);
56049                          return;
56050                        }
56051                        unsigned rd = ExtractSRegister(instr, 22, 12);
56052                        unsigned rm = ExtractSRegister(instr, 5, 0);
56053                        // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
56054                        vcvtp(dt, F32, SRegister(rd), SRegister(rm));
56055                        break;
56056                      }
56057                      case 0x000f0000: {
56058                        // 0xfebf0a40
56059                        DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56060                        if (dt.Is(kDataTypeValueInvalid)) {
56061                          UnallocatedA32(instr);
56062                          return;
56063                        }
56064                        unsigned rd = ExtractSRegister(instr, 22, 12);
56065                        unsigned rm = ExtractSRegister(instr, 5, 0);
56066                        // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
56067                        vcvtm(dt, F32, SRegister(rd), SRegister(rm));
56068                        break;
56069                      }
56070                      default:
56071                        UnallocatedA32(instr);
56072                        break;
56073                    }
56074                    break;
56075                  }
56076                  case 0x00b00140: {
56077                    // 0xfeb00b40
56078                    switch (instr & 0x000f0000) {
56079                      case 0x00080000: {
56080                        // 0xfeb80b40
56081                        if ((instr & 0x00000080) == 0x00000000) {
56082                          unsigned rd = ExtractDRegister(instr, 22, 12);
56083                          unsigned rm = ExtractDRegister(instr, 5, 0);
56084                          // VRINTA{<q>}.F64.F64 <Dd>, <Dm> ; A1
56085                          vrinta(F64, F64, DRegister(rd), DRegister(rm));
56086                        } else {
56087                          UnallocatedA32(instr);
56088                        }
56089                        break;
56090                      }
56091                      case 0x00090000: {
56092                        // 0xfeb90b40
56093                        if ((instr & 0x00000080) == 0x00000000) {
56094                          unsigned rd = ExtractDRegister(instr, 22, 12);
56095                          unsigned rm = ExtractDRegister(instr, 5, 0);
56096                          // VRINTN{<q>}.F64.F64 <Dd>, <Dm> ; A1
56097                          vrintn(F64, F64, DRegister(rd), DRegister(rm));
56098                        } else {
56099                          UnallocatedA32(instr);
56100                        }
56101                        break;
56102                      }
56103                      case 0x000a0000: {
56104                        // 0xfeba0b40
56105                        if ((instr & 0x00000080) == 0x00000000) {
56106                          unsigned rd = ExtractDRegister(instr, 22, 12);
56107                          unsigned rm = ExtractDRegister(instr, 5, 0);
56108                          // VRINTP{<q>}.F64.F64 <Dd>, <Dm> ; A1
56109                          vrintp(F64, F64, DRegister(rd), DRegister(rm));
56110                        } else {
56111                          UnallocatedA32(instr);
56112                        }
56113                        break;
56114                      }
56115                      case 0x000b0000: {
56116                        // 0xfebb0b40
56117                        if ((instr & 0x00000080) == 0x00000000) {
56118                          unsigned rd = ExtractDRegister(instr, 22, 12);
56119                          unsigned rm = ExtractDRegister(instr, 5, 0);
56120                          // VRINTM{<q>}.F64.F64 <Dd>, <Dm> ; A1
56121                          vrintm(F64, F64, DRegister(rd), DRegister(rm));
56122                        } else {
56123                          UnallocatedA32(instr);
56124                        }
56125                        break;
56126                      }
56127                      case 0x000c0000: {
56128                        // 0xfebc0b40
56129                        DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56130                        if (dt.Is(kDataTypeValueInvalid)) {
56131                          UnallocatedA32(instr);
56132                          return;
56133                        }
56134                        unsigned rd = ExtractSRegister(instr, 22, 12);
56135                        unsigned rm = ExtractDRegister(instr, 5, 0);
56136                        // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
56137                        vcvta(dt, F64, SRegister(rd), DRegister(rm));
56138                        break;
56139                      }
56140                      case 0x000d0000: {
56141                        // 0xfebd0b40
56142                        DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56143                        if (dt.Is(kDataTypeValueInvalid)) {
56144                          UnallocatedA32(instr);
56145                          return;
56146                        }
56147                        unsigned rd = ExtractSRegister(instr, 22, 12);
56148                        unsigned rm = ExtractDRegister(instr, 5, 0);
56149                        // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
56150                        vcvtn(dt, F64, SRegister(rd), DRegister(rm));
56151                        break;
56152                      }
56153                      case 0x000e0000: {
56154                        // 0xfebe0b40
56155                        DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56156                        if (dt.Is(kDataTypeValueInvalid)) {
56157                          UnallocatedA32(instr);
56158                          return;
56159                        }
56160                        unsigned rd = ExtractSRegister(instr, 22, 12);
56161                        unsigned rm = ExtractDRegister(instr, 5, 0);
56162                        // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
56163                        vcvtp(dt, F64, SRegister(rd), DRegister(rm));
56164                        break;
56165                      }
56166                      case 0x000f0000: {
56167                        // 0xfebf0b40
56168                        DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56169                        if (dt.Is(kDataTypeValueInvalid)) {
56170                          UnallocatedA32(instr);
56171                          return;
56172                        }
56173                        unsigned rd = ExtractSRegister(instr, 22, 12);
56174                        unsigned rm = ExtractDRegister(instr, 5, 0);
56175                        // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
56176                        vcvtm(dt, F64, SRegister(rd), DRegister(rm));
56177                        break;
56178                      }
56179                      default:
56180                        UnallocatedA32(instr);
56181                        break;
56182                    }
56183                    break;
56184                  }
56185                  default:
56186                    UnallocatedA32(instr);
56187                    break;
56188                }
56189                break;
56190              }
56191              default: {
56192                if (((instr & 0xe00) == 0xa00)) {
56193                  UnallocatedA32(instr);
56194                  return;
56195                }
56196                UnimplementedA32("CDP2", instr);
56197                break;
56198              }
56199            }
56200            break;
56201          }
56202          case 0x00000010: {
56203            // 0xfe000010
56204            switch (instr & 0x00100000) {
56205              case 0x00000000: {
56206                // 0xfe000010
56207                if (((instr & 0xe00) == 0xa00)) {
56208                  UnallocatedA32(instr);
56209                  return;
56210                }
56211                UnimplementedA32("MCR2", instr);
56212                break;
56213              }
56214              case 0x00100000: {
56215                // 0xfe100010
56216                if (((instr & 0xe00) == 0xa00)) {
56217                  UnallocatedA32(instr);
56218                  return;
56219                }
56220                UnimplementedA32("MRC2", instr);
56221                break;
56222              }
56223            }
56224            break;
56225          }
56226          default:
56227            UnallocatedA32(instr);
56228            break;
56229        }
56230        break;
56231      }
56232    }
56233  } else {
56234    switch (instr & 0x0e000000) {
56235      case 0x00000000: {
56236        // 0x00000000
56237        switch (instr & 0x00100010) {
56238          case 0x00000000: {
56239            // 0x00000000
56240            switch (instr & 0x01a00000) {
56241              case 0x00000000: {
56242                // 0x00000000
56243                switch (instr & 0x00400000) {
56244                  case 0x00000000: {
56245                    // 0x00000000
56246                    switch (instr & 0x00000fe0) {
56247                      case 0x00000060: {
56248                        // 0x00000060
56249                        if (((instr & 0xf0000000) == 0xf0000000)) {
56250                          UnallocatedA32(instr);
56251                          return;
56252                        }
56253                        Condition condition((instr >> 28) & 0xf);
56254                        unsigned rd = (instr >> 12) & 0xf;
56255                        unsigned rn = (instr >> 16) & 0xf;
56256                        unsigned rm = instr & 0xf;
56257                        // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56258                        and_(condition,
56259                             Best,
56260                             Register(rd),
56261                             Register(rn),
56262                             Operand(Register(rm), RRX));
56263                        break;
56264                      }
56265                      default: {
56266                        if (((instr & 0xf0000000) == 0xf0000000) ||
56267                            ((instr & 0xfe0) == 0x60)) {
56268                          UnallocatedA32(instr);
56269                          return;
56270                        }
56271                        Condition condition((instr >> 28) & 0xf);
56272                        unsigned rd = (instr >> 12) & 0xf;
56273                        unsigned rn = (instr >> 16) & 0xf;
56274                        unsigned rm = instr & 0xf;
56275                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56276                                                            (instr >> 7) &
56277                                                                0x1f);
56278                        // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56279                        and_(condition,
56280                             Best,
56281                             Register(rd),
56282                             Register(rn),
56283                             Operand(Register(rm),
56284                                     shift_operand.GetType(),
56285                                     shift_operand.GetAmount()));
56286                        break;
56287                      }
56288                    }
56289                    break;
56290                  }
56291                  case 0x00400000: {
56292                    // 0x00400000
56293                    switch (instr & 0x000f0000) {
56294                      case 0x000d0000: {
56295                        // 0x004d0000
56296                        switch (instr & 0x00000fe0) {
56297                          case 0x00000060: {
56298                            // 0x004d0060
56299                            if (((instr & 0xf0000000) == 0xf0000000)) {
56300                              UnallocatedA32(instr);
56301                              return;
56302                            }
56303                            Condition condition((instr >> 28) & 0xf);
56304                            unsigned rd = (instr >> 12) & 0xf;
56305                            unsigned rm = instr & 0xf;
56306                            // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
56307                            sub(condition,
56308                                Best,
56309                                Register(rd),
56310                                sp,
56311                                Operand(Register(rm), RRX));
56312                            break;
56313                          }
56314                          default: {
56315                            if (((instr & 0xf0000000) == 0xf0000000) ||
56316                                ((instr & 0xfe0) == 0x60)) {
56317                              UnallocatedA32(instr);
56318                              return;
56319                            }
56320                            Condition condition((instr >> 28) & 0xf);
56321                            unsigned rd = (instr >> 12) & 0xf;
56322                            unsigned rm = instr & 0xf;
56323                            ImmediateShiftOperand shift_operand((instr >> 5) &
56324                                                                    0x3,
56325                                                                (instr >> 7) &
56326                                                                    0x1f);
56327                            // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56328                            sub(condition,
56329                                Best,
56330                                Register(rd),
56331                                sp,
56332                                Operand(Register(rm),
56333                                        shift_operand.GetType(),
56334                                        shift_operand.GetAmount()));
56335                            break;
56336                          }
56337                        }
56338                        break;
56339                      }
56340                      default: {
56341                        switch (instr & 0x00000fe0) {
56342                          case 0x00000060: {
56343                            // 0x00400060
56344                            if (((instr & 0xf0000000) == 0xf0000000) ||
56345                                ((instr & 0xf0000) == 0xd0000)) {
56346                              UnallocatedA32(instr);
56347                              return;
56348                            }
56349                            Condition condition((instr >> 28) & 0xf);
56350                            unsigned rd = (instr >> 12) & 0xf;
56351                            unsigned rn = (instr >> 16) & 0xf;
56352                            unsigned rm = instr & 0xf;
56353                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56354                            sub(condition,
56355                                Best,
56356                                Register(rd),
56357                                Register(rn),
56358                                Operand(Register(rm), RRX));
56359                            break;
56360                          }
56361                          default: {
56362                            if (((instr & 0xf0000000) == 0xf0000000) ||
56363                                ((instr & 0xf0000) == 0xd0000) ||
56364                                ((instr & 0xfe0) == 0x60)) {
56365                              UnallocatedA32(instr);
56366                              return;
56367                            }
56368                            Condition condition((instr >> 28) & 0xf);
56369                            unsigned rd = (instr >> 12) & 0xf;
56370                            unsigned rn = (instr >> 16) & 0xf;
56371                            unsigned rm = instr & 0xf;
56372                            ImmediateShiftOperand shift_operand((instr >> 5) &
56373                                                                    0x3,
56374                                                                (instr >> 7) &
56375                                                                    0x1f);
56376                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56377                            sub(condition,
56378                                Best,
56379                                Register(rd),
56380                                Register(rn),
56381                                Operand(Register(rm),
56382                                        shift_operand.GetType(),
56383                                        shift_operand.GetAmount()));
56384                            break;
56385                          }
56386                        }
56387                        break;
56388                      }
56389                    }
56390                    break;
56391                  }
56392                }
56393                break;
56394              }
56395              case 0x00200000: {
56396                // 0x00200000
56397                switch (instr & 0x00400000) {
56398                  case 0x00000000: {
56399                    // 0x00200000
56400                    switch (instr & 0x00000fe0) {
56401                      case 0x00000060: {
56402                        // 0x00200060
56403                        if (((instr & 0xf0000000) == 0xf0000000)) {
56404                          UnallocatedA32(instr);
56405                          return;
56406                        }
56407                        Condition condition((instr >> 28) & 0xf);
56408                        unsigned rd = (instr >> 12) & 0xf;
56409                        unsigned rn = (instr >> 16) & 0xf;
56410                        unsigned rm = instr & 0xf;
56411                        // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56412                        eor(condition,
56413                            Best,
56414                            Register(rd),
56415                            Register(rn),
56416                            Operand(Register(rm), RRX));
56417                        break;
56418                      }
56419                      default: {
56420                        if (((instr & 0xf0000000) == 0xf0000000) ||
56421                            ((instr & 0xfe0) == 0x60)) {
56422                          UnallocatedA32(instr);
56423                          return;
56424                        }
56425                        Condition condition((instr >> 28) & 0xf);
56426                        unsigned rd = (instr >> 12) & 0xf;
56427                        unsigned rn = (instr >> 16) & 0xf;
56428                        unsigned rm = instr & 0xf;
56429                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56430                                                            (instr >> 7) &
56431                                                                0x1f);
56432                        // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56433                        eor(condition,
56434                            Best,
56435                            Register(rd),
56436                            Register(rn),
56437                            Operand(Register(rm),
56438                                    shift_operand.GetType(),
56439                                    shift_operand.GetAmount()));
56440                        break;
56441                      }
56442                    }
56443                    break;
56444                  }
56445                  case 0x00400000: {
56446                    // 0x00600000
56447                    switch (instr & 0x00000fe0) {
56448                      case 0x00000060: {
56449                        // 0x00600060
56450                        if (((instr & 0xf0000000) == 0xf0000000)) {
56451                          UnallocatedA32(instr);
56452                          return;
56453                        }
56454                        Condition condition((instr >> 28) & 0xf);
56455                        unsigned rd = (instr >> 12) & 0xf;
56456                        unsigned rn = (instr >> 16) & 0xf;
56457                        unsigned rm = instr & 0xf;
56458                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56459                        rsb(condition,
56460                            Best,
56461                            Register(rd),
56462                            Register(rn),
56463                            Operand(Register(rm), RRX));
56464                        break;
56465                      }
56466                      default: {
56467                        if (((instr & 0xf0000000) == 0xf0000000) ||
56468                            ((instr & 0xfe0) == 0x60)) {
56469                          UnallocatedA32(instr);
56470                          return;
56471                        }
56472                        Condition condition((instr >> 28) & 0xf);
56473                        unsigned rd = (instr >> 12) & 0xf;
56474                        unsigned rn = (instr >> 16) & 0xf;
56475                        unsigned rm = instr & 0xf;
56476                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56477                                                            (instr >> 7) &
56478                                                                0x1f);
56479                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56480                        rsb(condition,
56481                            Best,
56482                            Register(rd),
56483                            Register(rn),
56484                            Operand(Register(rm),
56485                                    shift_operand.GetType(),
56486                                    shift_operand.GetAmount()));
56487                        break;
56488                      }
56489                    }
56490                    break;
56491                  }
56492                }
56493                break;
56494              }
56495              case 0x00800000: {
56496                // 0x00800000
56497                switch (instr & 0x00400000) {
56498                  case 0x00000000: {
56499                    // 0x00800000
56500                    switch (instr & 0x000f0000) {
56501                      case 0x000d0000: {
56502                        // 0x008d0000
56503                        switch (instr & 0x00000fe0) {
56504                          case 0x00000060: {
56505                            // 0x008d0060
56506                            if (((instr & 0xf0000000) == 0xf0000000)) {
56507                              UnallocatedA32(instr);
56508                              return;
56509                            }
56510                            Condition condition((instr >> 28) & 0xf);
56511                            unsigned rd = (instr >> 12) & 0xf;
56512                            unsigned rm = instr & 0xf;
56513                            // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
56514                            add(condition,
56515                                Best,
56516                                Register(rd),
56517                                sp,
56518                                Operand(Register(rm), RRX));
56519                            break;
56520                          }
56521                          default: {
56522                            if (((instr & 0xf0000000) == 0xf0000000) ||
56523                                ((instr & 0xfe0) == 0x60)) {
56524                              UnallocatedA32(instr);
56525                              return;
56526                            }
56527                            Condition condition((instr >> 28) & 0xf);
56528                            unsigned rd = (instr >> 12) & 0xf;
56529                            unsigned rm = instr & 0xf;
56530                            ImmediateShiftOperand shift_operand((instr >> 5) &
56531                                                                    0x3,
56532                                                                (instr >> 7) &
56533                                                                    0x1f);
56534                            // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56535                            add(condition,
56536                                Best,
56537                                Register(rd),
56538                                sp,
56539                                Operand(Register(rm),
56540                                        shift_operand.GetType(),
56541                                        shift_operand.GetAmount()));
56542                            break;
56543                          }
56544                        }
56545                        break;
56546                      }
56547                      default: {
56548                        switch (instr & 0x00000fe0) {
56549                          case 0x00000060: {
56550                            // 0x00800060
56551                            if (((instr & 0xf0000000) == 0xf0000000) ||
56552                                ((instr & 0xf0000) == 0xd0000)) {
56553                              UnallocatedA32(instr);
56554                              return;
56555                            }
56556                            Condition condition((instr >> 28) & 0xf);
56557                            unsigned rd = (instr >> 12) & 0xf;
56558                            unsigned rn = (instr >> 16) & 0xf;
56559                            unsigned rm = instr & 0xf;
56560                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56561                            add(condition,
56562                                Best,
56563                                Register(rd),
56564                                Register(rn),
56565                                Operand(Register(rm), RRX));
56566                            break;
56567                          }
56568                          default: {
56569                            if (((instr & 0xf0000000) == 0xf0000000) ||
56570                                ((instr & 0xf0000) == 0xd0000) ||
56571                                ((instr & 0xfe0) == 0x60)) {
56572                              UnallocatedA32(instr);
56573                              return;
56574                            }
56575                            Condition condition((instr >> 28) & 0xf);
56576                            unsigned rd = (instr >> 12) & 0xf;
56577                            unsigned rn = (instr >> 16) & 0xf;
56578                            unsigned rm = instr & 0xf;
56579                            ImmediateShiftOperand shift_operand((instr >> 5) &
56580                                                                    0x3,
56581                                                                (instr >> 7) &
56582                                                                    0x1f);
56583                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56584                            add(condition,
56585                                Best,
56586                                Register(rd),
56587                                Register(rn),
56588                                Operand(Register(rm),
56589                                        shift_operand.GetType(),
56590                                        shift_operand.GetAmount()));
56591                            break;
56592                          }
56593                        }
56594                        break;
56595                      }
56596                    }
56597                    break;
56598                  }
56599                  case 0x00400000: {
56600                    // 0x00c00000
56601                    switch (instr & 0x00000fe0) {
56602                      case 0x00000060: {
56603                        // 0x00c00060
56604                        if (((instr & 0xf0000000) == 0xf0000000)) {
56605                          UnallocatedA32(instr);
56606                          return;
56607                        }
56608                        Condition condition((instr >> 28) & 0xf);
56609                        unsigned rd = (instr >> 12) & 0xf;
56610                        unsigned rn = (instr >> 16) & 0xf;
56611                        unsigned rm = instr & 0xf;
56612                        // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56613                        sbc(condition,
56614                            Best,
56615                            Register(rd),
56616                            Register(rn),
56617                            Operand(Register(rm), RRX));
56618                        break;
56619                      }
56620                      default: {
56621                        if (((instr & 0xf0000000) == 0xf0000000) ||
56622                            ((instr & 0xfe0) == 0x60)) {
56623                          UnallocatedA32(instr);
56624                          return;
56625                        }
56626                        Condition condition((instr >> 28) & 0xf);
56627                        unsigned rd = (instr >> 12) & 0xf;
56628                        unsigned rn = (instr >> 16) & 0xf;
56629                        unsigned rm = instr & 0xf;
56630                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56631                                                            (instr >> 7) &
56632                                                                0x1f);
56633                        // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56634                        sbc(condition,
56635                            Best,
56636                            Register(rd),
56637                            Register(rn),
56638                            Operand(Register(rm),
56639                                    shift_operand.GetType(),
56640                                    shift_operand.GetAmount()));
56641                        break;
56642                      }
56643                    }
56644                    break;
56645                  }
56646                }
56647                break;
56648              }
56649              case 0x00a00000: {
56650                // 0x00a00000
56651                switch (instr & 0x00400000) {
56652                  case 0x00000000: {
56653                    // 0x00a00000
56654                    switch (instr & 0x00000fe0) {
56655                      case 0x00000060: {
56656                        // 0x00a00060
56657                        if (((instr & 0xf0000000) == 0xf0000000)) {
56658                          UnallocatedA32(instr);
56659                          return;
56660                        }
56661                        Condition condition((instr >> 28) & 0xf);
56662                        unsigned rd = (instr >> 12) & 0xf;
56663                        unsigned rn = (instr >> 16) & 0xf;
56664                        unsigned rm = instr & 0xf;
56665                        // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56666                        adc(condition,
56667                            Best,
56668                            Register(rd),
56669                            Register(rn),
56670                            Operand(Register(rm), RRX));
56671                        break;
56672                      }
56673                      default: {
56674                        if (((instr & 0xf0000000) == 0xf0000000) ||
56675                            ((instr & 0xfe0) == 0x60)) {
56676                          UnallocatedA32(instr);
56677                          return;
56678                        }
56679                        Condition condition((instr >> 28) & 0xf);
56680                        unsigned rd = (instr >> 12) & 0xf;
56681                        unsigned rn = (instr >> 16) & 0xf;
56682                        unsigned rm = instr & 0xf;
56683                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56684                                                            (instr >> 7) &
56685                                                                0x1f);
56686                        // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56687                        adc(condition,
56688                            Best,
56689                            Register(rd),
56690                            Register(rn),
56691                            Operand(Register(rm),
56692                                    shift_operand.GetType(),
56693                                    shift_operand.GetAmount()));
56694                        break;
56695                      }
56696                    }
56697                    break;
56698                  }
56699                  case 0x00400000: {
56700                    // 0x00e00000
56701                    switch (instr & 0x00000fe0) {
56702                      case 0x00000060: {
56703                        // 0x00e00060
56704                        if (((instr & 0xf0000000) == 0xf0000000)) {
56705                          UnallocatedA32(instr);
56706                          return;
56707                        }
56708                        Condition condition((instr >> 28) & 0xf);
56709                        unsigned rd = (instr >> 12) & 0xf;
56710                        unsigned rn = (instr >> 16) & 0xf;
56711                        unsigned rm = instr & 0xf;
56712                        // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56713                        rsc(condition,
56714                            Register(rd),
56715                            Register(rn),
56716                            Operand(Register(rm), RRX));
56717                        break;
56718                      }
56719                      default: {
56720                        if (((instr & 0xf0000000) == 0xf0000000) ||
56721                            ((instr & 0xfe0) == 0x60)) {
56722                          UnallocatedA32(instr);
56723                          return;
56724                        }
56725                        Condition condition((instr >> 28) & 0xf);
56726                        unsigned rd = (instr >> 12) & 0xf;
56727                        unsigned rn = (instr >> 16) & 0xf;
56728                        unsigned rm = instr & 0xf;
56729                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56730                                                            (instr >> 7) &
56731                                                                0x1f);
56732                        // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56733                        rsc(condition,
56734                            Register(rd),
56735                            Register(rn),
56736                            Operand(Register(rm),
56737                                    shift_operand.GetType(),
56738                                    shift_operand.GetAmount()));
56739                        break;
56740                      }
56741                    }
56742                    break;
56743                  }
56744                }
56745                break;
56746              }
56747              case 0x01000000: {
56748                // 0x01000000
56749                switch (instr & 0x000000e0) {
56750                  case 0x00000000: {
56751                    // 0x01000000
56752                    switch (instr & 0x00000200) {
56753                      case 0x00000000: {
56754                        // 0x01000000
56755                        if (((instr & 0xf0000000) == 0xf0000000)) {
56756                          UnallocatedA32(instr);
56757                          return;
56758                        }
56759                        Condition condition((instr >> 28) & 0xf);
56760                        unsigned rd = (instr >> 12) & 0xf;
56761                        unsigned spec_reg = (instr >> 22) & 0x1;
56762                        // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1
56763                        mrs(condition, Register(rd), SpecialRegister(spec_reg));
56764                        if (((instr & 0xfbf0fff) != 0x10f0000)) {
56765                          UnpredictableA32(instr);
56766                        }
56767                        break;
56768                      }
56769                      case 0x00000200: {
56770                        // 0x01000200
56771                        if (((instr & 0xf0000000) == 0xf0000000)) {
56772                          UnallocatedA32(instr);
56773                          return;
56774                        }
56775                        UnimplementedA32("MRS", instr);
56776                        break;
56777                      }
56778                    }
56779                    break;
56780                  }
56781                  case 0x00000040: {
56782                    // 0x01000040
56783                    switch (instr & 0x00400200) {
56784                      case 0x00000000: {
56785                        // 0x01000040
56786                        if (((instr & 0xf0000000) == 0xf0000000)) {
56787                          UnallocatedA32(instr);
56788                          return;
56789                        }
56790                        unsigned rd = (instr >> 12) & 0xf;
56791                        unsigned rn = (instr >> 16) & 0xf;
56792                        unsigned rm = instr & 0xf;
56793                        // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1
56794                        crc32b(al, Register(rd), Register(rn), Register(rm));
56795                        if (((instr & 0xff00ff0) != 0x1000040)) {
56796                          UnpredictableA32(instr);
56797                        }
56798                        break;
56799                      }
56800                      case 0x00000200: {
56801                        // 0x01000240
56802                        if (((instr & 0xf0000000) == 0xf0000000)) {
56803                          UnallocatedA32(instr);
56804                          return;
56805                        }
56806                        unsigned rd = (instr >> 12) & 0xf;
56807                        unsigned rn = (instr >> 16) & 0xf;
56808                        unsigned rm = instr & 0xf;
56809                        // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1
56810                        crc32cb(al, Register(rd), Register(rn), Register(rm));
56811                        if (((instr & 0xff00ff0) != 0x1000240)) {
56812                          UnpredictableA32(instr);
56813                        }
56814                        break;
56815                      }
56816                      case 0x00400000: {
56817                        // 0x01400040
56818                        if (((instr & 0xf0000000) == 0xf0000000)) {
56819                          UnallocatedA32(instr);
56820                          return;
56821                        }
56822                        unsigned rd = (instr >> 12) & 0xf;
56823                        unsigned rn = (instr >> 16) & 0xf;
56824                        unsigned rm = instr & 0xf;
56825                        // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1
56826                        crc32w(al, Register(rd), Register(rn), Register(rm));
56827                        if (((instr & 0xff00ff0) != 0x1400040)) {
56828                          UnpredictableA32(instr);
56829                        }
56830                        break;
56831                      }
56832                      case 0x00400200: {
56833                        // 0x01400240
56834                        if (((instr & 0xf0000000) == 0xf0000000)) {
56835                          UnallocatedA32(instr);
56836                          return;
56837                        }
56838                        unsigned rd = (instr >> 12) & 0xf;
56839                        unsigned rn = (instr >> 16) & 0xf;
56840                        unsigned rm = instr & 0xf;
56841                        // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1
56842                        crc32cw(al, Register(rd), Register(rn), Register(rm));
56843                        if (((instr & 0xff00ff0) != 0x1400240)) {
56844                          UnpredictableA32(instr);
56845                        }
56846                        break;
56847                      }
56848                    }
56849                    break;
56850                  }
56851                  case 0x00000080: {
56852                    // 0x01000080
56853                    switch (instr & 0x00400000) {
56854                      case 0x00000000: {
56855                        // 0x01000080
56856                        if (((instr & 0xf0000000) == 0xf0000000)) {
56857                          UnallocatedA32(instr);
56858                          return;
56859                        }
56860                        Condition condition((instr >> 28) & 0xf);
56861                        unsigned rd = (instr >> 16) & 0xf;
56862                        unsigned rn = instr & 0xf;
56863                        unsigned rm = (instr >> 8) & 0xf;
56864                        unsigned ra = (instr >> 12) & 0xf;
56865                        // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56866                        smlabb(condition,
56867                               Register(rd),
56868                               Register(rn),
56869                               Register(rm),
56870                               Register(ra));
56871                        break;
56872                      }
56873                      case 0x00400000: {
56874                        // 0x01400080
56875                        if (((instr & 0xf0000000) == 0xf0000000)) {
56876                          UnallocatedA32(instr);
56877                          return;
56878                        }
56879                        Condition condition((instr >> 28) & 0xf);
56880                        unsigned rdlo = (instr >> 12) & 0xf;
56881                        unsigned rdhi = (instr >> 16) & 0xf;
56882                        unsigned rn = instr & 0xf;
56883                        unsigned rm = (instr >> 8) & 0xf;
56884                        // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56885                        smlalbb(condition,
56886                                Register(rdlo),
56887                                Register(rdhi),
56888                                Register(rn),
56889                                Register(rm));
56890                        break;
56891                      }
56892                    }
56893                    break;
56894                  }
56895                  case 0x000000a0: {
56896                    // 0x010000a0
56897                    switch (instr & 0x00400000) {
56898                      case 0x00000000: {
56899                        // 0x010000a0
56900                        if (((instr & 0xf0000000) == 0xf0000000)) {
56901                          UnallocatedA32(instr);
56902                          return;
56903                        }
56904                        Condition condition((instr >> 28) & 0xf);
56905                        unsigned rd = (instr >> 16) & 0xf;
56906                        unsigned rn = instr & 0xf;
56907                        unsigned rm = (instr >> 8) & 0xf;
56908                        unsigned ra = (instr >> 12) & 0xf;
56909                        // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56910                        smlatb(condition,
56911                               Register(rd),
56912                               Register(rn),
56913                               Register(rm),
56914                               Register(ra));
56915                        break;
56916                      }
56917                      case 0x00400000: {
56918                        // 0x014000a0
56919                        if (((instr & 0xf0000000) == 0xf0000000)) {
56920                          UnallocatedA32(instr);
56921                          return;
56922                        }
56923                        Condition condition((instr >> 28) & 0xf);
56924                        unsigned rdlo = (instr >> 12) & 0xf;
56925                        unsigned rdhi = (instr >> 16) & 0xf;
56926                        unsigned rn = instr & 0xf;
56927                        unsigned rm = (instr >> 8) & 0xf;
56928                        // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56929                        smlaltb(condition,
56930                                Register(rdlo),
56931                                Register(rdhi),
56932                                Register(rn),
56933                                Register(rm));
56934                        break;
56935                      }
56936                    }
56937                    break;
56938                  }
56939                  case 0x000000c0: {
56940                    // 0x010000c0
56941                    switch (instr & 0x00400000) {
56942                      case 0x00000000: {
56943                        // 0x010000c0
56944                        if (((instr & 0xf0000000) == 0xf0000000)) {
56945                          UnallocatedA32(instr);
56946                          return;
56947                        }
56948                        Condition condition((instr >> 28) & 0xf);
56949                        unsigned rd = (instr >> 16) & 0xf;
56950                        unsigned rn = instr & 0xf;
56951                        unsigned rm = (instr >> 8) & 0xf;
56952                        unsigned ra = (instr >> 12) & 0xf;
56953                        // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56954                        smlabt(condition,
56955                               Register(rd),
56956                               Register(rn),
56957                               Register(rm),
56958                               Register(ra));
56959                        break;
56960                      }
56961                      case 0x00400000: {
56962                        // 0x014000c0
56963                        if (((instr & 0xf0000000) == 0xf0000000)) {
56964                          UnallocatedA32(instr);
56965                          return;
56966                        }
56967                        Condition condition((instr >> 28) & 0xf);
56968                        unsigned rdlo = (instr >> 12) & 0xf;
56969                        unsigned rdhi = (instr >> 16) & 0xf;
56970                        unsigned rn = instr & 0xf;
56971                        unsigned rm = (instr >> 8) & 0xf;
56972                        // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56973                        smlalbt(condition,
56974                                Register(rdlo),
56975                                Register(rdhi),
56976                                Register(rn),
56977                                Register(rm));
56978                        break;
56979                      }
56980                    }
56981                    break;
56982                  }
56983                  case 0x000000e0: {
56984                    // 0x010000e0
56985                    switch (instr & 0x00400000) {
56986                      case 0x00000000: {
56987                        // 0x010000e0
56988                        if (((instr & 0xf0000000) == 0xf0000000)) {
56989                          UnallocatedA32(instr);
56990                          return;
56991                        }
56992                        Condition condition((instr >> 28) & 0xf);
56993                        unsigned rd = (instr >> 16) & 0xf;
56994                        unsigned rn = instr & 0xf;
56995                        unsigned rm = (instr >> 8) & 0xf;
56996                        unsigned ra = (instr >> 12) & 0xf;
56997                        // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56998                        smlatt(condition,
56999                               Register(rd),
57000                               Register(rn),
57001                               Register(rm),
57002                               Register(ra));
57003                        break;
57004                      }
57005                      case 0x00400000: {
57006                        // 0x014000e0
57007                        if (((instr & 0xf0000000) == 0xf0000000)) {
57008                          UnallocatedA32(instr);
57009                          return;
57010                        }
57011                        Condition condition((instr >> 28) & 0xf);
57012                        unsigned rdlo = (instr >> 12) & 0xf;
57013                        unsigned rdhi = (instr >> 16) & 0xf;
57014                        unsigned rn = instr & 0xf;
57015                        unsigned rm = (instr >> 8) & 0xf;
57016                        // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57017                        smlaltt(condition,
57018                                Register(rdlo),
57019                                Register(rdhi),
57020                                Register(rn),
57021                                Register(rm));
57022                        break;
57023                      }
57024                    }
57025                    break;
57026                  }
57027                  default:
57028                    UnallocatedA32(instr);
57029                    break;
57030                }
57031                break;
57032              }
57033              case 0x01200000: {
57034                // 0x01200000
57035                switch (instr & 0x000000e0) {
57036                  case 0x00000000: {
57037                    // 0x01200000
57038                    switch (instr & 0x00000200) {
57039                      case 0x00000000: {
57040                        // 0x01200000
57041                        if (((instr & 0xf0000000) == 0xf0000000)) {
57042                          UnallocatedA32(instr);
57043                          return;
57044                        }
57045                        Condition condition((instr >> 28) & 0xf);
57046                        unsigned spec_reg =
57047                            ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
57048                        unsigned rn = instr & 0xf;
57049                        // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1
57050                        msr(condition,
57051                            MaskedSpecialRegister(spec_reg),
57052                            Register(rn));
57053                        if (((instr & 0xfb0fff0) != 0x120f000)) {
57054                          UnpredictableA32(instr);
57055                        }
57056                        break;
57057                      }
57058                      case 0x00000200: {
57059                        // 0x01200200
57060                        if (((instr & 0xf0000000) == 0xf0000000)) {
57061                          UnallocatedA32(instr);
57062                          return;
57063                        }
57064                        UnimplementedA32("MSR", instr);
57065                        break;
57066                      }
57067                    }
57068                    break;
57069                  }
57070                  case 0x00000020: {
57071                    // 0x01200020
57072                    if ((instr & 0x00400000) == 0x00000000) {
57073                      if (((instr & 0xf0000000) == 0xf0000000)) {
57074                        UnallocatedA32(instr);
57075                        return;
57076                      }
57077                      Condition condition((instr >> 28) & 0xf);
57078                      unsigned rm = instr & 0xf;
57079                      // BXJ{<c>}{<q>} <Rm> ; A1
57080                      bxj(condition, Register(rm));
57081                      if (((instr & 0xffffff0) != 0x12fff20)) {
57082                        UnpredictableA32(instr);
57083                      }
57084                    } else {
57085                      UnallocatedA32(instr);
57086                    }
57087                    break;
57088                  }
57089                  case 0x00000040: {
57090                    // 0x01200040
57091                    switch (instr & 0x00400200) {
57092                      case 0x00000000: {
57093                        // 0x01200040
57094                        if (((instr & 0xf0000000) == 0xf0000000)) {
57095                          UnallocatedA32(instr);
57096                          return;
57097                        }
57098                        unsigned rd = (instr >> 12) & 0xf;
57099                        unsigned rn = (instr >> 16) & 0xf;
57100                        unsigned rm = instr & 0xf;
57101                        // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1
57102                        crc32h(al, Register(rd), Register(rn), Register(rm));
57103                        if (((instr & 0xff00ff0) != 0x1200040)) {
57104                          UnpredictableA32(instr);
57105                        }
57106                        break;
57107                      }
57108                      case 0x00000200: {
57109                        // 0x01200240
57110                        if (((instr & 0xf0000000) == 0xf0000000)) {
57111                          UnallocatedA32(instr);
57112                          return;
57113                        }
57114                        unsigned rd = (instr >> 12) & 0xf;
57115                        unsigned rn = (instr >> 16) & 0xf;
57116                        unsigned rm = instr & 0xf;
57117                        // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1
57118                        crc32ch(al, Register(rd), Register(rn), Register(rm));
57119                        if (((instr & 0xff00ff0) != 0x1200240)) {
57120                          UnpredictableA32(instr);
57121                        }
57122                        break;
57123                      }
57124                      default:
57125                        UnallocatedA32(instr);
57126                        break;
57127                    }
57128                    break;
57129                  }
57130                  case 0x00000060: {
57131                    // 0x01200060
57132                    if ((instr & 0x00400000) == 0x00400000) {
57133                      if (((instr & 0xf0000000) == 0xf0000000)) {
57134                        UnallocatedA32(instr);
57135                        return;
57136                      }
57137                      UnimplementedA32("ERET", instr);
57138                    } else {
57139                      UnallocatedA32(instr);
57140                    }
57141                    break;
57142                  }
57143                  case 0x00000080: {
57144                    // 0x01200080
57145                    switch (instr & 0x00400000) {
57146                      case 0x00000000: {
57147                        // 0x01200080
57148                        if (((instr & 0xf0000000) == 0xf0000000)) {
57149                          UnallocatedA32(instr);
57150                          return;
57151                        }
57152                        Condition condition((instr >> 28) & 0xf);
57153                        unsigned rd = (instr >> 16) & 0xf;
57154                        unsigned rn = instr & 0xf;
57155                        unsigned rm = (instr >> 8) & 0xf;
57156                        unsigned ra = (instr >> 12) & 0xf;
57157                        // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57158                        smlawb(condition,
57159                               Register(rd),
57160                               Register(rn),
57161                               Register(rm),
57162                               Register(ra));
57163                        break;
57164                      }
57165                      case 0x00400000: {
57166                        // 0x01600080
57167                        if (((instr & 0xf0000000) == 0xf0000000)) {
57168                          UnallocatedA32(instr);
57169                          return;
57170                        }
57171                        Condition condition((instr >> 28) & 0xf);
57172                        unsigned rd = (instr >> 16) & 0xf;
57173                        unsigned rn = instr & 0xf;
57174                        unsigned rm = (instr >> 8) & 0xf;
57175                        // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57176                        smulbb(condition,
57177                               Register(rd),
57178                               Register(rn),
57179                               Register(rm));
57180                        if (((instr & 0xff0f0f0) != 0x1600080)) {
57181                          UnpredictableA32(instr);
57182                        }
57183                        break;
57184                      }
57185                    }
57186                    break;
57187                  }
57188                  case 0x000000a0: {
57189                    // 0x012000a0
57190                    switch (instr & 0x00400000) {
57191                      case 0x00000000: {
57192                        // 0x012000a0
57193                        if (((instr & 0xf0000000) == 0xf0000000)) {
57194                          UnallocatedA32(instr);
57195                          return;
57196                        }
57197                        Condition condition((instr >> 28) & 0xf);
57198                        unsigned rd = (instr >> 16) & 0xf;
57199                        unsigned rn = instr & 0xf;
57200                        unsigned rm = (instr >> 8) & 0xf;
57201                        // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57202                        smulwb(condition,
57203                               Register(rd),
57204                               Register(rn),
57205                               Register(rm));
57206                        if (((instr & 0xff0f0f0) != 0x12000a0)) {
57207                          UnpredictableA32(instr);
57208                        }
57209                        break;
57210                      }
57211                      case 0x00400000: {
57212                        // 0x016000a0
57213                        if (((instr & 0xf0000000) == 0xf0000000)) {
57214                          UnallocatedA32(instr);
57215                          return;
57216                        }
57217                        Condition condition((instr >> 28) & 0xf);
57218                        unsigned rd = (instr >> 16) & 0xf;
57219                        unsigned rn = instr & 0xf;
57220                        unsigned rm = (instr >> 8) & 0xf;
57221                        // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57222                        smultb(condition,
57223                               Register(rd),
57224                               Register(rn),
57225                               Register(rm));
57226                        if (((instr & 0xff0f0f0) != 0x16000a0)) {
57227                          UnpredictableA32(instr);
57228                        }
57229                        break;
57230                      }
57231                    }
57232                    break;
57233                  }
57234                  case 0x000000c0: {
57235                    // 0x012000c0
57236                    switch (instr & 0x00400000) {
57237                      case 0x00000000: {
57238                        // 0x012000c0
57239                        if (((instr & 0xf0000000) == 0xf0000000)) {
57240                          UnallocatedA32(instr);
57241                          return;
57242                        }
57243                        Condition condition((instr >> 28) & 0xf);
57244                        unsigned rd = (instr >> 16) & 0xf;
57245                        unsigned rn = instr & 0xf;
57246                        unsigned rm = (instr >> 8) & 0xf;
57247                        unsigned ra = (instr >> 12) & 0xf;
57248                        // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57249                        smlawt(condition,
57250                               Register(rd),
57251                               Register(rn),
57252                               Register(rm),
57253                               Register(ra));
57254                        break;
57255                      }
57256                      case 0x00400000: {
57257                        // 0x016000c0
57258                        if (((instr & 0xf0000000) == 0xf0000000)) {
57259                          UnallocatedA32(instr);
57260                          return;
57261                        }
57262                        Condition condition((instr >> 28) & 0xf);
57263                        unsigned rd = (instr >> 16) & 0xf;
57264                        unsigned rn = instr & 0xf;
57265                        unsigned rm = (instr >> 8) & 0xf;
57266                        // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57267                        smulbt(condition,
57268                               Register(rd),
57269                               Register(rn),
57270                               Register(rm));
57271                        if (((instr & 0xff0f0f0) != 0x16000c0)) {
57272                          UnpredictableA32(instr);
57273                        }
57274                        break;
57275                      }
57276                    }
57277                    break;
57278                  }
57279                  case 0x000000e0: {
57280                    // 0x012000e0
57281                    switch (instr & 0x00400000) {
57282                      case 0x00000000: {
57283                        // 0x012000e0
57284                        if (((instr & 0xf0000000) == 0xf0000000)) {
57285                          UnallocatedA32(instr);
57286                          return;
57287                        }
57288                        Condition condition((instr >> 28) & 0xf);
57289                        unsigned rd = (instr >> 16) & 0xf;
57290                        unsigned rn = instr & 0xf;
57291                        unsigned rm = (instr >> 8) & 0xf;
57292                        // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57293                        smulwt(condition,
57294                               Register(rd),
57295                               Register(rn),
57296                               Register(rm));
57297                        if (((instr & 0xff0f0f0) != 0x12000e0)) {
57298                          UnpredictableA32(instr);
57299                        }
57300                        break;
57301                      }
57302                      case 0x00400000: {
57303                        // 0x016000e0
57304                        if (((instr & 0xf0000000) == 0xf0000000)) {
57305                          UnallocatedA32(instr);
57306                          return;
57307                        }
57308                        Condition condition((instr >> 28) & 0xf);
57309                        unsigned rd = (instr >> 16) & 0xf;
57310                        unsigned rn = instr & 0xf;
57311                        unsigned rm = (instr >> 8) & 0xf;
57312                        // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57313                        smultt(condition,
57314                               Register(rd),
57315                               Register(rn),
57316                               Register(rm));
57317                        if (((instr & 0xff0f0f0) != 0x16000e0)) {
57318                          UnpredictableA32(instr);
57319                        }
57320                        break;
57321                      }
57322                    }
57323                    break;
57324                  }
57325                }
57326                break;
57327              }
57328              case 0x01800000: {
57329                // 0x01800000
57330                switch (instr & 0x00400000) {
57331                  case 0x00000000: {
57332                    // 0x01800000
57333                    switch (instr & 0x00000fe0) {
57334                      case 0x00000060: {
57335                        // 0x01800060
57336                        if (((instr & 0xf0000000) == 0xf0000000)) {
57337                          UnallocatedA32(instr);
57338                          return;
57339                        }
57340                        Condition condition((instr >> 28) & 0xf);
57341                        unsigned rd = (instr >> 12) & 0xf;
57342                        unsigned rn = (instr >> 16) & 0xf;
57343                        unsigned rm = instr & 0xf;
57344                        // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
57345                        orr(condition,
57346                            Best,
57347                            Register(rd),
57348                            Register(rn),
57349                            Operand(Register(rm), RRX));
57350                        break;
57351                      }
57352                      default: {
57353                        if (((instr & 0xf0000000) == 0xf0000000) ||
57354                            ((instr & 0xfe0) == 0x60)) {
57355                          UnallocatedA32(instr);
57356                          return;
57357                        }
57358                        Condition condition((instr >> 28) & 0xf);
57359                        unsigned rd = (instr >> 12) & 0xf;
57360                        unsigned rn = (instr >> 16) & 0xf;
57361                        unsigned rm = instr & 0xf;
57362                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
57363                                                            (instr >> 7) &
57364                                                                0x1f);
57365                        // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
57366                        orr(condition,
57367                            Best,
57368                            Register(rd),
57369                            Register(rn),
57370                            Operand(Register(rm),
57371                                    shift_operand.GetType(),
57372                                    shift_operand.GetAmount()));
57373                        break;
57374                      }
57375                    }
57376                    break;
57377                  }
57378                  case 0x00400000: {
57379                    // 0x01c00000
57380                    switch (instr & 0x00000fe0) {
57381                      case 0x00000060: {
57382                        // 0x01c00060
57383                        if (((instr & 0xf0000000) == 0xf0000000)) {
57384                          UnallocatedA32(instr);
57385                          return;
57386                        }
57387                        Condition condition((instr >> 28) & 0xf);
57388                        unsigned rd = (instr >> 12) & 0xf;
57389                        unsigned rn = (instr >> 16) & 0xf;
57390                        unsigned rm = instr & 0xf;
57391                        // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
57392                        bic(condition,
57393                            Best,
57394                            Register(rd),
57395                            Register(rn),
57396                            Operand(Register(rm), RRX));
57397                        break;
57398                      }
57399                      default: {
57400                        if (((instr & 0xf0000000) == 0xf0000000) ||
57401                            ((instr & 0xfe0) == 0x60)) {
57402                          UnallocatedA32(instr);
57403                          return;
57404                        }
57405                        Condition condition((instr >> 28) & 0xf);
57406                        unsigned rd = (instr >> 12) & 0xf;
57407                        unsigned rn = (instr >> 16) & 0xf;
57408                        unsigned rm = instr & 0xf;
57409                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
57410                                                            (instr >> 7) &
57411                                                                0x1f);
57412                        // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
57413                        bic(condition,
57414                            Best,
57415                            Register(rd),
57416                            Register(rn),
57417                            Operand(Register(rm),
57418                                    shift_operand.GetType(),
57419                                    shift_operand.GetAmount()));
57420                        break;
57421                      }
57422                    }
57423                    break;
57424                  }
57425                }
57426                break;
57427              }
57428              case 0x01a00000: {
57429                // 0x01a00000
57430                switch (instr & 0x00400000) {
57431                  case 0x00000000: {
57432                    // 0x01a00000
57433                    switch (instr & 0x00000fe0) {
57434                      case 0x00000060: {
57435                        // 0x01a00060
57436                        if (((instr & 0xf0000000) == 0xf0000000)) {
57437                          UnallocatedA32(instr);
57438                          return;
57439                        }
57440                        if (((instr & 0xf0000000) != 0xf0000000)) {
57441                          Condition condition((instr >> 28) & 0xf);
57442                          unsigned rd = (instr >> 12) & 0xf;
57443                          unsigned rm = instr & 0xf;
57444                          // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1
57445                          rrx(condition, Register(rd), Register(rm));
57446                          if (((instr & 0xfff0ff0) != 0x1a00060)) {
57447                            UnpredictableA32(instr);
57448                          }
57449                          return;
57450                        }
57451                        Condition condition((instr >> 28) & 0xf);
57452                        unsigned rd = (instr >> 12) & 0xf;
57453                        unsigned rm = instr & 0xf;
57454                        // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
57455                        mov(condition,
57456                            Best,
57457                            Register(rd),
57458                            Operand(Register(rm), RRX));
57459                        if (((instr & 0xfff0ff0) != 0x1a00060)) {
57460                          UnpredictableA32(instr);
57461                        }
57462                        break;
57463                      }
57464                      default: {
57465                        if (((instr & 0xf0000000) == 0xf0000000) ||
57466                            ((instr & 0xfe0) == 0x60)) {
57467                          UnallocatedA32(instr);
57468                          return;
57469                        }
57470                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
57471                             Uint32(0x2)) &&
57472                            ((instr & 0xf0000000) != 0xf0000000)) {
57473                          Condition condition((instr >> 28) & 0xf);
57474                          unsigned rd = (instr >> 12) & 0xf;
57475                          unsigned rm = instr & 0xf;
57476                          uint32_t amount = (instr >> 7) & 0x1f;
57477                          if (amount == 0) amount = 32;
57478                          // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
57479                          asr(condition,
57480                              Best,
57481                              Register(rd),
57482                              Register(rm),
57483                              amount);
57484                          if (((instr & 0xfff0070) != 0x1a00040)) {
57485                            UnpredictableA32(instr);
57486                          }
57487                          return;
57488                        }
57489                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
57490                             Uint32(0x0)) &&
57491                            ((instr & 0xf0000000) != 0xf0000000) &&
57492                            ((instr & 0x00000f80) != 0x00000000)) {
57493                          Condition condition((instr >> 28) & 0xf);
57494                          unsigned rd = (instr >> 12) & 0xf;
57495                          unsigned rm = instr & 0xf;
57496                          uint32_t amount = (instr >> 7) & 0x1f;
57497                          // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
57498                          lsl(condition,
57499                              Best,
57500                              Register(rd),
57501                              Register(rm),
57502                              amount);
57503                          if (((instr & 0xfff0070) != 0x1a00000)) {
57504                            UnpredictableA32(instr);
57505                          }
57506                          return;
57507                        }
57508                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
57509                             Uint32(0x1)) &&
57510                            ((instr & 0xf0000000) != 0xf0000000)) {
57511                          Condition condition((instr >> 28) & 0xf);
57512                          unsigned rd = (instr >> 12) & 0xf;
57513                          unsigned rm = instr & 0xf;
57514                          uint32_t amount = (instr >> 7) & 0x1f;
57515                          if (amount == 0) amount = 32;
57516                          // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
57517                          lsr(condition,
57518                              Best,
57519                              Register(rd),
57520                              Register(rm),
57521                              amount);
57522                          if (((instr & 0xfff0070) != 0x1a00020)) {
57523                            UnpredictableA32(instr);
57524                          }
57525                          return;
57526                        }
57527                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
57528                             Uint32(0x3)) &&
57529                            ((instr & 0xf0000000) != 0xf0000000) &&
57530                            ((instr & 0x00000f80) != 0x00000000)) {
57531                          Condition condition((instr >> 28) & 0xf);
57532                          unsigned rd = (instr >> 12) & 0xf;
57533                          unsigned rm = instr & 0xf;
57534                          uint32_t amount = (instr >> 7) & 0x1f;
57535                          // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
57536                          ror(condition,
57537                              Best,
57538                              Register(rd),
57539                              Register(rm),
57540                              amount);
57541                          if (((instr & 0xfff0070) != 0x1a00060)) {
57542                            UnpredictableA32(instr);
57543                          }
57544                          return;
57545                        }
57546                        Condition condition((instr >> 28) & 0xf);
57547                        unsigned rd = (instr >> 12) & 0xf;
57548                        unsigned rm = instr & 0xf;
57549                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
57550                                                            (instr >> 7) &
57551                                                                0x1f);
57552                        // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
57553                        mov(condition,
57554                            Best,
57555                            Register(rd),
57556                            Operand(Register(rm),
57557                                    shift_operand.GetType(),
57558                                    shift_operand.GetAmount()));
57559                        if (((instr & 0xfff0010) != 0x1a00000)) {
57560                          UnpredictableA32(instr);
57561                        }
57562                        break;
57563                      }
57564                    }
57565                    break;
57566                  }
57567                  case 0x00400000: {
57568                    // 0x01e00000
57569                    switch (instr & 0x00000fe0) {
57570                      case 0x00000060: {
57571                        // 0x01e00060
57572                        if (((instr & 0xf0000000) == 0xf0000000)) {
57573                          UnallocatedA32(instr);
57574                          return;
57575                        }
57576                        Condition condition((instr >> 28) & 0xf);
57577                        unsigned rd = (instr >> 12) & 0xf;
57578                        unsigned rm = instr & 0xf;
57579                        // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
57580                        mvn(condition,
57581                            Best,
57582                            Register(rd),
57583                            Operand(Register(rm), RRX));
57584                        if (((instr & 0xfff0ff0) != 0x1e00060)) {
57585                          UnpredictableA32(instr);
57586                        }
57587                        break;
57588                      }
57589                      default: {
57590                        if (((instr & 0xf0000000) == 0xf0000000) ||
57591                            ((instr & 0xfe0) == 0x60)) {
57592                          UnallocatedA32(instr);
57593                          return;
57594                        }
57595                        Condition condition((instr >> 28) & 0xf);
57596                        unsigned rd = (instr >> 12) & 0xf;
57597                        unsigned rm = instr & 0xf;
57598                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
57599                                                            (instr >> 7) &
57600                                                                0x1f);
57601                        // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
57602                        mvn(condition,
57603                            Best,
57604                            Register(rd),
57605                            Operand(Register(rm),
57606                                    shift_operand.GetType(),
57607                                    shift_operand.GetAmount()));
57608                        if (((instr & 0xfff0010) != 0x1e00000)) {
57609                          UnpredictableA32(instr);
57610                        }
57611                        break;
57612                      }
57613                    }
57614                    break;
57615                  }
57616                }
57617                break;
57618              }
57619            }
57620            break;
57621          }
57622          case 0x00000010: {
57623            // 0x00000010
57624            switch (instr & 0x00400080) {
57625              case 0x00000000: {
57626                // 0x00000010
57627                switch (instr & 0x01a00000) {
57628                  case 0x00000000: {
57629                    // 0x00000010
57630                    if (((instr & 0xf0000000) == 0xf0000000)) {
57631                      UnallocatedA32(instr);
57632                      return;
57633                    }
57634                    Condition condition((instr >> 28) & 0xf);
57635                    unsigned rd = (instr >> 12) & 0xf;
57636                    unsigned rn = (instr >> 16) & 0xf;
57637                    unsigned rm = instr & 0xf;
57638                    Shift shift((instr >> 5) & 0x3);
57639                    unsigned rs = (instr >> 8) & 0xf;
57640                    // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57641                    and_(condition,
57642                         Best,
57643                         Register(rd),
57644                         Register(rn),
57645                         Operand(Register(rm), shift.GetType(), Register(rs)));
57646                    break;
57647                  }
57648                  case 0x00200000: {
57649                    // 0x00200010
57650                    if (((instr & 0xf0000000) == 0xf0000000)) {
57651                      UnallocatedA32(instr);
57652                      return;
57653                    }
57654                    Condition condition((instr >> 28) & 0xf);
57655                    unsigned rd = (instr >> 12) & 0xf;
57656                    unsigned rn = (instr >> 16) & 0xf;
57657                    unsigned rm = instr & 0xf;
57658                    Shift shift((instr >> 5) & 0x3);
57659                    unsigned rs = (instr >> 8) & 0xf;
57660                    // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57661                    eor(condition,
57662                        Best,
57663                        Register(rd),
57664                        Register(rn),
57665                        Operand(Register(rm), shift.GetType(), Register(rs)));
57666                    break;
57667                  }
57668                  case 0x00800000: {
57669                    // 0x00800010
57670                    if (((instr & 0xf0000000) == 0xf0000000)) {
57671                      UnallocatedA32(instr);
57672                      return;
57673                    }
57674                    Condition condition((instr >> 28) & 0xf);
57675                    unsigned rd = (instr >> 12) & 0xf;
57676                    unsigned rn = (instr >> 16) & 0xf;
57677                    unsigned rm = instr & 0xf;
57678                    Shift shift((instr >> 5) & 0x3);
57679                    unsigned rs = (instr >> 8) & 0xf;
57680                    // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57681                    add(condition,
57682                        Best,
57683                        Register(rd),
57684                        Register(rn),
57685                        Operand(Register(rm), shift.GetType(), Register(rs)));
57686                    break;
57687                  }
57688                  case 0x00a00000: {
57689                    // 0x00a00010
57690                    if (((instr & 0xf0000000) == 0xf0000000)) {
57691                      UnallocatedA32(instr);
57692                      return;
57693                    }
57694                    Condition condition((instr >> 28) & 0xf);
57695                    unsigned rd = (instr >> 12) & 0xf;
57696                    unsigned rn = (instr >> 16) & 0xf;
57697                    unsigned rm = instr & 0xf;
57698                    Shift shift((instr >> 5) & 0x3);
57699                    unsigned rs = (instr >> 8) & 0xf;
57700                    // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57701                    adc(condition,
57702                        Best,
57703                        Register(rd),
57704                        Register(rn),
57705                        Operand(Register(rm), shift.GetType(), Register(rs)));
57706                    break;
57707                  }
57708                  case 0x01000000: {
57709                    // 0x01000010
57710                    switch (instr & 0x00000060) {
57711                      case 0x00000040: {
57712                        // 0x01000050
57713                        if (((instr & 0xf0000000) == 0xf0000000)) {
57714                          UnallocatedA32(instr);
57715                          return;
57716                        }
57717                        Condition condition((instr >> 28) & 0xf);
57718                        unsigned rd = (instr >> 12) & 0xf;
57719                        unsigned rm = instr & 0xf;
57720                        unsigned rn = (instr >> 16) & 0xf;
57721                        // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57722                        qadd(condition,
57723                             Register(rd),
57724                             Register(rm),
57725                             Register(rn));
57726                        if (((instr & 0xff00ff0) != 0x1000050)) {
57727                          UnpredictableA32(instr);
57728                        }
57729                        break;
57730                      }
57731                      case 0x00000060: {
57732                        // 0x01000070
57733                        if (((instr & 0xf0000000) == 0xf0000000)) {
57734                          UnallocatedA32(instr);
57735                          return;
57736                        }
57737                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57738                        // HLT{<q>} {#}<imm> ; A1
57739                        hlt(al, imm);
57740                        break;
57741                      }
57742                      default:
57743                        UnallocatedA32(instr);
57744                        break;
57745                    }
57746                    break;
57747                  }
57748                  case 0x01200000: {
57749                    // 0x01200010
57750                    switch (instr & 0x00000060) {
57751                      case 0x00000000: {
57752                        // 0x01200010
57753                        if (((instr & 0xf0000000) == 0xf0000000)) {
57754                          UnallocatedA32(instr);
57755                          return;
57756                        }
57757                        Condition condition((instr >> 28) & 0xf);
57758                        unsigned rm = instr & 0xf;
57759                        // BX{<c>}{<q>} <Rm> ; A1
57760                        bx(condition, Register(rm));
57761                        if (((instr & 0xffffff0) != 0x12fff10)) {
57762                          UnpredictableA32(instr);
57763                        }
57764                        break;
57765                      }
57766                      case 0x00000020: {
57767                        // 0x01200030
57768                        if (((instr & 0xf0000000) == 0xf0000000)) {
57769                          UnallocatedA32(instr);
57770                          return;
57771                        }
57772                        Condition condition((instr >> 28) & 0xf);
57773                        unsigned rm = instr & 0xf;
57774                        // BLX{<c>}{<q>} <Rm> ; A1
57775                        blx(condition, Register(rm));
57776                        if (((instr & 0xffffff0) != 0x12fff30)) {
57777                          UnpredictableA32(instr);
57778                        }
57779                        break;
57780                      }
57781                      case 0x00000040: {
57782                        // 0x01200050
57783                        if (((instr & 0xf0000000) == 0xf0000000)) {
57784                          UnallocatedA32(instr);
57785                          return;
57786                        }
57787                        Condition condition((instr >> 28) & 0xf);
57788                        unsigned rd = (instr >> 12) & 0xf;
57789                        unsigned rm = instr & 0xf;
57790                        unsigned rn = (instr >> 16) & 0xf;
57791                        // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57792                        qsub(condition,
57793                             Register(rd),
57794                             Register(rm),
57795                             Register(rn));
57796                        if (((instr & 0xff00ff0) != 0x1200050)) {
57797                          UnpredictableA32(instr);
57798                        }
57799                        break;
57800                      }
57801                      case 0x00000060: {
57802                        // 0x01200070
57803                        if (((instr & 0xf0000000) == 0xf0000000)) {
57804                          UnallocatedA32(instr);
57805                          return;
57806                        }
57807                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57808                        // BKPT{<q>} {#}<imm> ; A1
57809                        bkpt(al, imm);
57810                        break;
57811                      }
57812                    }
57813                    break;
57814                  }
57815                  case 0x01800000: {
57816                    // 0x01800010
57817                    if (((instr & 0xf0000000) == 0xf0000000)) {
57818                      UnallocatedA32(instr);
57819                      return;
57820                    }
57821                    Condition condition((instr >> 28) & 0xf);
57822                    unsigned rd = (instr >> 12) & 0xf;
57823                    unsigned rn = (instr >> 16) & 0xf;
57824                    unsigned rm = instr & 0xf;
57825                    Shift shift((instr >> 5) & 0x3);
57826                    unsigned rs = (instr >> 8) & 0xf;
57827                    // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57828                    orr(condition,
57829                        Best,
57830                        Register(rd),
57831                        Register(rn),
57832                        Operand(Register(rm), shift.GetType(), Register(rs)));
57833                    break;
57834                  }
57835                  case 0x01a00000: {
57836                    // 0x01a00010
57837                    if (((instr & 0xf0000000) == 0xf0000000)) {
57838                      UnallocatedA32(instr);
57839                      return;
57840                    }
57841                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
57842                        ((instr & 0xf0000000) != 0xf0000000)) {
57843                      Condition condition((instr >> 28) & 0xf);
57844                      unsigned rd = (instr >> 12) & 0xf;
57845                      unsigned rm = instr & 0xf;
57846                      unsigned rs = (instr >> 8) & 0xf;
57847                      // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57848                      asr(condition,
57849                          Best,
57850                          Register(rd),
57851                          Register(rm),
57852                          Register(rs));
57853                      if (((instr & 0xfff00f0) != 0x1a00050)) {
57854                        UnpredictableA32(instr);
57855                      }
57856                      return;
57857                    }
57858                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
57859                        ((instr & 0xf0000000) != 0xf0000000)) {
57860                      Condition condition((instr >> 28) & 0xf);
57861                      unsigned rd = (instr >> 12) & 0xf;
57862                      unsigned rm = instr & 0xf;
57863                      unsigned rs = (instr >> 8) & 0xf;
57864                      // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57865                      lsl(condition,
57866                          Best,
57867                          Register(rd),
57868                          Register(rm),
57869                          Register(rs));
57870                      if (((instr & 0xfff00f0) != 0x1a00010)) {
57871                        UnpredictableA32(instr);
57872                      }
57873                      return;
57874                    }
57875                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
57876                        ((instr & 0xf0000000) != 0xf0000000)) {
57877                      Condition condition((instr >> 28) & 0xf);
57878                      unsigned rd = (instr >> 12) & 0xf;
57879                      unsigned rm = instr & 0xf;
57880                      unsigned rs = (instr >> 8) & 0xf;
57881                      // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57882                      lsr(condition,
57883                          Best,
57884                          Register(rd),
57885                          Register(rm),
57886                          Register(rs));
57887                      if (((instr & 0xfff00f0) != 0x1a00030)) {
57888                        UnpredictableA32(instr);
57889                      }
57890                      return;
57891                    }
57892                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
57893                        ((instr & 0xf0000000) != 0xf0000000)) {
57894                      Condition condition((instr >> 28) & 0xf);
57895                      unsigned rd = (instr >> 12) & 0xf;
57896                      unsigned rm = instr & 0xf;
57897                      unsigned rs = (instr >> 8) & 0xf;
57898                      // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57899                      ror(condition,
57900                          Best,
57901                          Register(rd),
57902                          Register(rm),
57903                          Register(rs));
57904                      if (((instr & 0xfff00f0) != 0x1a00070)) {
57905                        UnpredictableA32(instr);
57906                      }
57907                      return;
57908                    }
57909                    Condition condition((instr >> 28) & 0xf);
57910                    unsigned rd = (instr >> 12) & 0xf;
57911                    unsigned rm = instr & 0xf;
57912                    Shift shift((instr >> 5) & 0x3);
57913                    unsigned rs = (instr >> 8) & 0xf;
57914                    // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
57915                    mov(condition,
57916                        Best,
57917                        Register(rd),
57918                        Operand(Register(rm), shift.GetType(), Register(rs)));
57919                    if (((instr & 0xfff0090) != 0x1a00010)) {
57920                      UnpredictableA32(instr);
57921                    }
57922                    break;
57923                  }
57924                }
57925                break;
57926              }
57927              case 0x00000080: {
57928                // 0x00000090
57929                switch (instr & 0x01200060) {
57930                  case 0x00000000: {
57931                    // 0x00000090
57932                    switch (instr & 0x00800000) {
57933                      case 0x00000000: {
57934                        // 0x00000090
57935                        if (((instr & 0xf0000000) == 0xf0000000)) {
57936                          UnallocatedA32(instr);
57937                          return;
57938                        }
57939                        Condition condition((instr >> 28) & 0xf);
57940                        unsigned rd = (instr >> 16) & 0xf;
57941                        unsigned rn = instr & 0xf;
57942                        unsigned rm = (instr >> 8) & 0xf;
57943                        // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
57944                        mul(condition,
57945                            Best,
57946                            Register(rd),
57947                            Register(rn),
57948                            Register(rm));
57949                        if (((instr & 0xff0f0f0) != 0x90)) {
57950                          UnpredictableA32(instr);
57951                        }
57952                        break;
57953                      }
57954                      case 0x00800000: {
57955                        // 0x00800090
57956                        if (((instr & 0xf0000000) == 0xf0000000)) {
57957                          UnallocatedA32(instr);
57958                          return;
57959                        }
57960                        Condition condition((instr >> 28) & 0xf);
57961                        unsigned rdlo = (instr >> 12) & 0xf;
57962                        unsigned rdhi = (instr >> 16) & 0xf;
57963                        unsigned rn = instr & 0xf;
57964                        unsigned rm = (instr >> 8) & 0xf;
57965                        // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57966                        umull(condition,
57967                              Register(rdlo),
57968                              Register(rdhi),
57969                              Register(rn),
57970                              Register(rm));
57971                        break;
57972                      }
57973                    }
57974                    break;
57975                  }
57976                  case 0x00000020: {
57977                    // 0x000000b0
57978                    if (((instr & 0xf0000000) == 0xf0000000)) {
57979                      UnallocatedA32(instr);
57980                      return;
57981                    }
57982                    Condition condition((instr >> 28) & 0xf);
57983                    unsigned rt = (instr >> 12) & 0xf;
57984                    unsigned rn = (instr >> 16) & 0xf;
57985                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57986                    unsigned rm = instr & 0xf;
57987                    // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
57988                    strh(condition,
57989                         Best,
57990                         Register(rt),
57991                         MemOperand(Register(rn),
57992                                    sign,
57993                                    Register(rm),
57994                                    PostIndex));
57995                    if (((instr & 0xf700ff0) != 0xb0)) {
57996                      UnpredictableA32(instr);
57997                    }
57998                    break;
57999                  }
58000                  case 0x00000040: {
58001                    // 0x000000d0
58002                    if (((instr & 0xf0000000) == 0xf0000000)) {
58003                      UnallocatedA32(instr);
58004                      return;
58005                    }
58006                    Condition condition((instr >> 28) & 0xf);
58007                    unsigned rt = (instr >> 12) & 0xf;
58008                    unsigned rn = (instr >> 16) & 0xf;
58009                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58010                    unsigned rm = instr & 0xf;
58011                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
58012                    ldrd(condition,
58013                         Register(rt),
58014                         Register(rt + 1),
58015                         MemOperand(Register(rn),
58016                                    sign,
58017                                    Register(rm),
58018                                    PostIndex));
58019                    if (((instr & 0xf700ff0) != 0xd0)) {
58020                      UnpredictableA32(instr);
58021                    }
58022                    break;
58023                  }
58024                  case 0x00000060: {
58025                    // 0x000000f0
58026                    if (((instr & 0xf0000000) == 0xf0000000)) {
58027                      UnallocatedA32(instr);
58028                      return;
58029                    }
58030                    Condition condition((instr >> 28) & 0xf);
58031                    unsigned rt = (instr >> 12) & 0xf;
58032                    unsigned rn = (instr >> 16) & 0xf;
58033                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58034                    unsigned rm = instr & 0xf;
58035                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
58036                    strd(condition,
58037                         Register(rt),
58038                         Register(rt + 1),
58039                         MemOperand(Register(rn),
58040                                    sign,
58041                                    Register(rm),
58042                                    PostIndex));
58043                    if (((instr & 0xf700ff0) != 0xf0)) {
58044                      UnpredictableA32(instr);
58045                    }
58046                    break;
58047                  }
58048                  case 0x00200000: {
58049                    // 0x00200090
58050                    switch (instr & 0x00800000) {
58051                      case 0x00000000: {
58052                        // 0x00200090
58053                        if (((instr & 0xf0000000) == 0xf0000000)) {
58054                          UnallocatedA32(instr);
58055                          return;
58056                        }
58057                        Condition condition((instr >> 28) & 0xf);
58058                        unsigned rd = (instr >> 16) & 0xf;
58059                        unsigned rn = instr & 0xf;
58060                        unsigned rm = (instr >> 8) & 0xf;
58061                        unsigned ra = (instr >> 12) & 0xf;
58062                        // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
58063                        mla(condition,
58064                            Register(rd),
58065                            Register(rn),
58066                            Register(rm),
58067                            Register(ra));
58068                        break;
58069                      }
58070                      case 0x00800000: {
58071                        // 0x00a00090
58072                        if (((instr & 0xf0000000) == 0xf0000000)) {
58073                          UnallocatedA32(instr);
58074                          return;
58075                        }
58076                        Condition condition((instr >> 28) & 0xf);
58077                        unsigned rdlo = (instr >> 12) & 0xf;
58078                        unsigned rdhi = (instr >> 16) & 0xf;
58079                        unsigned rn = instr & 0xf;
58080                        unsigned rm = (instr >> 8) & 0xf;
58081                        // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
58082                        umlal(condition,
58083                              Register(rdlo),
58084                              Register(rdhi),
58085                              Register(rn),
58086                              Register(rm));
58087                        break;
58088                      }
58089                    }
58090                    break;
58091                  }
58092                  case 0x00200020: {
58093                    // 0x002000b0
58094                    if (((instr & 0xf0000000) == 0xf0000000)) {
58095                      UnallocatedA32(instr);
58096                      return;
58097                    }
58098                    UnimplementedA32("STRHT", instr);
58099                    break;
58100                  }
58101                  case 0x01000000: {
58102                    // 0x01000090
58103                    switch (instr & 0x00800300) {
58104                      case 0x00800000: {
58105                        // 0x01800090
58106                        if (((instr & 0xf0000000) == 0xf0000000)) {
58107                          UnallocatedA32(instr);
58108                          return;
58109                        }
58110                        Condition condition((instr >> 28) & 0xf);
58111                        unsigned rt = instr & 0xf;
58112                        unsigned rn = (instr >> 16) & 0xf;
58113                        // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1
58114                        stl(condition,
58115                            Register(rt),
58116                            MemOperand(Register(rn), Offset));
58117                        if (((instr & 0xff0fff0) != 0x180fc90)) {
58118                          UnpredictableA32(instr);
58119                        }
58120                        break;
58121                      }
58122                      case 0x00800200: {
58123                        // 0x01800290
58124                        if (((instr & 0xf0000000) == 0xf0000000)) {
58125                          UnallocatedA32(instr);
58126                          return;
58127                        }
58128                        Condition condition((instr >> 28) & 0xf);
58129                        unsigned rd = (instr >> 12) & 0xf;
58130                        unsigned rt = instr & 0xf;
58131                        unsigned rn = (instr >> 16) & 0xf;
58132                        // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58133                        stlex(condition,
58134                              Register(rd),
58135                              Register(rt),
58136                              MemOperand(Register(rn), Offset));
58137                        if (((instr & 0xff00ff0) != 0x1800e90)) {
58138                          UnpredictableA32(instr);
58139                        }
58140                        break;
58141                      }
58142                      case 0x00800300: {
58143                        // 0x01800390
58144                        if (((instr & 0xf0000000) == 0xf0000000)) {
58145                          UnallocatedA32(instr);
58146                          return;
58147                        }
58148                        Condition condition((instr >> 28) & 0xf);
58149                        unsigned rd = (instr >> 12) & 0xf;
58150                        unsigned rt = instr & 0xf;
58151                        unsigned rn = (instr >> 16) & 0xf;
58152                        // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1
58153                        strex(condition,
58154                              Register(rd),
58155                              Register(rt),
58156                              MemOperand(Register(rn), plus, 0, Offset));
58157                        if (((instr & 0xff00ff0) != 0x1800f90)) {
58158                          UnpredictableA32(instr);
58159                        }
58160                        break;
58161                      }
58162                      default:
58163                        UnallocatedA32(instr);
58164                        break;
58165                    }
58166                    break;
58167                  }
58168                  case 0x01000020: {
58169                    // 0x010000b0
58170                    if (((instr & 0xf0000000) == 0xf0000000)) {
58171                      UnallocatedA32(instr);
58172                      return;
58173                    }
58174                    Condition condition((instr >> 28) & 0xf);
58175                    unsigned rt = (instr >> 12) & 0xf;
58176                    unsigned rn = (instr >> 16) & 0xf;
58177                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58178                    unsigned rm = instr & 0xf;
58179                    AddrMode addrmode = Offset;
58180                    // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
58181                    strh(condition,
58182                         Best,
58183                         Register(rt),
58184                         MemOperand(Register(rn),
58185                                    sign,
58186                                    Register(rm),
58187                                    addrmode));
58188                    if (((instr & 0xf700ff0) != 0x10000b0)) {
58189                      UnpredictableA32(instr);
58190                    }
58191                    break;
58192                  }
58193                  case 0x01000040: {
58194                    // 0x010000d0
58195                    if (((instr & 0xf0000000) == 0xf0000000)) {
58196                      UnallocatedA32(instr);
58197                      return;
58198                    }
58199                    Condition condition((instr >> 28) & 0xf);
58200                    unsigned rt = (instr >> 12) & 0xf;
58201                    unsigned rn = (instr >> 16) & 0xf;
58202                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58203                    unsigned rm = instr & 0xf;
58204                    AddrMode addrmode = Offset;
58205                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
58206                    ldrd(condition,
58207                         Register(rt),
58208                         Register(rt + 1),
58209                         MemOperand(Register(rn),
58210                                    sign,
58211                                    Register(rm),
58212                                    addrmode));
58213                    if (((instr & 0xf700ff0) != 0x10000d0)) {
58214                      UnpredictableA32(instr);
58215                    }
58216                    break;
58217                  }
58218                  case 0x01000060: {
58219                    // 0x010000f0
58220                    if (((instr & 0xf0000000) == 0xf0000000)) {
58221                      UnallocatedA32(instr);
58222                      return;
58223                    }
58224                    Condition condition((instr >> 28) & 0xf);
58225                    unsigned rt = (instr >> 12) & 0xf;
58226                    unsigned rn = (instr >> 16) & 0xf;
58227                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58228                    unsigned rm = instr & 0xf;
58229                    AddrMode addrmode = Offset;
58230                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
58231                    strd(condition,
58232                         Register(rt),
58233                         Register(rt + 1),
58234                         MemOperand(Register(rn),
58235                                    sign,
58236                                    Register(rm),
58237                                    addrmode));
58238                    if (((instr & 0xf700ff0) != 0x10000f0)) {
58239                      UnpredictableA32(instr);
58240                    }
58241                    break;
58242                  }
58243                  case 0x01200000: {
58244                    // 0x01200090
58245                    switch (instr & 0x00800300) {
58246                      case 0x00800200: {
58247                        // 0x01a00290
58248                        if (((instr & 0xf0000000) == 0xf0000000)) {
58249                          UnallocatedA32(instr);
58250                          return;
58251                        }
58252                        Condition condition((instr >> 28) & 0xf);
58253                        unsigned rd = (instr >> 12) & 0xf;
58254                        unsigned rt = instr & 0xf;
58255                        unsigned rn = (instr >> 16) & 0xf;
58256                        // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
58257                        stlexd(condition,
58258                               Register(rd),
58259                               Register(rt),
58260                               Register(rt + 1),
58261                               MemOperand(Register(rn), Offset));
58262                        if (((instr & 0xff00ff0) != 0x1a00e90)) {
58263                          UnpredictableA32(instr);
58264                        }
58265                        break;
58266                      }
58267                      case 0x00800300: {
58268                        // 0x01a00390
58269                        if (((instr & 0xf0000000) == 0xf0000000)) {
58270                          UnallocatedA32(instr);
58271                          return;
58272                        }
58273                        Condition condition((instr >> 28) & 0xf);
58274                        unsigned rd = (instr >> 12) & 0xf;
58275                        unsigned rt = instr & 0xf;
58276                        unsigned rn = (instr >> 16) & 0xf;
58277                        // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
58278                        strexd(condition,
58279                               Register(rd),
58280                               Register(rt),
58281                               Register(rt + 1),
58282                               MemOperand(Register(rn), Offset));
58283                        if (((instr & 0xff00ff0) != 0x1a00f90)) {
58284                          UnpredictableA32(instr);
58285                        }
58286                        break;
58287                      }
58288                      default:
58289                        UnallocatedA32(instr);
58290                        break;
58291                    }
58292                    break;
58293                  }
58294                  case 0x01200020: {
58295                    // 0x012000b0
58296                    if (((instr & 0xf0000000) == 0xf0000000)) {
58297                      UnallocatedA32(instr);
58298                      return;
58299                    }
58300                    Condition condition((instr >> 28) & 0xf);
58301                    unsigned rt = (instr >> 12) & 0xf;
58302                    unsigned rn = (instr >> 16) & 0xf;
58303                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58304                    unsigned rm = instr & 0xf;
58305                    AddrMode addrmode = PreIndex;
58306                    // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
58307                    strh(condition,
58308                         Best,
58309                         Register(rt),
58310                         MemOperand(Register(rn),
58311                                    sign,
58312                                    Register(rm),
58313                                    addrmode));
58314                    if (((instr & 0xf700ff0) != 0x12000b0)) {
58315                      UnpredictableA32(instr);
58316                    }
58317                    break;
58318                  }
58319                  case 0x01200040: {
58320                    // 0x012000d0
58321                    if (((instr & 0xf0000000) == 0xf0000000)) {
58322                      UnallocatedA32(instr);
58323                      return;
58324                    }
58325                    Condition condition((instr >> 28) & 0xf);
58326                    unsigned rt = (instr >> 12) & 0xf;
58327                    unsigned rn = (instr >> 16) & 0xf;
58328                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58329                    unsigned rm = instr & 0xf;
58330                    AddrMode addrmode = PreIndex;
58331                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
58332                    ldrd(condition,
58333                         Register(rt),
58334                         Register(rt + 1),
58335                         MemOperand(Register(rn),
58336                                    sign,
58337                                    Register(rm),
58338                                    addrmode));
58339                    if (((instr & 0xf700ff0) != 0x12000d0)) {
58340                      UnpredictableA32(instr);
58341                    }
58342                    break;
58343                  }
58344                  case 0x01200060: {
58345                    // 0x012000f0
58346                    if (((instr & 0xf0000000) == 0xf0000000)) {
58347                      UnallocatedA32(instr);
58348                      return;
58349                    }
58350                    Condition condition((instr >> 28) & 0xf);
58351                    unsigned rt = (instr >> 12) & 0xf;
58352                    unsigned rn = (instr >> 16) & 0xf;
58353                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58354                    unsigned rm = instr & 0xf;
58355                    AddrMode addrmode = PreIndex;
58356                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
58357                    strd(condition,
58358                         Register(rt),
58359                         Register(rt + 1),
58360                         MemOperand(Register(rn),
58361                                    sign,
58362                                    Register(rm),
58363                                    addrmode));
58364                    if (((instr & 0xf700ff0) != 0x12000f0)) {
58365                      UnpredictableA32(instr);
58366                    }
58367                    break;
58368                  }
58369                  default:
58370                    UnallocatedA32(instr);
58371                    break;
58372                }
58373                break;
58374              }
58375              case 0x00400000: {
58376                // 0x00400010
58377                switch (instr & 0x01a00000) {
58378                  case 0x00000000: {
58379                    // 0x00400010
58380                    if (((instr & 0xf0000000) == 0xf0000000)) {
58381                      UnallocatedA32(instr);
58382                      return;
58383                    }
58384                    Condition condition((instr >> 28) & 0xf);
58385                    unsigned rd = (instr >> 12) & 0xf;
58386                    unsigned rn = (instr >> 16) & 0xf;
58387                    unsigned rm = instr & 0xf;
58388                    Shift shift((instr >> 5) & 0x3);
58389                    unsigned rs = (instr >> 8) & 0xf;
58390                    // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58391                    sub(condition,
58392                        Best,
58393                        Register(rd),
58394                        Register(rn),
58395                        Operand(Register(rm), shift.GetType(), Register(rs)));
58396                    break;
58397                  }
58398                  case 0x00200000: {
58399                    // 0x00600010
58400                    if (((instr & 0xf0000000) == 0xf0000000)) {
58401                      UnallocatedA32(instr);
58402                      return;
58403                    }
58404                    Condition condition((instr >> 28) & 0xf);
58405                    unsigned rd = (instr >> 12) & 0xf;
58406                    unsigned rn = (instr >> 16) & 0xf;
58407                    unsigned rm = instr & 0xf;
58408                    Shift shift((instr >> 5) & 0x3);
58409                    unsigned rs = (instr >> 8) & 0xf;
58410                    // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58411                    rsb(condition,
58412                        Best,
58413                        Register(rd),
58414                        Register(rn),
58415                        Operand(Register(rm), shift.GetType(), Register(rs)));
58416                    break;
58417                  }
58418                  case 0x00800000: {
58419                    // 0x00c00010
58420                    if (((instr & 0xf0000000) == 0xf0000000)) {
58421                      UnallocatedA32(instr);
58422                      return;
58423                    }
58424                    Condition condition((instr >> 28) & 0xf);
58425                    unsigned rd = (instr >> 12) & 0xf;
58426                    unsigned rn = (instr >> 16) & 0xf;
58427                    unsigned rm = instr & 0xf;
58428                    Shift shift((instr >> 5) & 0x3);
58429                    unsigned rs = (instr >> 8) & 0xf;
58430                    // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58431                    sbc(condition,
58432                        Best,
58433                        Register(rd),
58434                        Register(rn),
58435                        Operand(Register(rm), shift.GetType(), Register(rs)));
58436                    break;
58437                  }
58438                  case 0x00a00000: {
58439                    // 0x00e00010
58440                    if (((instr & 0xf0000000) == 0xf0000000)) {
58441                      UnallocatedA32(instr);
58442                      return;
58443                    }
58444                    Condition condition((instr >> 28) & 0xf);
58445                    unsigned rd = (instr >> 12) & 0xf;
58446                    unsigned rn = (instr >> 16) & 0xf;
58447                    unsigned rm = instr & 0xf;
58448                    Shift shift((instr >> 5) & 0x3);
58449                    unsigned rs = (instr >> 8) & 0xf;
58450                    // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58451                    rsc(condition,
58452                        Register(rd),
58453                        Register(rn),
58454                        Operand(Register(rm), shift.GetType(), Register(rs)));
58455                    break;
58456                  }
58457                  case 0x01000000: {
58458                    // 0x01400010
58459                    switch (instr & 0x00000060) {
58460                      case 0x00000040: {
58461                        // 0x01400050
58462                        if (((instr & 0xf0000000) == 0xf0000000)) {
58463                          UnallocatedA32(instr);
58464                          return;
58465                        }
58466                        Condition condition((instr >> 28) & 0xf);
58467                        unsigned rd = (instr >> 12) & 0xf;
58468                        unsigned rm = instr & 0xf;
58469                        unsigned rn = (instr >> 16) & 0xf;
58470                        // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
58471                        qdadd(condition,
58472                              Register(rd),
58473                              Register(rm),
58474                              Register(rn));
58475                        if (((instr & 0xff00ff0) != 0x1400050)) {
58476                          UnpredictableA32(instr);
58477                        }
58478                        break;
58479                      }
58480                      case 0x00000060: {
58481                        // 0x01400070
58482                        if (((instr & 0xf0000000) == 0xf0000000)) {
58483                          UnallocatedA32(instr);
58484                          return;
58485                        }
58486                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
58487                        // HVC{<q>} {#}<imm16> ; A1
58488                        hvc(al, imm);
58489                        break;
58490                      }
58491                      default:
58492                        UnallocatedA32(instr);
58493                        break;
58494                    }
58495                    break;
58496                  }
58497                  case 0x01200000: {
58498                    // 0x01600010
58499                    switch (instr & 0x00000060) {
58500                      case 0x00000000: {
58501                        // 0x01600010
58502                        if (((instr & 0xf0000000) == 0xf0000000)) {
58503                          UnallocatedA32(instr);
58504                          return;
58505                        }
58506                        Condition condition((instr >> 28) & 0xf);
58507                        unsigned rd = (instr >> 12) & 0xf;
58508                        unsigned rm = instr & 0xf;
58509                        // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1
58510                        clz(condition, Register(rd), Register(rm));
58511                        if (((instr & 0xfff0ff0) != 0x16f0f10)) {
58512                          UnpredictableA32(instr);
58513                        }
58514                        break;
58515                      }
58516                      case 0x00000040: {
58517                        // 0x01600050
58518                        if (((instr & 0xf0000000) == 0xf0000000)) {
58519                          UnallocatedA32(instr);
58520                          return;
58521                        }
58522                        Condition condition((instr >> 28) & 0xf);
58523                        unsigned rd = (instr >> 12) & 0xf;
58524                        unsigned rm = instr & 0xf;
58525                        unsigned rn = (instr >> 16) & 0xf;
58526                        // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
58527                        qdsub(condition,
58528                              Register(rd),
58529                              Register(rm),
58530                              Register(rn));
58531                        if (((instr & 0xff00ff0) != 0x1600050)) {
58532                          UnpredictableA32(instr);
58533                        }
58534                        break;
58535                      }
58536                      case 0x00000060: {
58537                        // 0x01600070
58538                        if (((instr & 0xf0000000) == 0xf0000000)) {
58539                          UnallocatedA32(instr);
58540                          return;
58541                        }
58542                        UnimplementedA32("SMC", instr);
58543                        break;
58544                      }
58545                      default:
58546                        UnallocatedA32(instr);
58547                        break;
58548                    }
58549                    break;
58550                  }
58551                  case 0x01800000: {
58552                    // 0x01c00010
58553                    if (((instr & 0xf0000000) == 0xf0000000)) {
58554                      UnallocatedA32(instr);
58555                      return;
58556                    }
58557                    Condition condition((instr >> 28) & 0xf);
58558                    unsigned rd = (instr >> 12) & 0xf;
58559                    unsigned rn = (instr >> 16) & 0xf;
58560                    unsigned rm = instr & 0xf;
58561                    Shift shift((instr >> 5) & 0x3);
58562                    unsigned rs = (instr >> 8) & 0xf;
58563                    // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58564                    bic(condition,
58565                        Best,
58566                        Register(rd),
58567                        Register(rn),
58568                        Operand(Register(rm), shift.GetType(), Register(rs)));
58569                    break;
58570                  }
58571                  case 0x01a00000: {
58572                    // 0x01e00010
58573                    if (((instr & 0xf0000000) == 0xf0000000)) {
58574                      UnallocatedA32(instr);
58575                      return;
58576                    }
58577                    Condition condition((instr >> 28) & 0xf);
58578                    unsigned rd = (instr >> 12) & 0xf;
58579                    unsigned rm = instr & 0xf;
58580                    Shift shift((instr >> 5) & 0x3);
58581                    unsigned rs = (instr >> 8) & 0xf;
58582                    // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
58583                    mvn(condition,
58584                        Best,
58585                        Register(rd),
58586                        Operand(Register(rm), shift.GetType(), Register(rs)));
58587                    if (((instr & 0xfff0090) != 0x1e00010)) {
58588                      UnpredictableA32(instr);
58589                    }
58590                    break;
58591                  }
58592                }
58593                break;
58594              }
58595              case 0x00400080: {
58596                // 0x00400090
58597                switch (instr & 0x00000060) {
58598                  case 0x00000000: {
58599                    // 0x00400090
58600                    switch (instr & 0x01a00000) {
58601                      case 0x00000000: {
58602                        // 0x00400090
58603                        if (((instr & 0xf0000000) == 0xf0000000)) {
58604                          UnallocatedA32(instr);
58605                          return;
58606                        }
58607                        Condition condition((instr >> 28) & 0xf);
58608                        unsigned rdlo = (instr >> 12) & 0xf;
58609                        unsigned rdhi = (instr >> 16) & 0xf;
58610                        unsigned rn = instr & 0xf;
58611                        unsigned rm = (instr >> 8) & 0xf;
58612                        // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
58613                        umaal(condition,
58614                              Register(rdlo),
58615                              Register(rdhi),
58616                              Register(rn),
58617                              Register(rm));
58618                        break;
58619                      }
58620                      case 0x00200000: {
58621                        // 0x00600090
58622                        if (((instr & 0xf0000000) == 0xf0000000)) {
58623                          UnallocatedA32(instr);
58624                          return;
58625                        }
58626                        Condition condition((instr >> 28) & 0xf);
58627                        unsigned rd = (instr >> 16) & 0xf;
58628                        unsigned rn = instr & 0xf;
58629                        unsigned rm = (instr >> 8) & 0xf;
58630                        unsigned ra = (instr >> 12) & 0xf;
58631                        // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
58632                        mls(condition,
58633                            Register(rd),
58634                            Register(rn),
58635                            Register(rm),
58636                            Register(ra));
58637                        break;
58638                      }
58639                      case 0x00800000: {
58640                        // 0x00c00090
58641                        if (((instr & 0xf0000000) == 0xf0000000)) {
58642                          UnallocatedA32(instr);
58643                          return;
58644                        }
58645                        Condition condition((instr >> 28) & 0xf);
58646                        unsigned rdlo = (instr >> 12) & 0xf;
58647                        unsigned rdhi = (instr >> 16) & 0xf;
58648                        unsigned rn = instr & 0xf;
58649                        unsigned rm = (instr >> 8) & 0xf;
58650                        // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
58651                        smull(condition,
58652                              Register(rdlo),
58653                              Register(rdhi),
58654                              Register(rn),
58655                              Register(rm));
58656                        break;
58657                      }
58658                      case 0x00a00000: {
58659                        // 0x00e00090
58660                        if (((instr & 0xf0000000) == 0xf0000000)) {
58661                          UnallocatedA32(instr);
58662                          return;
58663                        }
58664                        Condition condition((instr >> 28) & 0xf);
58665                        unsigned rdlo = (instr >> 12) & 0xf;
58666                        unsigned rdhi = (instr >> 16) & 0xf;
58667                        unsigned rn = instr & 0xf;
58668                        unsigned rm = (instr >> 8) & 0xf;
58669                        // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
58670                        smlal(condition,
58671                              Register(rdlo),
58672                              Register(rdhi),
58673                              Register(rn),
58674                              Register(rm));
58675                        break;
58676                      }
58677                      case 0x01800000: {
58678                        // 0x01c00090
58679                        switch (instr & 0x00000300) {
58680                          case 0x00000000: {
58681                            // 0x01c00090
58682                            if (((instr & 0xf0000000) == 0xf0000000)) {
58683                              UnallocatedA32(instr);
58684                              return;
58685                            }
58686                            Condition condition((instr >> 28) & 0xf);
58687                            unsigned rt = instr & 0xf;
58688                            unsigned rn = (instr >> 16) & 0xf;
58689                            // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1
58690                            stlb(condition,
58691                                 Register(rt),
58692                                 MemOperand(Register(rn), Offset));
58693                            if (((instr & 0xff0fff0) != 0x1c0fc90)) {
58694                              UnpredictableA32(instr);
58695                            }
58696                            break;
58697                          }
58698                          case 0x00000200: {
58699                            // 0x01c00290
58700                            if (((instr & 0xf0000000) == 0xf0000000)) {
58701                              UnallocatedA32(instr);
58702                              return;
58703                            }
58704                            Condition condition((instr >> 28) & 0xf);
58705                            unsigned rd = (instr >> 12) & 0xf;
58706                            unsigned rt = instr & 0xf;
58707                            unsigned rn = (instr >> 16) & 0xf;
58708                            // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58709                            stlexb(condition,
58710                                   Register(rd),
58711                                   Register(rt),
58712                                   MemOperand(Register(rn), Offset));
58713                            if (((instr & 0xff00ff0) != 0x1c00e90)) {
58714                              UnpredictableA32(instr);
58715                            }
58716                            break;
58717                          }
58718                          case 0x00000300: {
58719                            // 0x01c00390
58720                            if (((instr & 0xf0000000) == 0xf0000000)) {
58721                              UnallocatedA32(instr);
58722                              return;
58723                            }
58724                            Condition condition((instr >> 28) & 0xf);
58725                            unsigned rd = (instr >> 12) & 0xf;
58726                            unsigned rt = instr & 0xf;
58727                            unsigned rn = (instr >> 16) & 0xf;
58728                            // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58729                            strexb(condition,
58730                                   Register(rd),
58731                                   Register(rt),
58732                                   MemOperand(Register(rn), Offset));
58733                            if (((instr & 0xff00ff0) != 0x1c00f90)) {
58734                              UnpredictableA32(instr);
58735                            }
58736                            break;
58737                          }
58738                          default:
58739                            UnallocatedA32(instr);
58740                            break;
58741                        }
58742                        break;
58743                      }
58744                      case 0x01a00000: {
58745                        // 0x01e00090
58746                        switch (instr & 0x00000300) {
58747                          case 0x00000000: {
58748                            // 0x01e00090
58749                            if (((instr & 0xf0000000) == 0xf0000000)) {
58750                              UnallocatedA32(instr);
58751                              return;
58752                            }
58753                            Condition condition((instr >> 28) & 0xf);
58754                            unsigned rt = instr & 0xf;
58755                            unsigned rn = (instr >> 16) & 0xf;
58756                            // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1
58757                            stlh(condition,
58758                                 Register(rt),
58759                                 MemOperand(Register(rn), Offset));
58760                            if (((instr & 0xff0fff0) != 0x1e0fc90)) {
58761                              UnpredictableA32(instr);
58762                            }
58763                            break;
58764                          }
58765                          case 0x00000200: {
58766                            // 0x01e00290
58767                            if (((instr & 0xf0000000) == 0xf0000000)) {
58768                              UnallocatedA32(instr);
58769                              return;
58770                            }
58771                            Condition condition((instr >> 28) & 0xf);
58772                            unsigned rd = (instr >> 12) & 0xf;
58773                            unsigned rt = instr & 0xf;
58774                            unsigned rn = (instr >> 16) & 0xf;
58775                            // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58776                            stlexh(condition,
58777                                   Register(rd),
58778                                   Register(rt),
58779                                   MemOperand(Register(rn), Offset));
58780                            if (((instr & 0xff00ff0) != 0x1e00e90)) {
58781                              UnpredictableA32(instr);
58782                            }
58783                            break;
58784                          }
58785                          case 0x00000300: {
58786                            // 0x01e00390
58787                            if (((instr & 0xf0000000) == 0xf0000000)) {
58788                              UnallocatedA32(instr);
58789                              return;
58790                            }
58791                            Condition condition((instr >> 28) & 0xf);
58792                            unsigned rd = (instr >> 12) & 0xf;
58793                            unsigned rt = instr & 0xf;
58794                            unsigned rn = (instr >> 16) & 0xf;
58795                            // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58796                            strexh(condition,
58797                                   Register(rd),
58798                                   Register(rt),
58799                                   MemOperand(Register(rn), Offset));
58800                            if (((instr & 0xff00ff0) != 0x1e00f90)) {
58801                              UnpredictableA32(instr);
58802                            }
58803                            break;
58804                          }
58805                          default:
58806                            UnallocatedA32(instr);
58807                            break;
58808                        }
58809                        break;
58810                      }
58811                      default:
58812                        UnallocatedA32(instr);
58813                        break;
58814                    }
58815                    break;
58816                  }
58817                  case 0x00000020: {
58818                    // 0x004000b0
58819                    switch (instr & 0x01200000) {
58820                      case 0x00000000: {
58821                        // 0x004000b0
58822                        if (((instr & 0xf0000000) == 0xf0000000)) {
58823                          UnallocatedA32(instr);
58824                          return;
58825                        }
58826                        Condition condition((instr >> 28) & 0xf);
58827                        unsigned rt = (instr >> 12) & 0xf;
58828                        unsigned rn = (instr >> 16) & 0xf;
58829                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58830                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58831                        // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
58832                        strh(condition,
58833                             Best,
58834                             Register(rt),
58835                             MemOperand(Register(rn), sign, offset, PostIndex));
58836                        break;
58837                      }
58838                      case 0x00200000: {
58839                        // 0x006000b0
58840                        if (((instr & 0xf0000000) == 0xf0000000)) {
58841                          UnallocatedA32(instr);
58842                          return;
58843                        }
58844                        UnimplementedA32("STRHT", instr);
58845                        break;
58846                      }
58847                      case 0x01000000: {
58848                        // 0x014000b0
58849                        if (((instr & 0xf0000000) == 0xf0000000)) {
58850                          UnallocatedA32(instr);
58851                          return;
58852                        }
58853                        Condition condition((instr >> 28) & 0xf);
58854                        unsigned rt = (instr >> 12) & 0xf;
58855                        unsigned rn = (instr >> 16) & 0xf;
58856                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58857                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58858                        // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
58859                        strh(condition,
58860                             Best,
58861                             Register(rt),
58862                             MemOperand(Register(rn), sign, offset, Offset));
58863                        break;
58864                      }
58865                      case 0x01200000: {
58866                        // 0x016000b0
58867                        if (((instr & 0xf0000000) == 0xf0000000)) {
58868                          UnallocatedA32(instr);
58869                          return;
58870                        }
58871                        Condition condition((instr >> 28) & 0xf);
58872                        unsigned rt = (instr >> 12) & 0xf;
58873                        unsigned rn = (instr >> 16) & 0xf;
58874                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58875                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58876                        // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
58877                        strh(condition,
58878                             Best,
58879                             Register(rt),
58880                             MemOperand(Register(rn), sign, offset, PreIndex));
58881                        break;
58882                      }
58883                    }
58884                    break;
58885                  }
58886                  case 0x00000040: {
58887                    // 0x004000d0
58888                    switch (instr & 0x000f0000) {
58889                      case 0x000f0000: {
58890                        // 0x004f00d0
58891                        if (((instr & 0xf0000000) == 0xf0000000)) {
58892                          UnallocatedA32(instr);
58893                          return;
58894                        }
58895                        Condition condition((instr >> 28) & 0xf);
58896                        unsigned rt = (instr >> 12) & 0xf;
58897                        uint32_t U = (instr >> 23) & 0x1;
58898                        int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
58899                        if (U == 0) imm = -imm;
58900                        bool minus_zero = (imm == 0) && (U == 0);
58901                        Location location(imm, kA32PcDelta);
58902                        // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1
58903                        if (minus_zero) {
58904                          ldrd(condition,
58905                               Register(rt),
58906                               Register(rt + 1),
58907                               MemOperand(pc, minus, 0));
58908                        } else {
58909                          ldrd(condition,
58910                               Register(rt),
58911                               Register(rt + 1),
58912                               &location);
58913                        }
58914                        if (((instr & 0xf7f00f0) != 0x14f00d0)) {
58915                          UnpredictableA32(instr);
58916                        }
58917                        break;
58918                      }
58919                      default: {
58920                        switch (instr & 0x01200000) {
58921                          case 0x00000000: {
58922                            // 0x004000d0
58923                            if (((instr & 0xf0000000) == 0xf0000000) ||
58924                                ((instr & 0xf0000) == 0xf0000)) {
58925                              UnallocatedA32(instr);
58926                              return;
58927                            }
58928                            Condition condition((instr >> 28) & 0xf);
58929                            unsigned rt = (instr >> 12) & 0xf;
58930                            unsigned rn = (instr >> 16) & 0xf;
58931                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58932                                                                   : plus);
58933                            int32_t offset =
58934                                (instr & 0xf) | ((instr >> 4) & 0xf0);
58935                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
58936                            ldrd(condition,
58937                                 Register(rt),
58938                                 Register(rt + 1),
58939                                 MemOperand(Register(rn),
58940                                            sign,
58941                                            offset,
58942                                            PostIndex));
58943                            break;
58944                          }
58945                          case 0x01000000: {
58946                            // 0x014000d0
58947                            if (((instr & 0xf0000000) == 0xf0000000) ||
58948                                ((instr & 0xf0000) == 0xf0000)) {
58949                              UnallocatedA32(instr);
58950                              return;
58951                            }
58952                            Condition condition((instr >> 28) & 0xf);
58953                            unsigned rt = (instr >> 12) & 0xf;
58954                            unsigned rn = (instr >> 16) & 0xf;
58955                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58956                                                                   : plus);
58957                            int32_t offset =
58958                                (instr & 0xf) | ((instr >> 4) & 0xf0);
58959                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
58960                            ldrd(condition,
58961                                 Register(rt),
58962                                 Register(rt + 1),
58963                                 MemOperand(Register(rn),
58964                                            sign,
58965                                            offset,
58966                                            Offset));
58967                            break;
58968                          }
58969                          case 0x01200000: {
58970                            // 0x016000d0
58971                            if (((instr & 0xf0000000) == 0xf0000000) ||
58972                                ((instr & 0xf0000) == 0xf0000)) {
58973                              UnallocatedA32(instr);
58974                              return;
58975                            }
58976                            Condition condition((instr >> 28) & 0xf);
58977                            unsigned rt = (instr >> 12) & 0xf;
58978                            unsigned rn = (instr >> 16) & 0xf;
58979                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58980                                                                   : plus);
58981                            int32_t offset =
58982                                (instr & 0xf) | ((instr >> 4) & 0xf0);
58983                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
58984                            ldrd(condition,
58985                                 Register(rt),
58986                                 Register(rt + 1),
58987                                 MemOperand(Register(rn),
58988                                            sign,
58989                                            offset,
58990                                            PreIndex));
58991                            break;
58992                          }
58993                          default:
58994                            UnallocatedA32(instr);
58995                            break;
58996                        }
58997                        break;
58998                      }
58999                    }
59000                    break;
59001                  }
59002                  case 0x00000060: {
59003                    // 0x004000f0
59004                    switch (instr & 0x01200000) {
59005                      case 0x00000000: {
59006                        // 0x004000f0
59007                        if (((instr & 0xf0000000) == 0xf0000000)) {
59008                          UnallocatedA32(instr);
59009                          return;
59010                        }
59011                        Condition condition((instr >> 28) & 0xf);
59012                        unsigned rt = (instr >> 12) & 0xf;
59013                        unsigned rn = (instr >> 16) & 0xf;
59014                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
59015                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
59016                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
59017                        strd(condition,
59018                             Register(rt),
59019                             Register(rt + 1),
59020                             MemOperand(Register(rn), sign, offset, PostIndex));
59021                        break;
59022                      }
59023                      case 0x01000000: {
59024                        // 0x014000f0
59025                        if (((instr & 0xf0000000) == 0xf0000000)) {
59026                          UnallocatedA32(instr);
59027                          return;
59028                        }
59029                        Condition condition((instr >> 28) & 0xf);
59030                        unsigned rt = (instr >> 12) & 0xf;
59031                        unsigned rn = (instr >> 16) & 0xf;
59032                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
59033                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
59034                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
59035                        strd(condition,
59036                             Register(rt),
59037                             Register(rt + 1),
59038                             MemOperand(Register(rn), sign, offset, Offset));
59039                        break;
59040                      }
59041                      case 0x01200000: {
59042                        // 0x016000f0
59043                        if (((instr & 0xf0000000) == 0xf0000000)) {
59044                          UnallocatedA32(instr);
59045                          return;
59046                        }
59047                        Condition condition((instr >> 28) & 0xf);
59048                        unsigned rt = (instr >> 12) & 0xf;
59049                        unsigned rn = (instr >> 16) & 0xf;
59050                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
59051                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
59052                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
59053                        strd(condition,
59054                             Register(rt),
59055                             Register(rt + 1),
59056                             MemOperand(Register(rn), sign, offset, PreIndex));
59057                        break;
59058                      }
59059                      default:
59060                        UnallocatedA32(instr);
59061                        break;
59062                    }
59063                    break;
59064                  }
59065                }
59066                break;
59067              }
59068            }
59069            break;
59070          }
59071          case 0x00100000: {
59072            // 0x00100000
59073            switch (instr & 0x01e00000) {
59074              case 0x00000000: {
59075                // 0x00100000
59076                switch (instr & 0x00000fe0) {
59077                  case 0x00000060: {
59078                    // 0x00100060
59079                    if (((instr & 0xf0000000) == 0xf0000000)) {
59080                      UnallocatedA32(instr);
59081                      return;
59082                    }
59083                    Condition condition((instr >> 28) & 0xf);
59084                    unsigned rd = (instr >> 12) & 0xf;
59085                    unsigned rn = (instr >> 16) & 0xf;
59086                    unsigned rm = instr & 0xf;
59087                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59088                    ands(condition,
59089                         Best,
59090                         Register(rd),
59091                         Register(rn),
59092                         Operand(Register(rm), RRX));
59093                    break;
59094                  }
59095                  default: {
59096                    if (((instr & 0xf0000000) == 0xf0000000) ||
59097                        ((instr & 0xfe0) == 0x60)) {
59098                      UnallocatedA32(instr);
59099                      return;
59100                    }
59101                    Condition condition((instr >> 28) & 0xf);
59102                    unsigned rd = (instr >> 12) & 0xf;
59103                    unsigned rn = (instr >> 16) & 0xf;
59104                    unsigned rm = instr & 0xf;
59105                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59106                                                        (instr >> 7) & 0x1f);
59107                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59108                    ands(condition,
59109                         Best,
59110                         Register(rd),
59111                         Register(rn),
59112                         Operand(Register(rm),
59113                                 shift_operand.GetType(),
59114                                 shift_operand.GetAmount()));
59115                    break;
59116                  }
59117                }
59118                break;
59119              }
59120              case 0x00200000: {
59121                // 0x00300000
59122                switch (instr & 0x00000fe0) {
59123                  case 0x00000060: {
59124                    // 0x00300060
59125                    if (((instr & 0xf0000000) == 0xf0000000)) {
59126                      UnallocatedA32(instr);
59127                      return;
59128                    }
59129                    Condition condition((instr >> 28) & 0xf);
59130                    unsigned rd = (instr >> 12) & 0xf;
59131                    unsigned rn = (instr >> 16) & 0xf;
59132                    unsigned rm = instr & 0xf;
59133                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59134                    eors(condition,
59135                         Best,
59136                         Register(rd),
59137                         Register(rn),
59138                         Operand(Register(rm), RRX));
59139                    break;
59140                  }
59141                  default: {
59142                    if (((instr & 0xf0000000) == 0xf0000000) ||
59143                        ((instr & 0xfe0) == 0x60)) {
59144                      UnallocatedA32(instr);
59145                      return;
59146                    }
59147                    Condition condition((instr >> 28) & 0xf);
59148                    unsigned rd = (instr >> 12) & 0xf;
59149                    unsigned rn = (instr >> 16) & 0xf;
59150                    unsigned rm = instr & 0xf;
59151                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59152                                                        (instr >> 7) & 0x1f);
59153                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59154                    eors(condition,
59155                         Best,
59156                         Register(rd),
59157                         Register(rn),
59158                         Operand(Register(rm),
59159                                 shift_operand.GetType(),
59160                                 shift_operand.GetAmount()));
59161                    break;
59162                  }
59163                }
59164                break;
59165              }
59166              case 0x00400000: {
59167                // 0x00500000
59168                switch (instr & 0x000f0000) {
59169                  case 0x000d0000: {
59170                    // 0x005d0000
59171                    switch (instr & 0x00000fe0) {
59172                      case 0x00000060: {
59173                        // 0x005d0060
59174                        if (((instr & 0xf0000000) == 0xf0000000)) {
59175                          UnallocatedA32(instr);
59176                          return;
59177                        }
59178                        Condition condition((instr >> 28) & 0xf);
59179                        unsigned rd = (instr >> 12) & 0xf;
59180                        unsigned rm = instr & 0xf;
59181                        // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
59182                        subs(condition,
59183                             Best,
59184                             Register(rd),
59185                             sp,
59186                             Operand(Register(rm), RRX));
59187                        break;
59188                      }
59189                      default: {
59190                        if (((instr & 0xf0000000) == 0xf0000000) ||
59191                            ((instr & 0xfe0) == 0x60)) {
59192                          UnallocatedA32(instr);
59193                          return;
59194                        }
59195                        Condition condition((instr >> 28) & 0xf);
59196                        unsigned rd = (instr >> 12) & 0xf;
59197                        unsigned rm = instr & 0xf;
59198                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59199                                                            (instr >> 7) &
59200                                                                0x1f);
59201                        // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59202                        subs(condition,
59203                             Best,
59204                             Register(rd),
59205                             sp,
59206                             Operand(Register(rm),
59207                                     shift_operand.GetType(),
59208                                     shift_operand.GetAmount()));
59209                        break;
59210                      }
59211                    }
59212                    break;
59213                  }
59214                  default: {
59215                    switch (instr & 0x00000fe0) {
59216                      case 0x00000060: {
59217                        // 0x00500060
59218                        if (((instr & 0xf0000000) == 0xf0000000) ||
59219                            ((instr & 0xf0000) == 0xd0000)) {
59220                          UnallocatedA32(instr);
59221                          return;
59222                        }
59223                        Condition condition((instr >> 28) & 0xf);
59224                        unsigned rd = (instr >> 12) & 0xf;
59225                        unsigned rn = (instr >> 16) & 0xf;
59226                        unsigned rm = instr & 0xf;
59227                        // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59228                        subs(condition,
59229                             Best,
59230                             Register(rd),
59231                             Register(rn),
59232                             Operand(Register(rm), RRX));
59233                        break;
59234                      }
59235                      default: {
59236                        if (((instr & 0xf0000000) == 0xf0000000) ||
59237                            ((instr & 0xf0000) == 0xd0000) ||
59238                            ((instr & 0xfe0) == 0x60)) {
59239                          UnallocatedA32(instr);
59240                          return;
59241                        }
59242                        Condition condition((instr >> 28) & 0xf);
59243                        unsigned rd = (instr >> 12) & 0xf;
59244                        unsigned rn = (instr >> 16) & 0xf;
59245                        unsigned rm = instr & 0xf;
59246                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59247                                                            (instr >> 7) &
59248                                                                0x1f);
59249                        // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59250                        subs(condition,
59251                             Best,
59252                             Register(rd),
59253                             Register(rn),
59254                             Operand(Register(rm),
59255                                     shift_operand.GetType(),
59256                                     shift_operand.GetAmount()));
59257                        break;
59258                      }
59259                    }
59260                    break;
59261                  }
59262                }
59263                break;
59264              }
59265              case 0x00600000: {
59266                // 0x00700000
59267                switch (instr & 0x00000fe0) {
59268                  case 0x00000060: {
59269                    // 0x00700060
59270                    if (((instr & 0xf0000000) == 0xf0000000)) {
59271                      UnallocatedA32(instr);
59272                      return;
59273                    }
59274                    Condition condition((instr >> 28) & 0xf);
59275                    unsigned rd = (instr >> 12) & 0xf;
59276                    unsigned rn = (instr >> 16) & 0xf;
59277                    unsigned rm = instr & 0xf;
59278                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59279                    rsbs(condition,
59280                         Best,
59281                         Register(rd),
59282                         Register(rn),
59283                         Operand(Register(rm), RRX));
59284                    break;
59285                  }
59286                  default: {
59287                    if (((instr & 0xf0000000) == 0xf0000000) ||
59288                        ((instr & 0xfe0) == 0x60)) {
59289                      UnallocatedA32(instr);
59290                      return;
59291                    }
59292                    Condition condition((instr >> 28) & 0xf);
59293                    unsigned rd = (instr >> 12) & 0xf;
59294                    unsigned rn = (instr >> 16) & 0xf;
59295                    unsigned rm = instr & 0xf;
59296                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59297                                                        (instr >> 7) & 0x1f);
59298                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59299                    rsbs(condition,
59300                         Best,
59301                         Register(rd),
59302                         Register(rn),
59303                         Operand(Register(rm),
59304                                 shift_operand.GetType(),
59305                                 shift_operand.GetAmount()));
59306                    break;
59307                  }
59308                }
59309                break;
59310              }
59311              case 0x00800000: {
59312                // 0x00900000
59313                switch (instr & 0x000f0000) {
59314                  case 0x000d0000: {
59315                    // 0x009d0000
59316                    switch (instr & 0x00000fe0) {
59317                      case 0x00000060: {
59318                        // 0x009d0060
59319                        if (((instr & 0xf0000000) == 0xf0000000)) {
59320                          UnallocatedA32(instr);
59321                          return;
59322                        }
59323                        Condition condition((instr >> 28) & 0xf);
59324                        unsigned rd = (instr >> 12) & 0xf;
59325                        unsigned rm = instr & 0xf;
59326                        // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
59327                        adds(condition,
59328                             Best,
59329                             Register(rd),
59330                             sp,
59331                             Operand(Register(rm), RRX));
59332                        break;
59333                      }
59334                      default: {
59335                        if (((instr & 0xf0000000) == 0xf0000000) ||
59336                            ((instr & 0xfe0) == 0x60)) {
59337                          UnallocatedA32(instr);
59338                          return;
59339                        }
59340                        Condition condition((instr >> 28) & 0xf);
59341                        unsigned rd = (instr >> 12) & 0xf;
59342                        unsigned rm = instr & 0xf;
59343                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59344                                                            (instr >> 7) &
59345                                                                0x1f);
59346                        // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59347                        adds(condition,
59348                             Best,
59349                             Register(rd),
59350                             sp,
59351                             Operand(Register(rm),
59352                                     shift_operand.GetType(),
59353                                     shift_operand.GetAmount()));
59354                        break;
59355                      }
59356                    }
59357                    break;
59358                  }
59359                  default: {
59360                    switch (instr & 0x00000fe0) {
59361                      case 0x00000060: {
59362                        // 0x00900060
59363                        if (((instr & 0xf0000000) == 0xf0000000) ||
59364                            ((instr & 0xf0000) == 0xd0000)) {
59365                          UnallocatedA32(instr);
59366                          return;
59367                        }
59368                        Condition condition((instr >> 28) & 0xf);
59369                        unsigned rd = (instr >> 12) & 0xf;
59370                        unsigned rn = (instr >> 16) & 0xf;
59371                        unsigned rm = instr & 0xf;
59372                        // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59373                        adds(condition,
59374                             Best,
59375                             Register(rd),
59376                             Register(rn),
59377                             Operand(Register(rm), RRX));
59378                        break;
59379                      }
59380                      default: {
59381                        if (((instr & 0xf0000000) == 0xf0000000) ||
59382                            ((instr & 0xf0000) == 0xd0000) ||
59383                            ((instr & 0xfe0) == 0x60)) {
59384                          UnallocatedA32(instr);
59385                          return;
59386                        }
59387                        Condition condition((instr >> 28) & 0xf);
59388                        unsigned rd = (instr >> 12) & 0xf;
59389                        unsigned rn = (instr >> 16) & 0xf;
59390                        unsigned rm = instr & 0xf;
59391                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59392                                                            (instr >> 7) &
59393                                                                0x1f);
59394                        // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59395                        adds(condition,
59396                             Best,
59397                             Register(rd),
59398                             Register(rn),
59399                             Operand(Register(rm),
59400                                     shift_operand.GetType(),
59401                                     shift_operand.GetAmount()));
59402                        break;
59403                      }
59404                    }
59405                    break;
59406                  }
59407                }
59408                break;
59409              }
59410              case 0x00a00000: {
59411                // 0x00b00000
59412                switch (instr & 0x00000fe0) {
59413                  case 0x00000060: {
59414                    // 0x00b00060
59415                    if (((instr & 0xf0000000) == 0xf0000000)) {
59416                      UnallocatedA32(instr);
59417                      return;
59418                    }
59419                    Condition condition((instr >> 28) & 0xf);
59420                    unsigned rd = (instr >> 12) & 0xf;
59421                    unsigned rn = (instr >> 16) & 0xf;
59422                    unsigned rm = instr & 0xf;
59423                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59424                    adcs(condition,
59425                         Best,
59426                         Register(rd),
59427                         Register(rn),
59428                         Operand(Register(rm), RRX));
59429                    break;
59430                  }
59431                  default: {
59432                    if (((instr & 0xf0000000) == 0xf0000000) ||
59433                        ((instr & 0xfe0) == 0x60)) {
59434                      UnallocatedA32(instr);
59435                      return;
59436                    }
59437                    Condition condition((instr >> 28) & 0xf);
59438                    unsigned rd = (instr >> 12) & 0xf;
59439                    unsigned rn = (instr >> 16) & 0xf;
59440                    unsigned rm = instr & 0xf;
59441                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59442                                                        (instr >> 7) & 0x1f);
59443                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59444                    adcs(condition,
59445                         Best,
59446                         Register(rd),
59447                         Register(rn),
59448                         Operand(Register(rm),
59449                                 shift_operand.GetType(),
59450                                 shift_operand.GetAmount()));
59451                    break;
59452                  }
59453                }
59454                break;
59455              }
59456              case 0x00c00000: {
59457                // 0x00d00000
59458                switch (instr & 0x00000fe0) {
59459                  case 0x00000060: {
59460                    // 0x00d00060
59461                    if (((instr & 0xf0000000) == 0xf0000000)) {
59462                      UnallocatedA32(instr);
59463                      return;
59464                    }
59465                    Condition condition((instr >> 28) & 0xf);
59466                    unsigned rd = (instr >> 12) & 0xf;
59467                    unsigned rn = (instr >> 16) & 0xf;
59468                    unsigned rm = instr & 0xf;
59469                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59470                    sbcs(condition,
59471                         Best,
59472                         Register(rd),
59473                         Register(rn),
59474                         Operand(Register(rm), RRX));
59475                    break;
59476                  }
59477                  default: {
59478                    if (((instr & 0xf0000000) == 0xf0000000) ||
59479                        ((instr & 0xfe0) == 0x60)) {
59480                      UnallocatedA32(instr);
59481                      return;
59482                    }
59483                    Condition condition((instr >> 28) & 0xf);
59484                    unsigned rd = (instr >> 12) & 0xf;
59485                    unsigned rn = (instr >> 16) & 0xf;
59486                    unsigned rm = instr & 0xf;
59487                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59488                                                        (instr >> 7) & 0x1f);
59489                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59490                    sbcs(condition,
59491                         Best,
59492                         Register(rd),
59493                         Register(rn),
59494                         Operand(Register(rm),
59495                                 shift_operand.GetType(),
59496                                 shift_operand.GetAmount()));
59497                    break;
59498                  }
59499                }
59500                break;
59501              }
59502              case 0x00e00000: {
59503                // 0x00f00000
59504                switch (instr & 0x00000fe0) {
59505                  case 0x00000060: {
59506                    // 0x00f00060
59507                    if (((instr & 0xf0000000) == 0xf0000000)) {
59508                      UnallocatedA32(instr);
59509                      return;
59510                    }
59511                    Condition condition((instr >> 28) & 0xf);
59512                    unsigned rd = (instr >> 12) & 0xf;
59513                    unsigned rn = (instr >> 16) & 0xf;
59514                    unsigned rm = instr & 0xf;
59515                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59516                    rscs(condition,
59517                         Register(rd),
59518                         Register(rn),
59519                         Operand(Register(rm), RRX));
59520                    break;
59521                  }
59522                  default: {
59523                    if (((instr & 0xf0000000) == 0xf0000000) ||
59524                        ((instr & 0xfe0) == 0x60)) {
59525                      UnallocatedA32(instr);
59526                      return;
59527                    }
59528                    Condition condition((instr >> 28) & 0xf);
59529                    unsigned rd = (instr >> 12) & 0xf;
59530                    unsigned rn = (instr >> 16) & 0xf;
59531                    unsigned rm = instr & 0xf;
59532                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59533                                                        (instr >> 7) & 0x1f);
59534                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59535                    rscs(condition,
59536                         Register(rd),
59537                         Register(rn),
59538                         Operand(Register(rm),
59539                                 shift_operand.GetType(),
59540                                 shift_operand.GetAmount()));
59541                    break;
59542                  }
59543                }
59544                break;
59545              }
59546              case 0x01000000: {
59547                // 0x01100000
59548                switch (instr & 0x00000fe0) {
59549                  case 0x00000060: {
59550                    // 0x01100060
59551                    if (((instr & 0xf0000000) == 0xf0000000)) {
59552                      UnallocatedA32(instr);
59553                      return;
59554                    }
59555                    Condition condition((instr >> 28) & 0xf);
59556                    unsigned rn = (instr >> 16) & 0xf;
59557                    unsigned rm = instr & 0xf;
59558                    // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59559                    tst(condition,
59560                        Best,
59561                        Register(rn),
59562                        Operand(Register(rm), RRX));
59563                    if (((instr & 0xff0fff0) != 0x1100060)) {
59564                      UnpredictableA32(instr);
59565                    }
59566                    break;
59567                  }
59568                  default: {
59569                    if (((instr & 0xf0000000) == 0xf0000000) ||
59570                        ((instr & 0xfe0) == 0x60)) {
59571                      UnallocatedA32(instr);
59572                      return;
59573                    }
59574                    Condition condition((instr >> 28) & 0xf);
59575                    unsigned rn = (instr >> 16) & 0xf;
59576                    unsigned rm = instr & 0xf;
59577                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59578                                                        (instr >> 7) & 0x1f);
59579                    // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59580                    tst(condition,
59581                        Best,
59582                        Register(rn),
59583                        Operand(Register(rm),
59584                                shift_operand.GetType(),
59585                                shift_operand.GetAmount()));
59586                    if (((instr & 0xff0f010) != 0x1100000)) {
59587                      UnpredictableA32(instr);
59588                    }
59589                    break;
59590                  }
59591                }
59592                break;
59593              }
59594              case 0x01200000: {
59595                // 0x01300000
59596                switch (instr & 0x00000fe0) {
59597                  case 0x00000060: {
59598                    // 0x01300060
59599                    if (((instr & 0xf0000000) == 0xf0000000)) {
59600                      UnallocatedA32(instr);
59601                      return;
59602                    }
59603                    Condition condition((instr >> 28) & 0xf);
59604                    unsigned rn = (instr >> 16) & 0xf;
59605                    unsigned rm = instr & 0xf;
59606                    // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59607                    teq(condition, Register(rn), Operand(Register(rm), RRX));
59608                    if (((instr & 0xff0fff0) != 0x1300060)) {
59609                      UnpredictableA32(instr);
59610                    }
59611                    break;
59612                  }
59613                  default: {
59614                    if (((instr & 0xf0000000) == 0xf0000000) ||
59615                        ((instr & 0xfe0) == 0x60)) {
59616                      UnallocatedA32(instr);
59617                      return;
59618                    }
59619                    Condition condition((instr >> 28) & 0xf);
59620                    unsigned rn = (instr >> 16) & 0xf;
59621                    unsigned rm = instr & 0xf;
59622                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59623                                                        (instr >> 7) & 0x1f);
59624                    // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59625                    teq(condition,
59626                        Register(rn),
59627                        Operand(Register(rm),
59628                                shift_operand.GetType(),
59629                                shift_operand.GetAmount()));
59630                    if (((instr & 0xff0f010) != 0x1300000)) {
59631                      UnpredictableA32(instr);
59632                    }
59633                    break;
59634                  }
59635                }
59636                break;
59637              }
59638              case 0x01400000: {
59639                // 0x01500000
59640                switch (instr & 0x00000fe0) {
59641                  case 0x00000060: {
59642                    // 0x01500060
59643                    if (((instr & 0xf0000000) == 0xf0000000)) {
59644                      UnallocatedA32(instr);
59645                      return;
59646                    }
59647                    Condition condition((instr >> 28) & 0xf);
59648                    unsigned rn = (instr >> 16) & 0xf;
59649                    unsigned rm = instr & 0xf;
59650                    // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59651                    cmp(condition,
59652                        Best,
59653                        Register(rn),
59654                        Operand(Register(rm), RRX));
59655                    if (((instr & 0xff0fff0) != 0x1500060)) {
59656                      UnpredictableA32(instr);
59657                    }
59658                    break;
59659                  }
59660                  default: {
59661                    if (((instr & 0xf0000000) == 0xf0000000) ||
59662                        ((instr & 0xfe0) == 0x60)) {
59663                      UnallocatedA32(instr);
59664                      return;
59665                    }
59666                    Condition condition((instr >> 28) & 0xf);
59667                    unsigned rn = (instr >> 16) & 0xf;
59668                    unsigned rm = instr & 0xf;
59669                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59670                                                        (instr >> 7) & 0x1f);
59671                    // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59672                    cmp(condition,
59673                        Best,
59674                        Register(rn),
59675                        Operand(Register(rm),
59676                                shift_operand.GetType(),
59677                                shift_operand.GetAmount()));
59678                    if (((instr & 0xff0f010) != 0x1500000)) {
59679                      UnpredictableA32(instr);
59680                    }
59681                    break;
59682                  }
59683                }
59684                break;
59685              }
59686              case 0x01600000: {
59687                // 0x01700000
59688                switch (instr & 0x00000fe0) {
59689                  case 0x00000060: {
59690                    // 0x01700060
59691                    if (((instr & 0xf0000000) == 0xf0000000)) {
59692                      UnallocatedA32(instr);
59693                      return;
59694                    }
59695                    Condition condition((instr >> 28) & 0xf);
59696                    unsigned rn = (instr >> 16) & 0xf;
59697                    unsigned rm = instr & 0xf;
59698                    // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59699                    cmn(condition,
59700                        Best,
59701                        Register(rn),
59702                        Operand(Register(rm), RRX));
59703                    if (((instr & 0xff0fff0) != 0x1700060)) {
59704                      UnpredictableA32(instr);
59705                    }
59706                    break;
59707                  }
59708                  default: {
59709                    if (((instr & 0xf0000000) == 0xf0000000) ||
59710                        ((instr & 0xfe0) == 0x60)) {
59711                      UnallocatedA32(instr);
59712                      return;
59713                    }
59714                    Condition condition((instr >> 28) & 0xf);
59715                    unsigned rn = (instr >> 16) & 0xf;
59716                    unsigned rm = instr & 0xf;
59717                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59718                                                        (instr >> 7) & 0x1f);
59719                    // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59720                    cmn(condition,
59721                        Best,
59722                        Register(rn),
59723                        Operand(Register(rm),
59724                                shift_operand.GetType(),
59725                                shift_operand.GetAmount()));
59726                    if (((instr & 0xff0f010) != 0x1700000)) {
59727                      UnpredictableA32(instr);
59728                    }
59729                    break;
59730                  }
59731                }
59732                break;
59733              }
59734              case 0x01800000: {
59735                // 0x01900000
59736                switch (instr & 0x00000fe0) {
59737                  case 0x00000060: {
59738                    // 0x01900060
59739                    if (((instr & 0xf0000000) == 0xf0000000)) {
59740                      UnallocatedA32(instr);
59741                      return;
59742                    }
59743                    Condition condition((instr >> 28) & 0xf);
59744                    unsigned rd = (instr >> 12) & 0xf;
59745                    unsigned rn = (instr >> 16) & 0xf;
59746                    unsigned rm = instr & 0xf;
59747                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59748                    orrs(condition,
59749                         Best,
59750                         Register(rd),
59751                         Register(rn),
59752                         Operand(Register(rm), RRX));
59753                    break;
59754                  }
59755                  default: {
59756                    if (((instr & 0xf0000000) == 0xf0000000) ||
59757                        ((instr & 0xfe0) == 0x60)) {
59758                      UnallocatedA32(instr);
59759                      return;
59760                    }
59761                    Condition condition((instr >> 28) & 0xf);
59762                    unsigned rd = (instr >> 12) & 0xf;
59763                    unsigned rn = (instr >> 16) & 0xf;
59764                    unsigned rm = instr & 0xf;
59765                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59766                                                        (instr >> 7) & 0x1f);
59767                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59768                    orrs(condition,
59769                         Best,
59770                         Register(rd),
59771                         Register(rn),
59772                         Operand(Register(rm),
59773                                 shift_operand.GetType(),
59774                                 shift_operand.GetAmount()));
59775                    break;
59776                  }
59777                }
59778                break;
59779              }
59780              case 0x01a00000: {
59781                // 0x01b00000
59782                switch (instr & 0x00000fe0) {
59783                  case 0x00000060: {
59784                    // 0x01b00060
59785                    if (((instr & 0xf0000000) == 0xf0000000)) {
59786                      UnallocatedA32(instr);
59787                      return;
59788                    }
59789                    if (((instr & 0xf0000000) != 0xf0000000)) {
59790                      Condition condition((instr >> 28) & 0xf);
59791                      unsigned rd = (instr >> 12) & 0xf;
59792                      unsigned rm = instr & 0xf;
59793                      // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1
59794                      rrxs(condition, Register(rd), Register(rm));
59795                      if (((instr & 0xfff0ff0) != 0x1b00060)) {
59796                        UnpredictableA32(instr);
59797                      }
59798                      return;
59799                    }
59800                    Condition condition((instr >> 28) & 0xf);
59801                    unsigned rd = (instr >> 12) & 0xf;
59802                    unsigned rm = instr & 0xf;
59803                    // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
59804                    movs(condition,
59805                         Best,
59806                         Register(rd),
59807                         Operand(Register(rm), RRX));
59808                    if (((instr & 0xfff0ff0) != 0x1b00060)) {
59809                      UnpredictableA32(instr);
59810                    }
59811                    break;
59812                  }
59813                  default: {
59814                    if (((instr & 0xf0000000) == 0xf0000000) ||
59815                        ((instr & 0xfe0) == 0x60)) {
59816                      UnallocatedA32(instr);
59817                      return;
59818                    }
59819                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
59820                        ((instr & 0xf0000000) != 0xf0000000)) {
59821                      Condition condition((instr >> 28) & 0xf);
59822                      unsigned rd = (instr >> 12) & 0xf;
59823                      unsigned rm = instr & 0xf;
59824                      uint32_t amount = (instr >> 7) & 0x1f;
59825                      if (amount == 0) amount = 32;
59826                      // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59827                      asrs(condition, Best, Register(rd), Register(rm), amount);
59828                      if (((instr & 0xfff0070) != 0x1b00040)) {
59829                        UnpredictableA32(instr);
59830                      }
59831                      return;
59832                    }
59833                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
59834                        ((instr & 0xf0000000) != 0xf0000000) &&
59835                        ((instr & 0x00000f80) != 0x00000000)) {
59836                      Condition condition((instr >> 28) & 0xf);
59837                      unsigned rd = (instr >> 12) & 0xf;
59838                      unsigned rm = instr & 0xf;
59839                      uint32_t amount = (instr >> 7) & 0x1f;
59840                      // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59841                      lsls(condition, Best, Register(rd), Register(rm), amount);
59842                      if (((instr & 0xfff0070) != 0x1b00000)) {
59843                        UnpredictableA32(instr);
59844                      }
59845                      return;
59846                    }
59847                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
59848                        ((instr & 0xf0000000) != 0xf0000000)) {
59849                      Condition condition((instr >> 28) & 0xf);
59850                      unsigned rd = (instr >> 12) & 0xf;
59851                      unsigned rm = instr & 0xf;
59852                      uint32_t amount = (instr >> 7) & 0x1f;
59853                      if (amount == 0) amount = 32;
59854                      // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59855                      lsrs(condition, Best, Register(rd), Register(rm), amount);
59856                      if (((instr & 0xfff0070) != 0x1b00020)) {
59857                        UnpredictableA32(instr);
59858                      }
59859                      return;
59860                    }
59861                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
59862                        ((instr & 0xf0000000) != 0xf0000000) &&
59863                        ((instr & 0x00000f80) != 0x00000000)) {
59864                      Condition condition((instr >> 28) & 0xf);
59865                      unsigned rd = (instr >> 12) & 0xf;
59866                      unsigned rm = instr & 0xf;
59867                      uint32_t amount = (instr >> 7) & 0x1f;
59868                      // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59869                      rors(condition, Best, Register(rd), Register(rm), amount);
59870                      if (((instr & 0xfff0070) != 0x1b00060)) {
59871                        UnpredictableA32(instr);
59872                      }
59873                      return;
59874                    }
59875                    Condition condition((instr >> 28) & 0xf);
59876                    unsigned rd = (instr >> 12) & 0xf;
59877                    unsigned rm = instr & 0xf;
59878                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59879                                                        (instr >> 7) & 0x1f);
59880                    // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
59881                    movs(condition,
59882                         Best,
59883                         Register(rd),
59884                         Operand(Register(rm),
59885                                 shift_operand.GetType(),
59886                                 shift_operand.GetAmount()));
59887                    if (((instr & 0xfff0010) != 0x1b00000)) {
59888                      UnpredictableA32(instr);
59889                    }
59890                    break;
59891                  }
59892                }
59893                break;
59894              }
59895              case 0x01c00000: {
59896                // 0x01d00000
59897                switch (instr & 0x00000fe0) {
59898                  case 0x00000060: {
59899                    // 0x01d00060
59900                    if (((instr & 0xf0000000) == 0xf0000000)) {
59901                      UnallocatedA32(instr);
59902                      return;
59903                    }
59904                    Condition condition((instr >> 28) & 0xf);
59905                    unsigned rd = (instr >> 12) & 0xf;
59906                    unsigned rn = (instr >> 16) & 0xf;
59907                    unsigned rm = instr & 0xf;
59908                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59909                    bics(condition,
59910                         Best,
59911                         Register(rd),
59912                         Register(rn),
59913                         Operand(Register(rm), RRX));
59914                    break;
59915                  }
59916                  default: {
59917                    if (((instr & 0xf0000000) == 0xf0000000) ||
59918                        ((instr & 0xfe0) == 0x60)) {
59919                      UnallocatedA32(instr);
59920                      return;
59921                    }
59922                    Condition condition((instr >> 28) & 0xf);
59923                    unsigned rd = (instr >> 12) & 0xf;
59924                    unsigned rn = (instr >> 16) & 0xf;
59925                    unsigned rm = instr & 0xf;
59926                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59927                                                        (instr >> 7) & 0x1f);
59928                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59929                    bics(condition,
59930                         Best,
59931                         Register(rd),
59932                         Register(rn),
59933                         Operand(Register(rm),
59934                                 shift_operand.GetType(),
59935                                 shift_operand.GetAmount()));
59936                    break;
59937                  }
59938                }
59939                break;
59940              }
59941              case 0x01e00000: {
59942                // 0x01f00000
59943                switch (instr & 0x00000fe0) {
59944                  case 0x00000060: {
59945                    // 0x01f00060
59946                    if (((instr & 0xf0000000) == 0xf0000000)) {
59947                      UnallocatedA32(instr);
59948                      return;
59949                    }
59950                    Condition condition((instr >> 28) & 0xf);
59951                    unsigned rd = (instr >> 12) & 0xf;
59952                    unsigned rm = instr & 0xf;
59953                    // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
59954                    mvns(condition,
59955                         Best,
59956                         Register(rd),
59957                         Operand(Register(rm), RRX));
59958                    if (((instr & 0xfff0ff0) != 0x1f00060)) {
59959                      UnpredictableA32(instr);
59960                    }
59961                    break;
59962                  }
59963                  default: {
59964                    if (((instr & 0xf0000000) == 0xf0000000) ||
59965                        ((instr & 0xfe0) == 0x60)) {
59966                      UnallocatedA32(instr);
59967                      return;
59968                    }
59969                    Condition condition((instr >> 28) & 0xf);
59970                    unsigned rd = (instr >> 12) & 0xf;
59971                    unsigned rm = instr & 0xf;
59972                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59973                                                        (instr >> 7) & 0x1f);
59974                    // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
59975                    mvns(condition,
59976                         Best,
59977                         Register(rd),
59978                         Operand(Register(rm),
59979                                 shift_operand.GetType(),
59980                                 shift_operand.GetAmount()));
59981                    if (((instr & 0xfff0010) != 0x1f00000)) {
59982                      UnpredictableA32(instr);
59983                    }
59984                    break;
59985                  }
59986                }
59987                break;
59988              }
59989            }
59990            break;
59991          }
59992          case 0x00100010: {
59993            // 0x00100010
59994            switch (instr & 0x00400080) {
59995              case 0x00000000: {
59996                // 0x00100010
59997                switch (instr & 0x01a00000) {
59998                  case 0x00000000: {
59999                    // 0x00100010
60000                    if (((instr & 0xf0000000) == 0xf0000000)) {
60001                      UnallocatedA32(instr);
60002                      return;
60003                    }
60004                    Condition condition((instr >> 28) & 0xf);
60005                    unsigned rd = (instr >> 12) & 0xf;
60006                    unsigned rn = (instr >> 16) & 0xf;
60007                    unsigned rm = instr & 0xf;
60008                    Shift shift((instr >> 5) & 0x3);
60009                    unsigned rs = (instr >> 8) & 0xf;
60010                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60011                    ands(condition,
60012                         Best,
60013                         Register(rd),
60014                         Register(rn),
60015                         Operand(Register(rm), shift.GetType(), Register(rs)));
60016                    break;
60017                  }
60018                  case 0x00200000: {
60019                    // 0x00300010
60020                    if (((instr & 0xf0000000) == 0xf0000000)) {
60021                      UnallocatedA32(instr);
60022                      return;
60023                    }
60024                    Condition condition((instr >> 28) & 0xf);
60025                    unsigned rd = (instr >> 12) & 0xf;
60026                    unsigned rn = (instr >> 16) & 0xf;
60027                    unsigned rm = instr & 0xf;
60028                    Shift shift((instr >> 5) & 0x3);
60029                    unsigned rs = (instr >> 8) & 0xf;
60030                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60031                    eors(condition,
60032                         Best,
60033                         Register(rd),
60034                         Register(rn),
60035                         Operand(Register(rm), shift.GetType(), Register(rs)));
60036                    break;
60037                  }
60038                  case 0x00800000: {
60039                    // 0x00900010
60040                    if (((instr & 0xf0000000) == 0xf0000000)) {
60041                      UnallocatedA32(instr);
60042                      return;
60043                    }
60044                    Condition condition((instr >> 28) & 0xf);
60045                    unsigned rd = (instr >> 12) & 0xf;
60046                    unsigned rn = (instr >> 16) & 0xf;
60047                    unsigned rm = instr & 0xf;
60048                    Shift shift((instr >> 5) & 0x3);
60049                    unsigned rs = (instr >> 8) & 0xf;
60050                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60051                    adds(condition,
60052                         Best,
60053                         Register(rd),
60054                         Register(rn),
60055                         Operand(Register(rm), shift.GetType(), Register(rs)));
60056                    break;
60057                  }
60058                  case 0x00a00000: {
60059                    // 0x00b00010
60060                    if (((instr & 0xf0000000) == 0xf0000000)) {
60061                      UnallocatedA32(instr);
60062                      return;
60063                    }
60064                    Condition condition((instr >> 28) & 0xf);
60065                    unsigned rd = (instr >> 12) & 0xf;
60066                    unsigned rn = (instr >> 16) & 0xf;
60067                    unsigned rm = instr & 0xf;
60068                    Shift shift((instr >> 5) & 0x3);
60069                    unsigned rs = (instr >> 8) & 0xf;
60070                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60071                    adcs(condition,
60072                         Best,
60073                         Register(rd),
60074                         Register(rn),
60075                         Operand(Register(rm), shift.GetType(), Register(rs)));
60076                    break;
60077                  }
60078                  case 0x01000000: {
60079                    // 0x01100010
60080                    if (((instr & 0xf0000000) == 0xf0000000)) {
60081                      UnallocatedA32(instr);
60082                      return;
60083                    }
60084                    Condition condition((instr >> 28) & 0xf);
60085                    unsigned rn = (instr >> 16) & 0xf;
60086                    unsigned rm = instr & 0xf;
60087                    Shift shift((instr >> 5) & 0x3);
60088                    unsigned rs = (instr >> 8) & 0xf;
60089                    // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60090                    tst(condition,
60091                        Best,
60092                        Register(rn),
60093                        Operand(Register(rm), shift.GetType(), Register(rs)));
60094                    if (((instr & 0xff0f090) != 0x1100010)) {
60095                      UnpredictableA32(instr);
60096                    }
60097                    break;
60098                  }
60099                  case 0x01200000: {
60100                    // 0x01300010
60101                    if (((instr & 0xf0000000) == 0xf0000000)) {
60102                      UnallocatedA32(instr);
60103                      return;
60104                    }
60105                    Condition condition((instr >> 28) & 0xf);
60106                    unsigned rn = (instr >> 16) & 0xf;
60107                    unsigned rm = instr & 0xf;
60108                    Shift shift((instr >> 5) & 0x3);
60109                    unsigned rs = (instr >> 8) & 0xf;
60110                    // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60111                    teq(condition,
60112                        Register(rn),
60113                        Operand(Register(rm), shift.GetType(), Register(rs)));
60114                    if (((instr & 0xff0f090) != 0x1300010)) {
60115                      UnpredictableA32(instr);
60116                    }
60117                    break;
60118                  }
60119                  case 0x01800000: {
60120                    // 0x01900010
60121                    if (((instr & 0xf0000000) == 0xf0000000)) {
60122                      UnallocatedA32(instr);
60123                      return;
60124                    }
60125                    Condition condition((instr >> 28) & 0xf);
60126                    unsigned rd = (instr >> 12) & 0xf;
60127                    unsigned rn = (instr >> 16) & 0xf;
60128                    unsigned rm = instr & 0xf;
60129                    Shift shift((instr >> 5) & 0x3);
60130                    unsigned rs = (instr >> 8) & 0xf;
60131                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60132                    orrs(condition,
60133                         Best,
60134                         Register(rd),
60135                         Register(rn),
60136                         Operand(Register(rm), shift.GetType(), Register(rs)));
60137                    break;
60138                  }
60139                  case 0x01a00000: {
60140                    // 0x01b00010
60141                    if (((instr & 0xf0000000) == 0xf0000000)) {
60142                      UnallocatedA32(instr);
60143                      return;
60144                    }
60145                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
60146                        ((instr & 0xf0000000) != 0xf0000000)) {
60147                      Condition condition((instr >> 28) & 0xf);
60148                      unsigned rd = (instr >> 12) & 0xf;
60149                      unsigned rm = instr & 0xf;
60150                      unsigned rs = (instr >> 8) & 0xf;
60151                      // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
60152                      asrs(condition,
60153                           Best,
60154                           Register(rd),
60155                           Register(rm),
60156                           Register(rs));
60157                      if (((instr & 0xfff00f0) != 0x1b00050)) {
60158                        UnpredictableA32(instr);
60159                      }
60160                      return;
60161                    }
60162                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
60163                        ((instr & 0xf0000000) != 0xf0000000)) {
60164                      Condition condition((instr >> 28) & 0xf);
60165                      unsigned rd = (instr >> 12) & 0xf;
60166                      unsigned rm = instr & 0xf;
60167                      unsigned rs = (instr >> 8) & 0xf;
60168                      // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
60169                      lsls(condition,
60170                           Best,
60171                           Register(rd),
60172                           Register(rm),
60173                           Register(rs));
60174                      if (((instr & 0xfff00f0) != 0x1b00010)) {
60175                        UnpredictableA32(instr);
60176                      }
60177                      return;
60178                    }
60179                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
60180                        ((instr & 0xf0000000) != 0xf0000000)) {
60181                      Condition condition((instr >> 28) & 0xf);
60182                      unsigned rd = (instr >> 12) & 0xf;
60183                      unsigned rm = instr & 0xf;
60184                      unsigned rs = (instr >> 8) & 0xf;
60185                      // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
60186                      lsrs(condition,
60187                           Best,
60188                           Register(rd),
60189                           Register(rm),
60190                           Register(rs));
60191                      if (((instr & 0xfff00f0) != 0x1b00030)) {
60192                        UnpredictableA32(instr);
60193                      }
60194                      return;
60195                    }
60196                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
60197                        ((instr & 0xf0000000) != 0xf0000000)) {
60198                      Condition condition((instr >> 28) & 0xf);
60199                      unsigned rd = (instr >> 12) & 0xf;
60200                      unsigned rm = instr & 0xf;
60201                      unsigned rs = (instr >> 8) & 0xf;
60202                      // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
60203                      rors(condition,
60204                           Best,
60205                           Register(rd),
60206                           Register(rm),
60207                           Register(rs));
60208                      if (((instr & 0xfff00f0) != 0x1b00070)) {
60209                        UnpredictableA32(instr);
60210                      }
60211                      return;
60212                    }
60213                    Condition condition((instr >> 28) & 0xf);
60214                    unsigned rd = (instr >> 12) & 0xf;
60215                    unsigned rm = instr & 0xf;
60216                    Shift shift((instr >> 5) & 0x3);
60217                    unsigned rs = (instr >> 8) & 0xf;
60218                    // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
60219                    movs(condition,
60220                         Best,
60221                         Register(rd),
60222                         Operand(Register(rm), shift.GetType(), Register(rs)));
60223                    if (((instr & 0xfff0090) != 0x1b00010)) {
60224                      UnpredictableA32(instr);
60225                    }
60226                    break;
60227                  }
60228                }
60229                break;
60230              }
60231              case 0x00000080: {
60232                // 0x00100090
60233                switch (instr & 0x01200060) {
60234                  case 0x00000000: {
60235                    // 0x00100090
60236                    switch (instr & 0x00800000) {
60237                      case 0x00000000: {
60238                        // 0x00100090
60239                        if (((instr & 0xf0000000) == 0xf0000000)) {
60240                          UnallocatedA32(instr);
60241                          return;
60242                        }
60243                        Condition condition((instr >> 28) & 0xf);
60244                        unsigned rd = (instr >> 16) & 0xf;
60245                        unsigned rn = instr & 0xf;
60246                        unsigned rm = (instr >> 8) & 0xf;
60247                        // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
60248                        muls(condition,
60249                             Register(rd),
60250                             Register(rn),
60251                             Register(rm));
60252                        if (((instr & 0xff0f0f0) != 0x100090)) {
60253                          UnpredictableA32(instr);
60254                        }
60255                        break;
60256                      }
60257                      case 0x00800000: {
60258                        // 0x00900090
60259                        if (((instr & 0xf0000000) == 0xf0000000)) {
60260                          UnallocatedA32(instr);
60261                          return;
60262                        }
60263                        Condition condition((instr >> 28) & 0xf);
60264                        unsigned rdlo = (instr >> 12) & 0xf;
60265                        unsigned rdhi = (instr >> 16) & 0xf;
60266                        unsigned rn = instr & 0xf;
60267                        unsigned rm = (instr >> 8) & 0xf;
60268                        // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60269                        umulls(condition,
60270                               Register(rdlo),
60271                               Register(rdhi),
60272                               Register(rn),
60273                               Register(rm));
60274                        break;
60275                      }
60276                    }
60277                    break;
60278                  }
60279                  case 0x00000020: {
60280                    // 0x001000b0
60281                    if (((instr & 0xf0000000) == 0xf0000000)) {
60282                      UnallocatedA32(instr);
60283                      return;
60284                    }
60285                    Condition condition((instr >> 28) & 0xf);
60286                    unsigned rt = (instr >> 12) & 0xf;
60287                    unsigned rn = (instr >> 16) & 0xf;
60288                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60289                    unsigned rm = instr & 0xf;
60290                    // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
60291                    ldrh(condition,
60292                         Best,
60293                         Register(rt),
60294                         MemOperand(Register(rn),
60295                                    sign,
60296                                    Register(rm),
60297                                    PostIndex));
60298                    if (((instr & 0xf700ff0) != 0x1000b0)) {
60299                      UnpredictableA32(instr);
60300                    }
60301                    break;
60302                  }
60303                  case 0x00000040: {
60304                    // 0x001000d0
60305                    if (((instr & 0xf0000000) == 0xf0000000)) {
60306                      UnallocatedA32(instr);
60307                      return;
60308                    }
60309                    Condition condition((instr >> 28) & 0xf);
60310                    unsigned rt = (instr >> 12) & 0xf;
60311                    unsigned rn = (instr >> 16) & 0xf;
60312                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60313                    unsigned rm = instr & 0xf;
60314                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
60315                    ldrsb(condition,
60316                          Best,
60317                          Register(rt),
60318                          MemOperand(Register(rn),
60319                                     sign,
60320                                     Register(rm),
60321                                     PostIndex));
60322                    if (((instr & 0xf700ff0) != 0x1000d0)) {
60323                      UnpredictableA32(instr);
60324                    }
60325                    break;
60326                  }
60327                  case 0x00000060: {
60328                    // 0x001000f0
60329                    if (((instr & 0xf0000000) == 0xf0000000)) {
60330                      UnallocatedA32(instr);
60331                      return;
60332                    }
60333                    Condition condition((instr >> 28) & 0xf);
60334                    unsigned rt = (instr >> 12) & 0xf;
60335                    unsigned rn = (instr >> 16) & 0xf;
60336                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60337                    unsigned rm = instr & 0xf;
60338                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
60339                    ldrsh(condition,
60340                          Best,
60341                          Register(rt),
60342                          MemOperand(Register(rn),
60343                                     sign,
60344                                     Register(rm),
60345                                     PostIndex));
60346                    if (((instr & 0xf700ff0) != 0x1000f0)) {
60347                      UnpredictableA32(instr);
60348                    }
60349                    break;
60350                  }
60351                  case 0x00200000: {
60352                    // 0x00300090
60353                    switch (instr & 0x00800000) {
60354                      case 0x00000000: {
60355                        // 0x00300090
60356                        if (((instr & 0xf0000000) == 0xf0000000)) {
60357                          UnallocatedA32(instr);
60358                          return;
60359                        }
60360                        Condition condition((instr >> 28) & 0xf);
60361                        unsigned rd = (instr >> 16) & 0xf;
60362                        unsigned rn = instr & 0xf;
60363                        unsigned rm = (instr >> 8) & 0xf;
60364                        unsigned ra = (instr >> 12) & 0xf;
60365                        // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
60366                        mlas(condition,
60367                             Register(rd),
60368                             Register(rn),
60369                             Register(rm),
60370                             Register(ra));
60371                        break;
60372                      }
60373                      case 0x00800000: {
60374                        // 0x00b00090
60375                        if (((instr & 0xf0000000) == 0xf0000000)) {
60376                          UnallocatedA32(instr);
60377                          return;
60378                        }
60379                        Condition condition((instr >> 28) & 0xf);
60380                        unsigned rdlo = (instr >> 12) & 0xf;
60381                        unsigned rdhi = (instr >> 16) & 0xf;
60382                        unsigned rn = instr & 0xf;
60383                        unsigned rm = (instr >> 8) & 0xf;
60384                        // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60385                        umlals(condition,
60386                               Register(rdlo),
60387                               Register(rdhi),
60388                               Register(rn),
60389                               Register(rm));
60390                        break;
60391                      }
60392                    }
60393                    break;
60394                  }
60395                  case 0x00200020: {
60396                    // 0x003000b0
60397                    if (((instr & 0xf0000000) == 0xf0000000)) {
60398                      UnallocatedA32(instr);
60399                      return;
60400                    }
60401                    UnimplementedA32("LDRHT", instr);
60402                    break;
60403                  }
60404                  case 0x00200040: {
60405                    // 0x003000d0
60406                    if (((instr & 0xf0000000) == 0xf0000000)) {
60407                      UnallocatedA32(instr);
60408                      return;
60409                    }
60410                    UnimplementedA32("LDRSBT", instr);
60411                    break;
60412                  }
60413                  case 0x00200060: {
60414                    // 0x003000f0
60415                    if (((instr & 0xf0000000) == 0xf0000000)) {
60416                      UnallocatedA32(instr);
60417                      return;
60418                    }
60419                    UnimplementedA32("LDRSHT", instr);
60420                    break;
60421                  }
60422                  case 0x01000000: {
60423                    // 0x01100090
60424                    switch (instr & 0x00800300) {
60425                      case 0x00800000: {
60426                        // 0x01900090
60427                        if (((instr & 0xf0000000) == 0xf0000000)) {
60428                          UnallocatedA32(instr);
60429                          return;
60430                        }
60431                        Condition condition((instr >> 28) & 0xf);
60432                        unsigned rt = (instr >> 12) & 0xf;
60433                        unsigned rn = (instr >> 16) & 0xf;
60434                        // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1
60435                        lda(condition,
60436                            Register(rt),
60437                            MemOperand(Register(rn), Offset));
60438                        if (((instr & 0xff00fff) != 0x1900c9f)) {
60439                          UnpredictableA32(instr);
60440                        }
60441                        break;
60442                      }
60443                      case 0x00800200: {
60444                        // 0x01900290
60445                        if (((instr & 0xf0000000) == 0xf0000000)) {
60446                          UnallocatedA32(instr);
60447                          return;
60448                        }
60449                        Condition condition((instr >> 28) & 0xf);
60450                        unsigned rt = (instr >> 12) & 0xf;
60451                        unsigned rn = (instr >> 16) & 0xf;
60452                        // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1
60453                        ldaex(condition,
60454                              Register(rt),
60455                              MemOperand(Register(rn), Offset));
60456                        if (((instr & 0xff00fff) != 0x1900e9f)) {
60457                          UnpredictableA32(instr);
60458                        }
60459                        break;
60460                      }
60461                      case 0x00800300: {
60462                        // 0x01900390
60463                        if (((instr & 0xf0000000) == 0xf0000000)) {
60464                          UnallocatedA32(instr);
60465                          return;
60466                        }
60467                        Condition condition((instr >> 28) & 0xf);
60468                        unsigned rt = (instr >> 12) & 0xf;
60469                        unsigned rn = (instr >> 16) & 0xf;
60470                        // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1
60471                        ldrex(condition,
60472                              Register(rt),
60473                              MemOperand(Register(rn), plus, 0, Offset));
60474                        if (((instr & 0xff00fff) != 0x1900f9f)) {
60475                          UnpredictableA32(instr);
60476                        }
60477                        break;
60478                      }
60479                      default:
60480                        UnallocatedA32(instr);
60481                        break;
60482                    }
60483                    break;
60484                  }
60485                  case 0x01000020: {
60486                    // 0x011000b0
60487                    if (((instr & 0xf0000000) == 0xf0000000)) {
60488                      UnallocatedA32(instr);
60489                      return;
60490                    }
60491                    Condition condition((instr >> 28) & 0xf);
60492                    unsigned rt = (instr >> 12) & 0xf;
60493                    unsigned rn = (instr >> 16) & 0xf;
60494                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60495                    unsigned rm = instr & 0xf;
60496                    AddrMode addrmode = Offset;
60497                    // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
60498                    ldrh(condition,
60499                         Best,
60500                         Register(rt),
60501                         MemOperand(Register(rn),
60502                                    sign,
60503                                    Register(rm),
60504                                    addrmode));
60505                    if (((instr & 0xf700ff0) != 0x11000b0)) {
60506                      UnpredictableA32(instr);
60507                    }
60508                    break;
60509                  }
60510                  case 0x01000040: {
60511                    // 0x011000d0
60512                    if (((instr & 0xf0000000) == 0xf0000000)) {
60513                      UnallocatedA32(instr);
60514                      return;
60515                    }
60516                    Condition condition((instr >> 28) & 0xf);
60517                    unsigned rt = (instr >> 12) & 0xf;
60518                    unsigned rn = (instr >> 16) & 0xf;
60519                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60520                    unsigned rm = instr & 0xf;
60521                    AddrMode addrmode = Offset;
60522                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
60523                    ldrsb(condition,
60524                          Best,
60525                          Register(rt),
60526                          MemOperand(Register(rn),
60527                                     sign,
60528                                     Register(rm),
60529                                     addrmode));
60530                    if (((instr & 0xf700ff0) != 0x11000d0)) {
60531                      UnpredictableA32(instr);
60532                    }
60533                    break;
60534                  }
60535                  case 0x01000060: {
60536                    // 0x011000f0
60537                    if (((instr & 0xf0000000) == 0xf0000000)) {
60538                      UnallocatedA32(instr);
60539                      return;
60540                    }
60541                    Condition condition((instr >> 28) & 0xf);
60542                    unsigned rt = (instr >> 12) & 0xf;
60543                    unsigned rn = (instr >> 16) & 0xf;
60544                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60545                    unsigned rm = instr & 0xf;
60546                    AddrMode addrmode = Offset;
60547                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
60548                    ldrsh(condition,
60549                          Best,
60550                          Register(rt),
60551                          MemOperand(Register(rn),
60552                                     sign,
60553                                     Register(rm),
60554                                     addrmode));
60555                    if (((instr & 0xf700ff0) != 0x11000f0)) {
60556                      UnpredictableA32(instr);
60557                    }
60558                    break;
60559                  }
60560                  case 0x01200000: {
60561                    // 0x01300090
60562                    switch (instr & 0x00800300) {
60563                      case 0x00800200: {
60564                        // 0x01b00290
60565                        if (((instr & 0xf0000000) == 0xf0000000)) {
60566                          UnallocatedA32(instr);
60567                          return;
60568                        }
60569                        Condition condition((instr >> 28) & 0xf);
60570                        unsigned rt = (instr >> 12) & 0xf;
60571                        unsigned rn = (instr >> 16) & 0xf;
60572                        // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
60573                        ldaexd(condition,
60574                               Register(rt),
60575                               Register(rt + 1),
60576                               MemOperand(Register(rn), Offset));
60577                        if (((instr & 0xff00fff) != 0x1b00e9f)) {
60578                          UnpredictableA32(instr);
60579                        }
60580                        break;
60581                      }
60582                      case 0x00800300: {
60583                        // 0x01b00390
60584                        if (((instr & 0xf0000000) == 0xf0000000)) {
60585                          UnallocatedA32(instr);
60586                          return;
60587                        }
60588                        Condition condition((instr >> 28) & 0xf);
60589                        unsigned rt = (instr >> 12) & 0xf;
60590                        unsigned rn = (instr >> 16) & 0xf;
60591                        // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
60592                        ldrexd(condition,
60593                               Register(rt),
60594                               Register(rt + 1),
60595                               MemOperand(Register(rn), Offset));
60596                        if (((instr & 0xff00fff) != 0x1b00f9f)) {
60597                          UnpredictableA32(instr);
60598                        }
60599                        break;
60600                      }
60601                      default:
60602                        UnallocatedA32(instr);
60603                        break;
60604                    }
60605                    break;
60606                  }
60607                  case 0x01200020: {
60608                    // 0x013000b0
60609                    if (((instr & 0xf0000000) == 0xf0000000)) {
60610                      UnallocatedA32(instr);
60611                      return;
60612                    }
60613                    Condition condition((instr >> 28) & 0xf);
60614                    unsigned rt = (instr >> 12) & 0xf;
60615                    unsigned rn = (instr >> 16) & 0xf;
60616                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60617                    unsigned rm = instr & 0xf;
60618                    AddrMode addrmode = PreIndex;
60619                    // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
60620                    ldrh(condition,
60621                         Best,
60622                         Register(rt),
60623                         MemOperand(Register(rn),
60624                                    sign,
60625                                    Register(rm),
60626                                    addrmode));
60627                    if (((instr & 0xf700ff0) != 0x13000b0)) {
60628                      UnpredictableA32(instr);
60629                    }
60630                    break;
60631                  }
60632                  case 0x01200040: {
60633                    // 0x013000d0
60634                    if (((instr & 0xf0000000) == 0xf0000000)) {
60635                      UnallocatedA32(instr);
60636                      return;
60637                    }
60638                    Condition condition((instr >> 28) & 0xf);
60639                    unsigned rt = (instr >> 12) & 0xf;
60640                    unsigned rn = (instr >> 16) & 0xf;
60641                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60642                    unsigned rm = instr & 0xf;
60643                    AddrMode addrmode = PreIndex;
60644                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
60645                    ldrsb(condition,
60646                          Best,
60647                          Register(rt),
60648                          MemOperand(Register(rn),
60649                                     sign,
60650                                     Register(rm),
60651                                     addrmode));
60652                    if (((instr & 0xf700ff0) != 0x13000d0)) {
60653                      UnpredictableA32(instr);
60654                    }
60655                    break;
60656                  }
60657                  case 0x01200060: {
60658                    // 0x013000f0
60659                    if (((instr & 0xf0000000) == 0xf0000000)) {
60660                      UnallocatedA32(instr);
60661                      return;
60662                    }
60663                    Condition condition((instr >> 28) & 0xf);
60664                    unsigned rt = (instr >> 12) & 0xf;
60665                    unsigned rn = (instr >> 16) & 0xf;
60666                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60667                    unsigned rm = instr & 0xf;
60668                    AddrMode addrmode = PreIndex;
60669                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
60670                    ldrsh(condition,
60671                          Best,
60672                          Register(rt),
60673                          MemOperand(Register(rn),
60674                                     sign,
60675                                     Register(rm),
60676                                     addrmode));
60677                    if (((instr & 0xf700ff0) != 0x13000f0)) {
60678                      UnpredictableA32(instr);
60679                    }
60680                    break;
60681                  }
60682                }
60683                break;
60684              }
60685              case 0x00400000: {
60686                // 0x00500010
60687                switch (instr & 0x01a00000) {
60688                  case 0x00000000: {
60689                    // 0x00500010
60690                    if (((instr & 0xf0000000) == 0xf0000000)) {
60691                      UnallocatedA32(instr);
60692                      return;
60693                    }
60694                    Condition condition((instr >> 28) & 0xf);
60695                    unsigned rd = (instr >> 12) & 0xf;
60696                    unsigned rn = (instr >> 16) & 0xf;
60697                    unsigned rm = instr & 0xf;
60698                    Shift shift((instr >> 5) & 0x3);
60699                    unsigned rs = (instr >> 8) & 0xf;
60700                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60701                    subs(condition,
60702                         Best,
60703                         Register(rd),
60704                         Register(rn),
60705                         Operand(Register(rm), shift.GetType(), Register(rs)));
60706                    break;
60707                  }
60708                  case 0x00200000: {
60709                    // 0x00700010
60710                    if (((instr & 0xf0000000) == 0xf0000000)) {
60711                      UnallocatedA32(instr);
60712                      return;
60713                    }
60714                    Condition condition((instr >> 28) & 0xf);
60715                    unsigned rd = (instr >> 12) & 0xf;
60716                    unsigned rn = (instr >> 16) & 0xf;
60717                    unsigned rm = instr & 0xf;
60718                    Shift shift((instr >> 5) & 0x3);
60719                    unsigned rs = (instr >> 8) & 0xf;
60720                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60721                    rsbs(condition,
60722                         Best,
60723                         Register(rd),
60724                         Register(rn),
60725                         Operand(Register(rm), shift.GetType(), Register(rs)));
60726                    break;
60727                  }
60728                  case 0x00800000: {
60729                    // 0x00d00010
60730                    if (((instr & 0xf0000000) == 0xf0000000)) {
60731                      UnallocatedA32(instr);
60732                      return;
60733                    }
60734                    Condition condition((instr >> 28) & 0xf);
60735                    unsigned rd = (instr >> 12) & 0xf;
60736                    unsigned rn = (instr >> 16) & 0xf;
60737                    unsigned rm = instr & 0xf;
60738                    Shift shift((instr >> 5) & 0x3);
60739                    unsigned rs = (instr >> 8) & 0xf;
60740                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60741                    sbcs(condition,
60742                         Best,
60743                         Register(rd),
60744                         Register(rn),
60745                         Operand(Register(rm), shift.GetType(), Register(rs)));
60746                    break;
60747                  }
60748                  case 0x00a00000: {
60749                    // 0x00f00010
60750                    if (((instr & 0xf0000000) == 0xf0000000)) {
60751                      UnallocatedA32(instr);
60752                      return;
60753                    }
60754                    Condition condition((instr >> 28) & 0xf);
60755                    unsigned rd = (instr >> 12) & 0xf;
60756                    unsigned rn = (instr >> 16) & 0xf;
60757                    unsigned rm = instr & 0xf;
60758                    Shift shift((instr >> 5) & 0x3);
60759                    unsigned rs = (instr >> 8) & 0xf;
60760                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60761                    rscs(condition,
60762                         Register(rd),
60763                         Register(rn),
60764                         Operand(Register(rm), shift.GetType(), Register(rs)));
60765                    break;
60766                  }
60767                  case 0x01000000: {
60768                    // 0x01500010
60769                    if (((instr & 0xf0000000) == 0xf0000000)) {
60770                      UnallocatedA32(instr);
60771                      return;
60772                    }
60773                    Condition condition((instr >> 28) & 0xf);
60774                    unsigned rn = (instr >> 16) & 0xf;
60775                    unsigned rm = instr & 0xf;
60776                    Shift shift((instr >> 5) & 0x3);
60777                    unsigned rs = (instr >> 8) & 0xf;
60778                    // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60779                    cmp(condition,
60780                        Best,
60781                        Register(rn),
60782                        Operand(Register(rm), shift.GetType(), Register(rs)));
60783                    if (((instr & 0xff0f090) != 0x1500010)) {
60784                      UnpredictableA32(instr);
60785                    }
60786                    break;
60787                  }
60788                  case 0x01200000: {
60789                    // 0x01700010
60790                    if (((instr & 0xf0000000) == 0xf0000000)) {
60791                      UnallocatedA32(instr);
60792                      return;
60793                    }
60794                    Condition condition((instr >> 28) & 0xf);
60795                    unsigned rn = (instr >> 16) & 0xf;
60796                    unsigned rm = instr & 0xf;
60797                    Shift shift((instr >> 5) & 0x3);
60798                    unsigned rs = (instr >> 8) & 0xf;
60799                    // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60800                    cmn(condition,
60801                        Best,
60802                        Register(rn),
60803                        Operand(Register(rm), shift.GetType(), Register(rs)));
60804                    if (((instr & 0xff0f090) != 0x1700010)) {
60805                      UnpredictableA32(instr);
60806                    }
60807                    break;
60808                  }
60809                  case 0x01800000: {
60810                    // 0x01d00010
60811                    if (((instr & 0xf0000000) == 0xf0000000)) {
60812                      UnallocatedA32(instr);
60813                      return;
60814                    }
60815                    Condition condition((instr >> 28) & 0xf);
60816                    unsigned rd = (instr >> 12) & 0xf;
60817                    unsigned rn = (instr >> 16) & 0xf;
60818                    unsigned rm = instr & 0xf;
60819                    Shift shift((instr >> 5) & 0x3);
60820                    unsigned rs = (instr >> 8) & 0xf;
60821                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60822                    bics(condition,
60823                         Best,
60824                         Register(rd),
60825                         Register(rn),
60826                         Operand(Register(rm), shift.GetType(), Register(rs)));
60827                    break;
60828                  }
60829                  case 0x01a00000: {
60830                    // 0x01f00010
60831                    if (((instr & 0xf0000000) == 0xf0000000)) {
60832                      UnallocatedA32(instr);
60833                      return;
60834                    }
60835                    Condition condition((instr >> 28) & 0xf);
60836                    unsigned rd = (instr >> 12) & 0xf;
60837                    unsigned rm = instr & 0xf;
60838                    Shift shift((instr >> 5) & 0x3);
60839                    unsigned rs = (instr >> 8) & 0xf;
60840                    // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
60841                    mvns(condition,
60842                         Best,
60843                         Register(rd),
60844                         Operand(Register(rm), shift.GetType(), Register(rs)));
60845                    if (((instr & 0xfff0090) != 0x1f00010)) {
60846                      UnpredictableA32(instr);
60847                    }
60848                    break;
60849                  }
60850                }
60851                break;
60852              }
60853              case 0x00400080: {
60854                // 0x00500090
60855                switch (instr & 0x00000060) {
60856                  case 0x00000000: {
60857                    // 0x00500090
60858                    switch (instr & 0x01a00000) {
60859                      case 0x00800000: {
60860                        // 0x00d00090
60861                        if (((instr & 0xf0000000) == 0xf0000000)) {
60862                          UnallocatedA32(instr);
60863                          return;
60864                        }
60865                        Condition condition((instr >> 28) & 0xf);
60866                        unsigned rdlo = (instr >> 12) & 0xf;
60867                        unsigned rdhi = (instr >> 16) & 0xf;
60868                        unsigned rn = instr & 0xf;
60869                        unsigned rm = (instr >> 8) & 0xf;
60870                        // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60871                        smulls(condition,
60872                               Register(rdlo),
60873                               Register(rdhi),
60874                               Register(rn),
60875                               Register(rm));
60876                        break;
60877                      }
60878                      case 0x00a00000: {
60879                        // 0x00f00090
60880                        if (((instr & 0xf0000000) == 0xf0000000)) {
60881                          UnallocatedA32(instr);
60882                          return;
60883                        }
60884                        Condition condition((instr >> 28) & 0xf);
60885                        unsigned rdlo = (instr >> 12) & 0xf;
60886                        unsigned rdhi = (instr >> 16) & 0xf;
60887                        unsigned rn = instr & 0xf;
60888                        unsigned rm = (instr >> 8) & 0xf;
60889                        // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60890                        smlals(condition,
60891                               Register(rdlo),
60892                               Register(rdhi),
60893                               Register(rn),
60894                               Register(rm));
60895                        break;
60896                      }
60897                      case 0x01800000: {
60898                        // 0x01d00090
60899                        switch (instr & 0x00000300) {
60900                          case 0x00000000: {
60901                            // 0x01d00090
60902                            if (((instr & 0xf0000000) == 0xf0000000)) {
60903                              UnallocatedA32(instr);
60904                              return;
60905                            }
60906                            Condition condition((instr >> 28) & 0xf);
60907                            unsigned rt = (instr >> 12) & 0xf;
60908                            unsigned rn = (instr >> 16) & 0xf;
60909                            // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60910                            ldab(condition,
60911                                 Register(rt),
60912                                 MemOperand(Register(rn), Offset));
60913                            if (((instr & 0xff00fff) != 0x1d00c9f)) {
60914                              UnpredictableA32(instr);
60915                            }
60916                            break;
60917                          }
60918                          case 0x00000200: {
60919                            // 0x01d00290
60920                            if (((instr & 0xf0000000) == 0xf0000000)) {
60921                              UnallocatedA32(instr);
60922                              return;
60923                            }
60924                            Condition condition((instr >> 28) & 0xf);
60925                            unsigned rt = (instr >> 12) & 0xf;
60926                            unsigned rn = (instr >> 16) & 0xf;
60927                            // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60928                            ldaexb(condition,
60929                                   Register(rt),
60930                                   MemOperand(Register(rn), Offset));
60931                            if (((instr & 0xff00fff) != 0x1d00e9f)) {
60932                              UnpredictableA32(instr);
60933                            }
60934                            break;
60935                          }
60936                          case 0x00000300: {
60937                            // 0x01d00390
60938                            if (((instr & 0xf0000000) == 0xf0000000)) {
60939                              UnallocatedA32(instr);
60940                              return;
60941                            }
60942                            Condition condition((instr >> 28) & 0xf);
60943                            unsigned rt = (instr >> 12) & 0xf;
60944                            unsigned rn = (instr >> 16) & 0xf;
60945                            // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60946                            ldrexb(condition,
60947                                   Register(rt),
60948                                   MemOperand(Register(rn), Offset));
60949                            if (((instr & 0xff00fff) != 0x1d00f9f)) {
60950                              UnpredictableA32(instr);
60951                            }
60952                            break;
60953                          }
60954                          default:
60955                            UnallocatedA32(instr);
60956                            break;
60957                        }
60958                        break;
60959                      }
60960                      case 0x01a00000: {
60961                        // 0x01f00090
60962                        switch (instr & 0x00000300) {
60963                          case 0x00000000: {
60964                            // 0x01f00090
60965                            if (((instr & 0xf0000000) == 0xf0000000)) {
60966                              UnallocatedA32(instr);
60967                              return;
60968                            }
60969                            Condition condition((instr >> 28) & 0xf);
60970                            unsigned rt = (instr >> 12) & 0xf;
60971                            unsigned rn = (instr >> 16) & 0xf;
60972                            // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60973                            ldah(condition,
60974                                 Register(rt),
60975                                 MemOperand(Register(rn), Offset));
60976                            if (((instr & 0xff00fff) != 0x1f00c9f)) {
60977                              UnpredictableA32(instr);
60978                            }
60979                            break;
60980                          }
60981                          case 0x00000200: {
60982                            // 0x01f00290
60983                            if (((instr & 0xf0000000) == 0xf0000000)) {
60984                              UnallocatedA32(instr);
60985                              return;
60986                            }
60987                            Condition condition((instr >> 28) & 0xf);
60988                            unsigned rt = (instr >> 12) & 0xf;
60989                            unsigned rn = (instr >> 16) & 0xf;
60990                            // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60991                            ldaexh(condition,
60992                                   Register(rt),
60993                                   MemOperand(Register(rn), Offset));
60994                            if (((instr & 0xff00fff) != 0x1f00e9f)) {
60995                              UnpredictableA32(instr);
60996                            }
60997                            break;
60998                          }
60999                          case 0x00000300: {
61000                            // 0x01f00390
61001                            if (((instr & 0xf0000000) == 0xf0000000)) {
61002                              UnallocatedA32(instr);
61003                              return;
61004                            }
61005                            Condition condition((instr >> 28) & 0xf);
61006                            unsigned rt = (instr >> 12) & 0xf;
61007                            unsigned rn = (instr >> 16) & 0xf;
61008                            // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
61009                            ldrexh(condition,
61010                                   Register(rt),
61011                                   MemOperand(Register(rn), Offset));
61012                            if (((instr & 0xff00fff) != 0x1f00f9f)) {
61013                              UnpredictableA32(instr);
61014                            }
61015                            break;
61016                          }
61017                          default:
61018                            UnallocatedA32(instr);
61019                            break;
61020                        }
61021                        break;
61022                      }
61023                      default:
61024                        UnallocatedA32(instr);
61025                        break;
61026                    }
61027                    break;
61028                  }
61029                  case 0x00000020: {
61030                    // 0x005000b0
61031                    switch (instr & 0x01200000) {
61032                      case 0x00000000: {
61033                        // 0x005000b0
61034                        switch (instr & 0x000f0000) {
61035                          case 0x000f0000: {
61036                            // 0x005f00b0
61037                            if (((instr & 0xf0000000) == 0xf0000000) ||
61038                                ((instr & 0x1200000) == 0x200000)) {
61039                              UnallocatedA32(instr);
61040                              return;
61041                            }
61042                            Condition condition((instr >> 28) & 0xf);
61043                            unsigned rt = (instr >> 12) & 0xf;
61044                            uint32_t U = (instr >> 23) & 0x1;
61045                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61046                            if (U == 0) imm = -imm;
61047                            bool minus_zero = (imm == 0) && (U == 0);
61048                            Location location(imm, kA32PcDelta);
61049                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
61050                            if (minus_zero) {
61051                              ldrh(condition,
61052                                   Best,
61053                                   Register(rt),
61054                                   MemOperand(pc, minus, 0));
61055                            } else {
61056                              ldrh(condition, Register(rt), &location);
61057                            }
61058                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
61059                              UnpredictableA32(instr);
61060                            }
61061                            break;
61062                          }
61063                          default: {
61064                            if (((instr & 0xf0000000) == 0xf0000000) ||
61065                                ((instr & 0xf0000) == 0xf0000)) {
61066                              UnallocatedA32(instr);
61067                              return;
61068                            }
61069                            Condition condition((instr >> 28) & 0xf);
61070                            unsigned rt = (instr >> 12) & 0xf;
61071                            unsigned rn = (instr >> 16) & 0xf;
61072                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61073                                                                   : plus);
61074                            int32_t offset =
61075                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61076                            // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
61077                            ldrh(condition,
61078                                 Best,
61079                                 Register(rt),
61080                                 MemOperand(Register(rn),
61081                                            sign,
61082                                            offset,
61083                                            PostIndex));
61084                            break;
61085                          }
61086                        }
61087                        break;
61088                      }
61089                      case 0x00200000: {
61090                        // 0x007000b0
61091                        if (((instr & 0xf0000000) == 0xf0000000)) {
61092                          UnallocatedA32(instr);
61093                          return;
61094                        }
61095                        UnimplementedA32("LDRHT", instr);
61096                        break;
61097                      }
61098                      case 0x01000000: {
61099                        // 0x015000b0
61100                        switch (instr & 0x000f0000) {
61101                          case 0x000f0000: {
61102                            // 0x015f00b0
61103                            if (((instr & 0xf0000000) == 0xf0000000) ||
61104                                ((instr & 0x1200000) == 0x200000)) {
61105                              UnallocatedA32(instr);
61106                              return;
61107                            }
61108                            Condition condition((instr >> 28) & 0xf);
61109                            unsigned rt = (instr >> 12) & 0xf;
61110                            uint32_t U = (instr >> 23) & 0x1;
61111                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61112                            if (U == 0) imm = -imm;
61113                            bool minus_zero = (imm == 0) && (U == 0);
61114                            Location location(imm, kA32PcDelta);
61115                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
61116                            if (minus_zero) {
61117                              ldrh(condition,
61118                                   Best,
61119                                   Register(rt),
61120                                   MemOperand(pc, minus, 0));
61121                            } else {
61122                              ldrh(condition, Register(rt), &location);
61123                            }
61124                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
61125                              UnpredictableA32(instr);
61126                            }
61127                            break;
61128                          }
61129                          default: {
61130                            if (((instr & 0xf0000000) == 0xf0000000) ||
61131                                ((instr & 0xf0000) == 0xf0000)) {
61132                              UnallocatedA32(instr);
61133                              return;
61134                            }
61135                            Condition condition((instr >> 28) & 0xf);
61136                            unsigned rt = (instr >> 12) & 0xf;
61137                            unsigned rn = (instr >> 16) & 0xf;
61138                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61139                                                                   : plus);
61140                            int32_t offset =
61141                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61142                            // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
61143                            ldrh(condition,
61144                                 Best,
61145                                 Register(rt),
61146                                 MemOperand(Register(rn),
61147                                            sign,
61148                                            offset,
61149                                            Offset));
61150                            break;
61151                          }
61152                        }
61153                        break;
61154                      }
61155                      case 0x01200000: {
61156                        // 0x017000b0
61157                        switch (instr & 0x000f0000) {
61158                          case 0x000f0000: {
61159                            // 0x017f00b0
61160                            if (((instr & 0xf0000000) == 0xf0000000) ||
61161                                ((instr & 0x1200000) == 0x200000)) {
61162                              UnallocatedA32(instr);
61163                              return;
61164                            }
61165                            Condition condition((instr >> 28) & 0xf);
61166                            unsigned rt = (instr >> 12) & 0xf;
61167                            uint32_t U = (instr >> 23) & 0x1;
61168                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61169                            if (U == 0) imm = -imm;
61170                            bool minus_zero = (imm == 0) && (U == 0);
61171                            Location location(imm, kA32PcDelta);
61172                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
61173                            if (minus_zero) {
61174                              ldrh(condition,
61175                                   Best,
61176                                   Register(rt),
61177                                   MemOperand(pc, minus, 0));
61178                            } else {
61179                              ldrh(condition, Register(rt), &location);
61180                            }
61181                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
61182                              UnpredictableA32(instr);
61183                            }
61184                            break;
61185                          }
61186                          default: {
61187                            if (((instr & 0xf0000000) == 0xf0000000) ||
61188                                ((instr & 0xf0000) == 0xf0000)) {
61189                              UnallocatedA32(instr);
61190                              return;
61191                            }
61192                            Condition condition((instr >> 28) & 0xf);
61193                            unsigned rt = (instr >> 12) & 0xf;
61194                            unsigned rn = (instr >> 16) & 0xf;
61195                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61196                                                                   : plus);
61197                            int32_t offset =
61198                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61199                            // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length)
61200                            ldrh(condition,
61201                                 Best,
61202                                 Register(rt),
61203                                 MemOperand(Register(rn),
61204                                            sign,
61205                                            offset,
61206                                            PreIndex));
61207                            break;
61208                          }
61209                        }
61210                        break;
61211                      }
61212                    }
61213                    break;
61214                  }
61215                  case 0x00000040: {
61216                    // 0x005000d0
61217                    switch (instr & 0x01200000) {
61218                      case 0x00000000: {
61219                        // 0x005000d0
61220                        switch (instr & 0x000f0000) {
61221                          case 0x000f0000: {
61222                            // 0x005f00d0
61223                            if (((instr & 0xf0000000) == 0xf0000000) ||
61224                                ((instr & 0x1200000) == 0x200000)) {
61225                              UnallocatedA32(instr);
61226                              return;
61227                            }
61228                            Condition condition((instr >> 28) & 0xf);
61229                            unsigned rt = (instr >> 12) & 0xf;
61230                            uint32_t U = (instr >> 23) & 0x1;
61231                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61232                            if (U == 0) imm = -imm;
61233                            bool minus_zero = (imm == 0) && (U == 0);
61234                            Location location(imm, kA32PcDelta);
61235                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
61236                            if (minus_zero) {
61237                              ldrsb(condition,
61238                                    Best,
61239                                    Register(rt),
61240                                    MemOperand(pc, minus, 0));
61241                            } else {
61242                              ldrsb(condition, Register(rt), &location);
61243                            }
61244                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
61245                              UnpredictableA32(instr);
61246                            }
61247                            break;
61248                          }
61249                          default: {
61250                            if (((instr & 0xf0000000) == 0xf0000000) ||
61251                                ((instr & 0xf0000) == 0xf0000)) {
61252                              UnallocatedA32(instr);
61253                              return;
61254                            }
61255                            Condition condition((instr >> 28) & 0xf);
61256                            unsigned rt = (instr >> 12) & 0xf;
61257                            unsigned rn = (instr >> 16) & 0xf;
61258                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61259                                                                   : plus);
61260                            int32_t offset =
61261                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61262                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
61263                            ldrsb(condition,
61264                                  Best,
61265                                  Register(rt),
61266                                  MemOperand(Register(rn),
61267                                             sign,
61268                                             offset,
61269                                             PostIndex));
61270                            break;
61271                          }
61272                        }
61273                        break;
61274                      }
61275                      case 0x00200000: {
61276                        // 0x007000d0
61277                        if (((instr & 0xf0000000) == 0xf0000000)) {
61278                          UnallocatedA32(instr);
61279                          return;
61280                        }
61281                        UnimplementedA32("LDRSBT", instr);
61282                        break;
61283                      }
61284                      case 0x01000000: {
61285                        // 0x015000d0
61286                        switch (instr & 0x000f0000) {
61287                          case 0x000f0000: {
61288                            // 0x015f00d0
61289                            if (((instr & 0xf0000000) == 0xf0000000) ||
61290                                ((instr & 0x1200000) == 0x200000)) {
61291                              UnallocatedA32(instr);
61292                              return;
61293                            }
61294                            Condition condition((instr >> 28) & 0xf);
61295                            unsigned rt = (instr >> 12) & 0xf;
61296                            uint32_t U = (instr >> 23) & 0x1;
61297                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61298                            if (U == 0) imm = -imm;
61299                            bool minus_zero = (imm == 0) && (U == 0);
61300                            Location location(imm, kA32PcDelta);
61301                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
61302                            if (minus_zero) {
61303                              ldrsb(condition,
61304                                    Best,
61305                                    Register(rt),
61306                                    MemOperand(pc, minus, 0));
61307                            } else {
61308                              ldrsb(condition, Register(rt), &location);
61309                            }
61310                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
61311                              UnpredictableA32(instr);
61312                            }
61313                            break;
61314                          }
61315                          default: {
61316                            if (((instr & 0xf0000000) == 0xf0000000) ||
61317                                ((instr & 0xf0000) == 0xf0000)) {
61318                              UnallocatedA32(instr);
61319                              return;
61320                            }
61321                            Condition condition((instr >> 28) & 0xf);
61322                            unsigned rt = (instr >> 12) & 0xf;
61323                            unsigned rn = (instr >> 16) & 0xf;
61324                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61325                                                                   : plus);
61326                            int32_t offset =
61327                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61328                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
61329                            ldrsb(condition,
61330                                  Best,
61331                                  Register(rt),
61332                                  MemOperand(Register(rn),
61333                                             sign,
61334                                             offset,
61335                                             Offset));
61336                            break;
61337                          }
61338                        }
61339                        break;
61340                      }
61341                      case 0x01200000: {
61342                        // 0x017000d0
61343                        switch (instr & 0x000f0000) {
61344                          case 0x000f0000: {
61345                            // 0x017f00d0
61346                            if (((instr & 0xf0000000) == 0xf0000000) ||
61347                                ((instr & 0x1200000) == 0x200000)) {
61348                              UnallocatedA32(instr);
61349                              return;
61350                            }
61351                            Condition condition((instr >> 28) & 0xf);
61352                            unsigned rt = (instr >> 12) & 0xf;
61353                            uint32_t U = (instr >> 23) & 0x1;
61354                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61355                            if (U == 0) imm = -imm;
61356                            bool minus_zero = (imm == 0) && (U == 0);
61357                            Location location(imm, kA32PcDelta);
61358                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
61359                            if (minus_zero) {
61360                              ldrsb(condition,
61361                                    Best,
61362                                    Register(rt),
61363                                    MemOperand(pc, minus, 0));
61364                            } else {
61365                              ldrsb(condition, Register(rt), &location);
61366                            }
61367                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
61368                              UnpredictableA32(instr);
61369                            }
61370                            break;
61371                          }
61372                          default: {
61373                            if (((instr & 0xf0000000) == 0xf0000000) ||
61374                                ((instr & 0xf0000) == 0xf0000)) {
61375                              UnallocatedA32(instr);
61376                              return;
61377                            }
61378                            Condition condition((instr >> 28) & 0xf);
61379                            unsigned rt = (instr >> 12) & 0xf;
61380                            unsigned rn = (instr >> 16) & 0xf;
61381                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61382                                                                   : plus);
61383                            int32_t offset =
61384                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61385                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
61386                            ldrsb(condition,
61387                                  Best,
61388                                  Register(rt),
61389                                  MemOperand(Register(rn),
61390                                             sign,
61391                                             offset,
61392                                             PreIndex));
61393                            break;
61394                          }
61395                        }
61396                        break;
61397                      }
61398                    }
61399                    break;
61400                  }
61401                  case 0x00000060: {
61402                    // 0x005000f0
61403                    switch (instr & 0x01200000) {
61404                      case 0x00000000: {
61405                        // 0x005000f0
61406                        switch (instr & 0x000f0000) {
61407                          case 0x000f0000: {
61408                            // 0x005f00f0
61409                            if (((instr & 0xf0000000) == 0xf0000000) ||
61410                                ((instr & 0x1200000) == 0x200000)) {
61411                              UnallocatedA32(instr);
61412                              return;
61413                            }
61414                            Condition condition((instr >> 28) & 0xf);
61415                            unsigned rt = (instr >> 12) & 0xf;
61416                            uint32_t U = (instr >> 23) & 0x1;
61417                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61418                            if (U == 0) imm = -imm;
61419                            bool minus_zero = (imm == 0) && (U == 0);
61420                            Location location(imm, kA32PcDelta);
61421                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
61422                            if (minus_zero) {
61423                              ldrsh(condition,
61424                                    Best,
61425                                    Register(rt),
61426                                    MemOperand(pc, minus, 0));
61427                            } else {
61428                              ldrsh(condition, Register(rt), &location);
61429                            }
61430                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
61431                              UnpredictableA32(instr);
61432                            }
61433                            break;
61434                          }
61435                          default: {
61436                            if (((instr & 0xf0000000) == 0xf0000000) ||
61437                                ((instr & 0xf0000) == 0xf0000)) {
61438                              UnallocatedA32(instr);
61439                              return;
61440                            }
61441                            Condition condition((instr >> 28) & 0xf);
61442                            unsigned rt = (instr >> 12) & 0xf;
61443                            unsigned rn = (instr >> 16) & 0xf;
61444                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61445                                                                   : plus);
61446                            int32_t offset =
61447                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61448                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
61449                            ldrsh(condition,
61450                                  Best,
61451                                  Register(rt),
61452                                  MemOperand(Register(rn),
61453                                             sign,
61454                                             offset,
61455                                             PostIndex));
61456                            break;
61457                          }
61458                        }
61459                        break;
61460                      }
61461                      case 0x00200000: {
61462                        // 0x007000f0
61463                        if (((instr & 0xf0000000) == 0xf0000000)) {
61464                          UnallocatedA32(instr);
61465                          return;
61466                        }
61467                        UnimplementedA32("LDRSHT", instr);
61468                        break;
61469                      }
61470                      case 0x01000000: {
61471                        // 0x015000f0
61472                        switch (instr & 0x000f0000) {
61473                          case 0x000f0000: {
61474                            // 0x015f00f0
61475                            if (((instr & 0xf0000000) == 0xf0000000) ||
61476                                ((instr & 0x1200000) == 0x200000)) {
61477                              UnallocatedA32(instr);
61478                              return;
61479                            }
61480                            Condition condition((instr >> 28) & 0xf);
61481                            unsigned rt = (instr >> 12) & 0xf;
61482                            uint32_t U = (instr >> 23) & 0x1;
61483                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61484                            if (U == 0) imm = -imm;
61485                            bool minus_zero = (imm == 0) && (U == 0);
61486                            Location location(imm, kA32PcDelta);
61487                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
61488                            if (minus_zero) {
61489                              ldrsh(condition,
61490                                    Best,
61491                                    Register(rt),
61492                                    MemOperand(pc, minus, 0));
61493                            } else {
61494                              ldrsh(condition, Register(rt), &location);
61495                            }
61496                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
61497                              UnpredictableA32(instr);
61498                            }
61499                            break;
61500                          }
61501                          default: {
61502                            if (((instr & 0xf0000000) == 0xf0000000) ||
61503                                ((instr & 0xf0000) == 0xf0000)) {
61504                              UnallocatedA32(instr);
61505                              return;
61506                            }
61507                            Condition condition((instr >> 28) & 0xf);
61508                            unsigned rt = (instr >> 12) & 0xf;
61509                            unsigned rn = (instr >> 16) & 0xf;
61510                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61511                                                                   : plus);
61512                            int32_t offset =
61513                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61514                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
61515                            ldrsh(condition,
61516                                  Best,
61517                                  Register(rt),
61518                                  MemOperand(Register(rn),
61519                                             sign,
61520                                             offset,
61521                                             Offset));
61522                            break;
61523                          }
61524                        }
61525                        break;
61526                      }
61527                      case 0x01200000: {
61528                        // 0x017000f0
61529                        switch (instr & 0x000f0000) {
61530                          case 0x000f0000: {
61531                            // 0x017f00f0
61532                            if (((instr & 0xf0000000) == 0xf0000000) ||
61533                                ((instr & 0x1200000) == 0x200000)) {
61534                              UnallocatedA32(instr);
61535                              return;
61536                            }
61537                            Condition condition((instr >> 28) & 0xf);
61538                            unsigned rt = (instr >> 12) & 0xf;
61539                            uint32_t U = (instr >> 23) & 0x1;
61540                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61541                            if (U == 0) imm = -imm;
61542                            bool minus_zero = (imm == 0) && (U == 0);
61543                            Location location(imm, kA32PcDelta);
61544                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
61545                            if (minus_zero) {
61546                              ldrsh(condition,
61547                                    Best,
61548                                    Register(rt),
61549                                    MemOperand(pc, minus, 0));
61550                            } else {
61551                              ldrsh(condition, Register(rt), &location);
61552                            }
61553                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
61554                              UnpredictableA32(instr);
61555                            }
61556                            break;
61557                          }
61558                          default: {
61559                            if (((instr & 0xf0000000) == 0xf0000000) ||
61560                                ((instr & 0xf0000) == 0xf0000)) {
61561                              UnallocatedA32(instr);
61562                              return;
61563                            }
61564                            Condition condition((instr >> 28) & 0xf);
61565                            unsigned rt = (instr >> 12) & 0xf;
61566                            unsigned rn = (instr >> 16) & 0xf;
61567                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61568                                                                   : plus);
61569                            int32_t offset =
61570                                (instr & 0xf) | ((instr >> 4) & 0xf0);
61571                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
61572                            ldrsh(condition,
61573                                  Best,
61574                                  Register(rt),
61575                                  MemOperand(Register(rn),
61576                                             sign,
61577                                             offset,
61578                                             PreIndex));
61579                            break;
61580                          }
61581                        }
61582                        break;
61583                      }
61584                    }
61585                    break;
61586                  }
61587                }
61588                break;
61589              }
61590            }
61591            break;
61592          }
61593        }
61594        break;
61595      }
61596      case 0x02000000: {
61597        // 0x02000000
61598        switch (instr & 0x01b00000) {
61599          case 0x00000000: {
61600            // 0x02000000
61601            switch (instr & 0x00400000) {
61602              case 0x00000000: {
61603                // 0x02000000
61604                if (((instr & 0xf0000000) == 0xf0000000)) {
61605                  UnallocatedA32(instr);
61606                  return;
61607                }
61608                Condition condition((instr >> 28) & 0xf);
61609                unsigned rd = (instr >> 12) & 0xf;
61610                unsigned rn = (instr >> 16) & 0xf;
61611                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61612                // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61613                and_(condition, Best, Register(rd), Register(rn), imm);
61614                break;
61615              }
61616              case 0x00400000: {
61617                // 0x02400000
61618                switch (instr & 0x000d0000) {
61619                  case 0x000d0000: {
61620                    // 0x024d0000
61621                    switch (instr & 0x00020000) {
61622                      case 0x00000000: {
61623                        // 0x024d0000
61624                        if (((instr & 0xf0000000) == 0xf0000000)) {
61625                          UnallocatedA32(instr);
61626                          return;
61627                        }
61628                        Condition condition((instr >> 28) & 0xf);
61629                        unsigned rd = (instr >> 12) & 0xf;
61630                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61631                        // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61632                        sub(condition, Best, Register(rd), sp, imm);
61633                        break;
61634                      }
61635                      case 0x00020000: {
61636                        // 0x024f0000
61637                        if (((instr & 0xf0000000) == 0xf0000000)) {
61638                          UnallocatedA32(instr);
61639                          return;
61640                        }
61641                        if (((instr & 0xf0000000) != 0xf0000000) &&
61642                            ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) {
61643                          Condition condition((instr >> 28) & 0xf);
61644                          unsigned rd = (instr >> 12) & 0xf;
61645                          uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61646                          // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2
61647                          sub(condition, Best, Register(rd), pc, imm);
61648                          return;
61649                        }
61650                        Condition condition((instr >> 28) & 0xf);
61651                        unsigned rd = (instr >> 12) & 0xf;
61652                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61653                        Location location(-imm, kA32PcDelta);
61654                        // ADR{<c>}{<q>} <Rd>, <label> ; A2
61655                        adr(condition, Best, Register(rd), &location);
61656                        break;
61657                      }
61658                    }
61659                    break;
61660                  }
61661                  default: {
61662                    if (((instr & 0xf0000000) == 0xf0000000) ||
61663                        ((instr & 0xd0000) == 0xd0000)) {
61664                      UnallocatedA32(instr);
61665                      return;
61666                    }
61667                    Condition condition((instr >> 28) & 0xf);
61668                    unsigned rd = (instr >> 12) & 0xf;
61669                    unsigned rn = (instr >> 16) & 0xf;
61670                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61671                    // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61672                    sub(condition, Best, Register(rd), Register(rn), imm);
61673                    break;
61674                  }
61675                }
61676                break;
61677              }
61678            }
61679            break;
61680          }
61681          case 0x00100000: {
61682            // 0x02100000
61683            switch (instr & 0x00400000) {
61684              case 0x00000000: {
61685                // 0x02100000
61686                if (((instr & 0xf0000000) == 0xf0000000)) {
61687                  UnallocatedA32(instr);
61688                  return;
61689                }
61690                Condition condition((instr >> 28) & 0xf);
61691                unsigned rd = (instr >> 12) & 0xf;
61692                unsigned rn = (instr >> 16) & 0xf;
61693                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61694                // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61695                ands(condition, Best, Register(rd), Register(rn), imm);
61696                break;
61697              }
61698              case 0x00400000: {
61699                // 0x02500000
61700                switch (instr & 0x000f0000) {
61701                  case 0x000d0000: {
61702                    // 0x025d0000
61703                    if (((instr & 0xf0000000) == 0xf0000000)) {
61704                      UnallocatedA32(instr);
61705                      return;
61706                    }
61707                    Condition condition((instr >> 28) & 0xf);
61708                    unsigned rd = (instr >> 12) & 0xf;
61709                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61710                    // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61711                    subs(condition, Best, Register(rd), sp, imm);
61712                    break;
61713                  }
61714                  default: {
61715                    if (((instr & 0xf0000000) == 0xf0000000) ||
61716                        ((instr & 0xf0000) == 0xd0000)) {
61717                      UnallocatedA32(instr);
61718                      return;
61719                    }
61720                    Condition condition((instr >> 28) & 0xf);
61721                    unsigned rd = (instr >> 12) & 0xf;
61722                    unsigned rn = (instr >> 16) & 0xf;
61723                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61724                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61725                    subs(condition, Best, Register(rd), Register(rn), imm);
61726                    break;
61727                  }
61728                }
61729                break;
61730              }
61731            }
61732            break;
61733          }
61734          case 0x00200000: {
61735            // 0x02200000
61736            switch (instr & 0x00400000) {
61737              case 0x00000000: {
61738                // 0x02200000
61739                if (((instr & 0xf0000000) == 0xf0000000)) {
61740                  UnallocatedA32(instr);
61741                  return;
61742                }
61743                Condition condition((instr >> 28) & 0xf);
61744                unsigned rd = (instr >> 12) & 0xf;
61745                unsigned rn = (instr >> 16) & 0xf;
61746                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61747                // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61748                eor(condition, Best, Register(rd), Register(rn), imm);
61749                break;
61750              }
61751              case 0x00400000: {
61752                // 0x02600000
61753                if (((instr & 0xf0000000) == 0xf0000000)) {
61754                  UnallocatedA32(instr);
61755                  return;
61756                }
61757                Condition condition((instr >> 28) & 0xf);
61758                unsigned rd = (instr >> 12) & 0xf;
61759                unsigned rn = (instr >> 16) & 0xf;
61760                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61761                // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61762                rsb(condition, Best, Register(rd), Register(rn), imm);
61763                break;
61764              }
61765            }
61766            break;
61767          }
61768          case 0x00300000: {
61769            // 0x02300000
61770            switch (instr & 0x00400000) {
61771              case 0x00000000: {
61772                // 0x02300000
61773                if (((instr & 0xf0000000) == 0xf0000000)) {
61774                  UnallocatedA32(instr);
61775                  return;
61776                }
61777                Condition condition((instr >> 28) & 0xf);
61778                unsigned rd = (instr >> 12) & 0xf;
61779                unsigned rn = (instr >> 16) & 0xf;
61780                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61781                // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61782                eors(condition, Best, Register(rd), Register(rn), imm);
61783                break;
61784              }
61785              case 0x00400000: {
61786                // 0x02700000
61787                if (((instr & 0xf0000000) == 0xf0000000)) {
61788                  UnallocatedA32(instr);
61789                  return;
61790                }
61791                Condition condition((instr >> 28) & 0xf);
61792                unsigned rd = (instr >> 12) & 0xf;
61793                unsigned rn = (instr >> 16) & 0xf;
61794                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61795                // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61796                rsbs(condition, Best, Register(rd), Register(rn), imm);
61797                break;
61798              }
61799            }
61800            break;
61801          }
61802          case 0x00800000: {
61803            // 0x02800000
61804            switch (instr & 0x00400000) {
61805              case 0x00000000: {
61806                // 0x02800000
61807                switch (instr & 0x000d0000) {
61808                  case 0x000d0000: {
61809                    // 0x028d0000
61810                    switch (instr & 0x00020000) {
61811                      case 0x00000000: {
61812                        // 0x028d0000
61813                        if (((instr & 0xf0000000) == 0xf0000000)) {
61814                          UnallocatedA32(instr);
61815                          return;
61816                        }
61817                        Condition condition((instr >> 28) & 0xf);
61818                        unsigned rd = (instr >> 12) & 0xf;
61819                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61820                        // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61821                        add(condition, Best, Register(rd), sp, imm);
61822                        break;
61823                      }
61824                      case 0x00020000: {
61825                        // 0x028f0000
61826                        if (((instr & 0xf0000000) == 0xf0000000)) {
61827                          UnallocatedA32(instr);
61828                          return;
61829                        }
61830                        Condition condition((instr >> 28) & 0xf);
61831                        unsigned rd = (instr >> 12) & 0xf;
61832                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61833                        Location location(imm, kA32PcDelta);
61834                        // ADR{<c>}{<q>} <Rd>, <label> ; A1
61835                        adr(condition, Best, Register(rd), &location);
61836                        break;
61837                      }
61838                    }
61839                    break;
61840                  }
61841                  default: {
61842                    if (((instr & 0xf0000000) == 0xf0000000) ||
61843                        ((instr & 0xd0000) == 0xd0000)) {
61844                      UnallocatedA32(instr);
61845                      return;
61846                    }
61847                    Condition condition((instr >> 28) & 0xf);
61848                    unsigned rd = (instr >> 12) & 0xf;
61849                    unsigned rn = (instr >> 16) & 0xf;
61850                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61851                    // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61852                    add(condition, Best, Register(rd), Register(rn), imm);
61853                    break;
61854                  }
61855                }
61856                break;
61857              }
61858              case 0x00400000: {
61859                // 0x02c00000
61860                if (((instr & 0xf0000000) == 0xf0000000)) {
61861                  UnallocatedA32(instr);
61862                  return;
61863                }
61864                Condition condition((instr >> 28) & 0xf);
61865                unsigned rd = (instr >> 12) & 0xf;
61866                unsigned rn = (instr >> 16) & 0xf;
61867                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61868                // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61869                sbc(condition, Best, Register(rd), Register(rn), imm);
61870                break;
61871              }
61872            }
61873            break;
61874          }
61875          case 0x00900000: {
61876            // 0x02900000
61877            switch (instr & 0x00400000) {
61878              case 0x00000000: {
61879                // 0x02900000
61880                switch (instr & 0x000f0000) {
61881                  case 0x000d0000: {
61882                    // 0x029d0000
61883                    if (((instr & 0xf0000000) == 0xf0000000)) {
61884                      UnallocatedA32(instr);
61885                      return;
61886                    }
61887                    Condition condition((instr >> 28) & 0xf);
61888                    unsigned rd = (instr >> 12) & 0xf;
61889                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61890                    // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61891                    adds(condition, Best, Register(rd), sp, imm);
61892                    break;
61893                  }
61894                  default: {
61895                    if (((instr & 0xf0000000) == 0xf0000000) ||
61896                        ((instr & 0xf0000) == 0xd0000)) {
61897                      UnallocatedA32(instr);
61898                      return;
61899                    }
61900                    Condition condition((instr >> 28) & 0xf);
61901                    unsigned rd = (instr >> 12) & 0xf;
61902                    unsigned rn = (instr >> 16) & 0xf;
61903                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61904                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61905                    adds(condition, Best, Register(rd), Register(rn), imm);
61906                    break;
61907                  }
61908                }
61909                break;
61910              }
61911              case 0x00400000: {
61912                // 0x02d00000
61913                if (((instr & 0xf0000000) == 0xf0000000)) {
61914                  UnallocatedA32(instr);
61915                  return;
61916                }
61917                Condition condition((instr >> 28) & 0xf);
61918                unsigned rd = (instr >> 12) & 0xf;
61919                unsigned rn = (instr >> 16) & 0xf;
61920                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61921                // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61922                sbcs(condition, Best, Register(rd), Register(rn), imm);
61923                break;
61924              }
61925            }
61926            break;
61927          }
61928          case 0x00a00000: {
61929            // 0x02a00000
61930            switch (instr & 0x00400000) {
61931              case 0x00000000: {
61932                // 0x02a00000
61933                if (((instr & 0xf0000000) == 0xf0000000)) {
61934                  UnallocatedA32(instr);
61935                  return;
61936                }
61937                Condition condition((instr >> 28) & 0xf);
61938                unsigned rd = (instr >> 12) & 0xf;
61939                unsigned rn = (instr >> 16) & 0xf;
61940                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61941                // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61942                adc(condition, Best, Register(rd), Register(rn), imm);
61943                break;
61944              }
61945              case 0x00400000: {
61946                // 0x02e00000
61947                if (((instr & 0xf0000000) == 0xf0000000)) {
61948                  UnallocatedA32(instr);
61949                  return;
61950                }
61951                Condition condition((instr >> 28) & 0xf);
61952                unsigned rd = (instr >> 12) & 0xf;
61953                unsigned rn = (instr >> 16) & 0xf;
61954                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61955                // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61956                rsc(condition, Register(rd), Register(rn), imm);
61957                break;
61958              }
61959            }
61960            break;
61961          }
61962          case 0x00b00000: {
61963            // 0x02b00000
61964            switch (instr & 0x00400000) {
61965              case 0x00000000: {
61966                // 0x02b00000
61967                if (((instr & 0xf0000000) == 0xf0000000)) {
61968                  UnallocatedA32(instr);
61969                  return;
61970                }
61971                Condition condition((instr >> 28) & 0xf);
61972                unsigned rd = (instr >> 12) & 0xf;
61973                unsigned rn = (instr >> 16) & 0xf;
61974                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61975                // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61976                adcs(condition, Best, Register(rd), Register(rn), imm);
61977                break;
61978              }
61979              case 0x00400000: {
61980                // 0x02f00000
61981                if (((instr & 0xf0000000) == 0xf0000000)) {
61982                  UnallocatedA32(instr);
61983                  return;
61984                }
61985                Condition condition((instr >> 28) & 0xf);
61986                unsigned rd = (instr >> 12) & 0xf;
61987                unsigned rn = (instr >> 16) & 0xf;
61988                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61989                // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61990                rscs(condition, Register(rd), Register(rn), imm);
61991                break;
61992              }
61993            }
61994            break;
61995          }
61996          case 0x01000000: {
61997            // 0x03000000
61998            switch (instr & 0x00400000) {
61999              case 0x00000000: {
62000                // 0x03000000
62001                if (((instr & 0xf0000000) == 0xf0000000)) {
62002                  UnallocatedA32(instr);
62003                  return;
62004                }
62005                Condition condition((instr >> 28) & 0xf);
62006                unsigned rd = (instr >> 12) & 0xf;
62007                uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
62008                if (!ImmediateA32::IsImmediateA32(imm)) {
62009                  // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2
62010                  mov(condition, Best, Register(rd), imm);
62011                } else {
62012                  // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2
62013                  movw(condition, Register(rd), imm);
62014                }
62015                break;
62016              }
62017              case 0x00400000: {
62018                // 0x03400000
62019                if (((instr & 0xf0000000) == 0xf0000000)) {
62020                  UnallocatedA32(instr);
62021                  return;
62022                }
62023                Condition condition((instr >> 28) & 0xf);
62024                unsigned rd = (instr >> 12) & 0xf;
62025                uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
62026                // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1
62027                movt(condition, Register(rd), imm);
62028                break;
62029              }
62030            }
62031            break;
62032          }
62033          case 0x01100000: {
62034            // 0x03100000
62035            switch (instr & 0x00400000) {
62036              case 0x00000000: {
62037                // 0x03100000
62038                if (((instr & 0xf0000000) == 0xf0000000)) {
62039                  UnallocatedA32(instr);
62040                  return;
62041                }
62042                Condition condition((instr >> 28) & 0xf);
62043                unsigned rn = (instr >> 16) & 0xf;
62044                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62045                // TST{<c>}{<q>} <Rn>, #<const> ; A1
62046                tst(condition, Best, Register(rn), imm);
62047                if (((instr & 0xff0f000) != 0x3100000)) {
62048                  UnpredictableA32(instr);
62049                }
62050                break;
62051              }
62052              case 0x00400000: {
62053                // 0x03500000
62054                if (((instr & 0xf0000000) == 0xf0000000)) {
62055                  UnallocatedA32(instr);
62056                  return;
62057                }
62058                Condition condition((instr >> 28) & 0xf);
62059                unsigned rn = (instr >> 16) & 0xf;
62060                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62061                // CMP{<c>}{<q>} <Rn>, #<const> ; A1
62062                cmp(condition, Best, Register(rn), imm);
62063                if (((instr & 0xff0f000) != 0x3500000)) {
62064                  UnpredictableA32(instr);
62065                }
62066                break;
62067              }
62068            }
62069            break;
62070          }
62071          case 0x01200000: {
62072            // 0x03200000
62073            switch (instr & 0x004f0000) {
62074              case 0x00000000: {
62075                // 0x03200000
62076                switch (instr & 0x000000f0) {
62077                  case 0x00000000: {
62078                    // 0x03200000
62079                    switch (instr & 0x0000000f) {
62080                      case 0x00000000: {
62081                        // 0x03200000
62082                        if (((instr & 0xf0000000) == 0xf0000000)) {
62083                          UnallocatedA32(instr);
62084                          return;
62085                        }
62086                        Condition condition((instr >> 28) & 0xf);
62087                        // NOP{<c>}{<q>} ; A1
62088                        nop(condition, Best);
62089                        if (((instr & 0xfffffff) != 0x320f000)) {
62090                          UnpredictableA32(instr);
62091                        }
62092                        break;
62093                      }
62094                      case 0x00000001: {
62095                        // 0x03200001
62096                        if (((instr & 0xf0000000) == 0xf0000000)) {
62097                          UnallocatedA32(instr);
62098                          return;
62099                        }
62100                        Condition condition((instr >> 28) & 0xf);
62101                        // YIELD{<c>}{<q>} ; A1
62102                        yield(condition, Best);
62103                        if (((instr & 0xfffffff) != 0x320f001)) {
62104                          UnpredictableA32(instr);
62105                        }
62106                        break;
62107                      }
62108                      case 0x00000002: {
62109                        // 0x03200002
62110                        if (((instr & 0xf0000000) == 0xf0000000)) {
62111                          UnallocatedA32(instr);
62112                          return;
62113                        }
62114                        UnimplementedA32("WFE", instr);
62115                        break;
62116                      }
62117                      case 0x00000003: {
62118                        // 0x03200003
62119                        if (((instr & 0xf0000000) == 0xf0000000)) {
62120                          UnallocatedA32(instr);
62121                          return;
62122                        }
62123                        UnimplementedA32("WFI", instr);
62124                        break;
62125                      }
62126                      case 0x00000004: {
62127                        // 0x03200004
62128                        if (((instr & 0xf0000000) == 0xf0000000)) {
62129                          UnallocatedA32(instr);
62130                          return;
62131                        }
62132                        UnimplementedA32("SEV", instr);
62133                        break;
62134                      }
62135                      case 0x00000005: {
62136                        // 0x03200005
62137                        if (((instr & 0xf0000000) == 0xf0000000)) {
62138                          UnallocatedA32(instr);
62139                          return;
62140                        }
62141                        UnimplementedA32("SEVL", instr);
62142                        break;
62143                      }
62144                      default:
62145                        UnallocatedA32(instr);
62146                        break;
62147                    }
62148                    break;
62149                  }
62150                  case 0x000000f0: {
62151                    // 0x032000f0
62152                    if (((instr & 0xf0000000) == 0xf0000000)) {
62153                      UnallocatedA32(instr);
62154                      return;
62155                    }
62156                    UnimplementedA32("DBG", instr);
62157                    break;
62158                  }
62159                  default:
62160                    UnallocatedA32(instr);
62161                    break;
62162                }
62163                break;
62164              }
62165              default: {
62166                if (((instr & 0xf0000000) == 0xf0000000) ||
62167                    ((instr & 0x4f0000) == 0x0)) {
62168                  UnallocatedA32(instr);
62169                  return;
62170                }
62171                Condition condition((instr >> 28) & 0xf);
62172                unsigned spec_reg =
62173                    ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
62174                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62175                // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1
62176                msr(condition, MaskedSpecialRegister(spec_reg), imm);
62177                if (((instr & 0xfb0f000) != 0x320f000)) {
62178                  UnpredictableA32(instr);
62179                }
62180                break;
62181              }
62182            }
62183            break;
62184          }
62185          case 0x01300000: {
62186            // 0x03300000
62187            switch (instr & 0x00400000) {
62188              case 0x00000000: {
62189                // 0x03300000
62190                if (((instr & 0xf0000000) == 0xf0000000)) {
62191                  UnallocatedA32(instr);
62192                  return;
62193                }
62194                Condition condition((instr >> 28) & 0xf);
62195                unsigned rn = (instr >> 16) & 0xf;
62196                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62197                // TEQ{<c>}{<q>} <Rn>, #<const> ; A1
62198                teq(condition, Register(rn), imm);
62199                if (((instr & 0xff0f000) != 0x3300000)) {
62200                  UnpredictableA32(instr);
62201                }
62202                break;
62203              }
62204              case 0x00400000: {
62205                // 0x03700000
62206                if (((instr & 0xf0000000) == 0xf0000000)) {
62207                  UnallocatedA32(instr);
62208                  return;
62209                }
62210                Condition condition((instr >> 28) & 0xf);
62211                unsigned rn = (instr >> 16) & 0xf;
62212                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62213                // CMN{<c>}{<q>} <Rn>, #<const> ; A1
62214                cmn(condition, Best, Register(rn), imm);
62215                if (((instr & 0xff0f000) != 0x3700000)) {
62216                  UnpredictableA32(instr);
62217                }
62218                break;
62219              }
62220            }
62221            break;
62222          }
62223          case 0x01800000: {
62224            // 0x03800000
62225            switch (instr & 0x00400000) {
62226              case 0x00000000: {
62227                // 0x03800000
62228                if (((instr & 0xf0000000) == 0xf0000000)) {
62229                  UnallocatedA32(instr);
62230                  return;
62231                }
62232                Condition condition((instr >> 28) & 0xf);
62233                unsigned rd = (instr >> 12) & 0xf;
62234                unsigned rn = (instr >> 16) & 0xf;
62235                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62236                // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
62237                orr(condition, Best, Register(rd), Register(rn), imm);
62238                break;
62239              }
62240              case 0x00400000: {
62241                // 0x03c00000
62242                if (((instr & 0xf0000000) == 0xf0000000)) {
62243                  UnallocatedA32(instr);
62244                  return;
62245                }
62246                Condition condition((instr >> 28) & 0xf);
62247                unsigned rd = (instr >> 12) & 0xf;
62248                unsigned rn = (instr >> 16) & 0xf;
62249                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62250                // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
62251                bic(condition, Best, Register(rd), Register(rn), imm);
62252                break;
62253              }
62254            }
62255            break;
62256          }
62257          case 0x01900000: {
62258            // 0x03900000
62259            switch (instr & 0x00400000) {
62260              case 0x00000000: {
62261                // 0x03900000
62262                if (((instr & 0xf0000000) == 0xf0000000)) {
62263                  UnallocatedA32(instr);
62264                  return;
62265                }
62266                Condition condition((instr >> 28) & 0xf);
62267                unsigned rd = (instr >> 12) & 0xf;
62268                unsigned rn = (instr >> 16) & 0xf;
62269                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62270                // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
62271                orrs(condition, Best, Register(rd), Register(rn), imm);
62272                break;
62273              }
62274              case 0x00400000: {
62275                // 0x03d00000
62276                if (((instr & 0xf0000000) == 0xf0000000)) {
62277                  UnallocatedA32(instr);
62278                  return;
62279                }
62280                Condition condition((instr >> 28) & 0xf);
62281                unsigned rd = (instr >> 12) & 0xf;
62282                unsigned rn = (instr >> 16) & 0xf;
62283                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62284                // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
62285                bics(condition, Best, Register(rd), Register(rn), imm);
62286                break;
62287              }
62288            }
62289            break;
62290          }
62291          case 0x01a00000: {
62292            // 0x03a00000
62293            switch (instr & 0x00400000) {
62294              case 0x00000000: {
62295                // 0x03a00000
62296                if (((instr & 0xf0000000) == 0xf0000000)) {
62297                  UnallocatedA32(instr);
62298                  return;
62299                }
62300                Condition condition((instr >> 28) & 0xf);
62301                unsigned rd = (instr >> 12) & 0xf;
62302                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62303                // MOV{<c>}{<q>} <Rd>, #<const> ; A1
62304                mov(condition, Best, Register(rd), imm);
62305                if (((instr & 0xfff0000) != 0x3a00000)) {
62306                  UnpredictableA32(instr);
62307                }
62308                break;
62309              }
62310              case 0x00400000: {
62311                // 0x03e00000
62312                if (((instr & 0xf0000000) == 0xf0000000)) {
62313                  UnallocatedA32(instr);
62314                  return;
62315                }
62316                Condition condition((instr >> 28) & 0xf);
62317                unsigned rd = (instr >> 12) & 0xf;
62318                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62319                // MVN{<c>}{<q>} <Rd>, #<const> ; A1
62320                mvn(condition, Best, Register(rd), imm);
62321                if (((instr & 0xfff0000) != 0x3e00000)) {
62322                  UnpredictableA32(instr);
62323                }
62324                break;
62325              }
62326            }
62327            break;
62328          }
62329          case 0x01b00000: {
62330            // 0x03b00000
62331            switch (instr & 0x00400000) {
62332              case 0x00000000: {
62333                // 0x03b00000
62334                if (((instr & 0xf0000000) == 0xf0000000)) {
62335                  UnallocatedA32(instr);
62336                  return;
62337                }
62338                Condition condition((instr >> 28) & 0xf);
62339                unsigned rd = (instr >> 12) & 0xf;
62340                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62341                // MOVS{<c>}{<q>} <Rd>, #<const> ; A1
62342                movs(condition, Best, Register(rd), imm);
62343                if (((instr & 0xfff0000) != 0x3b00000)) {
62344                  UnpredictableA32(instr);
62345                }
62346                break;
62347              }
62348              case 0x00400000: {
62349                // 0x03f00000
62350                if (((instr & 0xf0000000) == 0xf0000000)) {
62351                  UnallocatedA32(instr);
62352                  return;
62353                }
62354                Condition condition((instr >> 28) & 0xf);
62355                unsigned rd = (instr >> 12) & 0xf;
62356                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62357                // MVNS{<c>}{<q>} <Rd>, #<const> ; A1
62358                mvns(condition, Best, Register(rd), imm);
62359                if (((instr & 0xfff0000) != 0x3f00000)) {
62360                  UnpredictableA32(instr);
62361                }
62362                break;
62363              }
62364            }
62365            break;
62366          }
62367        }
62368        break;
62369      }
62370      case 0x04000000: {
62371        // 0x04000000
62372        switch (instr & 0x00500000) {
62373          case 0x00000000: {
62374            // 0x04000000
62375            switch (instr & 0x01200000) {
62376              case 0x00000000: {
62377                // 0x04000000
62378                if (((instr & 0xf0000000) == 0xf0000000)) {
62379                  UnallocatedA32(instr);
62380                  return;
62381                }
62382                Condition condition((instr >> 28) & 0xf);
62383                unsigned rt = (instr >> 12) & 0xf;
62384                unsigned rn = (instr >> 16) & 0xf;
62385                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62386                int32_t offset = instr & 0xfff;
62387                // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62388                str(condition,
62389                    Best,
62390                    Register(rt),
62391                    MemOperand(Register(rn), sign, offset, PostIndex));
62392                break;
62393              }
62394              case 0x00200000: {
62395                // 0x04200000
62396                if (((instr & 0xf0000000) == 0xf0000000)) {
62397                  UnallocatedA32(instr);
62398                  return;
62399                }
62400                UnimplementedA32("STRT", instr);
62401                break;
62402              }
62403              case 0x01000000: {
62404                // 0x05000000
62405                if (((instr & 0xf0000000) == 0xf0000000)) {
62406                  UnallocatedA32(instr);
62407                  return;
62408                }
62409                Condition condition((instr >> 28) & 0xf);
62410                unsigned rt = (instr >> 12) & 0xf;
62411                unsigned rn = (instr >> 16) & 0xf;
62412                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62413                int32_t offset = instr & 0xfff;
62414                // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62415                str(condition,
62416                    Best,
62417                    Register(rt),
62418                    MemOperand(Register(rn), sign, offset, Offset));
62419                break;
62420              }
62421              case 0x01200000: {
62422                // 0x05200000
62423                if (((instr & 0xf0000000) == 0xf0000000)) {
62424                  UnallocatedA32(instr);
62425                  return;
62426                }
62427                if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) &&
62428                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
62429                    ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
62430                    ((instr & 0xf0000000) != 0xf0000000)) {
62431                  Condition condition((instr >> 28) & 0xf);
62432                  unsigned rt = (instr >> 12) & 0xf;
62433                  // PUSH{<c>}{<q>} <single_register_list> ; A1
62434                  push(condition, Best, Register(rt));
62435                  return;
62436                }
62437                Condition condition((instr >> 28) & 0xf);
62438                unsigned rt = (instr >> 12) & 0xf;
62439                unsigned rn = (instr >> 16) & 0xf;
62440                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62441                int32_t offset = instr & 0xfff;
62442                // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62443                str(condition,
62444                    Best,
62445                    Register(rt),
62446                    MemOperand(Register(rn), sign, offset, PreIndex));
62447                break;
62448              }
62449            }
62450            break;
62451          }
62452          case 0x00100000: {
62453            // 0x04100000
62454            switch (instr & 0x01200000) {
62455              case 0x00000000: {
62456                // 0x04100000
62457                switch (instr & 0x000f0000) {
62458                  case 0x000f0000: {
62459                    // 0x041f0000
62460                    if (((instr & 0xf0000000) == 0xf0000000) ||
62461                        ((instr & 0x1200000) == 0x200000)) {
62462                      UnallocatedA32(instr);
62463                      return;
62464                    }
62465                    Condition condition((instr >> 28) & 0xf);
62466                    unsigned rt = (instr >> 12) & 0xf;
62467                    uint32_t U = (instr >> 23) & 0x1;
62468                    int32_t imm = instr & 0xfff;
62469                    if (U == 0) imm = -imm;
62470                    bool minus_zero = (imm == 0) && (U == 0);
62471                    Location location(imm, kA32PcDelta);
62472                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
62473                    if (minus_zero) {
62474                      ldr(condition,
62475                          Best,
62476                          Register(rt),
62477                          MemOperand(pc, minus, 0));
62478                    } else {
62479                      ldr(condition, Best, Register(rt), &location);
62480                    }
62481                    if (((instr & 0xf7f0000) != 0x51f0000)) {
62482                      UnpredictableA32(instr);
62483                    }
62484                    break;
62485                  }
62486                  default: {
62487                    if (((instr & 0xf0000000) == 0xf0000000) ||
62488                        ((instr & 0xf0000) == 0xf0000)) {
62489                      UnallocatedA32(instr);
62490                      return;
62491                    }
62492                    if (((Uint32((instr >> 23)) & Uint32(0x1)) ==
62493                         Uint32(0x1)) &&
62494                        ((Uint32((instr >> 16)) & Uint32(0xf)) ==
62495                         Uint32(0xd)) &&
62496                        ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
62497                        ((instr & 0xf0000000) != 0xf0000000)) {
62498                      Condition condition((instr >> 28) & 0xf);
62499                      unsigned rt = (instr >> 12) & 0xf;
62500                      // POP{<c>}{<q>} <single_register_list> ; A1
62501                      pop(condition, Best, Register(rt));
62502                      return;
62503                    }
62504                    Condition condition((instr >> 28) & 0xf);
62505                    unsigned rt = (instr >> 12) & 0xf;
62506                    unsigned rn = (instr >> 16) & 0xf;
62507                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62508                    int32_t offset = instr & 0xfff;
62509                    // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62510                    ldr(condition,
62511                        Best,
62512                        Register(rt),
62513                        MemOperand(Register(rn), sign, offset, PostIndex));
62514                    break;
62515                  }
62516                }
62517                break;
62518              }
62519              case 0x00200000: {
62520                // 0x04300000
62521                if (((instr & 0xf0000000) == 0xf0000000)) {
62522                  UnallocatedA32(instr);
62523                  return;
62524                }
62525                UnimplementedA32("LDRT", instr);
62526                break;
62527              }
62528              case 0x01000000: {
62529                // 0x05100000
62530                switch (instr & 0x000f0000) {
62531                  case 0x000f0000: {
62532                    // 0x051f0000
62533                    if (((instr & 0xf0000000) == 0xf0000000) ||
62534                        ((instr & 0x1200000) == 0x200000)) {
62535                      UnallocatedA32(instr);
62536                      return;
62537                    }
62538                    Condition condition((instr >> 28) & 0xf);
62539                    unsigned rt = (instr >> 12) & 0xf;
62540                    uint32_t U = (instr >> 23) & 0x1;
62541                    int32_t imm = instr & 0xfff;
62542                    if (U == 0) imm = -imm;
62543                    bool minus_zero = (imm == 0) && (U == 0);
62544                    Location location(imm, kA32PcDelta);
62545                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
62546                    if (minus_zero) {
62547                      ldr(condition,
62548                          Best,
62549                          Register(rt),
62550                          MemOperand(pc, minus, 0));
62551                    } else {
62552                      ldr(condition, Best, Register(rt), &location);
62553                    }
62554                    if (((instr & 0xf7f0000) != 0x51f0000)) {
62555                      UnpredictableA32(instr);
62556                    }
62557                    break;
62558                  }
62559                  default: {
62560                    if (((instr & 0xf0000000) == 0xf0000000) ||
62561                        ((instr & 0xf0000) == 0xf0000)) {
62562                      UnallocatedA32(instr);
62563                      return;
62564                    }
62565                    Condition condition((instr >> 28) & 0xf);
62566                    unsigned rt = (instr >> 12) & 0xf;
62567                    unsigned rn = (instr >> 16) & 0xf;
62568                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62569                    int32_t offset = instr & 0xfff;
62570                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62571                    ldr(condition,
62572                        Best,
62573                        Register(rt),
62574                        MemOperand(Register(rn), sign, offset, Offset));
62575                    break;
62576                  }
62577                }
62578                break;
62579              }
62580              case 0x01200000: {
62581                // 0x05300000
62582                switch (instr & 0x000f0000) {
62583                  case 0x000f0000: {
62584                    // 0x053f0000
62585                    if (((instr & 0xf0000000) == 0xf0000000) ||
62586                        ((instr & 0x1200000) == 0x200000)) {
62587                      UnallocatedA32(instr);
62588                      return;
62589                    }
62590                    Condition condition((instr >> 28) & 0xf);
62591                    unsigned rt = (instr >> 12) & 0xf;
62592                    uint32_t U = (instr >> 23) & 0x1;
62593                    int32_t imm = instr & 0xfff;
62594                    if (U == 0) imm = -imm;
62595                    bool minus_zero = (imm == 0) && (U == 0);
62596                    Location location(imm, kA32PcDelta);
62597                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
62598                    if (minus_zero) {
62599                      ldr(condition,
62600                          Best,
62601                          Register(rt),
62602                          MemOperand(pc, minus, 0));
62603                    } else {
62604                      ldr(condition, Best, Register(rt), &location);
62605                    }
62606                    if (((instr & 0xf7f0000) != 0x51f0000)) {
62607                      UnpredictableA32(instr);
62608                    }
62609                    break;
62610                  }
62611                  default: {
62612                    if (((instr & 0xf0000000) == 0xf0000000) ||
62613                        ((instr & 0xf0000) == 0xf0000)) {
62614                      UnallocatedA32(instr);
62615                      return;
62616                    }
62617                    Condition condition((instr >> 28) & 0xf);
62618                    unsigned rt = (instr >> 12) & 0xf;
62619                    unsigned rn = (instr >> 16) & 0xf;
62620                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62621                    int32_t offset = instr & 0xfff;
62622                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62623                    ldr(condition,
62624                        Best,
62625                        Register(rt),
62626                        MemOperand(Register(rn), sign, offset, PreIndex));
62627                    break;
62628                  }
62629                }
62630                break;
62631              }
62632            }
62633            break;
62634          }
62635          case 0x00400000: {
62636            // 0x04400000
62637            switch (instr & 0x01200000) {
62638              case 0x00000000: {
62639                // 0x04400000
62640                if (((instr & 0xf0000000) == 0xf0000000)) {
62641                  UnallocatedA32(instr);
62642                  return;
62643                }
62644                Condition condition((instr >> 28) & 0xf);
62645                unsigned rt = (instr >> 12) & 0xf;
62646                unsigned rn = (instr >> 16) & 0xf;
62647                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62648                int32_t offset = instr & 0xfff;
62649                // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62650                strb(condition,
62651                     Best,
62652                     Register(rt),
62653                     MemOperand(Register(rn), sign, offset, PostIndex));
62654                break;
62655              }
62656              case 0x00200000: {
62657                // 0x04600000
62658                if (((instr & 0xf0000000) == 0xf0000000)) {
62659                  UnallocatedA32(instr);
62660                  return;
62661                }
62662                UnimplementedA32("STRBT", instr);
62663                break;
62664              }
62665              case 0x01000000: {
62666                // 0x05400000
62667                if (((instr & 0xf0000000) == 0xf0000000)) {
62668                  UnallocatedA32(instr);
62669                  return;
62670                }
62671                Condition condition((instr >> 28) & 0xf);
62672                unsigned rt = (instr >> 12) & 0xf;
62673                unsigned rn = (instr >> 16) & 0xf;
62674                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62675                int32_t offset = instr & 0xfff;
62676                // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62677                strb(condition,
62678                     Best,
62679                     Register(rt),
62680                     MemOperand(Register(rn), sign, offset, Offset));
62681                break;
62682              }
62683              case 0x01200000: {
62684                // 0x05600000
62685                if (((instr & 0xf0000000) == 0xf0000000)) {
62686                  UnallocatedA32(instr);
62687                  return;
62688                }
62689                Condition condition((instr >> 28) & 0xf);
62690                unsigned rt = (instr >> 12) & 0xf;
62691                unsigned rn = (instr >> 16) & 0xf;
62692                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62693                int32_t offset = instr & 0xfff;
62694                // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62695                strb(condition,
62696                     Best,
62697                     Register(rt),
62698                     MemOperand(Register(rn), sign, offset, PreIndex));
62699                break;
62700              }
62701            }
62702            break;
62703          }
62704          case 0x00500000: {
62705            // 0x04500000
62706            switch (instr & 0x01200000) {
62707              case 0x00000000: {
62708                // 0x04500000
62709                switch (instr & 0x000f0000) {
62710                  case 0x000f0000: {
62711                    // 0x045f0000
62712                    if (((instr & 0xf0000000) == 0xf0000000) ||
62713                        ((instr & 0x1200000) == 0x200000)) {
62714                      UnallocatedA32(instr);
62715                      return;
62716                    }
62717                    Condition condition((instr >> 28) & 0xf);
62718                    unsigned rt = (instr >> 12) & 0xf;
62719                    uint32_t U = (instr >> 23) & 0x1;
62720                    int32_t imm = instr & 0xfff;
62721                    if (U == 0) imm = -imm;
62722                    bool minus_zero = (imm == 0) && (U == 0);
62723                    Location location(imm, kA32PcDelta);
62724                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62725                    if (minus_zero) {
62726                      ldrb(condition,
62727                           Best,
62728                           Register(rt),
62729                           MemOperand(pc, minus, 0));
62730                    } else {
62731                      ldrb(condition, Register(rt), &location);
62732                    }
62733                    if (((instr & 0xf7f0000) != 0x55f0000)) {
62734                      UnpredictableA32(instr);
62735                    }
62736                    break;
62737                  }
62738                  default: {
62739                    if (((instr & 0xf0000000) == 0xf0000000) ||
62740                        ((instr & 0xf0000) == 0xf0000)) {
62741                      UnallocatedA32(instr);
62742                      return;
62743                    }
62744                    Condition condition((instr >> 28) & 0xf);
62745                    unsigned rt = (instr >> 12) & 0xf;
62746                    unsigned rn = (instr >> 16) & 0xf;
62747                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62748                    int32_t offset = instr & 0xfff;
62749                    // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62750                    ldrb(condition,
62751                         Best,
62752                         Register(rt),
62753                         MemOperand(Register(rn), sign, offset, PostIndex));
62754                    break;
62755                  }
62756                }
62757                break;
62758              }
62759              case 0x00200000: {
62760                // 0x04700000
62761                if (((instr & 0xf0000000) == 0xf0000000)) {
62762                  UnallocatedA32(instr);
62763                  return;
62764                }
62765                UnimplementedA32("LDRBT", instr);
62766                break;
62767              }
62768              case 0x01000000: {
62769                // 0x05500000
62770                switch (instr & 0x000f0000) {
62771                  case 0x000f0000: {
62772                    // 0x055f0000
62773                    if (((instr & 0xf0000000) == 0xf0000000) ||
62774                        ((instr & 0x1200000) == 0x200000)) {
62775                      UnallocatedA32(instr);
62776                      return;
62777                    }
62778                    Condition condition((instr >> 28) & 0xf);
62779                    unsigned rt = (instr >> 12) & 0xf;
62780                    uint32_t U = (instr >> 23) & 0x1;
62781                    int32_t imm = instr & 0xfff;
62782                    if (U == 0) imm = -imm;
62783                    bool minus_zero = (imm == 0) && (U == 0);
62784                    Location location(imm, kA32PcDelta);
62785                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62786                    if (minus_zero) {
62787                      ldrb(condition,
62788                           Best,
62789                           Register(rt),
62790                           MemOperand(pc, minus, 0));
62791                    } else {
62792                      ldrb(condition, Register(rt), &location);
62793                    }
62794                    if (((instr & 0xf7f0000) != 0x55f0000)) {
62795                      UnpredictableA32(instr);
62796                    }
62797                    break;
62798                  }
62799                  default: {
62800                    if (((instr & 0xf0000000) == 0xf0000000) ||
62801                        ((instr & 0xf0000) == 0xf0000)) {
62802                      UnallocatedA32(instr);
62803                      return;
62804                    }
62805                    Condition condition((instr >> 28) & 0xf);
62806                    unsigned rt = (instr >> 12) & 0xf;
62807                    unsigned rn = (instr >> 16) & 0xf;
62808                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62809                    int32_t offset = instr & 0xfff;
62810                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62811                    ldrb(condition,
62812                         Best,
62813                         Register(rt),
62814                         MemOperand(Register(rn), sign, offset, Offset));
62815                    break;
62816                  }
62817                }
62818                break;
62819              }
62820              case 0x01200000: {
62821                // 0x05700000
62822                switch (instr & 0x000f0000) {
62823                  case 0x000f0000: {
62824                    // 0x057f0000
62825                    if (((instr & 0xf0000000) == 0xf0000000) ||
62826                        ((instr & 0x1200000) == 0x200000)) {
62827                      UnallocatedA32(instr);
62828                      return;
62829                    }
62830                    Condition condition((instr >> 28) & 0xf);
62831                    unsigned rt = (instr >> 12) & 0xf;
62832                    uint32_t U = (instr >> 23) & 0x1;
62833                    int32_t imm = instr & 0xfff;
62834                    if (U == 0) imm = -imm;
62835                    bool minus_zero = (imm == 0) && (U == 0);
62836                    Location location(imm, kA32PcDelta);
62837                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62838                    if (minus_zero) {
62839                      ldrb(condition,
62840                           Best,
62841                           Register(rt),
62842                           MemOperand(pc, minus, 0));
62843                    } else {
62844                      ldrb(condition, Register(rt), &location);
62845                    }
62846                    if (((instr & 0xf7f0000) != 0x55f0000)) {
62847                      UnpredictableA32(instr);
62848                    }
62849                    break;
62850                  }
62851                  default: {
62852                    if (((instr & 0xf0000000) == 0xf0000000) ||
62853                        ((instr & 0xf0000) == 0xf0000)) {
62854                      UnallocatedA32(instr);
62855                      return;
62856                    }
62857                    Condition condition((instr >> 28) & 0xf);
62858                    unsigned rt = (instr >> 12) & 0xf;
62859                    unsigned rn = (instr >> 16) & 0xf;
62860                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62861                    int32_t offset = instr & 0xfff;
62862                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62863                    ldrb(condition,
62864                         Best,
62865                         Register(rt),
62866                         MemOperand(Register(rn), sign, offset, PreIndex));
62867                    break;
62868                  }
62869                }
62870                break;
62871              }
62872            }
62873            break;
62874          }
62875        }
62876        break;
62877      }
62878      case 0x06000000: {
62879        // 0x06000000
62880        switch (instr & 0x01600010) {
62881          case 0x00000000: {
62882            // 0x06000000
62883            switch (instr & 0x00100000) {
62884              case 0x00000000: {
62885                // 0x06000000
62886                if (((instr & 0xf0000000) == 0xf0000000)) {
62887                  UnallocatedA32(instr);
62888                  return;
62889                }
62890                Condition condition((instr >> 28) & 0xf);
62891                unsigned rt = (instr >> 12) & 0xf;
62892                unsigned rn = (instr >> 16) & 0xf;
62893                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62894                unsigned rm = instr & 0xf;
62895                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62896                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
62897                                                    (imm_and_type_ & 0x7c) >>
62898                                                        2);
62899                Shift shift = shift_operand.GetShift();
62900                uint32_t amount = shift_operand.GetAmount();
62901                // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
62902                str(condition,
62903                    Best,
62904                    Register(rt),
62905                    MemOperand(Register(rn),
62906                               sign,
62907                               Register(rm),
62908                               shift,
62909                               amount,
62910                               PostIndex));
62911                break;
62912              }
62913              case 0x00100000: {
62914                // 0x06100000
62915                if (((instr & 0xf0000000) == 0xf0000000)) {
62916                  UnallocatedA32(instr);
62917                  return;
62918                }
62919                Condition condition((instr >> 28) & 0xf);
62920                unsigned rt = (instr >> 12) & 0xf;
62921                unsigned rn = (instr >> 16) & 0xf;
62922                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62923                unsigned rm = instr & 0xf;
62924                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62925                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
62926                                                    (imm_and_type_ & 0x7c) >>
62927                                                        2);
62928                Shift shift = shift_operand.GetShift();
62929                uint32_t amount = shift_operand.GetAmount();
62930                // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
62931                ldr(condition,
62932                    Best,
62933                    Register(rt),
62934                    MemOperand(Register(rn),
62935                               sign,
62936                               Register(rm),
62937                               shift,
62938                               amount,
62939                               PostIndex));
62940                break;
62941              }
62942            }
62943            break;
62944          }
62945          case 0x00000010: {
62946            // 0x06000010
62947            switch (instr & 0x00900060) {
62948              case 0x00100000: {
62949                // 0x06100010
62950                switch (instr & 0x00000080) {
62951                  case 0x00000000: {
62952                    // 0x06100010
62953                    if (((instr & 0xf0000000) == 0xf0000000)) {
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                    // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62962                    sadd16(condition, Register(rd), Register(rn), Register(rm));
62963                    if (((instr & 0xff00ff0) != 0x6100f10)) {
62964                      UnpredictableA32(instr);
62965                    }
62966                    break;
62967                  }
62968                  case 0x00000080: {
62969                    // 0x06100090
62970                    if (((instr & 0xf0000000) == 0xf0000000)) {
62971                      UnallocatedA32(instr);
62972                      return;
62973                    }
62974                    Condition condition((instr >> 28) & 0xf);
62975                    unsigned rd = (instr >> 12) & 0xf;
62976                    unsigned rn = (instr >> 16) & 0xf;
62977                    unsigned rm = instr & 0xf;
62978                    // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62979                    sadd8(condition, Register(rd), Register(rn), Register(rm));
62980                    if (((instr & 0xff00ff0) != 0x6100f90)) {
62981                      UnpredictableA32(instr);
62982                    }
62983                    break;
62984                  }
62985                }
62986                break;
62987              }
62988              case 0x00100020: {
62989                // 0x06100030
62990                if ((instr & 0x00000080) == 0x00000000) {
62991                  if (((instr & 0xf0000000) == 0xf0000000)) {
62992                    UnallocatedA32(instr);
62993                    return;
62994                  }
62995                  Condition condition((instr >> 28) & 0xf);
62996                  unsigned rd = (instr >> 12) & 0xf;
62997                  unsigned rn = (instr >> 16) & 0xf;
62998                  unsigned rm = instr & 0xf;
62999                  // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63000                  sasx(condition, Register(rd), Register(rn), Register(rm));
63001                  if (((instr & 0xff00ff0) != 0x6100f30)) {
63002                    UnpredictableA32(instr);
63003                  }
63004                } else {
63005                  UnallocatedA32(instr);
63006                }
63007                break;
63008              }
63009              case 0x00100040: {
63010                // 0x06100050
63011                if ((instr & 0x00000080) == 0x00000000) {
63012                  if (((instr & 0xf0000000) == 0xf0000000)) {
63013                    UnallocatedA32(instr);
63014                    return;
63015                  }
63016                  Condition condition((instr >> 28) & 0xf);
63017                  unsigned rd = (instr >> 12) & 0xf;
63018                  unsigned rn = (instr >> 16) & 0xf;
63019                  unsigned rm = instr & 0xf;
63020                  // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63021                  ssax(condition, Register(rd), Register(rn), Register(rm));
63022                  if (((instr & 0xff00ff0) != 0x6100f50)) {
63023                    UnpredictableA32(instr);
63024                  }
63025                } else {
63026                  UnallocatedA32(instr);
63027                }
63028                break;
63029              }
63030              case 0x00100060: {
63031                // 0x06100070
63032                switch (instr & 0x00000080) {
63033                  case 0x00000000: {
63034                    // 0x06100070
63035                    if (((instr & 0xf0000000) == 0xf0000000)) {
63036                      UnallocatedA32(instr);
63037                      return;
63038                    }
63039                    Condition condition((instr >> 28) & 0xf);
63040                    unsigned rd = (instr >> 12) & 0xf;
63041                    unsigned rn = (instr >> 16) & 0xf;
63042                    unsigned rm = instr & 0xf;
63043                    // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63044                    ssub16(condition, Register(rd), Register(rn), Register(rm));
63045                    if (((instr & 0xff00ff0) != 0x6100f70)) {
63046                      UnpredictableA32(instr);
63047                    }
63048                    break;
63049                  }
63050                  case 0x00000080: {
63051                    // 0x061000f0
63052                    if (((instr & 0xf0000000) == 0xf0000000)) {
63053                      UnallocatedA32(instr);
63054                      return;
63055                    }
63056                    Condition condition((instr >> 28) & 0xf);
63057                    unsigned rd = (instr >> 12) & 0xf;
63058                    unsigned rn = (instr >> 16) & 0xf;
63059                    unsigned rm = instr & 0xf;
63060                    // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63061                    ssub8(condition, Register(rd), Register(rn), Register(rm));
63062                    if (((instr & 0xff00ff0) != 0x6100ff0)) {
63063                      UnpredictableA32(instr);
63064                    }
63065                    break;
63066                  }
63067                }
63068                break;
63069              }
63070              case 0x00800000: {
63071                // 0x06800010
63072                if (((instr & 0xf0000000) == 0xf0000000)) {
63073                  UnallocatedA32(instr);
63074                  return;
63075                }
63076                Condition condition((instr >> 28) & 0xf);
63077                unsigned rd = (instr >> 12) & 0xf;
63078                unsigned rn = (instr >> 16) & 0xf;
63079                unsigned rm = instr & 0xf;
63080                uint32_t amount = (instr >> 7) & 0x1f;
63081                // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1
63082                pkhbt(condition,
63083                      Register(rd),
63084                      Register(rn),
63085                      Operand(Register(rm), LSL, amount));
63086                break;
63087              }
63088              case 0x00800020: {
63089                // 0x06800030
63090                if ((instr & 0x00000080) == 0x00000080) {
63091                  if (((instr & 0xf0000000) == 0xf0000000)) {
63092                    UnallocatedA32(instr);
63093                    return;
63094                  }
63095                  Condition condition((instr >> 28) & 0xf);
63096                  unsigned rd = (instr >> 12) & 0xf;
63097                  unsigned rn = (instr >> 16) & 0xf;
63098                  unsigned rm = instr & 0xf;
63099                  // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63100                  sel(condition, Register(rd), Register(rn), Register(rm));
63101                  if (((instr & 0xff00ff0) != 0x6800fb0)) {
63102                    UnpredictableA32(instr);
63103                  }
63104                } else {
63105                  UnallocatedA32(instr);
63106                }
63107                break;
63108              }
63109              case 0x00800040: {
63110                // 0x06800050
63111                if (((instr & 0xf0000000) == 0xf0000000)) {
63112                  UnallocatedA32(instr);
63113                  return;
63114                }
63115                Condition condition((instr >> 28) & 0xf);
63116                unsigned rd = (instr >> 12) & 0xf;
63117                unsigned rn = (instr >> 16) & 0xf;
63118                unsigned rm = instr & 0xf;
63119                uint32_t amount = (instr >> 7) & 0x1f;
63120                if (amount == 0) amount = 32;
63121                // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1
63122                pkhtb(condition,
63123                      Register(rd),
63124                      Register(rn),
63125                      Operand(Register(rm), ASR, amount));
63126                break;
63127              }
63128              case 0x00800060: {
63129                // 0x06800070
63130                switch (instr & 0x00000080) {
63131                  case 0x00000000: {
63132                    // 0x06800070
63133                    switch (instr & 0x000f0000) {
63134                      case 0x000f0000: {
63135                        // 0x068f0070
63136                        if (((instr & 0xf0000000) == 0xf0000000)) {
63137                          UnallocatedA32(instr);
63138                          return;
63139                        }
63140                        Condition condition((instr >> 28) & 0xf);
63141                        unsigned rd = (instr >> 12) & 0xf;
63142                        unsigned rm = instr & 0xf;
63143                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63144                        // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63145                        sxtb16(condition,
63146                               Register(rd),
63147                               Operand(Register(rm), ROR, amount));
63148                        if (((instr & 0xfff03f0) != 0x68f0070)) {
63149                          UnpredictableA32(instr);
63150                        }
63151                        break;
63152                      }
63153                      default: {
63154                        if (((instr & 0xf0000000) == 0xf0000000) ||
63155                            ((instr & 0xf0000) == 0xf0000)) {
63156                          UnallocatedA32(instr);
63157                          return;
63158                        }
63159                        Condition condition((instr >> 28) & 0xf);
63160                        unsigned rd = (instr >> 12) & 0xf;
63161                        unsigned rn = (instr >> 16) & 0xf;
63162                        unsigned rm = instr & 0xf;
63163                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63164                        // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63165                        sxtab16(condition,
63166                                Register(rd),
63167                                Register(rn),
63168                                Operand(Register(rm), ROR, amount));
63169                        if (((instr & 0xff003f0) != 0x6800070)) {
63170                          UnpredictableA32(instr);
63171                        }
63172                        break;
63173                      }
63174                    }
63175                    break;
63176                  }
63177                  default:
63178                    UnallocatedA32(instr);
63179                    break;
63180                }
63181                break;
63182              }
63183              default:
63184                UnallocatedA32(instr);
63185                break;
63186            }
63187            break;
63188          }
63189          case 0x00200000: {
63190            // 0x06200000
63191            switch (instr & 0x00100000) {
63192              case 0x00000000: {
63193                // 0x06200000
63194                if (((instr & 0xf0000000) == 0xf0000000)) {
63195                  UnallocatedA32(instr);
63196                  return;
63197                }
63198                UnimplementedA32("STRT", instr);
63199                break;
63200              }
63201              case 0x00100000: {
63202                // 0x06300000
63203                if (((instr & 0xf0000000) == 0xf0000000)) {
63204                  UnallocatedA32(instr);
63205                  return;
63206                }
63207                UnimplementedA32("LDRT", instr);
63208                break;
63209              }
63210            }
63211            break;
63212          }
63213          case 0x00200010: {
63214            // 0x06200010
63215            switch (instr & 0x00800060) {
63216              case 0x00000000: {
63217                // 0x06200010
63218                switch (instr & 0x00100080) {
63219                  case 0x00000000: {
63220                    // 0x06200010
63221                    if (((instr & 0xf0000000) == 0xf0000000)) {
63222                      UnallocatedA32(instr);
63223                      return;
63224                    }
63225                    Condition condition((instr >> 28) & 0xf);
63226                    unsigned rd = (instr >> 12) & 0xf;
63227                    unsigned rn = (instr >> 16) & 0xf;
63228                    unsigned rm = instr & 0xf;
63229                    // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63230                    qadd16(condition, Register(rd), Register(rn), Register(rm));
63231                    if (((instr & 0xff00ff0) != 0x6200f10)) {
63232                      UnpredictableA32(instr);
63233                    }
63234                    break;
63235                  }
63236                  case 0x00000080: {
63237                    // 0x06200090
63238                    if (((instr & 0xf0000000) == 0xf0000000)) {
63239                      UnallocatedA32(instr);
63240                      return;
63241                    }
63242                    Condition condition((instr >> 28) & 0xf);
63243                    unsigned rd = (instr >> 12) & 0xf;
63244                    unsigned rn = (instr >> 16) & 0xf;
63245                    unsigned rm = instr & 0xf;
63246                    // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63247                    qadd8(condition, Register(rd), Register(rn), Register(rm));
63248                    if (((instr & 0xff00ff0) != 0x6200f90)) {
63249                      UnpredictableA32(instr);
63250                    }
63251                    break;
63252                  }
63253                  case 0x00100000: {
63254                    // 0x06300010
63255                    if (((instr & 0xf0000000) == 0xf0000000)) {
63256                      UnallocatedA32(instr);
63257                      return;
63258                    }
63259                    Condition condition((instr >> 28) & 0xf);
63260                    unsigned rd = (instr >> 12) & 0xf;
63261                    unsigned rn = (instr >> 16) & 0xf;
63262                    unsigned rm = instr & 0xf;
63263                    // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63264                    shadd16(condition,
63265                            Register(rd),
63266                            Register(rn),
63267                            Register(rm));
63268                    if (((instr & 0xff00ff0) != 0x6300f10)) {
63269                      UnpredictableA32(instr);
63270                    }
63271                    break;
63272                  }
63273                  case 0x00100080: {
63274                    // 0x06300090
63275                    if (((instr & 0xf0000000) == 0xf0000000)) {
63276                      UnallocatedA32(instr);
63277                      return;
63278                    }
63279                    Condition condition((instr >> 28) & 0xf);
63280                    unsigned rd = (instr >> 12) & 0xf;
63281                    unsigned rn = (instr >> 16) & 0xf;
63282                    unsigned rm = instr & 0xf;
63283                    // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63284                    shadd8(condition, Register(rd), Register(rn), Register(rm));
63285                    if (((instr & 0xff00ff0) != 0x6300f90)) {
63286                      UnpredictableA32(instr);
63287                    }
63288                    break;
63289                  }
63290                }
63291                break;
63292              }
63293              case 0x00000020: {
63294                // 0x06200030
63295                switch (instr & 0x00100080) {
63296                  case 0x00000000: {
63297                    // 0x06200030
63298                    if (((instr & 0xf0000000) == 0xf0000000)) {
63299                      UnallocatedA32(instr);
63300                      return;
63301                    }
63302                    Condition condition((instr >> 28) & 0xf);
63303                    unsigned rd = (instr >> 12) & 0xf;
63304                    unsigned rn = (instr >> 16) & 0xf;
63305                    unsigned rm = instr & 0xf;
63306                    // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63307                    qasx(condition, Register(rd), Register(rn), Register(rm));
63308                    if (((instr & 0xff00ff0) != 0x6200f30)) {
63309                      UnpredictableA32(instr);
63310                    }
63311                    break;
63312                  }
63313                  case 0x00100000: {
63314                    // 0x06300030
63315                    if (((instr & 0xf0000000) == 0xf0000000)) {
63316                      UnallocatedA32(instr);
63317                      return;
63318                    }
63319                    Condition condition((instr >> 28) & 0xf);
63320                    unsigned rd = (instr >> 12) & 0xf;
63321                    unsigned rn = (instr >> 16) & 0xf;
63322                    unsigned rm = instr & 0xf;
63323                    // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63324                    shasx(condition, Register(rd), Register(rn), Register(rm));
63325                    if (((instr & 0xff00ff0) != 0x6300f30)) {
63326                      UnpredictableA32(instr);
63327                    }
63328                    break;
63329                  }
63330                  default:
63331                    UnallocatedA32(instr);
63332                    break;
63333                }
63334                break;
63335              }
63336              case 0x00000040: {
63337                // 0x06200050
63338                switch (instr & 0x00100080) {
63339                  case 0x00000000: {
63340                    // 0x06200050
63341                    if (((instr & 0xf0000000) == 0xf0000000)) {
63342                      UnallocatedA32(instr);
63343                      return;
63344                    }
63345                    Condition condition((instr >> 28) & 0xf);
63346                    unsigned rd = (instr >> 12) & 0xf;
63347                    unsigned rn = (instr >> 16) & 0xf;
63348                    unsigned rm = instr & 0xf;
63349                    // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63350                    qsax(condition, Register(rd), Register(rn), Register(rm));
63351                    if (((instr & 0xff00ff0) != 0x6200f50)) {
63352                      UnpredictableA32(instr);
63353                    }
63354                    break;
63355                  }
63356                  case 0x00100000: {
63357                    // 0x06300050
63358                    if (((instr & 0xf0000000) == 0xf0000000)) {
63359                      UnallocatedA32(instr);
63360                      return;
63361                    }
63362                    Condition condition((instr >> 28) & 0xf);
63363                    unsigned rd = (instr >> 12) & 0xf;
63364                    unsigned rn = (instr >> 16) & 0xf;
63365                    unsigned rm = instr & 0xf;
63366                    // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63367                    shsax(condition, Register(rd), Register(rn), Register(rm));
63368                    if (((instr & 0xff00ff0) != 0x6300f50)) {
63369                      UnpredictableA32(instr);
63370                    }
63371                    break;
63372                  }
63373                  default:
63374                    UnallocatedA32(instr);
63375                    break;
63376                }
63377                break;
63378              }
63379              case 0x00000060: {
63380                // 0x06200070
63381                switch (instr & 0x00100080) {
63382                  case 0x00000000: {
63383                    // 0x06200070
63384                    if (((instr & 0xf0000000) == 0xf0000000)) {
63385                      UnallocatedA32(instr);
63386                      return;
63387                    }
63388                    Condition condition((instr >> 28) & 0xf);
63389                    unsigned rd = (instr >> 12) & 0xf;
63390                    unsigned rn = (instr >> 16) & 0xf;
63391                    unsigned rm = instr & 0xf;
63392                    // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63393                    qsub16(condition, Register(rd), Register(rn), Register(rm));
63394                    if (((instr & 0xff00ff0) != 0x6200f70)) {
63395                      UnpredictableA32(instr);
63396                    }
63397                    break;
63398                  }
63399                  case 0x00000080: {
63400                    // 0x062000f0
63401                    if (((instr & 0xf0000000) == 0xf0000000)) {
63402                      UnallocatedA32(instr);
63403                      return;
63404                    }
63405                    Condition condition((instr >> 28) & 0xf);
63406                    unsigned rd = (instr >> 12) & 0xf;
63407                    unsigned rn = (instr >> 16) & 0xf;
63408                    unsigned rm = instr & 0xf;
63409                    // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63410                    qsub8(condition, Register(rd), Register(rn), Register(rm));
63411                    if (((instr & 0xff00ff0) != 0x6200ff0)) {
63412                      UnpredictableA32(instr);
63413                    }
63414                    break;
63415                  }
63416                  case 0x00100000: {
63417                    // 0x06300070
63418                    if (((instr & 0xf0000000) == 0xf0000000)) {
63419                      UnallocatedA32(instr);
63420                      return;
63421                    }
63422                    Condition condition((instr >> 28) & 0xf);
63423                    unsigned rd = (instr >> 12) & 0xf;
63424                    unsigned rn = (instr >> 16) & 0xf;
63425                    unsigned rm = instr & 0xf;
63426                    // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63427                    shsub16(condition,
63428                            Register(rd),
63429                            Register(rn),
63430                            Register(rm));
63431                    if (((instr & 0xff00ff0) != 0x6300f70)) {
63432                      UnpredictableA32(instr);
63433                    }
63434                    break;
63435                  }
63436                  case 0x00100080: {
63437                    // 0x063000f0
63438                    if (((instr & 0xf0000000) == 0xf0000000)) {
63439                      UnallocatedA32(instr);
63440                      return;
63441                    }
63442                    Condition condition((instr >> 28) & 0xf);
63443                    unsigned rd = (instr >> 12) & 0xf;
63444                    unsigned rn = (instr >> 16) & 0xf;
63445                    unsigned rm = instr & 0xf;
63446                    // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63447                    shsub8(condition, Register(rd), Register(rn), Register(rm));
63448                    if (((instr & 0xff00ff0) != 0x6300ff0)) {
63449                      UnpredictableA32(instr);
63450                    }
63451                    break;
63452                  }
63453                }
63454                break;
63455              }
63456              case 0x00800000: {
63457                // 0x06a00010
63458                if (((instr & 0xf0000000) == 0xf0000000)) {
63459                  UnallocatedA32(instr);
63460                  return;
63461                }
63462                Condition condition((instr >> 28) & 0xf);
63463                unsigned rd = (instr >> 12) & 0xf;
63464                uint32_t imm = ((instr >> 16) & 0x1f) + 1;
63465                unsigned rn = instr & 0xf;
63466                uint32_t amount = (instr >> 7) & 0x1f;
63467                // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
63468                ssat(condition,
63469                     Register(rd),
63470                     imm,
63471                     Operand(Register(rn), LSL, amount));
63472                break;
63473              }
63474              case 0x00800020: {
63475                // 0x06a00030
63476                switch (instr & 0x00100080) {
63477                  case 0x00000000: {
63478                    // 0x06a00030
63479                    if (((instr & 0xf0000000) == 0xf0000000)) {
63480                      UnallocatedA32(instr);
63481                      return;
63482                    }
63483                    Condition condition((instr >> 28) & 0xf);
63484                    unsigned rd = (instr >> 12) & 0xf;
63485                    uint32_t imm = ((instr >> 16) & 0xf) + 1;
63486                    unsigned rn = instr & 0xf;
63487                    // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
63488                    ssat16(condition, Register(rd), imm, Register(rn));
63489                    if (((instr & 0xff00ff0) != 0x6a00f30)) {
63490                      UnpredictableA32(instr);
63491                    }
63492                    break;
63493                  }
63494                  case 0x00100000: {
63495                    // 0x06b00030
63496                    if (((instr & 0xf0000000) == 0xf0000000)) {
63497                      UnallocatedA32(instr);
63498                      return;
63499                    }
63500                    Condition condition((instr >> 28) & 0xf);
63501                    unsigned rd = (instr >> 12) & 0xf;
63502                    unsigned rm = instr & 0xf;
63503                    // REV{<c>}{<q>} <Rd>, <Rm> ; A1
63504                    rev(condition, Best, Register(rd), Register(rm));
63505                    if (((instr & 0xfff0ff0) != 0x6bf0f30)) {
63506                      UnpredictableA32(instr);
63507                    }
63508                    break;
63509                  }
63510                  case 0x00100080: {
63511                    // 0x06b000b0
63512                    if (((instr & 0xf0000000) == 0xf0000000)) {
63513                      UnallocatedA32(instr);
63514                      return;
63515                    }
63516                    Condition condition((instr >> 28) & 0xf);
63517                    unsigned rd = (instr >> 12) & 0xf;
63518                    unsigned rm = instr & 0xf;
63519                    // REV16{<c>}{<q>} <Rd>, <Rm> ; A1
63520                    rev16(condition, Best, Register(rd), Register(rm));
63521                    if (((instr & 0xfff0ff0) != 0x6bf0fb0)) {
63522                      UnpredictableA32(instr);
63523                    }
63524                    break;
63525                  }
63526                  default:
63527                    UnallocatedA32(instr);
63528                    break;
63529                }
63530                break;
63531              }
63532              case 0x00800040: {
63533                // 0x06a00050
63534                if (((instr & 0xf0000000) == 0xf0000000)) {
63535                  UnallocatedA32(instr);
63536                  return;
63537                }
63538                Condition condition((instr >> 28) & 0xf);
63539                unsigned rd = (instr >> 12) & 0xf;
63540                uint32_t imm = ((instr >> 16) & 0x1f) + 1;
63541                unsigned rn = instr & 0xf;
63542                uint32_t amount = (instr >> 7) & 0x1f;
63543                if (amount == 0) amount = 32;
63544                // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
63545                ssat(condition,
63546                     Register(rd),
63547                     imm,
63548                     Operand(Register(rn), ASR, amount));
63549                break;
63550              }
63551              case 0x00800060: {
63552                // 0x06a00070
63553                switch (instr & 0x00100080) {
63554                  case 0x00000000: {
63555                    // 0x06a00070
63556                    switch (instr & 0x000f0000) {
63557                      case 0x000f0000: {
63558                        // 0x06af0070
63559                        if (((instr & 0xf0000000) == 0xf0000000)) {
63560                          UnallocatedA32(instr);
63561                          return;
63562                        }
63563                        Condition condition((instr >> 28) & 0xf);
63564                        unsigned rd = (instr >> 12) & 0xf;
63565                        unsigned rm = instr & 0xf;
63566                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63567                        // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63568                        sxtb(condition,
63569                             Best,
63570                             Register(rd),
63571                             Operand(Register(rm), ROR, amount));
63572                        if (((instr & 0xfff03f0) != 0x6af0070)) {
63573                          UnpredictableA32(instr);
63574                        }
63575                        break;
63576                      }
63577                      default: {
63578                        if (((instr & 0xf0000000) == 0xf0000000) ||
63579                            ((instr & 0xf0000) == 0xf0000)) {
63580                          UnallocatedA32(instr);
63581                          return;
63582                        }
63583                        Condition condition((instr >> 28) & 0xf);
63584                        unsigned rd = (instr >> 12) & 0xf;
63585                        unsigned rn = (instr >> 16) & 0xf;
63586                        unsigned rm = instr & 0xf;
63587                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63588                        // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63589                        sxtab(condition,
63590                              Register(rd),
63591                              Register(rn),
63592                              Operand(Register(rm), ROR, amount));
63593                        if (((instr & 0xff003f0) != 0x6a00070)) {
63594                          UnpredictableA32(instr);
63595                        }
63596                        break;
63597                      }
63598                    }
63599                    break;
63600                  }
63601                  case 0x00100000: {
63602                    // 0x06b00070
63603                    switch (instr & 0x000f0000) {
63604                      case 0x000f0000: {
63605                        // 0x06bf0070
63606                        if (((instr & 0xf0000000) == 0xf0000000)) {
63607                          UnallocatedA32(instr);
63608                          return;
63609                        }
63610                        Condition condition((instr >> 28) & 0xf);
63611                        unsigned rd = (instr >> 12) & 0xf;
63612                        unsigned rm = instr & 0xf;
63613                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63614                        // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63615                        sxth(condition,
63616                             Best,
63617                             Register(rd),
63618                             Operand(Register(rm), ROR, amount));
63619                        if (((instr & 0xfff03f0) != 0x6bf0070)) {
63620                          UnpredictableA32(instr);
63621                        }
63622                        break;
63623                      }
63624                      default: {
63625                        if (((instr & 0xf0000000) == 0xf0000000) ||
63626                            ((instr & 0xf0000) == 0xf0000)) {
63627                          UnallocatedA32(instr);
63628                          return;
63629                        }
63630                        Condition condition((instr >> 28) & 0xf);
63631                        unsigned rd = (instr >> 12) & 0xf;
63632                        unsigned rn = (instr >> 16) & 0xf;
63633                        unsigned rm = instr & 0xf;
63634                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63635                        // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63636                        sxtah(condition,
63637                              Register(rd),
63638                              Register(rn),
63639                              Operand(Register(rm), ROR, amount));
63640                        if (((instr & 0xff003f0) != 0x6b00070)) {
63641                          UnpredictableA32(instr);
63642                        }
63643                        break;
63644                      }
63645                    }
63646                    break;
63647                  }
63648                  default:
63649                    UnallocatedA32(instr);
63650                    break;
63651                }
63652                break;
63653              }
63654            }
63655            break;
63656          }
63657          case 0x00400000: {
63658            // 0x06400000
63659            switch (instr & 0x00100000) {
63660              case 0x00000000: {
63661                // 0x06400000
63662                if (((instr & 0xf0000000) == 0xf0000000)) {
63663                  UnallocatedA32(instr);
63664                  return;
63665                }
63666                Condition condition((instr >> 28) & 0xf);
63667                unsigned rt = (instr >> 12) & 0xf;
63668                unsigned rn = (instr >> 16) & 0xf;
63669                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63670                unsigned rm = instr & 0xf;
63671                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63672                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63673                                                    (imm_and_type_ & 0x7c) >>
63674                                                        2);
63675                Shift shift = shift_operand.GetShift();
63676                uint32_t amount = shift_operand.GetAmount();
63677                // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
63678                strb(condition,
63679                     Best,
63680                     Register(rt),
63681                     MemOperand(Register(rn),
63682                                sign,
63683                                Register(rm),
63684                                shift,
63685                                amount,
63686                                PostIndex));
63687                break;
63688              }
63689              case 0x00100000: {
63690                // 0x06500000
63691                if (((instr & 0xf0000000) == 0xf0000000)) {
63692                  UnallocatedA32(instr);
63693                  return;
63694                }
63695                Condition condition((instr >> 28) & 0xf);
63696                unsigned rt = (instr >> 12) & 0xf;
63697                unsigned rn = (instr >> 16) & 0xf;
63698                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63699                unsigned rm = instr & 0xf;
63700                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63701                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63702                                                    (imm_and_type_ & 0x7c) >>
63703                                                        2);
63704                Shift shift = shift_operand.GetShift();
63705                uint32_t amount = shift_operand.GetAmount();
63706                // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
63707                ldrb(condition,
63708                     Best,
63709                     Register(rt),
63710                     MemOperand(Register(rn),
63711                                sign,
63712                                Register(rm),
63713                                shift,
63714                                amount,
63715                                PostIndex));
63716                break;
63717              }
63718            }
63719            break;
63720          }
63721          case 0x00400010: {
63722            // 0x06400010
63723            switch (instr & 0x009000e0) {
63724              case 0x00100000: {
63725                // 0x06500010
63726                if (((instr & 0xf0000000) == 0xf0000000)) {
63727                  UnallocatedA32(instr);
63728                  return;
63729                }
63730                Condition condition((instr >> 28) & 0xf);
63731                unsigned rd = (instr >> 12) & 0xf;
63732                unsigned rn = (instr >> 16) & 0xf;
63733                unsigned rm = instr & 0xf;
63734                // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63735                uadd16(condition, Register(rd), Register(rn), Register(rm));
63736                if (((instr & 0xff00ff0) != 0x6500f10)) {
63737                  UnpredictableA32(instr);
63738                }
63739                break;
63740              }
63741              case 0x00100020: {
63742                // 0x06500030
63743                if (((instr & 0xf0000000) == 0xf0000000)) {
63744                  UnallocatedA32(instr);
63745                  return;
63746                }
63747                Condition condition((instr >> 28) & 0xf);
63748                unsigned rd = (instr >> 12) & 0xf;
63749                unsigned rn = (instr >> 16) & 0xf;
63750                unsigned rm = instr & 0xf;
63751                // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63752                uasx(condition, Register(rd), Register(rn), Register(rm));
63753                if (((instr & 0xff00ff0) != 0x6500f30)) {
63754                  UnpredictableA32(instr);
63755                }
63756                break;
63757              }
63758              case 0x00100040: {
63759                // 0x06500050
63760                if (((instr & 0xf0000000) == 0xf0000000)) {
63761                  UnallocatedA32(instr);
63762                  return;
63763                }
63764                Condition condition((instr >> 28) & 0xf);
63765                unsigned rd = (instr >> 12) & 0xf;
63766                unsigned rn = (instr >> 16) & 0xf;
63767                unsigned rm = instr & 0xf;
63768                // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63769                usax(condition, Register(rd), Register(rn), Register(rm));
63770                if (((instr & 0xff00ff0) != 0x6500f50)) {
63771                  UnpredictableA32(instr);
63772                }
63773                break;
63774              }
63775              case 0x00100060: {
63776                // 0x06500070
63777                if (((instr & 0xf0000000) == 0xf0000000)) {
63778                  UnallocatedA32(instr);
63779                  return;
63780                }
63781                Condition condition((instr >> 28) & 0xf);
63782                unsigned rd = (instr >> 12) & 0xf;
63783                unsigned rn = (instr >> 16) & 0xf;
63784                unsigned rm = instr & 0xf;
63785                // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63786                usub16(condition, Register(rd), Register(rn), Register(rm));
63787                if (((instr & 0xff00ff0) != 0x6500f70)) {
63788                  UnpredictableA32(instr);
63789                }
63790                break;
63791              }
63792              case 0x00100080: {
63793                // 0x06500090
63794                if (((instr & 0xf0000000) == 0xf0000000)) {
63795                  UnallocatedA32(instr);
63796                  return;
63797                }
63798                Condition condition((instr >> 28) & 0xf);
63799                unsigned rd = (instr >> 12) & 0xf;
63800                unsigned rn = (instr >> 16) & 0xf;
63801                unsigned rm = instr & 0xf;
63802                // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63803                uadd8(condition, Register(rd), Register(rn), Register(rm));
63804                if (((instr & 0xff00ff0) != 0x6500f90)) {
63805                  UnpredictableA32(instr);
63806                }
63807                break;
63808              }
63809              case 0x001000e0: {
63810                // 0x065000f0
63811                if (((instr & 0xf0000000) == 0xf0000000)) {
63812                  UnallocatedA32(instr);
63813                  return;
63814                }
63815                Condition condition((instr >> 28) & 0xf);
63816                unsigned rd = (instr >> 12) & 0xf;
63817                unsigned rn = (instr >> 16) & 0xf;
63818                unsigned rm = instr & 0xf;
63819                // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63820                usub8(condition, Register(rd), Register(rn), Register(rm));
63821                if (((instr & 0xff00ff0) != 0x6500ff0)) {
63822                  UnpredictableA32(instr);
63823                }
63824                break;
63825              }
63826              case 0x00800060: {
63827                // 0x06c00070
63828                switch (instr & 0x000f0000) {
63829                  case 0x000f0000: {
63830                    // 0x06cf0070
63831                    if (((instr & 0xf0000000) == 0xf0000000)) {
63832                      UnallocatedA32(instr);
63833                      return;
63834                    }
63835                    Condition condition((instr >> 28) & 0xf);
63836                    unsigned rd = (instr >> 12) & 0xf;
63837                    unsigned rm = instr & 0xf;
63838                    uint32_t amount = ((instr >> 10) & 0x3) * 8;
63839                    // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63840                    uxtb16(condition,
63841                           Register(rd),
63842                           Operand(Register(rm), ROR, amount));
63843                    if (((instr & 0xfff03f0) != 0x6cf0070)) {
63844                      UnpredictableA32(instr);
63845                    }
63846                    break;
63847                  }
63848                  default: {
63849                    if (((instr & 0xf0000000) == 0xf0000000) ||
63850                        ((instr & 0xf0000) == 0xf0000)) {
63851                      UnallocatedA32(instr);
63852                      return;
63853                    }
63854                    Condition condition((instr >> 28) & 0xf);
63855                    unsigned rd = (instr >> 12) & 0xf;
63856                    unsigned rn = (instr >> 16) & 0xf;
63857                    unsigned rm = instr & 0xf;
63858                    uint32_t amount = ((instr >> 10) & 0x3) * 8;
63859                    // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63860                    uxtab16(condition,
63861                            Register(rd),
63862                            Register(rn),
63863                            Operand(Register(rm), ROR, amount));
63864                    if (((instr & 0xff003f0) != 0x6c00070)) {
63865                      UnpredictableA32(instr);
63866                    }
63867                    break;
63868                  }
63869                }
63870                break;
63871              }
63872              default:
63873                UnallocatedA32(instr);
63874                break;
63875            }
63876            break;
63877          }
63878          case 0x00600000: {
63879            // 0x06600000
63880            switch (instr & 0x00100000) {
63881              case 0x00000000: {
63882                // 0x06600000
63883                if (((instr & 0xf0000000) == 0xf0000000)) {
63884                  UnallocatedA32(instr);
63885                  return;
63886                }
63887                UnimplementedA32("STRBT", instr);
63888                break;
63889              }
63890              case 0x00100000: {
63891                // 0x06700000
63892                if (((instr & 0xf0000000) == 0xf0000000)) {
63893                  UnallocatedA32(instr);
63894                  return;
63895                }
63896                UnimplementedA32("LDRBT", instr);
63897                break;
63898              }
63899            }
63900            break;
63901          }
63902          case 0x00600010: {
63903            // 0x06600010
63904            switch (instr & 0x00800060) {
63905              case 0x00000000: {
63906                // 0x06600010
63907                switch (instr & 0x00100080) {
63908                  case 0x00000000: {
63909                    // 0x06600010
63910                    if (((instr & 0xf0000000) == 0xf0000000)) {
63911                      UnallocatedA32(instr);
63912                      return;
63913                    }
63914                    Condition condition((instr >> 28) & 0xf);
63915                    unsigned rd = (instr >> 12) & 0xf;
63916                    unsigned rn = (instr >> 16) & 0xf;
63917                    unsigned rm = instr & 0xf;
63918                    // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63919                    uqadd16(condition,
63920                            Register(rd),
63921                            Register(rn),
63922                            Register(rm));
63923                    if (((instr & 0xff00ff0) != 0x6600f10)) {
63924                      UnpredictableA32(instr);
63925                    }
63926                    break;
63927                  }
63928                  case 0x00000080: {
63929                    // 0x06600090
63930                    if (((instr & 0xf0000000) == 0xf0000000)) {
63931                      UnallocatedA32(instr);
63932                      return;
63933                    }
63934                    Condition condition((instr >> 28) & 0xf);
63935                    unsigned rd = (instr >> 12) & 0xf;
63936                    unsigned rn = (instr >> 16) & 0xf;
63937                    unsigned rm = instr & 0xf;
63938                    // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63939                    uqadd8(condition, Register(rd), Register(rn), Register(rm));
63940                    if (((instr & 0xff00ff0) != 0x6600f90)) {
63941                      UnpredictableA32(instr);
63942                    }
63943                    break;
63944                  }
63945                  case 0x00100000: {
63946                    // 0x06700010
63947                    if (((instr & 0xf0000000) == 0xf0000000)) {
63948                      UnallocatedA32(instr);
63949                      return;
63950                    }
63951                    Condition condition((instr >> 28) & 0xf);
63952                    unsigned rd = (instr >> 12) & 0xf;
63953                    unsigned rn = (instr >> 16) & 0xf;
63954                    unsigned rm = instr & 0xf;
63955                    // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63956                    uhadd16(condition,
63957                            Register(rd),
63958                            Register(rn),
63959                            Register(rm));
63960                    if (((instr & 0xff00ff0) != 0x6700f10)) {
63961                      UnpredictableA32(instr);
63962                    }
63963                    break;
63964                  }
63965                  case 0x00100080: {
63966                    // 0x06700090
63967                    if (((instr & 0xf0000000) == 0xf0000000)) {
63968                      UnallocatedA32(instr);
63969                      return;
63970                    }
63971                    Condition condition((instr >> 28) & 0xf);
63972                    unsigned rd = (instr >> 12) & 0xf;
63973                    unsigned rn = (instr >> 16) & 0xf;
63974                    unsigned rm = instr & 0xf;
63975                    // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63976                    uhadd8(condition, Register(rd), Register(rn), Register(rm));
63977                    if (((instr & 0xff00ff0) != 0x6700f90)) {
63978                      UnpredictableA32(instr);
63979                    }
63980                    break;
63981                  }
63982                }
63983                break;
63984              }
63985              case 0x00000020: {
63986                // 0x06600030
63987                switch (instr & 0x00100080) {
63988                  case 0x00000000: {
63989                    // 0x06600030
63990                    if (((instr & 0xf0000000) == 0xf0000000)) {
63991                      UnallocatedA32(instr);
63992                      return;
63993                    }
63994                    Condition condition((instr >> 28) & 0xf);
63995                    unsigned rd = (instr >> 12) & 0xf;
63996                    unsigned rn = (instr >> 16) & 0xf;
63997                    unsigned rm = instr & 0xf;
63998                    // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63999                    uqasx(condition, Register(rd), Register(rn), Register(rm));
64000                    if (((instr & 0xff00ff0) != 0x6600f30)) {
64001                      UnpredictableA32(instr);
64002                    }
64003                    break;
64004                  }
64005                  case 0x00100000: {
64006                    // 0x06700030
64007                    if (((instr & 0xf0000000) == 0xf0000000)) {
64008                      UnallocatedA32(instr);
64009                      return;
64010                    }
64011                    Condition condition((instr >> 28) & 0xf);
64012                    unsigned rd = (instr >> 12) & 0xf;
64013                    unsigned rn = (instr >> 16) & 0xf;
64014                    unsigned rm = instr & 0xf;
64015                    // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64016                    uhasx(condition, Register(rd), Register(rn), Register(rm));
64017                    if (((instr & 0xff00ff0) != 0x6700f30)) {
64018                      UnpredictableA32(instr);
64019                    }
64020                    break;
64021                  }
64022                  default:
64023                    UnallocatedA32(instr);
64024                    break;
64025                }
64026                break;
64027              }
64028              case 0x00000040: {
64029                // 0x06600050
64030                switch (instr & 0x00100080) {
64031                  case 0x00000000: {
64032                    // 0x06600050
64033                    if (((instr & 0xf0000000) == 0xf0000000)) {
64034                      UnallocatedA32(instr);
64035                      return;
64036                    }
64037                    Condition condition((instr >> 28) & 0xf);
64038                    unsigned rd = (instr >> 12) & 0xf;
64039                    unsigned rn = (instr >> 16) & 0xf;
64040                    unsigned rm = instr & 0xf;
64041                    // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64042                    uqsax(condition, Register(rd), Register(rn), Register(rm));
64043                    if (((instr & 0xff00ff0) != 0x6600f50)) {
64044                      UnpredictableA32(instr);
64045                    }
64046                    break;
64047                  }
64048                  case 0x00100000: {
64049                    // 0x06700050
64050                    if (((instr & 0xf0000000) == 0xf0000000)) {
64051                      UnallocatedA32(instr);
64052                      return;
64053                    }
64054                    Condition condition((instr >> 28) & 0xf);
64055                    unsigned rd = (instr >> 12) & 0xf;
64056                    unsigned rn = (instr >> 16) & 0xf;
64057                    unsigned rm = instr & 0xf;
64058                    // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64059                    uhsax(condition, Register(rd), Register(rn), Register(rm));
64060                    if (((instr & 0xff00ff0) != 0x6700f50)) {
64061                      UnpredictableA32(instr);
64062                    }
64063                    break;
64064                  }
64065                  default:
64066                    UnallocatedA32(instr);
64067                    break;
64068                }
64069                break;
64070              }
64071              case 0x00000060: {
64072                // 0x06600070
64073                switch (instr & 0x00100080) {
64074                  case 0x00000000: {
64075                    // 0x06600070
64076                    if (((instr & 0xf0000000) == 0xf0000000)) {
64077                      UnallocatedA32(instr);
64078                      return;
64079                    }
64080                    Condition condition((instr >> 28) & 0xf);
64081                    unsigned rd = (instr >> 12) & 0xf;
64082                    unsigned rn = (instr >> 16) & 0xf;
64083                    unsigned rm = instr & 0xf;
64084                    // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64085                    uqsub16(condition,
64086                            Register(rd),
64087                            Register(rn),
64088                            Register(rm));
64089                    if (((instr & 0xff00ff0) != 0x6600f70)) {
64090                      UnpredictableA32(instr);
64091                    }
64092                    break;
64093                  }
64094                  case 0x00000080: {
64095                    // 0x066000f0
64096                    if (((instr & 0xf0000000) == 0xf0000000)) {
64097                      UnallocatedA32(instr);
64098                      return;
64099                    }
64100                    Condition condition((instr >> 28) & 0xf);
64101                    unsigned rd = (instr >> 12) & 0xf;
64102                    unsigned rn = (instr >> 16) & 0xf;
64103                    unsigned rm = instr & 0xf;
64104                    // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64105                    uqsub8(condition, Register(rd), Register(rn), Register(rm));
64106                    if (((instr & 0xff00ff0) != 0x6600ff0)) {
64107                      UnpredictableA32(instr);
64108                    }
64109                    break;
64110                  }
64111                  case 0x00100000: {
64112                    // 0x06700070
64113                    if (((instr & 0xf0000000) == 0xf0000000)) {
64114                      UnallocatedA32(instr);
64115                      return;
64116                    }
64117                    Condition condition((instr >> 28) & 0xf);
64118                    unsigned rd = (instr >> 12) & 0xf;
64119                    unsigned rn = (instr >> 16) & 0xf;
64120                    unsigned rm = instr & 0xf;
64121                    // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64122                    uhsub16(condition,
64123                            Register(rd),
64124                            Register(rn),
64125                            Register(rm));
64126                    if (((instr & 0xff00ff0) != 0x6700f70)) {
64127                      UnpredictableA32(instr);
64128                    }
64129                    break;
64130                  }
64131                  case 0x00100080: {
64132                    // 0x067000f0
64133                    if (((instr & 0xf0000000) == 0xf0000000)) {
64134                      UnallocatedA32(instr);
64135                      return;
64136                    }
64137                    Condition condition((instr >> 28) & 0xf);
64138                    unsigned rd = (instr >> 12) & 0xf;
64139                    unsigned rn = (instr >> 16) & 0xf;
64140                    unsigned rm = instr & 0xf;
64141                    // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64142                    uhsub8(condition, Register(rd), Register(rn), Register(rm));
64143                    if (((instr & 0xff00ff0) != 0x6700ff0)) {
64144                      UnpredictableA32(instr);
64145                    }
64146                    break;
64147                  }
64148                }
64149                break;
64150              }
64151              case 0x00800000: {
64152                // 0x06e00010
64153                if (((instr & 0xf0000000) == 0xf0000000)) {
64154                  UnallocatedA32(instr);
64155                  return;
64156                }
64157                Condition condition((instr >> 28) & 0xf);
64158                unsigned rd = (instr >> 12) & 0xf;
64159                uint32_t imm = (instr >> 16) & 0x1f;
64160                unsigned rn = instr & 0xf;
64161                uint32_t amount = (instr >> 7) & 0x1f;
64162                // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
64163                usat(condition,
64164                     Register(rd),
64165                     imm,
64166                     Operand(Register(rn), LSL, amount));
64167                break;
64168              }
64169              case 0x00800020: {
64170                // 0x06e00030
64171                switch (instr & 0x00100080) {
64172                  case 0x00000000: {
64173                    // 0x06e00030
64174                    if (((instr & 0xf0000000) == 0xf0000000)) {
64175                      UnallocatedA32(instr);
64176                      return;
64177                    }
64178                    Condition condition((instr >> 28) & 0xf);
64179                    unsigned rd = (instr >> 12) & 0xf;
64180                    uint32_t imm = (instr >> 16) & 0xf;
64181                    unsigned rn = instr & 0xf;
64182                    // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
64183                    usat16(condition, Register(rd), imm, Register(rn));
64184                    if (((instr & 0xff00ff0) != 0x6e00f30)) {
64185                      UnpredictableA32(instr);
64186                    }
64187                    break;
64188                  }
64189                  case 0x00100000: {
64190                    // 0x06f00030
64191                    if (((instr & 0xf0000000) == 0xf0000000)) {
64192                      UnallocatedA32(instr);
64193                      return;
64194                    }
64195                    Condition condition((instr >> 28) & 0xf);
64196                    unsigned rd = (instr >> 12) & 0xf;
64197                    unsigned rm = instr & 0xf;
64198                    // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1
64199                    rbit(condition, Register(rd), Register(rm));
64200                    if (((instr & 0xfff0ff0) != 0x6ff0f30)) {
64201                      UnpredictableA32(instr);
64202                    }
64203                    break;
64204                  }
64205                  case 0x00100080: {
64206                    // 0x06f000b0
64207                    if (((instr & 0xf0000000) == 0xf0000000)) {
64208                      UnallocatedA32(instr);
64209                      return;
64210                    }
64211                    Condition condition((instr >> 28) & 0xf);
64212                    unsigned rd = (instr >> 12) & 0xf;
64213                    unsigned rm = instr & 0xf;
64214                    // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1
64215                    revsh(condition, Best, Register(rd), Register(rm));
64216                    if (((instr & 0xfff0ff0) != 0x6ff0fb0)) {
64217                      UnpredictableA32(instr);
64218                    }
64219                    break;
64220                  }
64221                  default:
64222                    UnallocatedA32(instr);
64223                    break;
64224                }
64225                break;
64226              }
64227              case 0x00800040: {
64228                // 0x06e00050
64229                if (((instr & 0xf0000000) == 0xf0000000)) {
64230                  UnallocatedA32(instr);
64231                  return;
64232                }
64233                Condition condition((instr >> 28) & 0xf);
64234                unsigned rd = (instr >> 12) & 0xf;
64235                uint32_t imm = (instr >> 16) & 0x1f;
64236                unsigned rn = instr & 0xf;
64237                uint32_t amount = (instr >> 7) & 0x1f;
64238                if (amount == 0) amount = 32;
64239                // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
64240                usat(condition,
64241                     Register(rd),
64242                     imm,
64243                     Operand(Register(rn), ASR, amount));
64244                break;
64245              }
64246              case 0x00800060: {
64247                // 0x06e00070
64248                switch (instr & 0x00100080) {
64249                  case 0x00000000: {
64250                    // 0x06e00070
64251                    switch (instr & 0x000f0000) {
64252                      case 0x000f0000: {
64253                        // 0x06ef0070
64254                        if (((instr & 0xf0000000) == 0xf0000000)) {
64255                          UnallocatedA32(instr);
64256                          return;
64257                        }
64258                        Condition condition((instr >> 28) & 0xf);
64259                        unsigned rd = (instr >> 12) & 0xf;
64260                        unsigned rm = instr & 0xf;
64261                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
64262                        // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
64263                        uxtb(condition,
64264                             Best,
64265                             Register(rd),
64266                             Operand(Register(rm), ROR, amount));
64267                        if (((instr & 0xfff03f0) != 0x6ef0070)) {
64268                          UnpredictableA32(instr);
64269                        }
64270                        break;
64271                      }
64272                      default: {
64273                        if (((instr & 0xf0000000) == 0xf0000000) ||
64274                            ((instr & 0xf0000) == 0xf0000)) {
64275                          UnallocatedA32(instr);
64276                          return;
64277                        }
64278                        Condition condition((instr >> 28) & 0xf);
64279                        unsigned rd = (instr >> 12) & 0xf;
64280                        unsigned rn = (instr >> 16) & 0xf;
64281                        unsigned rm = instr & 0xf;
64282                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
64283                        // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
64284                        uxtab(condition,
64285                              Register(rd),
64286                              Register(rn),
64287                              Operand(Register(rm), ROR, amount));
64288                        if (((instr & 0xff003f0) != 0x6e00070)) {
64289                          UnpredictableA32(instr);
64290                        }
64291                        break;
64292                      }
64293                    }
64294                    break;
64295                  }
64296                  case 0x00100000: {
64297                    // 0x06f00070
64298                    switch (instr & 0x000f0000) {
64299                      case 0x000f0000: {
64300                        // 0x06ff0070
64301                        if (((instr & 0xf0000000) == 0xf0000000)) {
64302                          UnallocatedA32(instr);
64303                          return;
64304                        }
64305                        Condition condition((instr >> 28) & 0xf);
64306                        unsigned rd = (instr >> 12) & 0xf;
64307                        unsigned rm = instr & 0xf;
64308                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
64309                        // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
64310                        uxth(condition,
64311                             Best,
64312                             Register(rd),
64313                             Operand(Register(rm), ROR, amount));
64314                        if (((instr & 0xfff03f0) != 0x6ff0070)) {
64315                          UnpredictableA32(instr);
64316                        }
64317                        break;
64318                      }
64319                      default: {
64320                        if (((instr & 0xf0000000) == 0xf0000000) ||
64321                            ((instr & 0xf0000) == 0xf0000)) {
64322                          UnallocatedA32(instr);
64323                          return;
64324                        }
64325                        Condition condition((instr >> 28) & 0xf);
64326                        unsigned rd = (instr >> 12) & 0xf;
64327                        unsigned rn = (instr >> 16) & 0xf;
64328                        unsigned rm = instr & 0xf;
64329                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
64330                        // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
64331                        uxtah(condition,
64332                              Register(rd),
64333                              Register(rn),
64334                              Operand(Register(rm), ROR, amount));
64335                        if (((instr & 0xff003f0) != 0x6f00070)) {
64336                          UnpredictableA32(instr);
64337                        }
64338                        break;
64339                      }
64340                    }
64341                    break;
64342                  }
64343                  default:
64344                    UnallocatedA32(instr);
64345                    break;
64346                }
64347                break;
64348              }
64349            }
64350            break;
64351          }
64352          case 0x01000000: {
64353            // 0x07000000
64354            switch (instr & 0x00100000) {
64355              case 0x00000000: {
64356                // 0x07000000
64357                if (((instr & 0xf0000000) == 0xf0000000)) {
64358                  UnallocatedA32(instr);
64359                  return;
64360                }
64361                Condition condition((instr >> 28) & 0xf);
64362                unsigned rt = (instr >> 12) & 0xf;
64363                unsigned rn = (instr >> 16) & 0xf;
64364                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64365                unsigned rm = instr & 0xf;
64366                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64367                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64368                                                    (imm_and_type_ & 0x7c) >>
64369                                                        2);
64370                Shift shift = shift_operand.GetShift();
64371                uint32_t amount = shift_operand.GetAmount();
64372                AddrMode addrmode = Offset;
64373                // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64374                str(condition,
64375                    Best,
64376                    Register(rt),
64377                    MemOperand(Register(rn),
64378                               sign,
64379                               Register(rm),
64380                               shift,
64381                               amount,
64382                               addrmode));
64383                break;
64384              }
64385              case 0x00100000: {
64386                // 0x07100000
64387                if (((instr & 0xf0000000) == 0xf0000000)) {
64388                  UnallocatedA32(instr);
64389                  return;
64390                }
64391                Condition condition((instr >> 28) & 0xf);
64392                unsigned rt = (instr >> 12) & 0xf;
64393                unsigned rn = (instr >> 16) & 0xf;
64394                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64395                unsigned rm = instr & 0xf;
64396                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64397                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64398                                                    (imm_and_type_ & 0x7c) >>
64399                                                        2);
64400                Shift shift = shift_operand.GetShift();
64401                uint32_t amount = shift_operand.GetAmount();
64402                AddrMode addrmode = Offset;
64403                // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64404                ldr(condition,
64405                    Best,
64406                    Register(rt),
64407                    MemOperand(Register(rn),
64408                               sign,
64409                               Register(rm),
64410                               shift,
64411                               amount,
64412                               addrmode));
64413                break;
64414              }
64415            }
64416            break;
64417          }
64418          case 0x01000010: {
64419            // 0x07000010
64420            switch (instr & 0x009000e0) {
64421              case 0x00000000: {
64422                // 0x07000010
64423                switch (instr & 0x0000f000) {
64424                  case 0x0000f000: {
64425                    // 0x0700f010
64426                    if (((instr & 0xf0000000) == 0xf0000000)) {
64427                      UnallocatedA32(instr);
64428                      return;
64429                    }
64430                    Condition condition((instr >> 28) & 0xf);
64431                    unsigned rd = (instr >> 16) & 0xf;
64432                    unsigned rn = instr & 0xf;
64433                    unsigned rm = (instr >> 8) & 0xf;
64434                    // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64435                    smuad(condition, Register(rd), Register(rn), Register(rm));
64436                    break;
64437                  }
64438                  default: {
64439                    if (((instr & 0xf0000000) == 0xf0000000) ||
64440                        ((instr & 0xf000) == 0xf000)) {
64441                      UnallocatedA32(instr);
64442                      return;
64443                    }
64444                    Condition condition((instr >> 28) & 0xf);
64445                    unsigned rd = (instr >> 16) & 0xf;
64446                    unsigned rn = instr & 0xf;
64447                    unsigned rm = (instr >> 8) & 0xf;
64448                    unsigned ra = (instr >> 12) & 0xf;
64449                    // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64450                    smlad(condition,
64451                          Register(rd),
64452                          Register(rn),
64453                          Register(rm),
64454                          Register(ra));
64455                    break;
64456                  }
64457                }
64458                break;
64459              }
64460              case 0x00000020: {
64461                // 0x07000030
64462                switch (instr & 0x0000f000) {
64463                  case 0x0000f000: {
64464                    // 0x0700f030
64465                    if (((instr & 0xf0000000) == 0xf0000000)) {
64466                      UnallocatedA32(instr);
64467                      return;
64468                    }
64469                    Condition condition((instr >> 28) & 0xf);
64470                    unsigned rd = (instr >> 16) & 0xf;
64471                    unsigned rn = instr & 0xf;
64472                    unsigned rm = (instr >> 8) & 0xf;
64473                    // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64474                    smuadx(condition, Register(rd), Register(rn), Register(rm));
64475                    break;
64476                  }
64477                  default: {
64478                    if (((instr & 0xf0000000) == 0xf0000000) ||
64479                        ((instr & 0xf000) == 0xf000)) {
64480                      UnallocatedA32(instr);
64481                      return;
64482                    }
64483                    Condition condition((instr >> 28) & 0xf);
64484                    unsigned rd = (instr >> 16) & 0xf;
64485                    unsigned rn = instr & 0xf;
64486                    unsigned rm = (instr >> 8) & 0xf;
64487                    unsigned ra = (instr >> 12) & 0xf;
64488                    // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64489                    smladx(condition,
64490                           Register(rd),
64491                           Register(rn),
64492                           Register(rm),
64493                           Register(ra));
64494                    break;
64495                  }
64496                }
64497                break;
64498              }
64499              case 0x00000040: {
64500                // 0x07000050
64501                switch (instr & 0x0000f000) {
64502                  case 0x0000f000: {
64503                    // 0x0700f050
64504                    if (((instr & 0xf0000000) == 0xf0000000)) {
64505                      UnallocatedA32(instr);
64506                      return;
64507                    }
64508                    Condition condition((instr >> 28) & 0xf);
64509                    unsigned rd = (instr >> 16) & 0xf;
64510                    unsigned rn = instr & 0xf;
64511                    unsigned rm = (instr >> 8) & 0xf;
64512                    // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64513                    smusd(condition, Register(rd), Register(rn), Register(rm));
64514                    break;
64515                  }
64516                  default: {
64517                    if (((instr & 0xf0000000) == 0xf0000000) ||
64518                        ((instr & 0xf000) == 0xf000)) {
64519                      UnallocatedA32(instr);
64520                      return;
64521                    }
64522                    Condition condition((instr >> 28) & 0xf);
64523                    unsigned rd = (instr >> 16) & 0xf;
64524                    unsigned rn = instr & 0xf;
64525                    unsigned rm = (instr >> 8) & 0xf;
64526                    unsigned ra = (instr >> 12) & 0xf;
64527                    // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64528                    smlsd(condition,
64529                          Register(rd),
64530                          Register(rn),
64531                          Register(rm),
64532                          Register(ra));
64533                    break;
64534                  }
64535                }
64536                break;
64537              }
64538              case 0x00000060: {
64539                // 0x07000070
64540                switch (instr & 0x0000f000) {
64541                  case 0x0000f000: {
64542                    // 0x0700f070
64543                    if (((instr & 0xf0000000) == 0xf0000000)) {
64544                      UnallocatedA32(instr);
64545                      return;
64546                    }
64547                    Condition condition((instr >> 28) & 0xf);
64548                    unsigned rd = (instr >> 16) & 0xf;
64549                    unsigned rn = instr & 0xf;
64550                    unsigned rm = (instr >> 8) & 0xf;
64551                    // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64552                    smusdx(condition, Register(rd), Register(rn), Register(rm));
64553                    break;
64554                  }
64555                  default: {
64556                    if (((instr & 0xf0000000) == 0xf0000000) ||
64557                        ((instr & 0xf000) == 0xf000)) {
64558                      UnallocatedA32(instr);
64559                      return;
64560                    }
64561                    Condition condition((instr >> 28) & 0xf);
64562                    unsigned rd = (instr >> 16) & 0xf;
64563                    unsigned rn = instr & 0xf;
64564                    unsigned rm = (instr >> 8) & 0xf;
64565                    unsigned ra = (instr >> 12) & 0xf;
64566                    // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64567                    smlsdx(condition,
64568                           Register(rd),
64569                           Register(rn),
64570                           Register(rm),
64571                           Register(ra));
64572                    break;
64573                  }
64574                }
64575                break;
64576              }
64577              case 0x00100000: {
64578                // 0x07100010
64579                if (((instr & 0xf0000000) == 0xf0000000)) {
64580                  UnallocatedA32(instr);
64581                  return;
64582                }
64583                Condition condition((instr >> 28) & 0xf);
64584                unsigned rd = (instr >> 16) & 0xf;
64585                unsigned rn = instr & 0xf;
64586                unsigned rm = (instr >> 8) & 0xf;
64587                // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64588                sdiv(condition, Register(rd), Register(rn), Register(rm));
64589                if (((instr & 0xff0f0f0) != 0x710f010)) {
64590                  UnpredictableA32(instr);
64591                }
64592                break;
64593              }
64594              case 0x00800000: {
64595                // 0x07800010
64596                switch (instr & 0x0000f000) {
64597                  case 0x0000f000: {
64598                    // 0x0780f010
64599                    if (((instr & 0xf0000000) == 0xf0000000)) {
64600                      UnallocatedA32(instr);
64601                      return;
64602                    }
64603                    Condition condition((instr >> 28) & 0xf);
64604                    unsigned rd = (instr >> 16) & 0xf;
64605                    unsigned rn = instr & 0xf;
64606                    unsigned rm = (instr >> 8) & 0xf;
64607                    // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64608                    usad8(condition, Register(rd), Register(rn), Register(rm));
64609                    break;
64610                  }
64611                  default: {
64612                    if (((instr & 0xf0000000) == 0xf0000000) ||
64613                        ((instr & 0xf000) == 0xf000)) {
64614                      UnallocatedA32(instr);
64615                      return;
64616                    }
64617                    Condition condition((instr >> 28) & 0xf);
64618                    unsigned rd = (instr >> 16) & 0xf;
64619                    unsigned rn = instr & 0xf;
64620                    unsigned rm = (instr >> 8) & 0xf;
64621                    unsigned ra = (instr >> 12) & 0xf;
64622                    // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64623                    usada8(condition,
64624                           Register(rd),
64625                           Register(rn),
64626                           Register(rm),
64627                           Register(ra));
64628                    break;
64629                  }
64630                }
64631                break;
64632              }
64633              default:
64634                UnallocatedA32(instr);
64635                break;
64636            }
64637            break;
64638          }
64639          case 0x01200000: {
64640            // 0x07200000
64641            switch (instr & 0x00100000) {
64642              case 0x00000000: {
64643                // 0x07200000
64644                if (((instr & 0xf0000000) == 0xf0000000)) {
64645                  UnallocatedA32(instr);
64646                  return;
64647                }
64648                Condition condition((instr >> 28) & 0xf);
64649                unsigned rt = (instr >> 12) & 0xf;
64650                unsigned rn = (instr >> 16) & 0xf;
64651                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64652                unsigned rm = instr & 0xf;
64653                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64654                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64655                                                    (imm_and_type_ & 0x7c) >>
64656                                                        2);
64657                Shift shift = shift_operand.GetShift();
64658                uint32_t amount = shift_operand.GetAmount();
64659                AddrMode addrmode = PreIndex;
64660                // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64661                str(condition,
64662                    Best,
64663                    Register(rt),
64664                    MemOperand(Register(rn),
64665                               sign,
64666                               Register(rm),
64667                               shift,
64668                               amount,
64669                               addrmode));
64670                break;
64671              }
64672              case 0x00100000: {
64673                // 0x07300000
64674                if (((instr & 0xf0000000) == 0xf0000000)) {
64675                  UnallocatedA32(instr);
64676                  return;
64677                }
64678                Condition condition((instr >> 28) & 0xf);
64679                unsigned rt = (instr >> 12) & 0xf;
64680                unsigned rn = (instr >> 16) & 0xf;
64681                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64682                unsigned rm = instr & 0xf;
64683                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64684                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64685                                                    (imm_and_type_ & 0x7c) >>
64686                                                        2);
64687                Shift shift = shift_operand.GetShift();
64688                uint32_t amount = shift_operand.GetAmount();
64689                AddrMode addrmode = PreIndex;
64690                // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64691                ldr(condition,
64692                    Best,
64693                    Register(rt),
64694                    MemOperand(Register(rn),
64695                               sign,
64696                               Register(rm),
64697                               shift,
64698                               amount,
64699                               addrmode));
64700                break;
64701              }
64702            }
64703            break;
64704          }
64705          case 0x01200010: {
64706            // 0x07200010
64707            switch (instr & 0x00800060) {
64708              case 0x00000000: {
64709                // 0x07200010
64710                if ((instr & 0x00100080) == 0x00100000) {
64711                  if (((instr & 0xf0000000) == 0xf0000000)) {
64712                    UnallocatedA32(instr);
64713                    return;
64714                  }
64715                  Condition condition((instr >> 28) & 0xf);
64716                  unsigned rd = (instr >> 16) & 0xf;
64717                  unsigned rn = instr & 0xf;
64718                  unsigned rm = (instr >> 8) & 0xf;
64719                  // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64720                  udiv(condition, Register(rd), Register(rn), Register(rm));
64721                  if (((instr & 0xff0f0f0) != 0x730f010)) {
64722                    UnpredictableA32(instr);
64723                  }
64724                } else {
64725                  UnallocatedA32(instr);
64726                }
64727                break;
64728              }
64729              case 0x00800040: {
64730                // 0x07a00050
64731                if (((instr & 0xf0000000) == 0xf0000000)) {
64732                  UnallocatedA32(instr);
64733                  return;
64734                }
64735                Condition condition((instr >> 28) & 0xf);
64736                unsigned rd = (instr >> 12) & 0xf;
64737                unsigned rn = instr & 0xf;
64738                uint32_t lsb = (instr >> 7) & 0x1f;
64739                uint32_t widthm1 = (instr >> 16) & 0x1f;
64740                uint32_t width = widthm1 + 1;
64741                // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64742                sbfx(condition, Register(rd), Register(rn), lsb, width);
64743                break;
64744              }
64745              default:
64746                UnallocatedA32(instr);
64747                break;
64748            }
64749            break;
64750          }
64751          case 0x01400000: {
64752            // 0x07400000
64753            switch (instr & 0x00100000) {
64754              case 0x00000000: {
64755                // 0x07400000
64756                if (((instr & 0xf0000000) == 0xf0000000)) {
64757                  UnallocatedA32(instr);
64758                  return;
64759                }
64760                Condition condition((instr >> 28) & 0xf);
64761                unsigned rt = (instr >> 12) & 0xf;
64762                unsigned rn = (instr >> 16) & 0xf;
64763                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64764                unsigned rm = instr & 0xf;
64765                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64766                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64767                                                    (imm_and_type_ & 0x7c) >>
64768                                                        2);
64769                Shift shift = shift_operand.GetShift();
64770                uint32_t amount = shift_operand.GetAmount();
64771                AddrMode addrmode = Offset;
64772                // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64773                strb(condition,
64774                     Best,
64775                     Register(rt),
64776                     MemOperand(Register(rn),
64777                                sign,
64778                                Register(rm),
64779                                shift,
64780                                amount,
64781                                addrmode));
64782                break;
64783              }
64784              case 0x00100000: {
64785                // 0x07500000
64786                if (((instr & 0xf0000000) == 0xf0000000)) {
64787                  UnallocatedA32(instr);
64788                  return;
64789                }
64790                Condition condition((instr >> 28) & 0xf);
64791                unsigned rt = (instr >> 12) & 0xf;
64792                unsigned rn = (instr >> 16) & 0xf;
64793                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64794                unsigned rm = instr & 0xf;
64795                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64796                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64797                                                    (imm_and_type_ & 0x7c) >>
64798                                                        2);
64799                Shift shift = shift_operand.GetShift();
64800                uint32_t amount = shift_operand.GetAmount();
64801                AddrMode addrmode = Offset;
64802                // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64803                ldrb(condition,
64804                     Best,
64805                     Register(rt),
64806                     MemOperand(Register(rn),
64807                                sign,
64808                                Register(rm),
64809                                shift,
64810                                amount,
64811                                addrmode));
64812                break;
64813              }
64814            }
64815            break;
64816          }
64817          case 0x01400010: {
64818            // 0x07400010
64819            switch (instr & 0x00800060) {
64820              case 0x00000000: {
64821                // 0x07400010
64822                switch (instr & 0x00100080) {
64823                  case 0x00000000: {
64824                    // 0x07400010
64825                    if (((instr & 0xf0000000) == 0xf0000000)) {
64826                      UnallocatedA32(instr);
64827                      return;
64828                    }
64829                    Condition condition((instr >> 28) & 0xf);
64830                    unsigned rdlo = (instr >> 12) & 0xf;
64831                    unsigned rdhi = (instr >> 16) & 0xf;
64832                    unsigned rn = instr & 0xf;
64833                    unsigned rm = (instr >> 8) & 0xf;
64834                    // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64835                    smlald(condition,
64836                           Register(rdlo),
64837                           Register(rdhi),
64838                           Register(rn),
64839                           Register(rm));
64840                    break;
64841                  }
64842                  case 0x00100000: {
64843                    // 0x07500010
64844                    switch (instr & 0x0000f000) {
64845                      case 0x0000f000: {
64846                        // 0x0750f010
64847                        if (((instr & 0xf0000000) == 0xf0000000)) {
64848                          UnallocatedA32(instr);
64849                          return;
64850                        }
64851                        Condition condition((instr >> 28) & 0xf);
64852                        unsigned rd = (instr >> 16) & 0xf;
64853                        unsigned rn = instr & 0xf;
64854                        unsigned rm = (instr >> 8) & 0xf;
64855                        // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64856                        smmul(condition,
64857                              Register(rd),
64858                              Register(rn),
64859                              Register(rm));
64860                        break;
64861                      }
64862                      default: {
64863                        if (((instr & 0xf0000000) == 0xf0000000) ||
64864                            ((instr & 0xf000) == 0xf000)) {
64865                          UnallocatedA32(instr);
64866                          return;
64867                        }
64868                        Condition condition((instr >> 28) & 0xf);
64869                        unsigned rd = (instr >> 16) & 0xf;
64870                        unsigned rn = instr & 0xf;
64871                        unsigned rm = (instr >> 8) & 0xf;
64872                        unsigned ra = (instr >> 12) & 0xf;
64873                        // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64874                        smmla(condition,
64875                              Register(rd),
64876                              Register(rn),
64877                              Register(rm),
64878                              Register(ra));
64879                        break;
64880                      }
64881                    }
64882                    break;
64883                  }
64884                  default:
64885                    UnallocatedA32(instr);
64886                    break;
64887                }
64888                break;
64889              }
64890              case 0x00000020: {
64891                // 0x07400030
64892                switch (instr & 0x00100080) {
64893                  case 0x00000000: {
64894                    // 0x07400030
64895                    if (((instr & 0xf0000000) == 0xf0000000)) {
64896                      UnallocatedA32(instr);
64897                      return;
64898                    }
64899                    Condition condition((instr >> 28) & 0xf);
64900                    unsigned rdlo = (instr >> 12) & 0xf;
64901                    unsigned rdhi = (instr >> 16) & 0xf;
64902                    unsigned rn = instr & 0xf;
64903                    unsigned rm = (instr >> 8) & 0xf;
64904                    // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64905                    smlaldx(condition,
64906                            Register(rdlo),
64907                            Register(rdhi),
64908                            Register(rn),
64909                            Register(rm));
64910                    break;
64911                  }
64912                  case 0x00100000: {
64913                    // 0x07500030
64914                    switch (instr & 0x0000f000) {
64915                      case 0x0000f000: {
64916                        // 0x0750f030
64917                        if (((instr & 0xf0000000) == 0xf0000000)) {
64918                          UnallocatedA32(instr);
64919                          return;
64920                        }
64921                        Condition condition((instr >> 28) & 0xf);
64922                        unsigned rd = (instr >> 16) & 0xf;
64923                        unsigned rn = instr & 0xf;
64924                        unsigned rm = (instr >> 8) & 0xf;
64925                        // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64926                        smmulr(condition,
64927                               Register(rd),
64928                               Register(rn),
64929                               Register(rm));
64930                        break;
64931                      }
64932                      default: {
64933                        if (((instr & 0xf0000000) == 0xf0000000) ||
64934                            ((instr & 0xf000) == 0xf000)) {
64935                          UnallocatedA32(instr);
64936                          return;
64937                        }
64938                        Condition condition((instr >> 28) & 0xf);
64939                        unsigned rd = (instr >> 16) & 0xf;
64940                        unsigned rn = instr & 0xf;
64941                        unsigned rm = (instr >> 8) & 0xf;
64942                        unsigned ra = (instr >> 12) & 0xf;
64943                        // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64944                        smmlar(condition,
64945                               Register(rd),
64946                               Register(rn),
64947                               Register(rm),
64948                               Register(ra));
64949                        break;
64950                      }
64951                    }
64952                    break;
64953                  }
64954                  default:
64955                    UnallocatedA32(instr);
64956                    break;
64957                }
64958                break;
64959              }
64960              case 0x00000040: {
64961                // 0x07400050
64962                switch (instr & 0x00100080) {
64963                  case 0x00000000: {
64964                    // 0x07400050
64965                    if (((instr & 0xf0000000) == 0xf0000000)) {
64966                      UnallocatedA32(instr);
64967                      return;
64968                    }
64969                    Condition condition((instr >> 28) & 0xf);
64970                    unsigned rdlo = (instr >> 12) & 0xf;
64971                    unsigned rdhi = (instr >> 16) & 0xf;
64972                    unsigned rn = instr & 0xf;
64973                    unsigned rm = (instr >> 8) & 0xf;
64974                    // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64975                    smlsld(condition,
64976                           Register(rdlo),
64977                           Register(rdhi),
64978                           Register(rn),
64979                           Register(rm));
64980                    break;
64981                  }
64982                  case 0x00100080: {
64983                    // 0x075000d0
64984                    if (((instr & 0xf0000000) == 0xf0000000)) {
64985                      UnallocatedA32(instr);
64986                      return;
64987                    }
64988                    Condition condition((instr >> 28) & 0xf);
64989                    unsigned rd = (instr >> 16) & 0xf;
64990                    unsigned rn = instr & 0xf;
64991                    unsigned rm = (instr >> 8) & 0xf;
64992                    unsigned ra = (instr >> 12) & 0xf;
64993                    // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64994                    smmls(condition,
64995                          Register(rd),
64996                          Register(rn),
64997                          Register(rm),
64998                          Register(ra));
64999                    break;
65000                  }
65001                  default:
65002                    UnallocatedA32(instr);
65003                    break;
65004                }
65005                break;
65006              }
65007              case 0x00000060: {
65008                // 0x07400070
65009                switch (instr & 0x00100080) {
65010                  case 0x00000000: {
65011                    // 0x07400070
65012                    if (((instr & 0xf0000000) == 0xf0000000)) {
65013                      UnallocatedA32(instr);
65014                      return;
65015                    }
65016                    Condition condition((instr >> 28) & 0xf);
65017                    unsigned rdlo = (instr >> 12) & 0xf;
65018                    unsigned rdhi = (instr >> 16) & 0xf;
65019                    unsigned rn = instr & 0xf;
65020                    unsigned rm = (instr >> 8) & 0xf;
65021                    // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
65022                    smlsldx(condition,
65023                            Register(rdlo),
65024                            Register(rdhi),
65025                            Register(rn),
65026                            Register(rm));
65027                    break;
65028                  }
65029                  case 0x00100080: {
65030                    // 0x075000f0
65031                    if (((instr & 0xf0000000) == 0xf0000000)) {
65032                      UnallocatedA32(instr);
65033                      return;
65034                    }
65035                    Condition condition((instr >> 28) & 0xf);
65036                    unsigned rd = (instr >> 16) & 0xf;
65037                    unsigned rn = instr & 0xf;
65038                    unsigned rm = (instr >> 8) & 0xf;
65039                    unsigned ra = (instr >> 12) & 0xf;
65040                    // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
65041                    smmlsr(condition,
65042                           Register(rd),
65043                           Register(rn),
65044                           Register(rm),
65045                           Register(ra));
65046                    break;
65047                  }
65048                  default:
65049                    UnallocatedA32(instr);
65050                    break;
65051                }
65052                break;
65053              }
65054              case 0x00800000: {
65055                // 0x07c00010
65056                switch (instr & 0x0000000f) {
65057                  case 0x0000000f: {
65058                    // 0x07c0001f
65059                    if (((instr & 0xf0000000) == 0xf0000000)) {
65060                      UnallocatedA32(instr);
65061                      return;
65062                    }
65063                    Condition condition((instr >> 28) & 0xf);
65064                    unsigned rd = (instr >> 12) & 0xf;
65065                    uint32_t lsb = (instr >> 7) & 0x1f;
65066                    uint32_t msb = (instr >> 16) & 0x1f;
65067                    uint32_t width = msb - lsb + 1;
65068                    // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1
65069                    bfc(condition, Register(rd), lsb, width);
65070                    break;
65071                  }
65072                  default: {
65073                    if (((instr & 0xf0000000) == 0xf0000000) ||
65074                        ((instr & 0xf) == 0xf)) {
65075                      UnallocatedA32(instr);
65076                      return;
65077                    }
65078                    Condition condition((instr >> 28) & 0xf);
65079                    unsigned rd = (instr >> 12) & 0xf;
65080                    unsigned rn = instr & 0xf;
65081                    uint32_t lsb = (instr >> 7) & 0x1f;
65082                    uint32_t msb = (instr >> 16) & 0x1f;
65083                    uint32_t width = msb - lsb + 1;
65084                    // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
65085                    bfi(condition, Register(rd), Register(rn), lsb, width);
65086                    break;
65087                  }
65088                }
65089                break;
65090              }
65091              default:
65092                UnallocatedA32(instr);
65093                break;
65094            }
65095            break;
65096          }
65097          case 0x01600000: {
65098            // 0x07600000
65099            switch (instr & 0x00100000) {
65100              case 0x00000000: {
65101                // 0x07600000
65102                if (((instr & 0xf0000000) == 0xf0000000)) {
65103                  UnallocatedA32(instr);
65104                  return;
65105                }
65106                Condition condition((instr >> 28) & 0xf);
65107                unsigned rt = (instr >> 12) & 0xf;
65108                unsigned rn = (instr >> 16) & 0xf;
65109                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
65110                unsigned rm = instr & 0xf;
65111                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
65112                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
65113                                                    (imm_and_type_ & 0x7c) >>
65114                                                        2);
65115                Shift shift = shift_operand.GetShift();
65116                uint32_t amount = shift_operand.GetAmount();
65117                AddrMode addrmode = PreIndex;
65118                // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
65119                strb(condition,
65120                     Best,
65121                     Register(rt),
65122                     MemOperand(Register(rn),
65123                                sign,
65124                                Register(rm),
65125                                shift,
65126                                amount,
65127                                addrmode));
65128                break;
65129              }
65130              case 0x00100000: {
65131                // 0x07700000
65132                if (((instr & 0xf0000000) == 0xf0000000)) {
65133                  UnallocatedA32(instr);
65134                  return;
65135                }
65136                Condition condition((instr >> 28) & 0xf);
65137                unsigned rt = (instr >> 12) & 0xf;
65138                unsigned rn = (instr >> 16) & 0xf;
65139                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
65140                unsigned rm = instr & 0xf;
65141                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
65142                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
65143                                                    (imm_and_type_ & 0x7c) >>
65144                                                        2);
65145                Shift shift = shift_operand.GetShift();
65146                uint32_t amount = shift_operand.GetAmount();
65147                AddrMode addrmode = PreIndex;
65148                // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
65149                ldrb(condition,
65150                     Best,
65151                     Register(rt),
65152                     MemOperand(Register(rn),
65153                                sign,
65154                                Register(rm),
65155                                shift,
65156                                amount,
65157                                addrmode));
65158                break;
65159              }
65160            }
65161            break;
65162          }
65163          case 0x01600010: {
65164            // 0x07600010
65165            switch (instr & 0x00800060) {
65166              case 0x00800040: {
65167                // 0x07e00050
65168                if (((instr & 0xf0000000) == 0xf0000000)) {
65169                  UnallocatedA32(instr);
65170                  return;
65171                }
65172                Condition condition((instr >> 28) & 0xf);
65173                unsigned rd = (instr >> 12) & 0xf;
65174                unsigned rn = instr & 0xf;
65175                uint32_t lsb = (instr >> 7) & 0x1f;
65176                uint32_t widthm1 = (instr >> 16) & 0x1f;
65177                uint32_t width = widthm1 + 1;
65178                // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
65179                ubfx(condition, Register(rd), Register(rn), lsb, width);
65180                break;
65181              }
65182              case 0x00800060: {
65183                // 0x07e00070
65184                if ((instr & 0xf0100080) == 0xe0100080) {
65185                  uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
65186                  // UDF{<c>}{<q>} {#}<imm> ; A1
65187                  udf(al, Best, imm);
65188                } else {
65189                  UnallocatedA32(instr);
65190                }
65191                break;
65192              }
65193              default:
65194                UnallocatedA32(instr);
65195                break;
65196            }
65197            break;
65198          }
65199        }
65200        break;
65201      }
65202      case 0x08000000: {
65203        // 0x08000000
65204        switch (instr & 0x00500000) {
65205          case 0x00000000: {
65206            // 0x08000000
65207            switch (instr & 0x01800000) {
65208              case 0x00000000: {
65209                // 0x08000000
65210                if (((instr & 0xf0000000) == 0xf0000000)) {
65211                  UnallocatedA32(instr);
65212                  return;
65213                }
65214                Condition condition((instr >> 28) & 0xf);
65215                unsigned rn = (instr >> 16) & 0xf;
65216                WriteBack write_back((instr >> 21) & 0x1);
65217                RegisterList registers((instr & 0xffff));
65218                // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
65219                stmda(condition, Register(rn), write_back, registers);
65220                break;
65221              }
65222              case 0x00800000: {
65223                // 0x08800000
65224                if (((instr & 0xf0000000) == 0xf0000000)) {
65225                  UnallocatedA32(instr);
65226                  return;
65227                }
65228                Condition condition((instr >> 28) & 0xf);
65229                unsigned rn = (instr >> 16) & 0xf;
65230                WriteBack write_back((instr >> 21) & 0x1);
65231                RegisterList registers((instr & 0xffff));
65232                // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1
65233                stm(condition, Best, Register(rn), write_back, registers);
65234                break;
65235              }
65236              case 0x01000000: {
65237                // 0x09000000
65238                if (((instr & 0xf0000000) == 0xf0000000)) {
65239                  UnallocatedA32(instr);
65240                  return;
65241                }
65242                if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
65243                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
65244                    ((instr & 0xf0000000) != 0xf0000000) &&
65245                    (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
65246                  Condition condition((instr >> 28) & 0xf);
65247                  RegisterList registers((instr & 0xffff));
65248                  // PUSH{<c>}{<q>} <registers> ; A1
65249                  push(condition, Best, registers);
65250                  return;
65251                }
65252                Condition condition((instr >> 28) & 0xf);
65253                unsigned rn = (instr >> 16) & 0xf;
65254                WriteBack write_back((instr >> 21) & 0x1);
65255                RegisterList registers((instr & 0xffff));
65256                // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
65257                stmdb(condition, Best, Register(rn), write_back, registers);
65258                break;
65259              }
65260              case 0x01800000: {
65261                // 0x09800000
65262                if (((instr & 0xf0000000) == 0xf0000000)) {
65263                  UnallocatedA32(instr);
65264                  return;
65265                }
65266                Condition condition((instr >> 28) & 0xf);
65267                unsigned rn = (instr >> 16) & 0xf;
65268                WriteBack write_back((instr >> 21) & 0x1);
65269                RegisterList registers((instr & 0xffff));
65270                // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
65271                stmib(condition, Register(rn), write_back, registers);
65272                break;
65273              }
65274            }
65275            break;
65276          }
65277          case 0x00100000: {
65278            // 0x08100000
65279            switch (instr & 0x01800000) {
65280              case 0x00000000: {
65281                // 0x08100000
65282                if (((instr & 0xf0000000) == 0xf0000000)) {
65283                  UnallocatedA32(instr);
65284                  return;
65285                }
65286                Condition condition((instr >> 28) & 0xf);
65287                unsigned rn = (instr >> 16) & 0xf;
65288                WriteBack write_back((instr >> 21) & 0x1);
65289                RegisterList registers((instr & 0xffff));
65290                // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
65291                ldmda(condition, Register(rn), write_back, registers);
65292                break;
65293              }
65294              case 0x00800000: {
65295                // 0x08900000
65296                if (((instr & 0xf0000000) == 0xf0000000)) {
65297                  UnallocatedA32(instr);
65298                  return;
65299                }
65300                if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
65301                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
65302                    ((instr & 0xf0000000) != 0xf0000000) &&
65303                    (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
65304                  Condition condition((instr >> 28) & 0xf);
65305                  RegisterList registers((instr & 0xffff));
65306                  // POP{<c>}{<q>} <registers> ; A1
65307                  pop(condition, Best, registers);
65308                  return;
65309                }
65310                Condition condition((instr >> 28) & 0xf);
65311                unsigned rn = (instr >> 16) & 0xf;
65312                WriteBack write_back((instr >> 21) & 0x1);
65313                RegisterList registers((instr & 0xffff));
65314                // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1
65315                ldm(condition, Best, Register(rn), write_back, registers);
65316                break;
65317              }
65318              case 0x01000000: {
65319                // 0x09100000
65320                if (((instr & 0xf0000000) == 0xf0000000)) {
65321                  UnallocatedA32(instr);
65322                  return;
65323                }
65324                Condition condition((instr >> 28) & 0xf);
65325                unsigned rn = (instr >> 16) & 0xf;
65326                WriteBack write_back((instr >> 21) & 0x1);
65327                RegisterList registers((instr & 0xffff));
65328                // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
65329                ldmdb(condition, Register(rn), write_back, registers);
65330                break;
65331              }
65332              case 0x01800000: {
65333                // 0x09900000
65334                if (((instr & 0xf0000000) == 0xf0000000)) {
65335                  UnallocatedA32(instr);
65336                  return;
65337                }
65338                Condition condition((instr >> 28) & 0xf);
65339                unsigned rn = (instr >> 16) & 0xf;
65340                WriteBack write_back((instr >> 21) & 0x1);
65341                RegisterList registers((instr & 0xffff));
65342                // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
65343                ldmib(condition, Register(rn), write_back, registers);
65344                break;
65345              }
65346            }
65347            break;
65348          }
65349          case 0x00400000: {
65350            // 0x08400000
65351            if (((instr & 0xf0000000) == 0xf0000000)) {
65352              UnallocatedA32(instr);
65353              return;
65354            }
65355            UnimplementedA32("STM", instr);
65356            break;
65357          }
65358          case 0x00500000: {
65359            // 0x08500000
65360            switch (instr & 0x00008000) {
65361              case 0x00000000: {
65362                // 0x08500000
65363                if (((instr & 0xf0000000) == 0xf0000000)) {
65364                  UnallocatedA32(instr);
65365                  return;
65366                }
65367                UnimplementedA32("LDM", instr);
65368                break;
65369              }
65370              case 0x00008000: {
65371                // 0x08508000
65372                if (((instr & 0xf0000000) == 0xf0000000)) {
65373                  UnallocatedA32(instr);
65374                  return;
65375                }
65376                UnimplementedA32("LDM", instr);
65377                break;
65378              }
65379            }
65380            break;
65381          }
65382        }
65383        break;
65384      }
65385      case 0x0a000000: {
65386        // 0x0a000000
65387        switch (instr & 0x01000000) {
65388          case 0x00000000: {
65389            // 0x0a000000
65390            if (((instr & 0xf0000000) == 0xf0000000)) {
65391              UnallocatedA32(instr);
65392              return;
65393            }
65394            Condition condition((instr >> 28) & 0xf);
65395            int32_t imm = SignExtend<int32_t>(instr & 0xffffff, 24) << 2;
65396            Location location(imm, kA32PcDelta);
65397            // B{<c>}{<q>} <label> ; A1
65398            b(condition, Best, &location);
65399            break;
65400          }
65401          case 0x01000000: {
65402            // 0x0b000000
65403            if (((instr & 0xf0000000) == 0xf0000000)) {
65404              UnallocatedA32(instr);
65405              return;
65406            }
65407            Condition condition((instr >> 28) & 0xf);
65408            int32_t imm = SignExtend<int32_t>(instr & 0xffffff, 24) << 2;
65409            Location location(imm, kA32PcDelta);
65410            // BL{<c>}{<q>} <label> ; A1
65411            bl(condition, &location);
65412            break;
65413          }
65414        }
65415        break;
65416      }
65417      case 0x0c000000: {
65418        // 0x0c000000
65419        switch (instr & 0x01100000) {
65420          case 0x00000000: {
65421            // 0x0c000000
65422            switch (instr & 0x00000e00) {
65423              case 0x00000a00: {
65424                // 0x0c000a00
65425                switch (instr & 0x00800100) {
65426                  case 0x00000000: {
65427                    // 0x0c000a00
65428                    if ((instr & 0x006000d0) == 0x00400010) {
65429                      if (((instr & 0xf0000000) == 0xf0000000)) {
65430                        UnallocatedA32(instr);
65431                        return;
65432                      }
65433                      Condition condition((instr >> 28) & 0xf);
65434                      unsigned rm = ExtractSRegister(instr, 5, 0);
65435                      unsigned rt = (instr >> 12) & 0xf;
65436                      unsigned rt2 = (instr >> 16) & 0xf;
65437                      // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1
65438                      vmov(condition,
65439                           SRegister(rm),
65440                           SRegister(rm + 1),
65441                           Register(rt),
65442                           Register(rt2));
65443                    } else {
65444                      UnallocatedA32(instr);
65445                    }
65446                    break;
65447                  }
65448                  case 0x00000100: {
65449                    // 0x0c000b00
65450                    if ((instr & 0x006000d0) == 0x00400010) {
65451                      if (((instr & 0xf0000000) == 0xf0000000)) {
65452                        UnallocatedA32(instr);
65453                        return;
65454                      }
65455                      Condition condition((instr >> 28) & 0xf);
65456                      unsigned rm = ExtractDRegister(instr, 5, 0);
65457                      unsigned rt = (instr >> 12) & 0xf;
65458                      unsigned rt2 = (instr >> 16) & 0xf;
65459                      // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1
65460                      vmov(condition,
65461                           DRegister(rm),
65462                           Register(rt),
65463                           Register(rt2));
65464                    } else {
65465                      UnallocatedA32(instr);
65466                    }
65467                    break;
65468                  }
65469                  case 0x00800000: {
65470                    // 0x0c800a00
65471                    if (((instr & 0xf0000000) == 0xf0000000)) {
65472                      UnallocatedA32(instr);
65473                      return;
65474                    }
65475                    Condition condition((instr >> 28) & 0xf);
65476                    unsigned rn = (instr >> 16) & 0xf;
65477                    WriteBack write_back((instr >> 21) & 0x1);
65478                    unsigned first = ExtractSRegister(instr, 22, 12);
65479                    unsigned len = instr & 0xff;
65480                    // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
65481                    vstm(condition,
65482                         kDataTypeValueNone,
65483                         Register(rn),
65484                         write_back,
65485                         SRegisterList(SRegister(first), len));
65486                    if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65487                      UnpredictableA32(instr);
65488                    }
65489                    break;
65490                  }
65491                  case 0x00800100: {
65492                    // 0x0c800b00
65493                    switch (instr & 0x00000001) {
65494                      case 0x00000000: {
65495                        // 0x0c800b00
65496                        if (((instr & 0xf0000000) == 0xf0000000)) {
65497                          UnallocatedA32(instr);
65498                          return;
65499                        }
65500                        Condition condition((instr >> 28) & 0xf);
65501                        unsigned rn = (instr >> 16) & 0xf;
65502                        WriteBack write_back((instr >> 21) & 0x1);
65503                        unsigned first = ExtractDRegister(instr, 22, 12);
65504                        unsigned imm8 = (instr & 0xff);
65505                        unsigned len = imm8 / 2;
65506                        unsigned end = first + len;
65507                        // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
65508                        vstm(condition,
65509                             kDataTypeValueNone,
65510                             Register(rn),
65511                             write_back,
65512                             DRegisterList(DRegister(first), len));
65513                        if ((len == 0) || (len > 16) ||
65514                            (end > kMaxNumberOfDRegisters)) {
65515                          UnpredictableA32(instr);
65516                        }
65517                        break;
65518                      }
65519                      case 0x00000001: {
65520                        // 0x0c800b01
65521                        if (((instr & 0xf0000000) == 0xf0000000)) {
65522                          UnallocatedA32(instr);
65523                          return;
65524                        }
65525                        Condition condition((instr >> 28) & 0xf);
65526                        unsigned rn = (instr >> 16) & 0xf;
65527                        WriteBack write_back((instr >> 21) & 0x1);
65528                        unsigned first = ExtractDRegister(instr, 22, 12);
65529                        unsigned imm8 = (instr & 0xff);
65530                        unsigned len = imm8 / 2;
65531                        unsigned end = first + len;
65532                        // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
65533                        fstmiax(condition,
65534                                Register(rn),
65535                                write_back,
65536                                DRegisterList(DRegister(first), len));
65537                        if ((len == 0) || (len > 16) || (end > 16)) {
65538                          UnpredictableA32(instr);
65539                        }
65540                        break;
65541                      }
65542                    }
65543                    break;
65544                  }
65545                }
65546                break;
65547              }
65548              default: {
65549                switch (instr & 0x00200000) {
65550                  case 0x00000000: {
65551                    // 0x0c000000
65552                    switch (instr & 0x00800000) {
65553                      case 0x00000000: {
65554                        // 0x0c000000
65555                        if ((instr & 0x00400000) == 0x00400000) {
65556                          if (((instr & 0xf0000000) == 0xf0000000) ||
65557                              ((instr & 0xe00) == 0xa00)) {
65558                            UnallocatedA32(instr);
65559                            return;
65560                          }
65561                          UnimplementedA32("MCRR", instr);
65562                        } else {
65563                          UnallocatedA32(instr);
65564                        }
65565                        break;
65566                      }
65567                      case 0x00800000: {
65568                        // 0x0c800000
65569                        if (((instr & 0xf0000000) == 0xf0000000) ||
65570                            ((instr & 0xe00) == 0xa00)) {
65571                          UnallocatedA32(instr);
65572                          return;
65573                        }
65574                        UnimplementedA32("STC", instr);
65575                        break;
65576                      }
65577                    }
65578                    break;
65579                  }
65580                  case 0x00200000: {
65581                    // 0x0c200000
65582                    if (((instr & 0xf0000000) == 0xf0000000) ||
65583                        ((instr & 0xe00) == 0xa00)) {
65584                      UnallocatedA32(instr);
65585                      return;
65586                    }
65587                    UnimplementedA32("STC", instr);
65588                    break;
65589                  }
65590                }
65591                break;
65592              }
65593            }
65594            break;
65595          }
65596          case 0x00100000: {
65597            // 0x0c100000
65598            switch (instr & 0x00000e00) {
65599              case 0x00000a00: {
65600                // 0x0c100a00
65601                switch (instr & 0x00800100) {
65602                  case 0x00000000: {
65603                    // 0x0c100a00
65604                    if ((instr & 0x006000d0) == 0x00400010) {
65605                      if (((instr & 0xf0000000) == 0xf0000000)) {
65606                        UnallocatedA32(instr);
65607                        return;
65608                      }
65609                      Condition condition((instr >> 28) & 0xf);
65610                      unsigned rt = (instr >> 12) & 0xf;
65611                      unsigned rt2 = (instr >> 16) & 0xf;
65612                      unsigned rm = ExtractSRegister(instr, 5, 0);
65613                      // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1
65614                      vmov(condition,
65615                           Register(rt),
65616                           Register(rt2),
65617                           SRegister(rm),
65618                           SRegister(rm + 1));
65619                    } else {
65620                      UnallocatedA32(instr);
65621                    }
65622                    break;
65623                  }
65624                  case 0x00000100: {
65625                    // 0x0c100b00
65626                    if ((instr & 0x006000d0) == 0x00400010) {
65627                      if (((instr & 0xf0000000) == 0xf0000000)) {
65628                        UnallocatedA32(instr);
65629                        return;
65630                      }
65631                      Condition condition((instr >> 28) & 0xf);
65632                      unsigned rt = (instr >> 12) & 0xf;
65633                      unsigned rt2 = (instr >> 16) & 0xf;
65634                      unsigned rm = ExtractDRegister(instr, 5, 0);
65635                      // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1
65636                      vmov(condition,
65637                           Register(rt),
65638                           Register(rt2),
65639                           DRegister(rm));
65640                    } else {
65641                      UnallocatedA32(instr);
65642                    }
65643                    break;
65644                  }
65645                  case 0x00800000: {
65646                    // 0x0c900a00
65647                    if (((instr & 0xf0000000) == 0xf0000000)) {
65648                      UnallocatedA32(instr);
65649                      return;
65650                    }
65651                    if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
65652                         Uint32(0x1)) &&
65653                        ((Uint32((instr >> 16)) & Uint32(0xf)) ==
65654                         Uint32(0xd)) &&
65655                        ((instr & 0xf0000000) != 0xf0000000)) {
65656                      Condition condition((instr >> 28) & 0xf);
65657                      unsigned first = ExtractSRegister(instr, 22, 12);
65658                      unsigned len = instr & 0xff;
65659                      // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2
65660                      vpop(condition,
65661                           kDataTypeValueNone,
65662                           SRegisterList(SRegister(first), len));
65663                      if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65664                        UnpredictableA32(instr);
65665                      }
65666                      return;
65667                    }
65668                    Condition condition((instr >> 28) & 0xf);
65669                    unsigned rn = (instr >> 16) & 0xf;
65670                    WriteBack write_back((instr >> 21) & 0x1);
65671                    unsigned first = ExtractSRegister(instr, 22, 12);
65672                    unsigned len = instr & 0xff;
65673                    // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
65674                    vldm(condition,
65675                         kDataTypeValueNone,
65676                         Register(rn),
65677                         write_back,
65678                         SRegisterList(SRegister(first), len));
65679                    if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65680                      UnpredictableA32(instr);
65681                    }
65682                    break;
65683                  }
65684                  case 0x00800100: {
65685                    // 0x0c900b00
65686                    switch (instr & 0x00000001) {
65687                      case 0x00000000: {
65688                        // 0x0c900b00
65689                        if (((instr & 0xf0000000) == 0xf0000000)) {
65690                          UnallocatedA32(instr);
65691                          return;
65692                        }
65693                        if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
65694                             Uint32(0x1)) &&
65695                            ((Uint32((instr >> 16)) & Uint32(0xf)) ==
65696                             Uint32(0xd)) &&
65697                            ((instr & 0xf0000000) != 0xf0000000)) {
65698                          Condition condition((instr >> 28) & 0xf);
65699                          unsigned first = ExtractDRegister(instr, 22, 12);
65700                          unsigned imm8 = (instr & 0xff);
65701                          unsigned len = imm8 / 2;
65702                          unsigned end = first + len;
65703                          // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1
65704                          vpop(condition,
65705                               kDataTypeValueNone,
65706                               DRegisterList(DRegister(first), len));
65707                          if ((len == 0) || (len > 16) ||
65708                              (end > kMaxNumberOfDRegisters)) {
65709                            UnpredictableA32(instr);
65710                          }
65711                          return;
65712                        }
65713                        Condition condition((instr >> 28) & 0xf);
65714                        unsigned rn = (instr >> 16) & 0xf;
65715                        WriteBack write_back((instr >> 21) & 0x1);
65716                        unsigned first = ExtractDRegister(instr, 22, 12);
65717                        unsigned imm8 = (instr & 0xff);
65718                        unsigned len = imm8 / 2;
65719                        unsigned end = first + len;
65720                        // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
65721                        vldm(condition,
65722                             kDataTypeValueNone,
65723                             Register(rn),
65724                             write_back,
65725                             DRegisterList(DRegister(first), len));
65726                        if ((len == 0) || (len > 16) ||
65727                            (end > kMaxNumberOfDRegisters)) {
65728                          UnpredictableA32(instr);
65729                        }
65730                        break;
65731                      }
65732                      case 0x00000001: {
65733                        // 0x0c900b01
65734                        if (((instr & 0xf0000000) == 0xf0000000)) {
65735                          UnallocatedA32(instr);
65736                          return;
65737                        }
65738                        Condition condition((instr >> 28) & 0xf);
65739                        unsigned rn = (instr >> 16) & 0xf;
65740                        WriteBack write_back((instr >> 21) & 0x1);
65741                        unsigned first = ExtractDRegister(instr, 22, 12);
65742                        unsigned imm8 = (instr & 0xff);
65743                        unsigned len = imm8 / 2;
65744                        unsigned end = first + len;
65745                        // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
65746                        fldmiax(condition,
65747                                Register(rn),
65748                                write_back,
65749                                DRegisterList(DRegister(first), len));
65750                        if ((len == 0) || (len > 16) || (end > 16)) {
65751                          UnpredictableA32(instr);
65752                        }
65753                        break;
65754                      }
65755                    }
65756                    break;
65757                  }
65758                }
65759                break;
65760              }
65761              default: {
65762                switch (instr & 0x00200000) {
65763                  case 0x00000000: {
65764                    // 0x0c100000
65765                    switch (instr & 0x00800000) {
65766                      case 0x00000000: {
65767                        // 0x0c100000
65768                        if ((instr & 0x00400000) == 0x00400000) {
65769                          if (((instr & 0xf0000000) == 0xf0000000) ||
65770                              ((instr & 0xe00) == 0xa00)) {
65771                            UnallocatedA32(instr);
65772                            return;
65773                          }
65774                          UnimplementedA32("MRRC", instr);
65775                        } else {
65776                          UnallocatedA32(instr);
65777                        }
65778                        break;
65779                      }
65780                      case 0x00800000: {
65781                        // 0x0c900000
65782                        switch (instr & 0x000f0000) {
65783                          case 0x000f0000: {
65784                            // 0x0c9f0000
65785                            if (((instr & 0xf0000000) == 0xf0000000) ||
65786                                ((instr & 0xe00) == 0xa00)) {
65787                              UnallocatedA32(instr);
65788                              return;
65789                            }
65790                            UnimplementedA32("LDC", instr);
65791                            break;
65792                          }
65793                          default: {
65794                            if (((instr & 0xf0000000) == 0xf0000000) ||
65795                                ((instr & 0xf0000) == 0xf0000) ||
65796                                ((instr & 0xe00) == 0xa00)) {
65797                              UnallocatedA32(instr);
65798                              return;
65799                            }
65800                            UnimplementedA32("LDC", instr);
65801                            break;
65802                          }
65803                        }
65804                        break;
65805                      }
65806                    }
65807                    break;
65808                  }
65809                  case 0x00200000: {
65810                    // 0x0c300000
65811                    if (((instr & 0xf0000000) == 0xf0000000) ||
65812                        ((instr & 0xf0000) == 0xf0000) ||
65813                        ((instr & 0xe00) == 0xa00)) {
65814                      UnallocatedA32(instr);
65815                      return;
65816                    }
65817                    UnimplementedA32("LDC", instr);
65818                    break;
65819                  }
65820                }
65821                break;
65822              }
65823            }
65824            break;
65825          }
65826          case 0x01000000: {
65827            // 0x0d000000
65828            switch (instr & 0x00200000) {
65829              case 0x00000000: {
65830                // 0x0d000000
65831                switch (instr & 0x00000e00) {
65832                  case 0x00000a00: {
65833                    // 0x0d000a00
65834                    switch (instr & 0x00000100) {
65835                      case 0x00000000: {
65836                        // 0x0d000a00
65837                        if (((instr & 0xf0000000) == 0xf0000000)) {
65838                          UnallocatedA32(instr);
65839                          return;
65840                        }
65841                        Condition condition((instr >> 28) & 0xf);
65842                        unsigned rd = ExtractSRegister(instr, 22, 12);
65843                        unsigned rn = (instr >> 16) & 0xf;
65844                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65845                        int32_t offset = (instr & 0xff) << 2;
65846                        // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
65847                        vstr(condition,
65848                             Untyped32,
65849                             SRegister(rd),
65850                             MemOperand(Register(rn), sign, offset, Offset));
65851                        break;
65852                      }
65853                      case 0x00000100: {
65854                        // 0x0d000b00
65855                        if (((instr & 0xf0000000) == 0xf0000000)) {
65856                          UnallocatedA32(instr);
65857                          return;
65858                        }
65859                        Condition condition((instr >> 28) & 0xf);
65860                        unsigned rd = ExtractDRegister(instr, 22, 12);
65861                        unsigned rn = (instr >> 16) & 0xf;
65862                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65863                        int32_t offset = (instr & 0xff) << 2;
65864                        // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
65865                        vstr(condition,
65866                             Untyped64,
65867                             DRegister(rd),
65868                             MemOperand(Register(rn), sign, offset, Offset));
65869                        break;
65870                      }
65871                    }
65872                    break;
65873                  }
65874                  default: {
65875                    if (((instr & 0xf0000000) == 0xf0000000) ||
65876                        ((instr & 0xe00) == 0xa00)) {
65877                      UnallocatedA32(instr);
65878                      return;
65879                    }
65880                    UnimplementedA32("STC", instr);
65881                    break;
65882                  }
65883                }
65884                break;
65885              }
65886              case 0x00200000: {
65887                // 0x0d200000
65888                switch (instr & 0x00000e00) {
65889                  case 0x00000a00: {
65890                    // 0x0d200a00
65891                    switch (instr & 0x00800100) {
65892                      case 0x00000000: {
65893                        // 0x0d200a00
65894                        if (((instr & 0xf0000000) == 0xf0000000)) {
65895                          UnallocatedA32(instr);
65896                          return;
65897                        }
65898                        if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
65899                             Uint32(0xd)) &&
65900                            ((instr & 0xf0000000) != 0xf0000000)) {
65901                          Condition condition((instr >> 28) & 0xf);
65902                          unsigned first = ExtractSRegister(instr, 22, 12);
65903                          unsigned len = instr & 0xff;
65904                          // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2
65905                          vpush(condition,
65906                                kDataTypeValueNone,
65907                                SRegisterList(SRegister(first), len));
65908                          if ((len == 0) ||
65909                              ((first + len) > kNumberOfSRegisters)) {
65910                            UnpredictableA32(instr);
65911                          }
65912                          return;
65913                        }
65914                        Condition condition((instr >> 28) & 0xf);
65915                        unsigned rn = (instr >> 16) & 0xf;
65916                        unsigned first = ExtractSRegister(instr, 22, 12);
65917                        unsigned len = instr & 0xff;
65918                        // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
65919                        vstmdb(condition,
65920                               kDataTypeValueNone,
65921                               Register(rn),
65922                               WriteBack(WRITE_BACK),
65923                               SRegisterList(SRegister(first), len));
65924                        if ((len == 0) ||
65925                            ((first + len) > kNumberOfSRegisters)) {
65926                          UnpredictableA32(instr);
65927                        }
65928                        break;
65929                      }
65930                      case 0x00000100: {
65931                        // 0x0d200b00
65932                        switch (instr & 0x00000001) {
65933                          case 0x00000000: {
65934                            // 0x0d200b00
65935                            if (((instr & 0xf0000000) == 0xf0000000)) {
65936                              UnallocatedA32(instr);
65937                              return;
65938                            }
65939                            if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
65940                                 Uint32(0xd)) &&
65941                                ((instr & 0xf0000000) != 0xf0000000)) {
65942                              Condition condition((instr >> 28) & 0xf);
65943                              unsigned first = ExtractDRegister(instr, 22, 12);
65944                              unsigned imm8 = (instr & 0xff);
65945                              unsigned len = imm8 / 2;
65946                              unsigned end = first + len;
65947                              // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1
65948                              vpush(condition,
65949                                    kDataTypeValueNone,
65950                                    DRegisterList(DRegister(first), len));
65951                              if ((len == 0) || (len > 16) ||
65952                                  (end > kMaxNumberOfDRegisters)) {
65953                                UnpredictableA32(instr);
65954                              }
65955                              return;
65956                            }
65957                            Condition condition((instr >> 28) & 0xf);
65958                            unsigned rn = (instr >> 16) & 0xf;
65959                            unsigned first = ExtractDRegister(instr, 22, 12);
65960                            unsigned imm8 = (instr & 0xff);
65961                            unsigned len = imm8 / 2;
65962                            unsigned end = first + len;
65963                            // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
65964                            vstmdb(condition,
65965                                   kDataTypeValueNone,
65966                                   Register(rn),
65967                                   WriteBack(WRITE_BACK),
65968                                   DRegisterList(DRegister(first), len));
65969                            if ((len == 0) || (len > 16) ||
65970                                (end > kMaxNumberOfDRegisters)) {
65971                              UnpredictableA32(instr);
65972                            }
65973                            break;
65974                          }
65975                          case 0x00000001: {
65976                            // 0x0d200b01
65977                            if (((instr & 0xf0000000) == 0xf0000000)) {
65978                              UnallocatedA32(instr);
65979                              return;
65980                            }
65981                            Condition condition((instr >> 28) & 0xf);
65982                            unsigned rn = (instr >> 16) & 0xf;
65983                            unsigned first = ExtractDRegister(instr, 22, 12);
65984                            unsigned imm8 = (instr & 0xff);
65985                            unsigned len = imm8 / 2;
65986                            unsigned end = first + len;
65987                            // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
65988                            fstmdbx(condition,
65989                                    Register(rn),
65990                                    WriteBack(WRITE_BACK),
65991                                    DRegisterList(DRegister(first), len));
65992                            if ((len == 0) || (len > 16) || (end > 16)) {
65993                              UnpredictableA32(instr);
65994                            }
65995                            break;
65996                          }
65997                        }
65998                        break;
65999                      }
66000                      default:
66001                        UnallocatedA32(instr);
66002                        break;
66003                    }
66004                    break;
66005                  }
66006                  default: {
66007                    if (((instr & 0xf0000000) == 0xf0000000) ||
66008                        ((instr & 0xe00) == 0xa00)) {
66009                      UnallocatedA32(instr);
66010                      return;
66011                    }
66012                    UnimplementedA32("STC", instr);
66013                    break;
66014                  }
66015                }
66016                break;
66017              }
66018            }
66019            break;
66020          }
66021          case 0x01100000: {
66022            // 0x0d100000
66023            switch (instr & 0x00200000) {
66024              case 0x00000000: {
66025                // 0x0d100000
66026                switch (instr & 0x000f0000) {
66027                  case 0x000f0000: {
66028                    // 0x0d1f0000
66029                    switch (instr & 0x00000e00) {
66030                      case 0x00000a00: {
66031                        // 0x0d1f0a00
66032                        switch (instr & 0x00000100) {
66033                          case 0x00000000: {
66034                            // 0x0d1f0a00
66035                            if (((instr & 0xf0000000) == 0xf0000000)) {
66036                              UnallocatedA32(instr);
66037                              return;
66038                            }
66039                            Condition condition((instr >> 28) & 0xf);
66040                            unsigned rd = ExtractSRegister(instr, 22, 12);
66041                            uint32_t U = (instr >> 23) & 0x1;
66042                            int32_t imm = instr & 0xff;
66043                            imm <<= 2;
66044                            if (U == 0) imm = -imm;
66045                            bool minus_zero = (imm == 0) && (U == 0);
66046                            Location location(imm, kA32PcDelta);
66047                            // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2
66048                            if (minus_zero) {
66049                              vldr(condition,
66050                                   Untyped32,
66051                                   SRegister(rd),
66052                                   MemOperand(pc, minus, 0));
66053                            } else {
66054                              vldr(condition,
66055                                   Untyped32,
66056                                   SRegister(rd),
66057                                   &location);
66058                            }
66059                            break;
66060                          }
66061                          case 0x00000100: {
66062                            // 0x0d1f0b00
66063                            if (((instr & 0xf0000000) == 0xf0000000)) {
66064                              UnallocatedA32(instr);
66065                              return;
66066                            }
66067                            Condition condition((instr >> 28) & 0xf);
66068                            unsigned rd = ExtractDRegister(instr, 22, 12);
66069                            uint32_t U = (instr >> 23) & 0x1;
66070                            int32_t imm = instr & 0xff;
66071                            imm <<= 2;
66072                            if (U == 0) imm = -imm;
66073                            bool minus_zero = (imm == 0) && (U == 0);
66074                            Location location(imm, kA32PcDelta);
66075                            // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1
66076                            if (minus_zero) {
66077                              vldr(condition,
66078                                   Untyped64,
66079                                   DRegister(rd),
66080                                   MemOperand(pc, minus, 0));
66081                            } else {
66082                              vldr(condition,
66083                                   Untyped64,
66084                                   DRegister(rd),
66085                                   &location);
66086                            }
66087                            break;
66088                          }
66089                        }
66090                        break;
66091                      }
66092                      default: {
66093                        if (((instr & 0xf0000000) == 0xf0000000) ||
66094                            ((instr & 0xe00) == 0xa00)) {
66095                          UnallocatedA32(instr);
66096                          return;
66097                        }
66098                        UnimplementedA32("LDC", instr);
66099                        break;
66100                      }
66101                    }
66102                    break;
66103                  }
66104                  default: {
66105                    switch (instr & 0x00000e00) {
66106                      case 0x00000a00: {
66107                        // 0x0d100a00
66108                        switch (instr & 0x00000100) {
66109                          case 0x00000000: {
66110                            // 0x0d100a00
66111                            if (((instr & 0xf0000000) == 0xf0000000) ||
66112                                ((instr & 0xf0000) == 0xf0000)) {
66113                              UnallocatedA32(instr);
66114                              return;
66115                            }
66116                            Condition condition((instr >> 28) & 0xf);
66117                            unsigned rd = ExtractSRegister(instr, 22, 12);
66118                            unsigned rn = (instr >> 16) & 0xf;
66119                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
66120                                                                   : plus);
66121                            int32_t offset = (instr & 0xff) << 2;
66122                            // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2 NOLINT(whitespace/line_length)
66123                            vldr(condition,
66124                                 Untyped32,
66125                                 SRegister(rd),
66126                                 MemOperand(Register(rn),
66127                                            sign,
66128                                            offset,
66129                                            Offset));
66130                            break;
66131                          }
66132                          case 0x00000100: {
66133                            // 0x0d100b00
66134                            if (((instr & 0xf0000000) == 0xf0000000) ||
66135                                ((instr & 0xf0000) == 0xf0000)) {
66136                              UnallocatedA32(instr);
66137                              return;
66138                            }
66139                            Condition condition((instr >> 28) & 0xf);
66140                            unsigned rd = ExtractDRegister(instr, 22, 12);
66141                            unsigned rn = (instr >> 16) & 0xf;
66142                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
66143                                                                   : plus);
66144                            int32_t offset = (instr & 0xff) << 2;
66145                            // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1 NOLINT(whitespace/line_length)
66146                            vldr(condition,
66147                                 Untyped64,
66148                                 DRegister(rd),
66149                                 MemOperand(Register(rn),
66150                                            sign,
66151                                            offset,
66152                                            Offset));
66153                            break;
66154                          }
66155                        }
66156                        break;
66157                      }
66158                      default: {
66159                        if (((instr & 0xf0000000) == 0xf0000000) ||
66160                            ((instr & 0xf0000) == 0xf0000) ||
66161                            ((instr & 0xe00) == 0xa00)) {
66162                          UnallocatedA32(instr);
66163                          return;
66164                        }
66165                        UnimplementedA32("LDC", instr);
66166                        break;
66167                      }
66168                    }
66169                    break;
66170                  }
66171                }
66172                break;
66173              }
66174              case 0x00200000: {
66175                // 0x0d300000
66176                switch (instr & 0x00000e00) {
66177                  case 0x00000a00: {
66178                    // 0x0d300a00
66179                    switch (instr & 0x00800100) {
66180                      case 0x00000000: {
66181                        // 0x0d300a00
66182                        if (((instr & 0xf0000000) == 0xf0000000)) {
66183                          UnallocatedA32(instr);
66184                          return;
66185                        }
66186                        Condition condition((instr >> 28) & 0xf);
66187                        unsigned rn = (instr >> 16) & 0xf;
66188                        unsigned first = ExtractSRegister(instr, 22, 12);
66189                        unsigned len = instr & 0xff;
66190                        // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
66191                        vldmdb(condition,
66192                               kDataTypeValueNone,
66193                               Register(rn),
66194                               WriteBack(WRITE_BACK),
66195                               SRegisterList(SRegister(first), len));
66196                        if ((len == 0) ||
66197                            ((first + len) > kNumberOfSRegisters)) {
66198                          UnpredictableA32(instr);
66199                        }
66200                        break;
66201                      }
66202                      case 0x00000100: {
66203                        // 0x0d300b00
66204                        switch (instr & 0x00000001) {
66205                          case 0x00000000: {
66206                            // 0x0d300b00
66207                            if (((instr & 0xf0000000) == 0xf0000000)) {
66208                              UnallocatedA32(instr);
66209                              return;
66210                            }
66211                            Condition condition((instr >> 28) & 0xf);
66212                            unsigned rn = (instr >> 16) & 0xf;
66213                            unsigned first = ExtractDRegister(instr, 22, 12);
66214                            unsigned imm8 = (instr & 0xff);
66215                            unsigned len = imm8 / 2;
66216                            unsigned end = first + len;
66217                            // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
66218                            vldmdb(condition,
66219                                   kDataTypeValueNone,
66220                                   Register(rn),
66221                                   WriteBack(WRITE_BACK),
66222                                   DRegisterList(DRegister(first), len));
66223                            if ((len == 0) || (len > 16) ||
66224                                (end > kMaxNumberOfDRegisters)) {
66225                              UnpredictableA32(instr);
66226                            }
66227                            break;
66228                          }
66229                          case 0x00000001: {
66230                            // 0x0d300b01
66231                            if (((instr & 0xf0000000) == 0xf0000000)) {
66232                              UnallocatedA32(instr);
66233                              return;
66234                            }
66235                            Condition condition((instr >> 28) & 0xf);
66236                            unsigned rn = (instr >> 16) & 0xf;
66237                            unsigned first = ExtractDRegister(instr, 22, 12);
66238                            unsigned imm8 = (instr & 0xff);
66239                            unsigned len = imm8 / 2;
66240                            unsigned end = first + len;
66241                            // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
66242                            fldmdbx(condition,
66243                                    Register(rn),
66244                                    WriteBack(WRITE_BACK),
66245                                    DRegisterList(DRegister(first), len));
66246                            if ((len == 0) || (len > 16) || (end > 16)) {
66247                              UnpredictableA32(instr);
66248                            }
66249                            break;
66250                          }
66251                        }
66252                        break;
66253                      }
66254                      default:
66255                        UnallocatedA32(instr);
66256                        break;
66257                    }
66258                    break;
66259                  }
66260                  default: {
66261                    if (((instr & 0xf0000000) == 0xf0000000) ||
66262                        ((instr & 0xf0000) == 0xf0000) ||
66263                        ((instr & 0xe00) == 0xa00)) {
66264                      UnallocatedA32(instr);
66265                      return;
66266                    }
66267                    UnimplementedA32("LDC", instr);
66268                    break;
66269                  }
66270                }
66271                break;
66272              }
66273            }
66274            break;
66275          }
66276        }
66277        break;
66278      }
66279      case 0x0e000000: {
66280        // 0x0e000000
66281        switch (instr & 0x01000000) {
66282          case 0x00000000: {
66283            // 0x0e000000
66284            switch (instr & 0x00000010) {
66285              case 0x00000000: {
66286                // 0x0e000000
66287                switch (instr & 0x00000e00) {
66288                  case 0x00000a00: {
66289                    // 0x0e000a00
66290                    switch (instr & 0x00b00140) {
66291                      case 0x00000000: {
66292                        // 0x0e000a00
66293                        if (((instr & 0xf0000000) == 0xf0000000)) {
66294                          UnallocatedA32(instr);
66295                          return;
66296                        }
66297                        Condition condition((instr >> 28) & 0xf);
66298                        unsigned rd = ExtractSRegister(instr, 22, 12);
66299                        unsigned rn = ExtractSRegister(instr, 7, 16);
66300                        unsigned rm = ExtractSRegister(instr, 5, 0);
66301                        // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
66302                        vmla(condition,
66303                             F32,
66304                             SRegister(rd),
66305                             SRegister(rn),
66306                             SRegister(rm));
66307                        break;
66308                      }
66309                      case 0x00000040: {
66310                        // 0x0e000a40
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 rn = ExtractSRegister(instr, 7, 16);
66318                        unsigned rm = ExtractSRegister(instr, 5, 0);
66319                        // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
66320                        vmls(condition,
66321                             F32,
66322                             SRegister(rd),
66323                             SRegister(rn),
66324                             SRegister(rm));
66325                        break;
66326                      }
66327                      case 0x00000100: {
66328                        // 0x0e000b00
66329                        if (((instr & 0xf0000000) == 0xf0000000)) {
66330                          UnallocatedA32(instr);
66331                          return;
66332                        }
66333                        Condition condition((instr >> 28) & 0xf);
66334                        unsigned rd = ExtractDRegister(instr, 22, 12);
66335                        unsigned rn = ExtractDRegister(instr, 7, 16);
66336                        unsigned rm = ExtractDRegister(instr, 5, 0);
66337                        // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
66338                        vmla(condition,
66339                             F64,
66340                             DRegister(rd),
66341                             DRegister(rn),
66342                             DRegister(rm));
66343                        break;
66344                      }
66345                      case 0x00000140: {
66346                        // 0x0e000b40
66347                        if (((instr & 0xf0000000) == 0xf0000000)) {
66348                          UnallocatedA32(instr);
66349                          return;
66350                        }
66351                        Condition condition((instr >> 28) & 0xf);
66352                        unsigned rd = ExtractDRegister(instr, 22, 12);
66353                        unsigned rn = ExtractDRegister(instr, 7, 16);
66354                        unsigned rm = ExtractDRegister(instr, 5, 0);
66355                        // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
66356                        vmls(condition,
66357                             F64,
66358                             DRegister(rd),
66359                             DRegister(rn),
66360                             DRegister(rm));
66361                        break;
66362                      }
66363                      case 0x00100000: {
66364                        // 0x0e100a00
66365                        if (((instr & 0xf0000000) == 0xf0000000)) {
66366                          UnallocatedA32(instr);
66367                          return;
66368                        }
66369                        Condition condition((instr >> 28) & 0xf);
66370                        unsigned rd = ExtractSRegister(instr, 22, 12);
66371                        unsigned rn = ExtractSRegister(instr, 7, 16);
66372                        unsigned rm = ExtractSRegister(instr, 5, 0);
66373                        // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66374                        vnmls(condition,
66375                              F32,
66376                              SRegister(rd),
66377                              SRegister(rn),
66378                              SRegister(rm));
66379                        break;
66380                      }
66381                      case 0x00100040: {
66382                        // 0x0e100a40
66383                        if (((instr & 0xf0000000) == 0xf0000000)) {
66384                          UnallocatedA32(instr);
66385                          return;
66386                        }
66387                        Condition condition((instr >> 28) & 0xf);
66388                        unsigned rd = ExtractSRegister(instr, 22, 12);
66389                        unsigned rn = ExtractSRegister(instr, 7, 16);
66390                        unsigned rm = ExtractSRegister(instr, 5, 0);
66391                        // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66392                        vnmla(condition,
66393                              F32,
66394                              SRegister(rd),
66395                              SRegister(rn),
66396                              SRegister(rm));
66397                        break;
66398                      }
66399                      case 0x00100100: {
66400                        // 0x0e100b00
66401                        if (((instr & 0xf0000000) == 0xf0000000)) {
66402                          UnallocatedA32(instr);
66403                          return;
66404                        }
66405                        Condition condition((instr >> 28) & 0xf);
66406                        unsigned rd = ExtractDRegister(instr, 22, 12);
66407                        unsigned rn = ExtractDRegister(instr, 7, 16);
66408                        unsigned rm = ExtractDRegister(instr, 5, 0);
66409                        // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66410                        vnmls(condition,
66411                              F64,
66412                              DRegister(rd),
66413                              DRegister(rn),
66414                              DRegister(rm));
66415                        break;
66416                      }
66417                      case 0x00100140: {
66418                        // 0x0e100b40
66419                        if (((instr & 0xf0000000) == 0xf0000000)) {
66420                          UnallocatedA32(instr);
66421                          return;
66422                        }
66423                        Condition condition((instr >> 28) & 0xf);
66424                        unsigned rd = ExtractDRegister(instr, 22, 12);
66425                        unsigned rn = ExtractDRegister(instr, 7, 16);
66426                        unsigned rm = ExtractDRegister(instr, 5, 0);
66427                        // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66428                        vnmla(condition,
66429                              F64,
66430                              DRegister(rd),
66431                              DRegister(rn),
66432                              DRegister(rm));
66433                        break;
66434                      }
66435                      case 0x00200000: {
66436                        // 0x0e200a00
66437                        if (((instr & 0xf0000000) == 0xf0000000)) {
66438                          UnallocatedA32(instr);
66439                          return;
66440                        }
66441                        Condition condition((instr >> 28) & 0xf);
66442                        unsigned rd = ExtractSRegister(instr, 22, 12);
66443                        unsigned rn = ExtractSRegister(instr, 7, 16);
66444                        unsigned rm = ExtractSRegister(instr, 5, 0);
66445                        // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66446                        vmul(condition,
66447                             F32,
66448                             SRegister(rd),
66449                             SRegister(rn),
66450                             SRegister(rm));
66451                        break;
66452                      }
66453                      case 0x00200040: {
66454                        // 0x0e200a40
66455                        if (((instr & 0xf0000000) == 0xf0000000)) {
66456                          UnallocatedA32(instr);
66457                          return;
66458                        }
66459                        Condition condition((instr >> 28) & 0xf);
66460                        unsigned rd = ExtractSRegister(instr, 22, 12);
66461                        unsigned rn = ExtractSRegister(instr, 7, 16);
66462                        unsigned rm = ExtractSRegister(instr, 5, 0);
66463                        // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
66464                        vnmul(condition,
66465                              F32,
66466                              SRegister(rd),
66467                              SRegister(rn),
66468                              SRegister(rm));
66469                        break;
66470                      }
66471                      case 0x00200100: {
66472                        // 0x0e200b00
66473                        if (((instr & 0xf0000000) == 0xf0000000)) {
66474                          UnallocatedA32(instr);
66475                          return;
66476                        }
66477                        Condition condition((instr >> 28) & 0xf);
66478                        unsigned rd = ExtractDRegister(instr, 22, 12);
66479                        unsigned rn = ExtractDRegister(instr, 7, 16);
66480                        unsigned rm = ExtractDRegister(instr, 5, 0);
66481                        // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66482                        vmul(condition,
66483                             F64,
66484                             DRegister(rd),
66485                             DRegister(rn),
66486                             DRegister(rm));
66487                        break;
66488                      }
66489                      case 0x00200140: {
66490                        // 0x0e200b40
66491                        if (((instr & 0xf0000000) == 0xf0000000)) {
66492                          UnallocatedA32(instr);
66493                          return;
66494                        }
66495                        Condition condition((instr >> 28) & 0xf);
66496                        unsigned rd = ExtractDRegister(instr, 22, 12);
66497                        unsigned rn = ExtractDRegister(instr, 7, 16);
66498                        unsigned rm = ExtractDRegister(instr, 5, 0);
66499                        // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
66500                        vnmul(condition,
66501                              F64,
66502                              DRegister(rd),
66503                              DRegister(rn),
66504                              DRegister(rm));
66505                        break;
66506                      }
66507                      case 0x00300000: {
66508                        // 0x0e300a00
66509                        if (((instr & 0xf0000000) == 0xf0000000)) {
66510                          UnallocatedA32(instr);
66511                          return;
66512                        }
66513                        Condition condition((instr >> 28) & 0xf);
66514                        unsigned rd = ExtractSRegister(instr, 22, 12);
66515                        unsigned rn = ExtractSRegister(instr, 7, 16);
66516                        unsigned rm = ExtractSRegister(instr, 5, 0);
66517                        // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66518                        vadd(condition,
66519                             F32,
66520                             SRegister(rd),
66521                             SRegister(rn),
66522                             SRegister(rm));
66523                        break;
66524                      }
66525                      case 0x00300040: {
66526                        // 0x0e300a40
66527                        if (((instr & 0xf0000000) == 0xf0000000)) {
66528                          UnallocatedA32(instr);
66529                          return;
66530                        }
66531                        Condition condition((instr >> 28) & 0xf);
66532                        unsigned rd = ExtractSRegister(instr, 22, 12);
66533                        unsigned rn = ExtractSRegister(instr, 7, 16);
66534                        unsigned rm = ExtractSRegister(instr, 5, 0);
66535                        // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66536                        vsub(condition,
66537                             F32,
66538                             SRegister(rd),
66539                             SRegister(rn),
66540                             SRegister(rm));
66541                        break;
66542                      }
66543                      case 0x00300100: {
66544                        // 0x0e300b00
66545                        if (((instr & 0xf0000000) == 0xf0000000)) {
66546                          UnallocatedA32(instr);
66547                          return;
66548                        }
66549                        Condition condition((instr >> 28) & 0xf);
66550                        unsigned rd = ExtractDRegister(instr, 22, 12);
66551                        unsigned rn = ExtractDRegister(instr, 7, 16);
66552                        unsigned rm = ExtractDRegister(instr, 5, 0);
66553                        // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66554                        vadd(condition,
66555                             F64,
66556                             DRegister(rd),
66557                             DRegister(rn),
66558                             DRegister(rm));
66559                        break;
66560                      }
66561                      case 0x00300140: {
66562                        // 0x0e300b40
66563                        if (((instr & 0xf0000000) == 0xf0000000)) {
66564                          UnallocatedA32(instr);
66565                          return;
66566                        }
66567                        Condition condition((instr >> 28) & 0xf);
66568                        unsigned rd = ExtractDRegister(instr, 22, 12);
66569                        unsigned rn = ExtractDRegister(instr, 7, 16);
66570                        unsigned rm = ExtractDRegister(instr, 5, 0);
66571                        // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66572                        vsub(condition,
66573                             F64,
66574                             DRegister(rd),
66575                             DRegister(rn),
66576                             DRegister(rm));
66577                        break;
66578                      }
66579                      case 0x00800000: {
66580                        // 0x0e800a00
66581                        if (((instr & 0xf0000000) == 0xf0000000)) {
66582                          UnallocatedA32(instr);
66583                          return;
66584                        }
66585                        Condition condition((instr >> 28) & 0xf);
66586                        unsigned rd = ExtractSRegister(instr, 22, 12);
66587                        unsigned rn = ExtractSRegister(instr, 7, 16);
66588                        unsigned rm = ExtractSRegister(instr, 5, 0);
66589                        // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
66590                        vdiv(condition,
66591                             F32,
66592                             SRegister(rd),
66593                             SRegister(rn),
66594                             SRegister(rm));
66595                        break;
66596                      }
66597                      case 0x00800100: {
66598                        // 0x0e800b00
66599                        if (((instr & 0xf0000000) == 0xf0000000)) {
66600                          UnallocatedA32(instr);
66601                          return;
66602                        }
66603                        Condition condition((instr >> 28) & 0xf);
66604                        unsigned rd = ExtractDRegister(instr, 22, 12);
66605                        unsigned rn = ExtractDRegister(instr, 7, 16);
66606                        unsigned rm = ExtractDRegister(instr, 5, 0);
66607                        // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
66608                        vdiv(condition,
66609                             F64,
66610                             DRegister(rd),
66611                             DRegister(rn),
66612                             DRegister(rm));
66613                        break;
66614                      }
66615                      case 0x00900000: {
66616                        // 0x0e900a00
66617                        if (((instr & 0xf0000000) == 0xf0000000)) {
66618                          UnallocatedA32(instr);
66619                          return;
66620                        }
66621                        Condition condition((instr >> 28) & 0xf);
66622                        unsigned rd = ExtractSRegister(instr, 22, 12);
66623                        unsigned rn = ExtractSRegister(instr, 7, 16);
66624                        unsigned rm = ExtractSRegister(instr, 5, 0);
66625                        // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66626                        vfnms(condition,
66627                              F32,
66628                              SRegister(rd),
66629                              SRegister(rn),
66630                              SRegister(rm));
66631                        break;
66632                      }
66633                      case 0x00900040: {
66634                        // 0x0e900a40
66635                        if (((instr & 0xf0000000) == 0xf0000000)) {
66636                          UnallocatedA32(instr);
66637                          return;
66638                        }
66639                        Condition condition((instr >> 28) & 0xf);
66640                        unsigned rd = ExtractSRegister(instr, 22, 12);
66641                        unsigned rn = ExtractSRegister(instr, 7, 16);
66642                        unsigned rm = ExtractSRegister(instr, 5, 0);
66643                        // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66644                        vfnma(condition,
66645                              F32,
66646                              SRegister(rd),
66647                              SRegister(rn),
66648                              SRegister(rm));
66649                        break;
66650                      }
66651                      case 0x00900100: {
66652                        // 0x0e900b00
66653                        if (((instr & 0xf0000000) == 0xf0000000)) {
66654                          UnallocatedA32(instr);
66655                          return;
66656                        }
66657                        Condition condition((instr >> 28) & 0xf);
66658                        unsigned rd = ExtractDRegister(instr, 22, 12);
66659                        unsigned rn = ExtractDRegister(instr, 7, 16);
66660                        unsigned rm = ExtractDRegister(instr, 5, 0);
66661                        // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66662                        vfnms(condition,
66663                              F64,
66664                              DRegister(rd),
66665                              DRegister(rn),
66666                              DRegister(rm));
66667                        break;
66668                      }
66669                      case 0x00900140: {
66670                        // 0x0e900b40
66671                        if (((instr & 0xf0000000) == 0xf0000000)) {
66672                          UnallocatedA32(instr);
66673                          return;
66674                        }
66675                        Condition condition((instr >> 28) & 0xf);
66676                        unsigned rd = ExtractDRegister(instr, 22, 12);
66677                        unsigned rn = ExtractDRegister(instr, 7, 16);
66678                        unsigned rm = ExtractDRegister(instr, 5, 0);
66679                        // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66680                        vfnma(condition,
66681                              F64,
66682                              DRegister(rd),
66683                              DRegister(rn),
66684                              DRegister(rm));
66685                        break;
66686                      }
66687                      case 0x00a00000: {
66688                        // 0x0ea00a00
66689                        if (((instr & 0xf0000000) == 0xf0000000)) {
66690                          UnallocatedA32(instr);
66691                          return;
66692                        }
66693                        Condition condition((instr >> 28) & 0xf);
66694                        unsigned rd = ExtractSRegister(instr, 22, 12);
66695                        unsigned rn = ExtractSRegister(instr, 7, 16);
66696                        unsigned rm = ExtractSRegister(instr, 5, 0);
66697                        // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
66698                        vfma(condition,
66699                             F32,
66700                             SRegister(rd),
66701                             SRegister(rn),
66702                             SRegister(rm));
66703                        break;
66704                      }
66705                      case 0x00a00040: {
66706                        // 0x0ea00a40
66707                        if (((instr & 0xf0000000) == 0xf0000000)) {
66708                          UnallocatedA32(instr);
66709                          return;
66710                        }
66711                        Condition condition((instr >> 28) & 0xf);
66712                        unsigned rd = ExtractSRegister(instr, 22, 12);
66713                        unsigned rn = ExtractSRegister(instr, 7, 16);
66714                        unsigned rm = ExtractSRegister(instr, 5, 0);
66715                        // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
66716                        vfms(condition,
66717                             F32,
66718                             SRegister(rd),
66719                             SRegister(rn),
66720                             SRegister(rm));
66721                        break;
66722                      }
66723                      case 0x00a00100: {
66724                        // 0x0ea00b00
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 rn = ExtractDRegister(instr, 7, 16);
66732                        unsigned rm = ExtractDRegister(instr, 5, 0);
66733                        // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
66734                        vfma(condition,
66735                             F64,
66736                             DRegister(rd),
66737                             DRegister(rn),
66738                             DRegister(rm));
66739                        break;
66740                      }
66741                      case 0x00a00140: {
66742                        // 0x0ea00b40
66743                        if (((instr & 0xf0000000) == 0xf0000000)) {
66744                          UnallocatedA32(instr);
66745                          return;
66746                        }
66747                        Condition condition((instr >> 28) & 0xf);
66748                        unsigned rd = ExtractDRegister(instr, 22, 12);
66749                        unsigned rn = ExtractDRegister(instr, 7, 16);
66750                        unsigned rm = ExtractDRegister(instr, 5, 0);
66751                        // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
66752                        vfms(condition,
66753                             F64,
66754                             DRegister(rd),
66755                             DRegister(rn),
66756                             DRegister(rm));
66757                        break;
66758                      }
66759                      case 0x00b00000: {
66760                        // 0x0eb00a00
66761                        if (((instr & 0xf0000000) == 0xf0000000)) {
66762                          UnallocatedA32(instr);
66763                          return;
66764                        }
66765                        Condition condition((instr >> 28) & 0xf);
66766                        unsigned rd = ExtractSRegister(instr, 22, 12);
66767                        uint32_t encoded_imm =
66768                            (instr & 0xf) | ((instr >> 12) & 0xf0);
66769                        NeonImmediate imm =
66770                            ImmediateVFP::Decode<float>(encoded_imm);
66771                        // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2
66772                        vmov(condition, F32, SRegister(rd), imm);
66773                        if (((instr & 0xfb00ff0) != 0xeb00a00)) {
66774                          UnpredictableA32(instr);
66775                        }
66776                        break;
66777                      }
66778                      case 0x00b00040: {
66779                        // 0x0eb00a40
66780                        switch (instr & 0x000e0000) {
66781                          case 0x00000000: {
66782                            // 0x0eb00a40
66783                            switch (instr & 0x00010080) {
66784                              case 0x00000000: {
66785                                // 0x0eb00a40
66786                                if (((instr & 0xf0000000) == 0xf0000000)) {
66787                                  UnallocatedA32(instr);
66788                                  return;
66789                                }
66790                                Condition condition((instr >> 28) & 0xf);
66791                                unsigned rd = ExtractSRegister(instr, 22, 12);
66792                                unsigned rm = ExtractSRegister(instr, 5, 0);
66793                                // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66794                                vmov(condition,
66795                                     F32,
66796                                     SRegister(rd),
66797                                     SRegister(rm));
66798                                break;
66799                              }
66800                              case 0x00000080: {
66801                                // 0x0eb00ac0
66802                                if (((instr & 0xf0000000) == 0xf0000000)) {
66803                                  UnallocatedA32(instr);
66804                                  return;
66805                                }
66806                                Condition condition((instr >> 28) & 0xf);
66807                                unsigned rd = ExtractSRegister(instr, 22, 12);
66808                                unsigned rm = ExtractSRegister(instr, 5, 0);
66809                                // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66810                                vabs(condition,
66811                                     F32,
66812                                     SRegister(rd),
66813                                     SRegister(rm));
66814                                break;
66815                              }
66816                              case 0x00010000: {
66817                                // 0x0eb10a40
66818                                if (((instr & 0xf0000000) == 0xf0000000)) {
66819                                  UnallocatedA32(instr);
66820                                  return;
66821                                }
66822                                Condition condition((instr >> 28) & 0xf);
66823                                unsigned rd = ExtractSRegister(instr, 22, 12);
66824                                unsigned rm = ExtractSRegister(instr, 5, 0);
66825                                // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66826                                vneg(condition,
66827                                     F32,
66828                                     SRegister(rd),
66829                                     SRegister(rm));
66830                                break;
66831                              }
66832                              case 0x00010080: {
66833                                // 0x0eb10ac0
66834                                if (((instr & 0xf0000000) == 0xf0000000)) {
66835                                  UnallocatedA32(instr);
66836                                  return;
66837                                }
66838                                Condition condition((instr >> 28) & 0xf);
66839                                unsigned rd = ExtractSRegister(instr, 22, 12);
66840                                unsigned rm = ExtractSRegister(instr, 5, 0);
66841                                // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66842                                vsqrt(condition,
66843                                      F32,
66844                                      SRegister(rd),
66845                                      SRegister(rm));
66846                                break;
66847                              }
66848                            }
66849                            break;
66850                          }
66851                          case 0x00020000: {
66852                            // 0x0eb20a40
66853                            switch (instr & 0x00010080) {
66854                              case 0x00000000: {
66855                                // 0x0eb20a40
66856                                if (((instr & 0xf0000000) == 0xf0000000)) {
66857                                  UnallocatedA32(instr);
66858                                  return;
66859                                }
66860                                Condition condition((instr >> 28) & 0xf);
66861                                unsigned rd = ExtractSRegister(instr, 22, 12);
66862                                unsigned rm = ExtractSRegister(instr, 5, 0);
66863                                // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
66864                                vcvtb(condition,
66865                                      F32,
66866                                      F16,
66867                                      SRegister(rd),
66868                                      SRegister(rm));
66869                                break;
66870                              }
66871                              case 0x00000080: {
66872                                // 0x0eb20ac0
66873                                if (((instr & 0xf0000000) == 0xf0000000)) {
66874                                  UnallocatedA32(instr);
66875                                  return;
66876                                }
66877                                Condition condition((instr >> 28) & 0xf);
66878                                unsigned rd = ExtractSRegister(instr, 22, 12);
66879                                unsigned rm = ExtractSRegister(instr, 5, 0);
66880                                // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
66881                                vcvtt(condition,
66882                                      F32,
66883                                      F16,
66884                                      SRegister(rd),
66885                                      SRegister(rm));
66886                                break;
66887                              }
66888                              case 0x00010000: {
66889                                // 0x0eb30a40
66890                                if (((instr & 0xf0000000) == 0xf0000000)) {
66891                                  UnallocatedA32(instr);
66892                                  return;
66893                                }
66894                                Condition condition((instr >> 28) & 0xf);
66895                                unsigned rd = ExtractSRegister(instr, 22, 12);
66896                                unsigned rm = ExtractSRegister(instr, 5, 0);
66897                                // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
66898                                vcvtb(condition,
66899                                      F16,
66900                                      F32,
66901                                      SRegister(rd),
66902                                      SRegister(rm));
66903                                break;
66904                              }
66905                              case 0x00010080: {
66906                                // 0x0eb30ac0
66907                                if (((instr & 0xf0000000) == 0xf0000000)) {
66908                                  UnallocatedA32(instr);
66909                                  return;
66910                                }
66911                                Condition condition((instr >> 28) & 0xf);
66912                                unsigned rd = ExtractSRegister(instr, 22, 12);
66913                                unsigned rm = ExtractSRegister(instr, 5, 0);
66914                                // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
66915                                vcvtt(condition,
66916                                      F16,
66917                                      F32,
66918                                      SRegister(rd),
66919                                      SRegister(rm));
66920                                break;
66921                              }
66922                            }
66923                            break;
66924                          }
66925                          case 0x00040000: {
66926                            // 0x0eb40a40
66927                            switch (instr & 0x00010080) {
66928                              case 0x00000000: {
66929                                // 0x0eb40a40
66930                                if (((instr & 0xf0000000) == 0xf0000000)) {
66931                                  UnallocatedA32(instr);
66932                                  return;
66933                                }
66934                                Condition condition((instr >> 28) & 0xf);
66935                                unsigned rd = ExtractSRegister(instr, 22, 12);
66936                                unsigned rm = ExtractSRegister(instr, 5, 0);
66937                                // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66938                                vcmp(condition,
66939                                     F32,
66940                                     SRegister(rd),
66941                                     SRegister(rm));
66942                                break;
66943                              }
66944                              case 0x00000080: {
66945                                // 0x0eb40ac0
66946                                if (((instr & 0xf0000000) == 0xf0000000)) {
66947                                  UnallocatedA32(instr);
66948                                  return;
66949                                }
66950                                Condition condition((instr >> 28) & 0xf);
66951                                unsigned rd = ExtractSRegister(instr, 22, 12);
66952                                unsigned rm = ExtractSRegister(instr, 5, 0);
66953                                // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66954                                vcmpe(condition,
66955                                      F32,
66956                                      SRegister(rd),
66957                                      SRegister(rm));
66958                                break;
66959                              }
66960                              case 0x00010000: {
66961                                // 0x0eb50a40
66962                                if (((instr & 0xf0000000) == 0xf0000000)) {
66963                                  UnallocatedA32(instr);
66964                                  return;
66965                                }
66966                                Condition condition((instr >> 28) & 0xf);
66967                                unsigned rd = ExtractSRegister(instr, 22, 12);
66968                                // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
66969                                vcmp(condition, F32, SRegister(rd), 0.0);
66970                                if (((instr & 0xfbf0fff) != 0xeb50a40)) {
66971                                  UnpredictableA32(instr);
66972                                }
66973                                break;
66974                              }
66975                              case 0x00010080: {
66976                                // 0x0eb50ac0
66977                                if (((instr & 0xf0000000) == 0xf0000000)) {
66978                                  UnallocatedA32(instr);
66979                                  return;
66980                                }
66981                                Condition condition((instr >> 28) & 0xf);
66982                                unsigned rd = ExtractSRegister(instr, 22, 12);
66983                                // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
66984                                vcmpe(condition, F32, SRegister(rd), 0.0);
66985                                if (((instr & 0xfbf0fff) != 0xeb50ac0)) {
66986                                  UnpredictableA32(instr);
66987                                }
66988                                break;
66989                              }
66990                            }
66991                            break;
66992                          }
66993                          case 0x00060000: {
66994                            // 0x0eb60a40
66995                            switch (instr & 0x00010080) {
66996                              case 0x00000000: {
66997                                // 0x0eb60a40
66998                                if (((instr & 0xf0000000) == 0xf0000000)) {
66999                                  UnallocatedA32(instr);
67000                                  return;
67001                                }
67002                                Condition condition((instr >> 28) & 0xf);
67003                                unsigned rd = ExtractSRegister(instr, 22, 12);
67004                                unsigned rm = ExtractSRegister(instr, 5, 0);
67005                                // VRINTR{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
67006                                vrintr(condition,
67007                                       F32,
67008                                       F32,
67009                                       SRegister(rd),
67010                                       SRegister(rm));
67011                                break;
67012                              }
67013                              case 0x00000080: {
67014                                // 0x0eb60ac0
67015                                if (((instr & 0xf0000000) == 0xf0000000)) {
67016                                  UnallocatedA32(instr);
67017                                  return;
67018                                }
67019                                Condition condition((instr >> 28) & 0xf);
67020                                unsigned rd = ExtractSRegister(instr, 22, 12);
67021                                unsigned rm = ExtractSRegister(instr, 5, 0);
67022                                // VRINTZ{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
67023                                vrintz(condition,
67024                                       F32,
67025                                       F32,
67026                                       SRegister(rd),
67027                                       SRegister(rm));
67028                                break;
67029                              }
67030                              case 0x00010000: {
67031                                // 0x0eb70a40
67032                                if (((instr & 0xf0000000) == 0xf0000000)) {
67033                                  UnallocatedA32(instr);
67034                                  return;
67035                                }
67036                                Condition condition((instr >> 28) & 0xf);
67037                                unsigned rd = ExtractSRegister(instr, 22, 12);
67038                                unsigned rm = ExtractSRegister(instr, 5, 0);
67039                                // VRINTX{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
67040                                vrintx(condition,
67041                                       F32,
67042                                       F32,
67043                                       SRegister(rd),
67044                                       SRegister(rm));
67045                                break;
67046                              }
67047                              case 0x00010080: {
67048                                // 0x0eb70ac0
67049                                if (((instr & 0xf0000000) == 0xf0000000)) {
67050                                  UnallocatedA32(instr);
67051                                  return;
67052                                }
67053                                Condition condition((instr >> 28) & 0xf);
67054                                unsigned rd = ExtractDRegister(instr, 22, 12);
67055                                unsigned rm = ExtractSRegister(instr, 5, 0);
67056                                // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1
67057                                vcvt(condition,
67058                                     F64,
67059                                     F32,
67060                                     DRegister(rd),
67061                                     SRegister(rm));
67062                                break;
67063                              }
67064                            }
67065                            break;
67066                          }
67067                          case 0x00080000: {
67068                            // 0x0eb80a40
67069                            if ((instr & 0x00010000) == 0x00000000) {
67070                              if (((instr & 0xf0000000) == 0xf0000000)) {
67071                                UnallocatedA32(instr);
67072                                return;
67073                              }
67074                              Condition condition((instr >> 28) & 0xf);
67075                              DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
67076                              if (dt.Is(kDataTypeValueInvalid)) {
67077                                UnallocatedA32(instr);
67078                                return;
67079                              }
67080                              unsigned rd = ExtractSRegister(instr, 22, 12);
67081                              unsigned rm = ExtractSRegister(instr, 5, 0);
67082                              // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1
67083                              vcvt(condition,
67084                                   F32,
67085                                   dt,
67086                                   SRegister(rd),
67087                                   SRegister(rm));
67088                            } else {
67089                              UnallocatedA32(instr);
67090                            }
67091                            break;
67092                          }
67093                          case 0x000a0000: {
67094                            // 0x0eba0a40
67095                            if (((instr & 0xf0000000) == 0xf0000000)) {
67096                              UnallocatedA32(instr);
67097                              return;
67098                            }
67099                            Condition condition((instr >> 28) & 0xf);
67100                            DataType dt = Dt_U_sx_1_Decode(
67101                                ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
67102                            if (dt.Is(kDataTypeValueInvalid)) {
67103                              UnallocatedA32(instr);
67104                              return;
67105                            }
67106                            unsigned rd = ExtractSRegister(instr, 22, 12);
67107                            unsigned offset = 32;
67108                            if (dt.Is(S16) || dt.Is(U16)) {
67109                              offset = 16;
67110                            }
67111                            uint32_t fbits = offset - (((instr >> 5) & 0x1) |
67112                                                       ((instr << 1) & 0x1e));
67113                            // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
67114                            vcvt(condition,
67115                                 F32,
67116                                 dt,
67117                                 SRegister(rd),
67118                                 SRegister(rd),
67119                                 fbits);
67120                            break;
67121                          }
67122                          case 0x000c0000: {
67123                            // 0x0ebc0a40
67124                            switch (instr & 0x00010080) {
67125                              case 0x00000000: {
67126                                // 0x0ebc0a40
67127                                if (((instr & 0xf0000000) == 0xf0000000)) {
67128                                  UnallocatedA32(instr);
67129                                  return;
67130                                }
67131                                Condition condition((instr >> 28) & 0xf);
67132                                unsigned rd = ExtractSRegister(instr, 22, 12);
67133                                unsigned rm = ExtractSRegister(instr, 5, 0);
67134                                // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
67135                                vcvtr(condition,
67136                                      U32,
67137                                      F32,
67138                                      SRegister(rd),
67139                                      SRegister(rm));
67140                                break;
67141                              }
67142                              case 0x00000080: {
67143                                // 0x0ebc0ac0
67144                                if (((instr & 0xf0000000) == 0xf0000000)) {
67145                                  UnallocatedA32(instr);
67146                                  return;
67147                                }
67148                                Condition condition((instr >> 28) & 0xf);
67149                                unsigned rd = ExtractSRegister(instr, 22, 12);
67150                                unsigned rm = ExtractSRegister(instr, 5, 0);
67151                                // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
67152                                vcvt(condition,
67153                                     U32,
67154                                     F32,
67155                                     SRegister(rd),
67156                                     SRegister(rm));
67157                                break;
67158                              }
67159                              case 0x00010000: {
67160                                // 0x0ebd0a40
67161                                if (((instr & 0xf0000000) == 0xf0000000)) {
67162                                  UnallocatedA32(instr);
67163                                  return;
67164                                }
67165                                Condition condition((instr >> 28) & 0xf);
67166                                unsigned rd = ExtractSRegister(instr, 22, 12);
67167                                unsigned rm = ExtractSRegister(instr, 5, 0);
67168                                // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
67169                                vcvtr(condition,
67170                                      S32,
67171                                      F32,
67172                                      SRegister(rd),
67173                                      SRegister(rm));
67174                                break;
67175                              }
67176                              case 0x00010080: {
67177                                // 0x0ebd0ac0
67178                                if (((instr & 0xf0000000) == 0xf0000000)) {
67179                                  UnallocatedA32(instr);
67180                                  return;
67181                                }
67182                                Condition condition((instr >> 28) & 0xf);
67183                                unsigned rd = ExtractSRegister(instr, 22, 12);
67184                                unsigned rm = ExtractSRegister(instr, 5, 0);
67185                                // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
67186                                vcvt(condition,
67187                                     S32,
67188                                     F32,
67189                                     SRegister(rd),
67190                                     SRegister(rm));
67191                                break;
67192                              }
67193                            }
67194                            break;
67195                          }
67196                          case 0x000e0000: {
67197                            // 0x0ebe0a40
67198                            if (((instr & 0xf0000000) == 0xf0000000)) {
67199                              UnallocatedA32(instr);
67200                              return;
67201                            }
67202                            Condition condition((instr >> 28) & 0xf);
67203                            DataType dt = Dt_U_sx_1_Decode(
67204                                ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
67205                            if (dt.Is(kDataTypeValueInvalid)) {
67206                              UnallocatedA32(instr);
67207                              return;
67208                            }
67209                            unsigned rd = ExtractSRegister(instr, 22, 12);
67210                            unsigned offset = 32;
67211                            if (dt.Is(S16) || dt.Is(U16)) {
67212                              offset = 16;
67213                            }
67214                            uint32_t fbits = offset - (((instr >> 5) & 0x1) |
67215                                                       ((instr << 1) & 0x1e));
67216                            // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
67217                            vcvt(condition,
67218                                 dt,
67219                                 F32,
67220                                 SRegister(rd),
67221                                 SRegister(rd),
67222                                 fbits);
67223                            break;
67224                          }
67225                        }
67226                        break;
67227                      }
67228                      case 0x00b00100: {
67229                        // 0x0eb00b00
67230                        if (((instr & 0xf0000000) == 0xf0000000)) {
67231                          UnallocatedA32(instr);
67232                          return;
67233                        }
67234                        Condition condition((instr >> 28) & 0xf);
67235                        unsigned rd = ExtractDRegister(instr, 22, 12);
67236                        uint32_t encoded_imm =
67237                            (instr & 0xf) | ((instr >> 12) & 0xf0);
67238                        NeonImmediate imm =
67239                            ImmediateVFP::Decode<double>(encoded_imm);
67240                        // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2
67241                        vmov(condition, F64, DRegister(rd), imm);
67242                        if (((instr & 0xfb00ff0) != 0xeb00b00)) {
67243                          UnpredictableA32(instr);
67244                        }
67245                        break;
67246                      }
67247                      case 0x00b00140: {
67248                        // 0x0eb00b40
67249                        switch (instr & 0x000e0000) {
67250                          case 0x00000000: {
67251                            // 0x0eb00b40
67252                            switch (instr & 0x00010080) {
67253                              case 0x00000000: {
67254                                // 0x0eb00b40
67255                                if (((instr & 0xf0000000) == 0xf0000000)) {
67256                                  UnallocatedA32(instr);
67257                                  return;
67258                                }
67259                                Condition condition((instr >> 28) & 0xf);
67260                                unsigned rd = ExtractDRegister(instr, 22, 12);
67261                                unsigned rm = ExtractDRegister(instr, 5, 0);
67262                                // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
67263                                vmov(condition,
67264                                     F64,
67265                                     DRegister(rd),
67266                                     DRegister(rm));
67267                                break;
67268                              }
67269                              case 0x00000080: {
67270                                // 0x0eb00bc0
67271                                if (((instr & 0xf0000000) == 0xf0000000)) {
67272                                  UnallocatedA32(instr);
67273                                  return;
67274                                }
67275                                Condition condition((instr >> 28) & 0xf);
67276                                unsigned rd = ExtractDRegister(instr, 22, 12);
67277                                unsigned rm = ExtractDRegister(instr, 5, 0);
67278                                // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
67279                                vabs(condition,
67280                                     F64,
67281                                     DRegister(rd),
67282                                     DRegister(rm));
67283                                break;
67284                              }
67285                              case 0x00010000: {
67286                                // 0x0eb10b40
67287                                if (((instr & 0xf0000000) == 0xf0000000)) {
67288                                  UnallocatedA32(instr);
67289                                  return;
67290                                }
67291                                Condition condition((instr >> 28) & 0xf);
67292                                unsigned rd = ExtractDRegister(instr, 22, 12);
67293                                unsigned rm = ExtractDRegister(instr, 5, 0);
67294                                // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
67295                                vneg(condition,
67296                                     F64,
67297                                     DRegister(rd),
67298                                     DRegister(rm));
67299                                break;
67300                              }
67301                              case 0x00010080: {
67302                                // 0x0eb10bc0
67303                                if (((instr & 0xf0000000) == 0xf0000000)) {
67304                                  UnallocatedA32(instr);
67305                                  return;
67306                                }
67307                                Condition condition((instr >> 28) & 0xf);
67308                                unsigned rd = ExtractDRegister(instr, 22, 12);
67309                                unsigned rm = ExtractDRegister(instr, 5, 0);
67310                                // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
67311                                vsqrt(condition,
67312                                      F64,
67313                                      DRegister(rd),
67314                                      DRegister(rm));
67315                                break;
67316                              }
67317                            }
67318                            break;
67319                          }
67320                          case 0x00020000: {
67321                            // 0x0eb20b40
67322                            switch (instr & 0x00010080) {
67323                              case 0x00000000: {
67324                                // 0x0eb20b40
67325                                if (((instr & 0xf0000000) == 0xf0000000)) {
67326                                  UnallocatedA32(instr);
67327                                  return;
67328                                }
67329                                Condition condition((instr >> 28) & 0xf);
67330                                unsigned rd = ExtractDRegister(instr, 22, 12);
67331                                unsigned rm = ExtractSRegister(instr, 5, 0);
67332                                // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
67333                                vcvtb(condition,
67334                                      F64,
67335                                      F16,
67336                                      DRegister(rd),
67337                                      SRegister(rm));
67338                                break;
67339                              }
67340                              case 0x00000080: {
67341                                // 0x0eb20bc0
67342                                if (((instr & 0xf0000000) == 0xf0000000)) {
67343                                  UnallocatedA32(instr);
67344                                  return;
67345                                }
67346                                Condition condition((instr >> 28) & 0xf);
67347                                unsigned rd = ExtractDRegister(instr, 22, 12);
67348                                unsigned rm = ExtractSRegister(instr, 5, 0);
67349                                // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
67350                                vcvtt(condition,
67351                                      F64,
67352                                      F16,
67353                                      DRegister(rd),
67354                                      SRegister(rm));
67355                                break;
67356                              }
67357                              case 0x00010000: {
67358                                // 0x0eb30b40
67359                                if (((instr & 0xf0000000) == 0xf0000000)) {
67360                                  UnallocatedA32(instr);
67361                                  return;
67362                                }
67363                                Condition condition((instr >> 28) & 0xf);
67364                                unsigned rd = ExtractSRegister(instr, 22, 12);
67365                                unsigned rm = ExtractDRegister(instr, 5, 0);
67366                                // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
67367                                vcvtb(condition,
67368                                      F16,
67369                                      F64,
67370                                      SRegister(rd),
67371                                      DRegister(rm));
67372                                break;
67373                              }
67374                              case 0x00010080: {
67375                                // 0x0eb30bc0
67376                                if (((instr & 0xf0000000) == 0xf0000000)) {
67377                                  UnallocatedA32(instr);
67378                                  return;
67379                                }
67380                                Condition condition((instr >> 28) & 0xf);
67381                                unsigned rd = ExtractSRegister(instr, 22, 12);
67382                                unsigned rm = ExtractDRegister(instr, 5, 0);
67383                                // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
67384                                vcvtt(condition,
67385                                      F16,
67386                                      F64,
67387                                      SRegister(rd),
67388                                      DRegister(rm));
67389                                break;
67390                              }
67391                            }
67392                            break;
67393                          }
67394                          case 0x00040000: {
67395                            // 0x0eb40b40
67396                            switch (instr & 0x00010080) {
67397                              case 0x00000000: {
67398                                // 0x0eb40b40
67399                                if (((instr & 0xf0000000) == 0xf0000000)) {
67400                                  UnallocatedA32(instr);
67401                                  return;
67402                                }
67403                                Condition condition((instr >> 28) & 0xf);
67404                                unsigned rd = ExtractDRegister(instr, 22, 12);
67405                                unsigned rm = ExtractDRegister(instr, 5, 0);
67406                                // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
67407                                vcmp(condition,
67408                                     F64,
67409                                     DRegister(rd),
67410                                     DRegister(rm));
67411                                break;
67412                              }
67413                              case 0x00000080: {
67414                                // 0x0eb40bc0
67415                                if (((instr & 0xf0000000) == 0xf0000000)) {
67416                                  UnallocatedA32(instr);
67417                                  return;
67418                                }
67419                                Condition condition((instr >> 28) & 0xf);
67420                                unsigned rd = ExtractDRegister(instr, 22, 12);
67421                                unsigned rm = ExtractDRegister(instr, 5, 0);
67422                                // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
67423                                vcmpe(condition,
67424                                      F64,
67425                                      DRegister(rd),
67426                                      DRegister(rm));
67427                                break;
67428                              }
67429                              case 0x00010000: {
67430                                // 0x0eb50b40
67431                                if (((instr & 0xf0000000) == 0xf0000000)) {
67432                                  UnallocatedA32(instr);
67433                                  return;
67434                                }
67435                                Condition condition((instr >> 28) & 0xf);
67436                                unsigned rd = ExtractDRegister(instr, 22, 12);
67437                                // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
67438                                vcmp(condition, F64, DRegister(rd), 0.0);
67439                                if (((instr & 0xfbf0fff) != 0xeb50b40)) {
67440                                  UnpredictableA32(instr);
67441                                }
67442                                break;
67443                              }
67444                              case 0x00010080: {
67445                                // 0x0eb50bc0
67446                                if (((instr & 0xf0000000) == 0xf0000000)) {
67447                                  UnallocatedA32(instr);
67448                                  return;
67449                                }
67450                                Condition condition((instr >> 28) & 0xf);
67451                                unsigned rd = ExtractDRegister(instr, 22, 12);
67452                                // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
67453                                vcmpe(condition, F64, DRegister(rd), 0.0);
67454                                if (((instr & 0xfbf0fff) != 0xeb50bc0)) {
67455                                  UnpredictableA32(instr);
67456                                }
67457                                break;
67458                              }
67459                            }
67460                            break;
67461                          }
67462                          case 0x00060000: {
67463                            // 0x0eb60b40
67464                            switch (instr & 0x00010080) {
67465                              case 0x00000000: {
67466                                // 0x0eb60b40
67467                                if (((instr & 0xf0000000) == 0xf0000000)) {
67468                                  UnallocatedA32(instr);
67469                                  return;
67470                                }
67471                                Condition condition((instr >> 28) & 0xf);
67472                                unsigned rd = ExtractDRegister(instr, 22, 12);
67473                                unsigned rm = ExtractDRegister(instr, 5, 0);
67474                                // VRINTR{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
67475                                vrintr(condition,
67476                                       F64,
67477                                       F64,
67478                                       DRegister(rd),
67479                                       DRegister(rm));
67480                                break;
67481                              }
67482                              case 0x00000080: {
67483                                // 0x0eb60bc0
67484                                if (((instr & 0xf0000000) == 0xf0000000)) {
67485                                  UnallocatedA32(instr);
67486                                  return;
67487                                }
67488                                Condition condition((instr >> 28) & 0xf);
67489                                unsigned rd = ExtractDRegister(instr, 22, 12);
67490                                unsigned rm = ExtractDRegister(instr, 5, 0);
67491                                // VRINTZ{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
67492                                vrintz(condition,
67493                                       F64,
67494                                       F64,
67495                                       DRegister(rd),
67496                                       DRegister(rm));
67497                                break;
67498                              }
67499                              case 0x00010000: {
67500                                // 0x0eb70b40
67501                                if (((instr & 0xf0000000) == 0xf0000000)) {
67502                                  UnallocatedA32(instr);
67503                                  return;
67504                                }
67505                                Condition condition((instr >> 28) & 0xf);
67506                                unsigned rd = ExtractDRegister(instr, 22, 12);
67507                                unsigned rm = ExtractDRegister(instr, 5, 0);
67508                                // VRINTX{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
67509                                vrintx(condition,
67510                                       F64,
67511                                       F64,
67512                                       DRegister(rd),
67513                                       DRegister(rm));
67514                                break;
67515                              }
67516                              case 0x00010080: {
67517                                // 0x0eb70bc0
67518                                if (((instr & 0xf0000000) == 0xf0000000)) {
67519                                  UnallocatedA32(instr);
67520                                  return;
67521                                }
67522                                Condition condition((instr >> 28) & 0xf);
67523                                unsigned rd = ExtractSRegister(instr, 22, 12);
67524                                unsigned rm = ExtractDRegister(instr, 5, 0);
67525                                // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1
67526                                vcvt(condition,
67527                                     F32,
67528                                     F64,
67529                                     SRegister(rd),
67530                                     DRegister(rm));
67531                                break;
67532                              }
67533                            }
67534                            break;
67535                          }
67536                          case 0x00080000: {
67537                            // 0x0eb80b40
67538                            if ((instr & 0x00010000) == 0x00000000) {
67539                              if (((instr & 0xf0000000) == 0xf0000000)) {
67540                                UnallocatedA32(instr);
67541                                return;
67542                              }
67543                              Condition condition((instr >> 28) & 0xf);
67544                              DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
67545                              if (dt.Is(kDataTypeValueInvalid)) {
67546                                UnallocatedA32(instr);
67547                                return;
67548                              }
67549                              unsigned rd = ExtractDRegister(instr, 22, 12);
67550                              unsigned rm = ExtractSRegister(instr, 5, 0);
67551                              // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1
67552                              vcvt(condition,
67553                                   F64,
67554                                   dt,
67555                                   DRegister(rd),
67556                                   SRegister(rm));
67557                            } else {
67558                              UnallocatedA32(instr);
67559                            }
67560                            break;
67561                          }
67562                          case 0x000a0000: {
67563                            // 0x0eba0b40
67564                            if (((instr & 0xf0000000) == 0xf0000000)) {
67565                              UnallocatedA32(instr);
67566                              return;
67567                            }
67568                            Condition condition((instr >> 28) & 0xf);
67569                            DataType dt = Dt_U_sx_1_Decode(
67570                                ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
67571                            if (dt.Is(kDataTypeValueInvalid)) {
67572                              UnallocatedA32(instr);
67573                              return;
67574                            }
67575                            unsigned rd = ExtractDRegister(instr, 22, 12);
67576                            unsigned offset = 32;
67577                            if (dt.Is(S16) || dt.Is(U16)) {
67578                              offset = 16;
67579                            }
67580                            uint32_t fbits = offset - (((instr >> 5) & 0x1) |
67581                                                       ((instr << 1) & 0x1e));
67582                            // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
67583                            vcvt(condition,
67584                                 F64,
67585                                 dt,
67586                                 DRegister(rd),
67587                                 DRegister(rd),
67588                                 fbits);
67589                            break;
67590                          }
67591                          case 0x000c0000: {
67592                            // 0x0ebc0b40
67593                            switch (instr & 0x00010080) {
67594                              case 0x00000000: {
67595                                // 0x0ebc0b40
67596                                if (((instr & 0xf0000000) == 0xf0000000)) {
67597                                  UnallocatedA32(instr);
67598                                  return;
67599                                }
67600                                Condition condition((instr >> 28) & 0xf);
67601                                unsigned rd = ExtractSRegister(instr, 22, 12);
67602                                unsigned rm = ExtractDRegister(instr, 5, 0);
67603                                // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
67604                                vcvtr(condition,
67605                                      U32,
67606                                      F64,
67607                                      SRegister(rd),
67608                                      DRegister(rm));
67609                                break;
67610                              }
67611                              case 0x00000080: {
67612                                // 0x0ebc0bc0
67613                                if (((instr & 0xf0000000) == 0xf0000000)) {
67614                                  UnallocatedA32(instr);
67615                                  return;
67616                                }
67617                                Condition condition((instr >> 28) & 0xf);
67618                                unsigned rd = ExtractSRegister(instr, 22, 12);
67619                                unsigned rm = ExtractDRegister(instr, 5, 0);
67620                                // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
67621                                vcvt(condition,
67622                                     U32,
67623                                     F64,
67624                                     SRegister(rd),
67625                                     DRegister(rm));
67626                                break;
67627                              }
67628                              case 0x00010000: {
67629                                // 0x0ebd0b40
67630                                if (((instr & 0xf0000000) == 0xf0000000)) {
67631                                  UnallocatedA32(instr);
67632                                  return;
67633                                }
67634                                Condition condition((instr >> 28) & 0xf);
67635                                unsigned rd = ExtractSRegister(instr, 22, 12);
67636                                unsigned rm = ExtractDRegister(instr, 5, 0);
67637                                // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
67638                                vcvtr(condition,
67639                                      S32,
67640                                      F64,
67641                                      SRegister(rd),
67642                                      DRegister(rm));
67643                                break;
67644                              }
67645                              case 0x00010080: {
67646                                // 0x0ebd0bc0
67647                                if (((instr & 0xf0000000) == 0xf0000000)) {
67648                                  UnallocatedA32(instr);
67649                                  return;
67650                                }
67651                                Condition condition((instr >> 28) & 0xf);
67652                                unsigned rd = ExtractSRegister(instr, 22, 12);
67653                                unsigned rm = ExtractDRegister(instr, 5, 0);
67654                                // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
67655                                vcvt(condition,
67656                                     S32,
67657                                     F64,
67658                                     SRegister(rd),
67659                                     DRegister(rm));
67660                                break;
67661                              }
67662                            }
67663                            break;
67664                          }
67665                          case 0x000e0000: {
67666                            // 0x0ebe0b40
67667                            if (((instr & 0xf0000000) == 0xf0000000)) {
67668                              UnallocatedA32(instr);
67669                              return;
67670                            }
67671                            Condition condition((instr >> 28) & 0xf);
67672                            DataType dt = Dt_U_sx_1_Decode(
67673                                ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
67674                            if (dt.Is(kDataTypeValueInvalid)) {
67675                              UnallocatedA32(instr);
67676                              return;
67677                            }
67678                            unsigned rd = ExtractDRegister(instr, 22, 12);
67679                            unsigned offset = 32;
67680                            if (dt.Is(S16) || dt.Is(U16)) {
67681                              offset = 16;
67682                            }
67683                            uint32_t fbits = offset - (((instr >> 5) & 0x1) |
67684                                                       ((instr << 1) & 0x1e));
67685                            // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
67686                            vcvt(condition,
67687                                 dt,
67688                                 F64,
67689                                 DRegister(rd),
67690                                 DRegister(rd),
67691                                 fbits);
67692                            break;
67693                          }
67694                        }
67695                        break;
67696                      }
67697                      default:
67698                        UnallocatedA32(instr);
67699                        break;
67700                    }
67701                    break;
67702                  }
67703                  default: {
67704                    if (((instr & 0xf0000000) == 0xf0000000) ||
67705                        ((instr & 0xe00) == 0xa00)) {
67706                      UnallocatedA32(instr);
67707                      return;
67708                    }
67709                    UnimplementedA32("CDP", instr);
67710                    break;
67711                  }
67712                }
67713                break;
67714              }
67715              case 0x00000010: {
67716                // 0x0e000010
67717                switch (instr & 0x00100000) {
67718                  case 0x00000000: {
67719                    // 0x0e000010
67720                    switch (instr & 0x00000e00) {
67721                      case 0x00000a00: {
67722                        // 0x0e000a10
67723                        switch (instr & 0x00800100) {
67724                          case 0x00000000: {
67725                            // 0x0e000a10
67726                            if ((instr & 0x00600000) == 0x00000000) {
67727                              if (((instr & 0xf0000000) == 0xf0000000)) {
67728                                UnallocatedA32(instr);
67729                                return;
67730                              }
67731                              Condition condition((instr >> 28) & 0xf);
67732                              unsigned rn = ExtractSRegister(instr, 7, 16);
67733                              unsigned rt = (instr >> 12) & 0xf;
67734                              // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1
67735                              vmov(condition, SRegister(rn), Register(rt));
67736                              if (((instr & 0xff00f7f) != 0xe000a10)) {
67737                                UnpredictableA32(instr);
67738                              }
67739                            } else {
67740                              UnallocatedA32(instr);
67741                            }
67742                            break;
67743                          }
67744                          case 0x00000100: {
67745                            // 0x0e000b10
67746                            if (((instr & 0xf0000000) == 0xf0000000)) {
67747                              UnallocatedA32(instr);
67748                              return;
67749                            }
67750                            Condition condition((instr >> 28) & 0xf);
67751                            unsigned lane;
67752                            DataType dt =
67753                                Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
67754                                                          ((instr >> 19) & 0xc),
67755                                                      &lane);
67756                            if (dt.Is(kDataTypeValueInvalid)) {
67757                              UnallocatedA32(instr);
67758                              return;
67759                            }
67760                            unsigned rd = ExtractDRegister(instr, 7, 16);
67761                            unsigned rt = (instr >> 12) & 0xf;
67762                            // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1
67763                            vmov(condition,
67764                                 dt,
67765                                 DRegisterLane(rd, lane),
67766                                 Register(rt));
67767                            if (((instr & 0xf900f1f) != 0xe000b10)) {
67768                              UnpredictableA32(instr);
67769                            }
67770                            break;
67771                          }
67772                          case 0x00800000: {
67773                            // 0x0e800a10
67774                            if ((instr & 0x00600000) == 0x00600000) {
67775                              if (((instr & 0xf0000000) == 0xf0000000)) {
67776                                UnallocatedA32(instr);
67777                                return;
67778                              }
67779                              Condition condition((instr >> 28) & 0xf);
67780                              unsigned spec_reg = (instr >> 16) & 0xf;
67781                              unsigned rt = (instr >> 12) & 0xf;
67782                              switch (spec_reg) {
67783                                case 0x0:
67784                                case 0x1:
67785                                case 0x8: {
67786                                  // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1
67787                                  vmsr(condition,
67788                                       SpecialFPRegister(spec_reg),
67789                                       Register(rt));
67790                                  if (((instr & 0xff00fff) != 0xee00a10)) {
67791                                    UnpredictableA32(instr);
67792                                  }
67793                                  break;
67794                                }
67795                                default:
67796                                  UnallocatedA32(instr);
67797                                  break;
67798                              }
67799                            } else {
67800                              UnallocatedA32(instr);
67801                            }
67802                            break;
67803                          }
67804                          case 0x00800100: {
67805                            // 0x0e800b10
67806                            switch (instr & 0x00200040) {
67807                              case 0x00000000: {
67808                                // 0x0e800b10
67809                                if (((instr & 0xf0000000) == 0xf0000000)) {
67810                                  UnallocatedA32(instr);
67811                                  return;
67812                                }
67813                                Condition condition((instr >> 28) & 0xf);
67814                                DataType dt =
67815                                    Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
67816                                                    ((instr >> 21) & 0x2));
67817                                if (dt.Is(kDataTypeValueInvalid)) {
67818                                  UnallocatedA32(instr);
67819                                  return;
67820                                }
67821                                unsigned rd = ExtractDRegister(instr, 7, 16);
67822                                unsigned rt = (instr >> 12) & 0xf;
67823                                // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1
67824                                vdup(condition,
67825                                     dt,
67826                                     DRegister(rd),
67827                                     Register(rt));
67828                                if (((instr & 0xfb00f5f) != 0xe800b10)) {
67829                                  UnpredictableA32(instr);
67830                                }
67831                                break;
67832                              }
67833                              case 0x00200000: {
67834                                // 0x0ea00b10
67835                                if (((instr & 0xf0000000) == 0xf0000000)) {
67836                                  UnallocatedA32(instr);
67837                                  return;
67838                                }
67839                                Condition condition((instr >> 28) & 0xf);
67840                                DataType dt =
67841                                    Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
67842                                                    ((instr >> 21) & 0x2));
67843                                if (dt.Is(kDataTypeValueInvalid)) {
67844                                  UnallocatedA32(instr);
67845                                  return;
67846                                }
67847                                if (((instr >> 16) & 1) != 0) {
67848                                  UnallocatedA32(instr);
67849                                  return;
67850                                }
67851                                unsigned rd = ExtractQRegister(instr, 7, 16);
67852                                unsigned rt = (instr >> 12) & 0xf;
67853                                // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1
67854                                vdup(condition,
67855                                     dt,
67856                                     QRegister(rd),
67857                                     Register(rt));
67858                                if (((instr & 0xfb00f5f) != 0xea00b10)) {
67859                                  UnpredictableA32(instr);
67860                                }
67861                                break;
67862                              }
67863                              default:
67864                                UnallocatedA32(instr);
67865                                break;
67866                            }
67867                            break;
67868                          }
67869                        }
67870                        break;
67871                      }
67872                      default: {
67873                        if (((instr & 0xf0000000) == 0xf0000000) ||
67874                            ((instr & 0xe00) == 0xa00)) {
67875                          UnallocatedA32(instr);
67876                          return;
67877                        }
67878                        UnimplementedA32("MCR", instr);
67879                        break;
67880                      }
67881                    }
67882                    break;
67883                  }
67884                  case 0x00100000: {
67885                    // 0x0e100010
67886                    switch (instr & 0x00000e00) {
67887                      case 0x00000a00: {
67888                        // 0x0e100a10
67889                        switch (instr & 0x00000100) {
67890                          case 0x00000000: {
67891                            // 0x0e100a10
67892                            switch (instr & 0x00e00000) {
67893                              case 0x00000000: {
67894                                // 0x0e100a10
67895                                if (((instr & 0xf0000000) == 0xf0000000)) {
67896                                  UnallocatedA32(instr);
67897                                  return;
67898                                }
67899                                Condition condition((instr >> 28) & 0xf);
67900                                unsigned rt = (instr >> 12) & 0xf;
67901                                unsigned rn = ExtractSRegister(instr, 7, 16);
67902                                // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1
67903                                vmov(condition, Register(rt), SRegister(rn));
67904                                if (((instr & 0xff00f7f) != 0xe100a10)) {
67905                                  UnpredictableA32(instr);
67906                                }
67907                                break;
67908                              }
67909                              case 0x00e00000: {
67910                                // 0x0ef00a10
67911                                if (((instr & 0xf0000000) == 0xf0000000)) {
67912                                  UnallocatedA32(instr);
67913                                  return;
67914                                }
67915                                Condition condition((instr >> 28) & 0xf);
67916                                unsigned rt = (instr >> 12) & 0xf;
67917                                unsigned spec_reg = (instr >> 16) & 0xf;
67918                                switch (spec_reg) {
67919                                  case 0x0:
67920                                  case 0x1:
67921                                  case 0x5:
67922                                  case 0x6:
67923                                  case 0x7:
67924                                  case 0x8: {
67925                                    // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1
67926                                    vmrs(condition,
67927                                         RegisterOrAPSR_nzcv(rt),
67928                                         SpecialFPRegister(spec_reg));
67929                                    if (((instr & 0xff00fff) != 0xef00a10)) {
67930                                      UnpredictableA32(instr);
67931                                    }
67932                                    break;
67933                                  }
67934                                  default:
67935                                    UnallocatedA32(instr);
67936                                    break;
67937                                }
67938                                break;
67939                              }
67940                              default:
67941                                UnallocatedA32(instr);
67942                                break;
67943                            }
67944                            break;
67945                          }
67946                          case 0x00000100: {
67947                            // 0x0e100b10
67948                            if (((instr & 0xf0000000) == 0xf0000000)) {
67949                              UnallocatedA32(instr);
67950                              return;
67951                            }
67952                            Condition condition((instr >> 28) & 0xf);
67953                            unsigned lane;
67954                            DataType dt =
67955                                Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
67956                                                            ((instr >> 19) &
67957                                                             0xc) |
67958                                                            ((instr >> 19) &
67959                                                             0x10),
67960                                                        &lane);
67961                            if (dt.Is(kDataTypeValueInvalid)) {
67962                              UnallocatedA32(instr);
67963                              return;
67964                            }
67965                            unsigned rt = (instr >> 12) & 0xf;
67966                            unsigned rn = ExtractDRegister(instr, 7, 16);
67967                            // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1
67968                            vmov(condition,
67969                                 dt,
67970                                 Register(rt),
67971                                 DRegisterLane(rn, lane));
67972                            if (((instr & 0xf100f1f) != 0xe100b10)) {
67973                              UnpredictableA32(instr);
67974                            }
67975                            break;
67976                          }
67977                        }
67978                        break;
67979                      }
67980                      default: {
67981                        if (((instr & 0xf0000000) == 0xf0000000) ||
67982                            ((instr & 0xe00) == 0xa00)) {
67983                          UnallocatedA32(instr);
67984                          return;
67985                        }
67986                        UnimplementedA32("MRC", instr);
67987                        break;
67988                      }
67989                    }
67990                    break;
67991                  }
67992                }
67993                break;
67994              }
67995            }
67996            break;
67997          }
67998          case 0x01000000: {
67999            // 0x0f000000
68000            if (((instr & 0xf0000000) == 0xf0000000)) {
68001              UnallocatedA32(instr);
68002              return;
68003            }
68004            Condition condition((instr >> 28) & 0xf);
68005            uint32_t imm = instr & 0xffffff;
68006            // SVC{<c>}{<q>} {#}<imm> ; A1
68007            svc(condition, imm);
68008            break;
68009          }
68010        }
68011        break;
68012      }
68013    }
68014  }
68015}  // NOLINT(readability/fn_size)
68016// End of generated code.
68017
68018const uint16_t* PrintDisassembler::DecodeT32At(
68019    const uint16_t* instruction_address, const uint16_t* buffer_end) {
68020  uint32_t instruction = *instruction_address++ << 16;
68021
68022  if (instruction >= kLowestT32_32Opcode) {
68023    if (instruction_address >= buffer_end) {
68024      os() << "?\n";
68025      return instruction_address;
68026    }
68027    instruction |= *instruction_address++;
68028  }
68029
68030  DecodeT32(instruction);
68031  return instruction_address;
68032}
68033
68034void PrintDisassembler::DecodeT32(uint32_t instruction) {
68035  PrintCodeAddress(GetCodeAddress());
68036  if (T32Size(instruction) == 2) {
68037    PrintOpcode16(instruction >> 16);
68038    Disassembler::DecodeT32(instruction);
68039  } else {
68040    PrintOpcode32(instruction);
68041    Disassembler::DecodeT32(instruction);
68042  }
68043  os() << "\n";
68044}
68045
68046
68047void PrintDisassembler::DecodeA32(uint32_t instruction) {
68048  PrintCodeAddress(GetCodeAddress());
68049  PrintOpcode32(instruction);
68050  Disassembler::DecodeA32(instruction);
68051  os() << "\n";
68052}
68053
68054
68055void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer,
68056                                             size_t size_in_bytes) {
68057  VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
68058  VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
68059  const uint32_t* const end_buffer =
68060      buffer + (size_in_bytes / sizeof(uint32_t));
68061  while (buffer < end_buffer) {
68062    DecodeA32(*buffer++);
68063  }
68064}
68065
68066
68067void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer,
68068                                             size_t size_in_bytes) {
68069  VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
68070  VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
68071  const uint16_t* const end_buffer =
68072      buffer + (size_in_bytes / sizeof(uint16_t));
68073  while (buffer < end_buffer) {
68074    buffer = DecodeT32At(buffer, end_buffer);
68075  }
68076  VIXL_ASSERT(buffer == end_buffer);
68077}
68078
68079}  // namespace aarch32
68080}  // namespace vixl
68081